The Bolg of WoodyBuendia
WoodyBuendia个人博客

深度学习之图像目标检测分类-真手把手教程

0.吐槽

本人python零基础(16年就买了py学习手册一直没看完),深度学习零基础(17年买的花书翻了三页纸),突发奇想(领导要求),上马深度学习图像分类,三天时间跑起来python识别图像并对图片内容进行识别和框选分类。

吐槽:都说Python编程简洁,python的宗旨是:优美胜于丑陋、明了胜于晦涩、简洁胜于复杂、复杂胜于凌乱…..可是python的安装和各种编译器、各种库、各种pip、pip3、conda、wheel完全就把我弄昏了头。好不容易装起来了,又是各种路径、环境、配置乱七八糟各种问题,日了狗了。。真还不如MATLAB来的简单。。。好了吐槽归吐槽,本文让你从小白到运行py如飞。

1.清单

为避免文章冗长无章,先把所需清单和背景知识列举一下。

关键参考文献:Object detection and tracking in PyTorch,原作者简介: Chris Fotache is an AI researcher with CYNET.ai based in New Jersey. He covers topics related to artificial intelligence in our life, Python programming, machine learning, computer vision, natural language processing and more.

该文章中英文对照 用PyTorch来做物体检测和追踪

所需软件:python3.7、Anaconda

本来用的是PyCharm作为编辑器,Anaconda为python库环境,但是PyCharm使用的时候总是遇到问题,后面在Anaconda里面也找到了python的命令行窗口,总算把程序跑起来了。

运行平台:windows 10

2.安装和下载

2.1 安装python

打开python官网,下载win平台最新版3.7,

https://www.python.org/downloads/windows/

安装python,需要注意的是,勾选添加至系统路径。

2.2 安装anaconda

Anaconda安装文件较大,下载安装。Anaconda 是一个管理python的库的平台,众所周知,python之所以强大,是因为有各种库。需要什么功能,首先寻找有没有库,这也导致了python的库版本众多,管理困难,开发环境混乱。

下载链接

2.3 下载文件

根据 参考文献:Object detection and tracking in PyTorch, 下载所需文件,下载地址为GitHub:https://github.com/cfotache/pytorch_objectdetecttrack

下载权重文件 yolov3.weights (236MB), 将该文件放入config文件夹中,下载地址:https://pjreddie.com/media/files/yolov3.weights

2.4 安装python库

所需库:pytorch、opencv、matplotlib

运行Anaconda Prompt

在Pytorch官网选择自己的版本和平台,找到相应安装的命令。

https://pytorch.org/

我这里选择python3.7 ,conda安装,无CPU版。

在打开的 Anaconda Prompt 中输入下面命令安装pytorch

conda install pytorch-cpu torchvision-cpu -c pytorch

在Anaconda Prompt中输入:conda install matplotlib安装matplot库

打开Anaconda Navigator

左侧选择Environment

搜索opencv,会出来三个,勾选后点击右下角的apply安装。

注意:如果勾选后选择安装出现错误,那么在creat中新建一个环境

我的就报错了,新建了一个名为opencv的环境,注意,这个环境与默认的base环境是独立的,之前安装的pytorch和matplot都还需要在安装一边。

由于anaconda环境不同,在anaconda prompt中,输入:

activate opencv (此处是你新建的环境名称)

切换到新环境之后,重新安装 pytorch和matplot

3 物体检测代码Object Detection in Images

在从GitHub下载到的文件夹,名为:pytorch_objectdetecttrack-master,中新建python脚本:test.py

3.1脚本

输入以下代码:

from models import *
from utils import *
import os, sys, time, datetime, random
import torch
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
from torch.autograd import Variable
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image

config_path='config/yolov3.cfg'
weights_path='config/yolov3.weights'
class_path='config/coco.names'
img_size=416
conf_thres=0.8
nms_thres=0.4
# Load model and weights
model = Darknet(config_path, img_size=img_size)
model.load_weights(weights_path)
model.cuda()
#model.cpu()

model.eval()
classes = utils.load_classes(class_path)
Tensor = torch.cuda.FloatTensor

