戳一戳!和我一起走进opencv的世界
导读
OpenCV4终于更新啦!让我流下眼泪的,不是7月的高温,而是OpenCV4支持YOLO v4了。
在这篇文章,我将带领大家一起,回顾 OpenCV4.4.0 的更新, C++ 结合 OpenCV 、 Darknet 实现 YOLO v4 ,并带领大家一起用 python 语言结合 OpenCV4 实现 YOLO v4 。
如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就加群:326866692 或者扫描下方二维码加入我们吧!
OpenCV4 支持YOLO v4
经过久久的辛苦等待,OpenCV终于迎来了4.4.0。最让我激动地一个更新点就是它支持YOLO v4,之前的版本是不支持的!
想了解具体的更新点,请看下面的文章:
重磅!!!OpenCV4.4.0新鲜出炉!支持YOLO v4,SIFT免费使用
OpenCV-C++ 实现 YOLO v4
虽然刚开始OpenCV没有支持YOLO v4,但是在YOLO v4刚出不久,我就按耐不住激动地心情,进行了一波尝试,效果还不错!
我使用了OpenCV4.3.0版本和Darknet,检测效果还不错:
想了解的朋友可以移步:
【DL-YOLO】尝鲜!Windows下实现YOLOv4物体检测(VS2015+OpenCV)
OpenCV-python 实现 YOLO v4
1 引入
上面的方式虽然不用最新版的OpenCV,但是要使用Darknet框架,确实是比较麻烦的,但是有了最新版的OpenCV,再加上python强大的功能,实现起来就 so easy 了。
2 准备工作
让我们开始吧!
首先肯定要下载模型相关的文件的,我们至少需要:
coco数据集的类别名称
cfg配置文件
权重文件
一般来说,我们下载最常用的,就是我下图下载的文件:
下载有如下三种方式:
途径一:作者的GitHub
https://github.com/AlexeyAB/darknet
这个会有最初始的模型,也会有详细的介绍。具体的内容,我就不过多说明啦,大家去网站中,就能看到。
途径二:加群326866692
加我们上面提到的技术群,我会把项目打包放到群文件。本文的全部代码、相关文件都会有。
途径三:公众号回复
在我的公众号回复YOLOv4,就可以获得对应的下载链接,内容和加群一样。
3 配置
上面的做完,准备工作就完成了。
接下来,我们新建一个python项目,配置参考下面这篇教程:
【OpenCV教程】01 OpenCV简介与安装
唯一不同的是,我们这里使用的是OpenCV4.4.0版本,而教程中的是OpenCV4.3.0版本。不过这并不影响我们的操作,请大胆参考。
在项目中新建一个文件夹,命名为model,用于存放上面用到的模型文件。具体内容请看下图:
model文件夹
新建一个文件夹,命名为picture,用于存放我们测试的图片。(emm,我只是随便找了两张以前用过的测试图像,忽略这些)
picture文件夹
新建一个python文件YOLOv4.py,用于写代码。
注:
上面的命名方式,或者文件夹创建大家自由选择,大家也可以将模型,图片和代码都放在一个文件夹下。根据个人喜好决定
4 代码及检测结果
1、引用包
首先我们需要调用两个包,第一个是用于调用OpenCV,第二个帮助我们生成随机数。
import cv2 as cvimport random
2、保存模型及图片
然后我们定义几个变量存放模型和文件的路径及名称,用于后面加载模型及图片。
# 文件需要加载的文件cfg = "./model/yolov4.cfg"weights = "./model/yolov4.weights"imgName = "./picture/1.png"className = "./model/coco.names"
3、YOLO网络配置
我们需要配置网络,加载cfg配置文件、权重文件及数据集名称,对网络进行设置,用于后面检测图片。
# 网络设置net = cv.dnn_DetectionModel(cfg, weights)net.setInputSize(608, 608)net.setInputScale(1.0 / 255)net.setInputSwapRB(True)with open(className, 'rt') as f: names = f.read().rstrip('\n').split('\n')
4、加载图像
我们需要加载图片,用于后面的检测。
# 加载图像及类别img = cv.imread(imgName)cv.imshow('read img', img)
5、使用网络检测图像
我们使用网络检测图像,检测到物体所属类别、位置、数据置信度等,并将数据保存到变量中。
# 模型检测classes, confidences, boxes = net.detect(img, confThreshold=0.1, nmsThreshold=0.4)
6、显示检测结果
将检测到的数据展示到图像中。
# 将检测结果显示到图像上for classId, confidence, box in zip(classes.flatten(), confidences.flatten(), boxes): label = '%s: %.2f' % (names[classId], confidence) labelSize, baseLine = cv.getTextSize(label, cv.FONT_HERSHEY_SIMPLEX, 0.5, 1) left, top, width, height = box top = max(top, labelSize[1]) b = random.randint(0,255) g = random.randint(0,255) r = random.randint(0,255) cv.rectangle(img, box, color=(b, g, r), thickness=2) cv.rectangle(img, (left-1, top - labelSize[1]), (left + labelSize[0], top), (b, g, r), cv.FILLED) cv.putText(img, label, (left, top), cv.FONT_HERSHEY_SIMPLEX, 0.5, (255-b, 255-g, 255-r))cv.imshow('detect out', img)cv.waitKey(0)
得到的检测结果如下:
第一个是我们之前的那个马路上:
第二个是可爱的小猫咪:
检测效果还是很不错的,大家抓紧尝试一下!
说在后面的话
整体教程比较简单易懂,就是希望大家能够快速了解,并能够利用OpenCV4.4.0实现YOLO v4。
这个整体也很基础,不是做了一个项目,只是做了一个简单的检测。
但是没有关系,我想,这能让大多数人都能够快速体验 OpenCV4.4.0 和 YOLO v4 了。
目前来讲,这足够了,如果你还有别的想法或者问题,留言,告诉我!
如果喜欢这篇文章
麻烦给我一个在看