opencv调用yolov3模型进行深度学习目标检测,以实例进行代码详解
对于yolo v3已经训练好的模型,opencv提供了加载相关文件,进行图片检测的类dnn。
下面对怎么通过opencv调用yolov3模型进行目标检测方法进行详解,付源代码
1、建立相关目录
在训练结果backup文件夹下,找到模型权重文件,拷到win的工程文件夹下
在cfg文件夹下,找到模型配置文件,yolov3-voc.cfg拷到win的工程文件夹下
在data文件夹下,找到voc.names,类别标签文件,拷到win的工程文件夹下
2代码详解
weightsPath
=
"E:\deep_learn\yolov3_modeFile\yolov3-voc_25000.weights"
# 模型权重文件configPath
=
"E:\deep_learn\yolov3_modeFile\yolov3-voc.cfg"
# 模型配置文件labelsPath
=
"E:\\deep_learn\\yolov3_modeFile\\voc.names"
# 模型类别标签文件123123
引入模型的相关文件,这里需要使用yolo v3训练模型的三个文件
(1)模型权重文件 name.weights
(2)训练模型时的配置文件 yolov3-voc.cfg(一定和训练时一致,后面会提原因)
(3)模型类别的标签文件 voc.names LABELS
=
open
(labelsPath
)
.read
(
)
.strip
(
)
.split
(
"\n"
)11
从voc.names中得到标签的数组LABELS
我的模型识别的是车和人
voc,names文件内容
LABELS数组内容
COLORS
= np
.random
.randint
(
0
,
255
, size
=
(
len
(LABELS
)
,
3
)
,dtype
=
"uint8"
)
#颜色 随机生成颜色框11
根据类别个数随机生成几个颜色 ,用来后期画矩形框
[[ 33 124 191]
[211 63 59]] boxes
=
[
]confidences
=
[
]classIDs
=
[
]123123
声明三个数组
(1)boxes 存放矩形框信息
(2)confidences 存放框的置信度
(3)classIDs 存放框的类别标签
三个数组元素一一对应,即boxes[0]、confidences[0]、classIDs[0]对应一个识别目标的信息,后期根据该信息在图片中画出识别目标的矩形框
net
= cv2
.dnn
.readNetFromDarknet
(configPath
,weightsPath
)11
加载 网络配置与训练的权重文件 构建网络
注意此处opencv2.7不行 ,没有dnn这个类,最好opencv版本在4.0以上,对应python用3.0以上版本 image
= cv2
.imread
(
"E:\deep_learn\yolov3_detection_image\R1_WH_ZW_40_80_288.jpg"
)
(H
,W
)
= image
.shape
[
0
:
2
]1212
读入待检测的图片,得到图像的高和宽
ln
= net
.getLayerNames
(
)11
得到 YOLO各层的名称,之后从各层名称中找到输出层
可以看到yolo的各层非常多,红框圈的’yolo_94’、"yolo_106’即为输出层,下面就需要通过代码找到这三个输出层,为什么是三个?跟yolo的框架结构有关,yolo有三个输出。对应的我们在训练模型时修改 yolov3-voc.cfg文件,修改的filters、classes也是三处,详细参考
https://blog.csdn.net/qq_32761549/article/details/90020725#8_darknetcfgyolov3voccfg_183 8. 修改./darknet/cfg/yolov3-voc.cfg文件
下面就是在yolo的所有层名称ln中找出三个输出层,代码如下 out
= net
.getUnconnectedOutLayers
(
)
#得到未连接层得序号x
=
[
]
for i
in out
:
# i=[200] x
.append
(ln
[i
[
0
]
-
1
]
)
# i[0]-1 取out中的数字 [200][0]=200 ln(199)= "yolo_82"ln
=x1234512345
yolo的输出层是未连接层的前一个元素,通过net.getUnconnectedOutLayers()找到未连接层的序号out= [[200] /n [267] /n [400] ],循环找到所有的输出层,赋值给ln
最终ln = [‘yolo_82’, ‘yolo_94’

本文详细介绍了如何利用OpenCV调用预先训练好的YOLOv3模型进行目标检测。首先,需要将模型权重文件、配置文件和类别标签文件放在正确的位置。然后,通过OpenCV的dnn模块加载模型并读取待检测图像。接着,找到YOLO的输出层并转换输入图像格式。最后,进行前向传播得到检测结果,并通过非极大值抑制(NMS)处理多余的框,绘制出最终的目标检测结果。提供的代码实现了整个流程。
最低0.47元/天 解锁文章


被折叠的 条评论
为什么被折叠?



