文章目录

  • 一、前言
  • 二、入门实验coco数据集
    • 1.下载
    • 2.食用
    • 3.源码

一、前言

yolo3也是目标检测的新兴算法之一。它的发展是基于HOG->CNN ->RCNN->YOLO

(图源于网络,侵删)

图像检测发展史

  1. HOG阶段(一步法):边缘检测+卷积神经网络。
  2. CNN ~ R-CNN阶段(两步法):基于图像分类加上滑动窗口。
  3. 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.下载

现在用官网示例的模型进行实验:

  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

  2. 说明:

    • coco.names:训练模型的所有类别名。

    • yolov3.weights:预训练的权重。

    • yolov3.cfg:配置文件。

  3. coco.names包含:

    人 自行车 汽车 摩托车 飞机 巴士 火车 卡车 船 红绿灯 消防栓 站牌 停车咪表 板凳 鸟 猫 狗
    马 羊 牛 象 熊 斑马 长颈鹿 背包 雨伞 手袋 领带 手提箱 飞碟 滑雪 单板滑雪 运动的球
    风筝 棒球棒 棒球手套 滑板 冲浪板 网球拍 瓶 酒杯 杯 叉 刀 勺 碗 香蕉 苹果 三明治 橙
    花椰菜 胡萝卜 热狗 披萨 甜甜圈 蛋糕 椅子 沙发 盆栽植物  床 餐桌  厕所 电视 笔记本
    鼠标 遥控 键盘 手机  微波 烤箱 烤面包 片 冰箱 本书 时钟 花瓶 剪刀 泰迪熊 吹风机 牙刷
    
  4. 参考教程:

    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

全部源码:

  1. 图片部分

参考:【教程】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)
  1. 视频部分
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相关推荐

  1. OpenCV+yolov3实现目标检测(C++,Python)

    OpenCV+yolov3实现目标检测(C++,Python) 目标检测算法主要分为两类:一类是基于Region Proposal(候选区域)的算法,如R-CNN系算法(R-CNN,Fast R-CN ...

  2. 【目标检测实验系列】使用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类似的数据集文件结构(文件夹名可以自定义) ...

  3. 使用Yolo3进行目标检测实现流程记录1

    上个月需要使用目标检测进行项目开发,简单了解了下目标检测的技术之后,果断选择使用yolo来进行尝试. 在查看了无数篇博客之后,头疼脑热,各种花样的问题之后,果断记录了自行爬坑的过程,希望对后续使用yo ...

  4. 目标检测实战必会!4种基于YOLO目标检测(Python和C++两种版本实现)

    目标检测实战必会!4种基于YOLO目标检测(Python和C++两种版本实现) AI算法修炼营 1周前 以下文章来源于极市平台 ,作者CV开发者都爱看的 极市平台 专注计算机视觉前沿资讯和技术干货,官 ...

  5. YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)

    本人YOLOv3刚刚入坑,走了不少弯路,自己摸索了一下,首先给大家配置一下yolo3,后续会有具体的算法分析讲解.安装VS2015+opencv3.4.2,这个就不用多说了吧,网上很多教程可以参考,主 ...

  6. 计算机视觉:图像分类定位(单一目标检测)python实现

    前言 目标检测:我们不仅要用算法判断图片中是不是猫还是狗, 还要在图片中标记出它的位置, 用边框或红色方框把猫狗圈起来, 这就是目标检测问题.其中"定位"的意思是判断猫狗在图片中的 ...

  7. 机器学习入门目标检测之印章检测和分类

    识别效果如上图 模型下载地址: 采用技术架构 Flask PaddlePaddle PaddleX 安装框架:Flask,PaddlePaddle,PaddleX python3.6以上版本 使用说明 ...

  8. 大疆、港科大联手!双目3D目标检测实验效果大放送 | CVPR 2019

    作者 | heryms 责编 | Jane CVPR 2019的文章出来了,今天聊聊双目的 3D object detection.这是一篇来自 DJI (大疆)与港科大合作的文章<Stereo ...

  9. 货运列车目标检测实验记录

    问题描述1 Traceback (most recent call last):File "train.py", line 274, in <module>fit_on ...

最新文章

  1. 对象----《你不知道的JS》
  2. 使用es6实现iview的选项卡切换
  3. centOS 6.5 yum升级 gcc4.8 然后又退回来4.4
  4. vb简易计算机器程序,vb简易计算器源码
  5. C字节对齐与C++类对象内存布局
  6. html5响应式网站建设网络类织梦模板
  7. c# datagridview 中DataSource的使用总结
  8. 音乐编辑 java_求助 关于java编辑音乐
  9. 搜狗深入布局人工智能 Q2营收利润创新高
  10. 树莓派命令行发送邮件
  11. ai中如何建立阴影_在投资管理中采用AI:公司如何成功建立
  12. 如何选型音视频即时通讯产品
  13. ASC转换BCD,ASC2BCD
  14. 服务器日志默认存放位置,系统日志和IIS日志存放路径
  15. 系统测试(学习笔记)
  16. 关于gite代码提交不显示绿格子的处理心得git
  17. Qt编写地图综合应用12-路线查询
  18. 关于Random(47)与randon.nextInt(100)的区别
  19. 《数据结构与算法》课程设计:18-背包问题
  20. Hieroglyph3 框架分析2

热门文章

  1. 静态NAT 如何配置?
  2. jsTree插件简介(一)
  3. pycharm---更改背景颜色
  4. C语言100题练习计划 27——字符串替换
  5. 光猫拨号和软路由拨号失败服务器无响应,光猫拨号好还是无线路由器拨号好(一文解答你的疑惑)...
  6. 水下超声波测距c语言程序,51单片机超声波测距C程序
  7. vue+element-ui 动态加载本地图片
  8. 各厂家linux面板对比
  9. Oracle表数据转换为XML格式数据
  10. IOT语义互操作性之标准与开源