python调用yolov3模型_opencv调用yolov3模型进行目标检测,以实例进行代码详解

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值