def detect_image(img):
    # scale and pad image
    ratio = min(img_size/img.size[0], img_size/img.size[1])
    imw = round(img.size[0] * ratio)
    imh = round(img.size[1] * ratio)
    img_transforms=transforms.Compose([transforms.Resize((imh,imw)),
         transforms.Pad((max(int((imh-imw)/2),0),
              max(int((imw-imh)/2),0), max(int((imh-imw)/2),0),
              max(int((imw-imh)/2),0)), (128,128,128)),
         transforms.ToTensor(),
         ])
    # convert image to Tensor
    image_tensor = img_transforms(img).float()
    image_tensor = image_tensor.unsqueeze_(0)
    input_img = Variable(image_tensor.type(Tensor))
    # run inference on the model and get detections
    with torch.no_grad():
        detections = model(input_img)
        detections = utils.non_max_suppression(detections, 80,
                        conf_thres, nms_thres)
    return detections[0]

# load image and get detections
img_path = "images/blueangels.jpg"

prev_time = time.time()
img = Image.open(img_path)
detections = detect_image(img)
inference_time = datetime.timedelta(seconds=time.time() - prev_time)
print ('Inference Time: %s' % (inference_time))
# Get bounding-box colors
cmap = plt.get_cmap('tab20b')
colors = [cmap(i) for i in np.linspace(0, 1, 20)]
img = np.array(img)
plt.figure()
fig, ax = plt.subplots(1, figsize=(12,9))
ax.imshow(img)
pad_x = max(img.shape[0] - img.shape[1], 0) * (img_size / max(img.shape))
pad_y = max(img.shape[1] - img.shape[0], 0) * (img_size / max(img.shape))
unpad_h = img_size - pad_y
unpad_w = img_size - pad_x
if detections is not None:
    unique_labels = detections[:, -1].cpu().unique()
    n_cls_preds = len(unique_labels)
    bbox_colors = random.sample(colors, n_cls_preds)
    # browse detections and draw bounding boxes
    for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:
        box_h = ((y2 - y1) / unpad_h) * img.shape[0]
        box_w = ((x2 - x1) / unpad_w) * img.shape[1]
        y1 = ((y1 - pad_y // 2) / unpad_h) * img.shape[0]
        x1 = ((x1 - pad_x // 2) / unpad_w) * img.shape[1]
        color = bbox_colors[int(np.where(
             unique_labels == int(cls_pred))[0])]
        bbox = patches.Rectangle((x1, y1), box_w, box_h,
             linewidth=2, edgecolor=color, facecolor='none')
        ax.add_patch(bbox)
        plt.text(x1, y1, s=classes[int(cls_pred)],
                color='white', verticalalignment='top',
                bbox={'color': color, 'pad': 0})
plt.axis('off')
# save image
plt.savefig(img_path.replace(".jpg", "-det.jpg"),
                  bbox_inches='tight', pad_inches=0.0)
plt.show()

3.2 运行python

在打开的Anaconda Navigator中,选择环境,点击三角形箭头,在菜单中选择open with python

输入import torch,导入模块;

输入torch.cuda.is_available(),测试计算机是否有显卡。

讲道理pytorch是支持无显卡,纯CPU模式的,但是需要改代码,我不会,下载到的这个代码是GPU模式的。。好在我的笔记本有显卡,虽然很破,但是不会报错。另外,一般讲道理这里不应该通过anaconda来运行python的,而是通过PyCharm来编辑py代码和运行的。但是我的pycharm运行显卡测试时,总是Fase,换成anaconda打开的python,就显示Ture。这可能和笔记本的独显和集显有关。

3.3切换工作目录

把通过anaconda启动的python命令行的工作目录切换到保存pytorch_objectdetecttrack-master的目录

输入:import os

输入:os.getcwd() 获取当前工作目录

输入os.chdir(”) 改变工作目录,我这里输入

import os
os.chdir('D:/Python/pytorch_objectdetecttrack-master/pytorch_objectdetecttrack-master/')

3.4运行代码

在命令行输入:exec(open(‘test.py’).read()) 来执行test.py,即可检测图片中的物体。

4效果

赞(4) 打赏
未经允许不得转载:The Blog of Woody Buendia » 深度学习之图像目标检测分类-真手把手教程
分享到: 更多 (0)

说点什么

avatar
  Subscribe  
提醒

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