【Yolo3】入门目标检测实验--Python+Opencv2+dnn
文章目录
- 一、前言
- 二、入门实验coco数据集
- 1.下载
- 2.食用
- 3.源码
一、前言
yolo3也是目标检测的新兴算法之一。它的发展是基于HOG->CNN ->RCNN->YOLO
。
(图源于网络,侵删)
图像检测发展史:
- HOG阶段(一步法):边缘检测+卷积神经网络。
- CNN ~ R-CNN阶段(两步法):基于图像分类加上滑动窗口。
- YOLO:区域推荐(RP)。
1 , 2 方法缺点:计算量比较大,导致性能低下无法实时;YOLO采样了一种完全不同的方法,达到对图像每个区域只计算一次(You Look at Once - YOLO)。
YOLO3实现过程:
图1:YOLO把图像分为13x13的Cell(网格);
图2:每个Cell预测5个BOX,同时YOLO也会生成一个置信分数,告诉每个BOX包含某个对象的可能性是多少;
(注意置信分数不会直接说明BOX内是检测到何种对象,最终那些得分高的BOX被加粗显示)
图3:对于每个BOX来说,Cell会预测检测对象类别,这部分的工作就像是一个分类器一样;
(基于VOC数据集20中对象检测,YOLO结合分数与分类信息对每个BOX给出一个最终可能对象类型的可能性值,黄色标注区域85%可能性是狗)
因为总数是13x13的网格,每个网格预言5个BOX,所以最终有854个BOX,证据表明绝大多数的BOX得分会很低,我们只要保留30%BOX即可(取决于你自己的阈值设置),最终输出:
此部分引用出处:
OpenCV DNN之YOLO实时对象检测
YOLO3训练原理:
参考:YOLOv3 深入理解
后面我会标注训练自己的手语数据集,这里不扩展。
二、入门实验coco数据集
1.下载
现在用官网示例的模型进行实验:
下载:
https://pjreddie.com/media/files/yolov3.weights
(官网很慢的,可以在 百度网盘 中下载,好心人一生平安!)https://github.com/pjreddie/darknet/blob/master/cfg/yolov3.cfg
https://github.com/pjreddie/darknet/blob/master/data/coco.names
说明:
coco.names:训练模型的所有类别名。
yolov3.weights:预训练的权重。
yolov3.cfg:配置文件。
coco.names包含:
人 自行车 汽车 摩托车 飞机 巴士 火车 卡车 船 红绿灯 消防栓 站牌 停车咪表 板凳 鸟 猫 狗 马 羊 牛 象 熊 斑马 长颈鹿 背包 雨伞 手袋 领带 手提箱 飞碟 滑雪 单板滑雪 运动的球 风筝 棒球棒 棒球手套 滑板 冲浪板 网球拍 瓶 酒杯 杯 叉 刀 勺 碗 香蕉 苹果 三明治 橙 花椰菜 胡萝卜 热狗 披萨 甜甜圈 蛋糕 椅子 沙发 盆栽植物 床 餐桌 厕所 电视 笔记本 鼠标 遥控 键盘 手机 微波 烤箱 烤面包 片 冰箱 本书 时钟 花瓶 剪刀 泰迪熊 吹风机 牙刷
参考教程:
https://www.learnopencv.com/deep-learning-based-object-detection-using-yolov3-with-opencv-python-c/
2.食用
单图测试:识别率99.9%,惊人!
测试图2:
狗:98%、猫:67%(识别错误,这应该是狗狗)
鸟:57%、
其他动物:太小,角度等,未能识别,这都是我们在制作模型,标注图像需要注意的地方
视频检测:
原谅我睡衣出境,不过person和cellphone的检测效果挺好的。
3.源码
相关笔记:
https://gitee.com/cungudafa/Python-notes/blob/master/yolov3/yolotest.ipynb
全部源码:
- 图片部分
参考:【教程】opencv-python+yolov3实现目标检测
import numpy as np
import cv2 as cv
import os
import time
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号#参数
yolo_dir = 'D:/myworkspace/dataset/yolov3/' # 你下载YOLO权重的文件路径
CONFIDENCE = 0.5 # 过滤弱检测的最小概率
THRESHOLD = 0.4 # 非最大值抑制阈值def yolov3(imgPath,yolo_dir,CONFIDENCE,THRESHOLD):weightsPath = os.path.join(yolo_dir, 'yolov3.weights') # 权重文件configPath = os.path.join(yolo_dir, 'yolov3.cfg') # 配置文件labelsPath = os.path.join(yolo_dir, 'coco.names') # label名称# 加载网络、配置权重net = cv.dnn.readNetFromDarknet(configPath, weightsPath) ## 利用下载的文件print("[INFO] loading YOLO from disk...") ## 可以打印下信息# 加载图片、转为blob格式、送入网络输入层img = cv.imread(imgPath)blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False) ## net需要的输入是blob格式的,用blobFromImage这个函数来转格式net.setInput(blobImg) ## 调用setInput函数将图片送入输入层# 获取网络输出层信息(所有输出层的名字),设定并前向传播outInfo = net.getUnconnectedOutLayersNames() ## 前面的yolov3架构也讲了,yolo在每个scale都有输出,outInfo是每个scale的名字信息,供net.forward使用start = time.time()layerOutputs = net.forward(outInfo) # 得到各个输出层的、各个检测框等信息,是二维结构。end = time.time()print("[INFO] YOLO took {:.6f} seconds".format(end - start)) ## 可以打印下信息# 拿到图片尺寸(H, W) = img.shape[:2]# 过滤layerOutputs# layerOutputs的第1维的元素内容: [center_x, center_y, width, height, objectness, N-class score data]# 过滤后的结果放入:boxes = [] # 所有边界框(各层结果放一起)confidences = [] # 所有置信度classIDs = [] # 所有分类ID# # 1)过滤掉置信度低的框框for out in layerOutputs: # 各个输出层for detection in out: # 各个框框# 拿到置信度scores = detection[5:] # 各个类别的置信度classID = np.argmax(scores) # 最高置信度的id即为分类idconfidence = scores[classID] # 拿到置信度# 根据置信度筛查if confidence > CONFIDENCE:box = detection[0:4] * np.array([W, H, W, H]) # 将边界框放会图片尺寸(centerX, centerY, width, height) = box.astype("int")x = int(centerX - (width / 2))y = int(centerY - (height / 2))boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)# # 2)应用非最大值抑制(non-maxima suppression,nms)进一步筛掉idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes中,保留的box的索引index存入idxs# 得到labels列表with open(labelsPath, 'rt') as f:labels = f.read().rstrip('\n').split('\n')# 应用检测结果np.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") # 框框显示颜色,每一类有不同的颜色,每种颜色都是由RGB三个值组成的,所以size为(len(labels), 3)if len(idxs) > 0:for i in idxs.flatten(): # indxs是二维的,第0维是输出层,所以这里把它展平成1维(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])color = [int(c) for c in COLORS[classIDs[i]]]cv.rectangle(img, (x, y), (x+w, y+h), color, 2) # 线条粗细为2pxtext = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])print("[INFO] predect result is: ",text)(text_w, text_h), baseline = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)cv2.rectangle(img, (x, y-text_h-baseline), (x + text_w, y), color, -1)cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 2) # cv.FONT_HERSHEY_SIMPLEX字体风格、0.5字体大小、粗细2px# cv.imshow('detected image', img)# cv.waitKey(0)plt.figure(figsize=[10, 10])plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))plt.axis("off")plt.show()imgPath = os.path.join(yolo_dir, 'test.jpg') # 测试图像
yolov3(imgPath,yolo_dir,CONFIDENCE,THRESHOLD)imgPath = os.path.join(yolo_dir, 'test2.jpg') # 测试图像
yolov3(imgPath,yolo_dir,CONFIDENCE,THRESHOLD)
- 视频部分
import numpy as np
import cv2 as cv
import os
import time
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号#参数
yolo_dir = 'D:/myworkspace/dataset/yolov3/' # YOLO文件路径
CONFIDENCE = 0.5 # 过滤弱检测的最小概率
THRESHOLD = 0.4 # 非最大值抑制阈值def yolov3_vedio(img,yolo_dir,CONFIDENCE,THRESHOLD):weightsPath = os.path.join(yolo_dir, 'yolov3.weights') # 权重文件configPath = os.path.join(yolo_dir, 'yolov3.cfg') # 配置文件labelsPath = os.path.join(yolo_dir, 'coco.names') # label名称# 加载网络、配置权重net = cv.dnn.readNetFromDarknet(configPath, weightsPath) ## 利用下载的文件print("[INFO] loading YOLO from disk...") ## 可以打印下信息blobImg = cv.dnn.blobFromImage(img, 1.0/255.0, (416, 416), None, True, False) ## net需要的输入是blob格式的,用blobFromImage这个函数来转格式net.setInput(blobImg) ## 调用setInput函数将图片送入输入层# 获取网络输出层信息(所有输出层的名字),设定并前向传播outInfo = net.getUnconnectedOutLayersNames() ## 前面的yolov3架构也讲了,yolo在每个scale都有输出,outInfo是每个scale的名字信息,供net.forward使用start = time.time()layerOutputs = net.forward(outInfo) # 得到各个输出层的、各个检测框等信息,是二维结构。end = time.time()print("[INFO] YOLO took {:.6f} seconds".format(end - start)) ## 可以打印下信息# 拿到图片尺寸(H, W) = img.shape[:2]# 过滤layerOutputs# layerOutputs的第1维的元素内容: [center_x, center_y, width, height, objectness, N-class score data]# 过滤后的结果放入:boxes = [] # 所有边界框(各层结果放一起)confidences = [] # 所有置信度classIDs = [] # 所有分类ID# # 1)过滤掉置信度低的框框for out in layerOutputs: # 各个输出层for detection in out: # 各个框框# 拿到置信度scores = detection[5:] # 各个类别的置信度classID = np.argmax(scores) # 最高置信度的id即为分类idconfidence = scores[classID] # 拿到置信度# 根据置信度筛查if confidence > CONFIDENCE:box = detection[0:4] * np.array([W, H, W, H]) # 将边界框放会图片尺寸(centerX, centerY, width, height) = box.astype("int")x = int(centerX - (width / 2))y = int(centerY - (height / 2))boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)# # 2)应用非最大值抑制(non-maxima suppression,nms)进一步筛掉idxs = cv.dnn.NMSBoxes(boxes, confidences, CONFIDENCE, THRESHOLD) # boxes中,保留的box的索引index存入idxs# 得到labels列表with open(labelsPath, 'rt') as f:labels = f.read().rstrip('\n').split('\n')# 应用检测结果np.random.seed(42)COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8") # 框框显示颜色,每一类有不同的颜色,每种颜色都是由RGB三个值组成的,所以size为(len(labels), 3)if len(idxs) > 0:for i in idxs.flatten(): # indxs是二维的,第0维是输出层,所以这里把它展平成1维(x, y) = (boxes[i][0], boxes[i][1])(w, h) = (boxes[i][2], boxes[i][3])color = [int(c) for c in COLORS[classIDs[i]]]cv.rectangle(img, (x, y), (x+w, y+h), color, 2) # 线条粗细为2pxtext = "{}: {:.4f}".format(labels[classIDs[i]], confidences[i])print("[INFO] predect result is: ",text)(text_w, text_h), baseline = cv.getTextSize(text, cv.FONT_HERSHEY_SIMPLEX, 0.5, 2)cv.rectangle(img, (x, y-text_h-baseline), (x + text_w, y), color, -1)cv.putText(img, text, (x, y-5), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 2) # cv.FONT_HERSHEY_SIMPLEX字体风格、0.5字体大小、粗细2pxreturn imgcap = cv.VideoCapture(0)while(True):ret, frame = cap.read() #读取帧yolov3_vedio(frame,yolo_dir,CONFIDENCE,THRESHOLD)cv.imshow('frame',frame)if cv.waitKey(1) & 0xFF == ord('q'): #按‘q’退出break#释放资源并关闭窗口
cap.release()
cv.destroyAllWindows()
【Yolo3】入门目标检测实验--Python+Opencv2+dnn相关推荐
- OpenCV+yolov3实现目标检测(C++,Python)
OpenCV+yolov3实现目标检测(C++,Python) 目标检测算法主要分为两类:一类是基于Region Proposal(候选区域)的算法,如R-CNN系算法(R-CNN,Fast R-CN ...
- 【目标检测实验系列】使用yolov3 spp训练西工大遥感数据集NWPU VHR-10(包括如何将NWPU VHR-10转为VOC格式和yolov3 spp实验调试的详细步骤,且附上训练完的权重文件)
目录 1. 文章主要内容 2. 西工大数据集转换为VOC格式数据集 2.1 VOC数据集结构 2.2 西工大数据集 2.3 转换格式 2.3.1 构建与VOC类似的数据集文件结构(文件夹名可以自定义) ...
- 使用Yolo3进行目标检测实现流程记录1
上个月需要使用目标检测进行项目开发,简单了解了下目标检测的技术之后,果断选择使用yolo来进行尝试. 在查看了无数篇博客之后,头疼脑热,各种花样的问题之后,果断记录了自行爬坑的过程,希望对后续使用yo ...
- 目标检测实战必会!4种基于YOLO目标检测(Python和C++两种版本实现)
目标检测实战必会!4种基于YOLO目标检测(Python和C++两种版本实现) AI算法修炼营 1周前 以下文章来源于极市平台 ,作者CV开发者都爱看的 极市平台 专注计算机视觉前沿资讯和技术干货,官 ...
- YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
本人YOLOv3刚刚入坑,走了不少弯路,自己摸索了一下,首先给大家配置一下yolo3,后续会有具体的算法分析讲解.安装VS2015+opencv3.4.2,这个就不用多说了吧,网上很多教程可以参考,主 ...
- 计算机视觉:图像分类定位(单一目标检测)python实现
前言 目标检测:我们不仅要用算法判断图片中是不是猫还是狗, 还要在图片中标记出它的位置, 用边框或红色方框把猫狗圈起来, 这就是目标检测问题.其中"定位"的意思是判断猫狗在图片中的 ...
- 机器学习入门目标检测之印章检测和分类
识别效果如上图 模型下载地址: 采用技术架构 Flask PaddlePaddle PaddleX 安装框架:Flask,PaddlePaddle,PaddleX python3.6以上版本 使用说明 ...
- 大疆、港科大联手!双目3D目标检测实验效果大放送 | CVPR 2019
作者 | heryms 责编 | Jane CVPR 2019的文章出来了,今天聊聊双目的 3D object detection.这是一篇来自 DJI (大疆)与港科大合作的文章<Stereo ...
- 货运列车目标检测实验记录
问题描述1 Traceback (most recent call last):File "train.py", line 274, in <module>fit_on ...
最新文章
- 对象----《你不知道的JS》
- 使用es6实现iview的选项卡切换
- centOS 6.5 yum升级 gcc4.8 然后又退回来4.4
- vb简易计算机器程序,vb简易计算器源码
- C字节对齐与C++类对象内存布局
- html5响应式网站建设网络类织梦模板
- c# datagridview 中DataSource的使用总结
- 音乐编辑 java_求助 关于java编辑音乐
- 搜狗深入布局人工智能 Q2营收利润创新高
- 树莓派命令行发送邮件
- ai中如何建立阴影_在投资管理中采用AI:公司如何成功建立
- 如何选型音视频即时通讯产品
- ASC转换BCD,ASC2BCD
- 服务器日志默认存放位置,系统日志和IIS日志存放路径
- 系统测试(学习笔记)
- 关于gite代码提交不显示绿格子的处理心得git
- Qt编写地图综合应用12-路线查询
- 关于Random(47)与randon.nextInt(100)的区别
- 《数据结构与算法》课程设计:18-背包问题
- Hieroglyph3 框架分析2