Yolo-v3+Python 3.7目标检测 物体识别

本文介绍了如何使用Python 3.7和OpenCV进行Yolo-v3目标检测。通过新建工程,添加必要的库,下载Yolo模型配置和权重文件,然后编写.py程序来获取相机数据,读取Coco Names名单,加载模型,输入图像到网络,获取输出,并进行物体识别。程序提供了完整的代码,并附带了下载资源链接。

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


前言

运行yolo v3 有很多方法,最简单的一种就是使用opencv与numpy。
此文程序在PyCharm中编译运行。
本文程序和所需yolo文件,coco names, 源代码都可在以下百度云盘链接下载:
链接:https://pan.baidu.com/s/1575DPtD-Zp2ZADWgGJDT0Q
提取码:mhad


一、新建工程

新建工程"Object_Detection",并在File-Setting-Project:Object_Detection中点击右上角加号,搜索并添加我们需要的library:opencv-python,numpy。
添加library

接着,我们需要前往yolo官网下载下图中所需的config和weight文件:YOLOv3-tiny.Cfg与YOLOv3-tiny.weights, YOLOv3.Cfg与YOLOv3.weights(YOLOv3即为320p版本)
Yolo官网链接如下:https://pjreddie.com/darknet/yolo/
如果下载速度太慢,可以使用以下百度网盘链接进行下载:
链接:https://pan.baidu.com/s/1575DPtD-Zp2ZADWgGJDT0Q
提取码:mhad
在这里插入图片描述

二、编写.py程序

1.获取相机

引入opencv-python,numpy库:

import cv2
import numpy as np

2.读入数据

为了从相机获取帧,我们将声明一个Video Capture对象,并为其指定摄像机的索引。如果您使用的是笔记本电脑,或者仅连接了一个摄像头,则可以将其保留为0。然后,我们创建一个while循环,以不断获取来自摄像头的最新帧。使用read 方法获取图像,然后使用imshow()函数显示图像 。
cap = cv2.VideoCapture(0)
 
while True:
    success, img = cap.read()
 
    cv2.imshow('Image', img)
    cv2.waitKey(1)

运行后可获取摄像头实时画面。
waitKey()是在一个给定的时间内(单位ms)等待用户按键触发, 如果用户没有按下 键,则接续等待(循环)。

3.读入Coco Names名单

加载yolo3模型,由于它是根据coco dataset进行训练的,因此我们将首先收集class names。可以从coco.names文件导入(可在云盘中下载)。当然也可以手动输入所有类名。但由于有80个不同的类,因此最好使用该文件导入。【可以在PyCharm中打开coco.names文件查看这80各不同的类】
classesFile = "coco.names"
classNames = []
with open(classesFile, 'rt') as f:
    classNames = f.read().rstrip('\n').split('\n')
print(classNames)

4.载入模型

任何的模型都有两个主要组成部分:一个是结构体系,另一个是权重。对于yolo-V3,这两个组成部分被分为了两个不同的文件。因此,我们将导入包含结构的configuration文件和包含权重的weights文件。 在Yolo官网上,我们可以找到不同的.cfg和.weight文件。在这个项目里面我们可以先试用tiny来实现快速的识别,以适应不同配置的PC。
modelConfiguration = "yolov3-tiny.cfg"
modelWeights = "yolov3-tiny.weights
使用readNetFromDarkNet function载入我们的模型。同时将后端设置为openCV,将目标设置为CPU。
net = cv2.dnn.readNetFromDarknet(modelConfiguration, modelWeights)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)

5.将图像输入到网络

由于无法将相机拍摄的图像直接发送到网络。它必须采用blob的格式。我们可以使用blobFromImage函数从图像创建4维blob。输入为img, 可选参数分别为: 图像各通道数值的缩放比例,输出图像的空间尺寸, 各通道减去的值,以降低光照的影响, 交换蓝色和红色通道, 图像裁剪,默认为False.。
	blob = cv2.dnn.blobFromImage(img, 1/255, (320, 320), [0, 0, 0], 1, crop=False)
    net.setInput(blob)

6.获取网络输出

由于Yolo3体系结构具有3个输出层(如下图所示),我们必须找到它们对应的名称,以获得它们的输出。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值