Yolo-v3+Python 3.7目标检测 物体识别
前言
运行yolo v3 有很多方法,最简单的一种就是使用opencv与numpy。
此文程序在PyCharm中编译运行。
本文程序和所需yolo文件,coco names, 源代码都可在以下百度云盘链接下载:
链接:https://pan.baidu.com/s/1575DPtD-Zp2ZADWgGJDT0Q
提取码:mhad
一、新建工程
新建工程"Object_Detection",并在File-Setting-Project:Object_Detection中点击右上角加号,搜索并添加我们需要的library:opencv-python,numpy。
接着,我们需要前往yolo官网下载下图中所需的config和weight文件:YOLOv3-tiny.Cfg与YOLOv3-tiny.weights, YOLOv3.Cfg与YOLOv3.weights(YOLOv3即为320p版本)
Yolo官网链接如下:https://pjreddie.com/darknet/yolo/
如果下载速度太慢,可以使用以下百度网盘链接进行下载:
链接:https://pan.baidu.com/s/1575DPtD-Zp2ZADWgGJDT0Q
提取码:mhad
二、编写.py程序
1.获取相机
引入opencv-python,numpy库:
import cv2
import numpy as np
2.读入数据
为了从相机获取帧,我们将声明一个Video Capture对象,并为其指定摄像机的索引。如果您使用的是笔记本电脑,或者仅连接了一个摄像头,则可以将其保留为0。然后,我们创建一个while循环,以不断获取来自摄像头的最新帧。使用read 方法获取图像,然后使用imshow()函数显示图像 。cap = cv2.VideoCapture(0)
while True:
success, img = cap.read()
cv2.imshow('Image', img)
cv2.waitKey(1)
运行后可获取摄像头实时画面。
waitKey()是在一个给定的时间内(单位ms)等待用户按键触发, 如果用户没有按下 键,则接续等待(循环)。
3.读入Coco Names名单
加载yolo3模型,由于它是根据coco dataset进行训练的,因此我们将首先收集class names。可以从coco.names文件导入(可在云盘中下载)。当然也可以手动输入所有类名。但由于有80个不同的类,因此最好使用该文件导入。【可以在PyCharm中打开coco.names文件查看这80各不同的类】classesFile = "coco.names"
classNames = []
with open(classesFile, 'rt') as f:
classNames = f.read().rstrip('\n').split('\n')
print(classNames)
4.载入模型
任何的模型都有两个主要组成部分:一个是结构体系,另一个是权重。对于yolo-V3,这两个组成部分被分为了两个不同的文件。因此,我们将导入包含结构的configuration文件和包含权重的weights文件。 在Yolo官网上,我们可以找到不同的.cfg和.weight文件。在这个项目里面我们可以先试用tiny来实现快速的识别,以适应不同配置的PC。modelConfiguration = "yolov3-tiny.cfg"
modelWeights = "yolov3-tiny.weights
使用readNetFromDarkNet function载入我们的模型。同时将后端设置为openCV,将目标设置为CPU。
net = cv2.dnn.readNetFromDarknet(modelConfiguration, modelWeights)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
5.将图像输入到网络
由于无法将相机拍摄的图像直接发送到网络。它必须采用blob的格式。我们可以使用blobFromImage函数从图像创建4维blob。输入为img, 可选参数分别为: 图像各通道数值的缩放比例,输出图像的空间尺寸, 各通道减去的值,以降低光照的影响, 交换蓝色和红色通道, 图像裁剪,默认为False.。 blob = cv2.dnn.blobFromImage(img, 1/255, (320, 320), [0, 0, 0], 1, crop=False)
net.setInput(blob)