OpenCV调用YOLOv4进行目标检测
目标检测就是对目标进行动态实时跟踪定位,常见的目标检测算法有 R-CNN、Fast R-CNN、Faster R-CNN、SSD、Yolo 等,其中 Yolo 的速度和精确度都比较高,且只需训练一次,使用起来比较方便。
这里我们就使用官方现成的模型来检测图片,看一看效果,先学会使用流程,以后再训练自己的模型。
注意:opencv-python 目前只有 4.4.0 版本适配了 YOLOv4
导入库
import numpy as np
import time
import cv2
设置标签和标注颜色
LABELS = open("coco.names").read().strip().split("\n")
np.random.seed(666)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")
加载网络
# 导入 YOLO 配置和权重文件并加载网络:
net = cv2.dnn_DetectionModel('yolov4.cfg', 'yolov4.weights')
# 获取 YOLO 未连接的输出图层
layer = net.getUnconnectedOutLayersNames()
检测图片
# 导入图片
image = cv2.imread('timg.jpg')
# 获取图片尺寸
(H, W) = image.shape[:2]# 从输入图像构造一个 blob,然后执行 YOLO 对象检测器的前向传递,给我们边界盒和相关概率
blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416),swapRB=True, crop=False)
net.setInput(blob)
start = time.time()
# 前向传递,获得信息
layerOutputs = net.forward(layer)
# 用于得出检测时间
end = time.time()
print("[INFO] YOLO took {:.6f} seconds".format(end - start))
- image:输入图像
- scalefactor:图像各通道数值的缩放比例
- size:输出图像的空间尺寸
- mean:用于各通道减去的值,以降低光照的影响
- swapRB:交换 RB 通道,默认为 False
- crop:图像裁剪,默认为 False。当值为 True 时,先按比例缩放,然后从中心裁剪成 size 尺寸
- ddepth:输出的图像深度,可选 CV_32F 或者 CV_8U
数据提取
boxes = []
confidences = []
classIDs = []# 循环提取每个输出层
for output in layerOutputs:# 循环提取每个框for detection in output:# 提取当前目标的类 ID 和置信度scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 通过确保检测概率大于最小概率来过滤弱预测if confidence > 0.5:# 将边界框坐标相对于图像的大小进行缩放,YOLO 返回的是边界框的中心(x, y)坐标,# 后面是边界框的宽度和高度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))# 更新边界框坐标、置信度和类 id 的列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)
- boxes:对象的边界框
- confidences :YOLO 分配给对象的置信度值,较低的置信度值表示该对象可能不是网络认为的对象。上面的代码中将过滤掉小于 0.5 阈值的对象
- classIDs:检测到的对象的类标签
这样每个被提取出的对象,都确定了标签和区域坐标就、位置。接下来就是在图片中标记出来,便于我们观看。
标记显示
# 非最大值抑制,确定唯一边框
idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)
# 确定每个对象至少有一个框存在
if len(idxs) > 0:# 循环画出保存的边框for i in idxs.flatten():# 提取坐标和宽度(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]]]cv2.rectangle(image, (x, y), (x + w, y + h), color, 1, lineType=cv2.LINE_AA)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 1, lineType=cv2.LINE_AA)
cv2.imshow("Tag", image)
cv2.waitKey(0)
对于每个对象,Yolo 会框出 3 个左右的区域,我们只需要显示出最合适的区域。非最大值抑制,就是搜索出局部最大值,将置信度最大的框保存,其余剔除。
cv2.dnn.NMSBoxes(bboxes, scores, score_threshold, nms_threshold, eta=None, top_k=None)
完整代码
import numpy as np
import time
import cv2LABELS = open("coco.names").read().strip().split("\n")
np.random.seed(666)
COLORS = np.random.randint(0, 255, size=(len(LABELS), 3), dtype="uint8")
# 导入 YOLO 配置和权重文件并加载网络:
net = cv2.dnn_DetectionModel('yolov4.cfg', 'yolov4.weights')
# 获取 YOLO 未连接的输出图层
layer = net.getUnconnectedOutLayersNames()
image = cv2.imread('timg.jpg')
# 获取图片尺寸
(H, W) = image.shape[:2]
# 从输入图像构造一个 blob,然后执行 YOLO 对象检测器的前向传递,给我们边界盒和相关概率
blob = cv2.dnn.blobFromImage(image, 1/255.0, (416, 416),swapRB=True, crop=False)
net.setInput(blob)
start = time.time()
# 前向传递,获得信息
layerOutputs = net.forward(layer)
# 用于得出检测时间
end = time.time()
print("YOLO took {:.6f} seconds".format(end - start))boxes = []
confidences = []
classIDs = []# 循环提取每个输出层
for output in layerOutputs:# 循环提取每个框for detection in output:# 提取当前目标的类 ID 和置信度scores = detection[5:]classID = np.argmax(scores)confidence = scores[classID]# 通过确保检测概率大于最小概率来过滤弱预测if confidence > 0.5:# 将边界框坐标相对于图像的大小进行缩放,YOLO 返回的是边界框的中心(x, y)坐标,# 后面是边界框的宽度和高度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))# 更新边界框坐标、置信度和类 id 的列表boxes.append([x, y, int(width), int(height)])confidences.append(float(confidence))classIDs.append(classID)
# 非最大值抑制,确定唯一边框
idxs = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.3)
# 确定每个对象至少有一个框存在
if len(idxs) > 0:# 循环画出保存的边框for i in idxs.flatten():# 提取坐标和宽度(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]]]cv2.rectangle(image, (x, y), (x + w, y + h), color, 1, lineType=cv2.LINE_AA)text = "{}: {:.4f}".format(LABELS[classIDs[i]], confidences[i])cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX,0.5, color, 1, lineType=cv2.LINE_AA)
cv2.imshow("Tag", image)
cv2.waitKey(0)
OpenCV调用YOLOv4进行目标检测相关推荐
- YOLOv4:目标检测(windows和Linux下Darknet 版本)实施
YOLOv4:目标检测(windows和Linux下Darknet 版本)实施 YOLOv4 - Neural Networks for Object Detection (Windows and L ...
- 睿智的目标检测21——如何调用摄像头进行目标检测
睿智的目标检测21--如何调用摄像头进行目标检测 学习前言 使用到的库 实现思路 实现代码 2020/4/26更新:FPS计算 FPS记录的原理 FPS实现代码 学习前言 好多人都想了解一下如何对摄像 ...
- 基于YOLOv4的目标检测系统(附MATLAB代码+GUI实现)
摘要:本文介绍了一种MATLAB实现的目标检测系统代码,采用 YOLOv4 检测网络作为核心模型,用于训练和检测各种任务下的目标,并在GUI界面中对各种目标检测结果可视化.文章详细介绍了YOLOv4的 ...
- OpenCV推断onnx格式目标检测模型(SSD)(附完整代码)
OpenCV推断onnx格式目标检测模型的实例 OpenCV推断onnx格式目标检测模型的实例 OpenCV推断onnx格式目标检测模型的实例 #include <algorithm> # ...
- OpenCV使用CNN进行目标检测
OpenCV使用CNN进行目标检测 使用CNN进行目标检测 建造Building 物体检测 改变门槛 影像分类 使用CNN进行目标检测 建造Building 构建" dnn_objectec ...
- 树莓派摄像头 C++ OpenCV YoloV3 实现实时目标检测
树莓派摄像头 C++ OpenCV YoloV3 实现实时目标检测 本文将实现树莓派摄像头 C++ OpenCV YoloV3 实现实时目标检测,我们会先实现树莓派对视频文件的逐帧检测来验证算法流程, ...
- YOLOv4:目标检测的最佳速度和精度
YOLOv4:目标检测的最佳速度和精度 摘要 随着深度学习的发展,目前已经出现了很多算法(或者训练技巧,tricks)来提升神经网络的准确率.在实际测试中评价一个算法的好坏优劣主要看两点,一是能否在大 ...
- 【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码
各位同学好,今天和大家分享一下如何使用 opencv 调用 yolov4-tiny 目标检测方法,并对指定类别进行检测.用b站的视频做测试. 点击按钮 'all',按钮变红色,对所有的类别检测 点击按 ...
- 利用OpenCV的Haar特征目标检测方法进行人脸识别的尝试(一)
一.前言 由于还处于学习阶段,大多数内容都是从网上学习借鉴的,重复的内容就不多赘述,只是将自己的经验和想法分享出来.感觉不错的学习资源如下 http://www.cnblogs.com/tornado ...
最新文章
- 输入年月日,判断为该年的第几天
- 深入探究Python中的字典容器
- 四、启动OpenLDAP服务器
- Wi-Fi 联盟撤销华为资格;华为已熟练掌握 ARM 架构修改;苹果 2020 年或推 5G 手机 | 极客头条...
- HDU6292 赛题分析【水题】
- 2008 r2 server sql 中文版补丁_sql2008 sp3补丁下载-sql server 2008补丁包sp3中文版补丁【32/64位】-东坡下载...
- 关于Linux内核学习
- Flask部署机器学习模型---基于线性回归模型的销售预测系统实现简易版代码
- Qualcomm MSM8916 将开关机动画放置到指定分区做法
- EXCEL 边框 去不掉的解决方法
- 深度学习端到端的优缺点和网络泛化性
- android自定义滚动条(ScrollBar)样式
- 网易云音乐常用API浅析
- 基于STM32F767的FreeRTOS的移植
- 感受Google的汉英翻译能力
- linux bzip2压缩文件,bzip2命令_Linux bzip2命令:压缩和解压文件(.bz2文件)
- [前端技巧] 网站性能优化(FCP、lCP)
- PDF密码忘记了,如何找回口令密码
- heartbeat错误:ERROR: Could not send gratuitous arps. rc=127
- 【Phoenix】 ERROR 726 (43M10): Inconsistent namespace mapping properties.