YOLO-V3实时检测实现(opencv+python实现)
YOLO-V3实时检测实现(opencv+python实现)——改进——>更加的易懂
Opencv+YOLO-V3实现目标跟踪
两款IP Camera+YOLOV3进行目标检测(手机摄像头作为电脑摄像头使用)
windows平台使用CMake工具对darknet的编译以及安装过程+yolov3+图像检测+摄像头检测+视频检测+手机作为摄像头进行检测(详解)
基于darknet框架+yolov3训练自己的数据集
提示:读懂YOLOV1,YOLOV2,YOLOV3非常的重要,如果想要理解后序的YOLO版本,那么对于YOLOV1,YOLOV2,YOLOV3必须理解其中的原理,但是在理解原理的同时尽量结合代码,因为实践和理论并不总是一一对应的(只有你看了开源的代码,你才会发现有时候实践比理论更难理解,同时实践也更难实现)。
1.开源YOLOV3代码
YOLOV3的官网(darknet)
下面代码是在学习YOLOV3过程中发现的比较好理解同时也容易测试的开源代码https://github.com/eriklindernoren/PyTorch-YOLOv3/tree/master
提示:下载这份代码主要是为了了解其中YOLOV3实现的原理和细节,而且可以通过API进行调用。
2.权重文件和配置文件下载
3.调用API
提示:根据上面的开源代码,这里先尝试调用API进行测试,后面再进入开源代码理解其中的细节:
- 第一步:建议读者首先创建一个新的虚拟环境,不要把原来的环境和现在下载的包给混在一起了 - conda create -n 环境名 python=版本号(3.8.5)
- 第二步: - pip install pytorchyolo(这里面包含检测,模型,训练等模块)
(1)测试API
提示:读者可能已经发现了,如果使用下面的方式调用API,整个过程非常的清晰和简单,如果想要了解其中的具体原理,只需要进入具体的包里面了解即可。甚至可以调用API进行训练。
"""
@Author : Keep_Trying_Go
@Major : Computer Science and Technology
@Hobby : Computer Vision
@Time : 2023/5/26 18:01
"""
import cv2
import time
import cvzone
from util.utils import load_classes
from pytorchyolo import detect, models
# import detect
# import models
# Load the YOLO model
"""
when the weights and cfg is yolov3-tiny.weights ,yolov3-tiny.cfg
#detections.shape: torch.Size([1, 2535, 85])
# 2535 = 3 x 13 x 13 + 3 x 26 x 26 ; 85 = len(cx,cy,w,h,conf) + len(classes)
when the weights and cfg is yolov3.weights ,yolov3.cfg
#detections.shape: torch.Size([1, 2535, 85])
# 10647 = 3 x 13 x 13 + 3 x 26 x 26 + 3 x 52 x 52; 85 = len(cx,cy,w,h,conf) + len(classes)
"""
model = models.load_model("config/yolov3-tiny.cfg","weights/yolov3-tiny.weights")
classes = load_classes('data/coco.names')
def detectSignalImage(img_path):
"""
对单张图像进行检测
"""
# Load the image as a numpy array
img = cv2.imread(img_path)
# Convert OpenCV bgr to rgb
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# Runs the YOLO model on the image
boxes = detect.detect_image(model, imgRGB)
print(boxes)
# Output will be a numpy array in the following format:
# [[x1, y1, x2, y2, confidence, class]]
for i ,box in enumerate(boxes):
xmin = int(box[0])
ymin = int(box[1])
xmax = int(box[2])
ymax = int(box[3])
confidence = round(box[4] * 100,2)
class_id = int(box[5])
cv2.rectangle(img,pt1=(xmin,ymin),pt2=(xmax,ymax),color=(0,255,255),thickness=2)
cvzone.putTextRect(img,text=str(classes[class_id]) + ':'+str(confidence),pos=(xmin,ymin - 10),scale=1,thickness=1)
cv2.imshow('detect',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def detectTime():
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret,frame = cap.read()
if ret is False:
break
frame = cv2.flip(src=frame, flipCode=2)
frame = cv2.resize(src=frame,dsize=(520,520))
# 输出预测的结果
start_time = time.time()
# Convert OpenCV bgr to rgb
imgRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Runs the YOLO model on the image
boxes = detect.detect_image(model, imgRGB)
# 绘制矩形框
for i, box in enumerate(boxes):
xmin = int(box[0])
ymin = int(box[1])
xmax = int(box[2])
ymax = int(box[3])
confidence = round(box[4] * 100, 2)
class_id = int(box[5])
cv2.rectangle(frame, pt1=(xmin, ymin), pt2=(xmax, ymax), color=(0, 255, 255), thickness=2)
cvzone.putTextRect(frame, text=str(classes[class_id]) + ':' + str(confidence), pos=(xmin, ymin - 10), scale=1,
thickness=1)
# 计算结束时间
end_time = time.time()
FPS = round(1 / (end_time - start_time), 0)
cv2.putText(img=frame, text='FPS: ' + str(FPS), org=(10, 50),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=1.0, color=(0, 255, 0), thickness=2)
cv2.imshow('detect', frame)
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
detectSignalImage('data/samples/dog.jpg')
# detectTime()
pass
4.源码理解
提示:以下的源码是在下载之后自己给添加的注释,主要是便于理解(很可能里面有理解错的地方,读者可自行修改方便自己查看),在里面添加了生成数据集相关文件的代码voc_label.py,生成anchors的代码generate_anchor.py以及用于预测的代码predict.py。
5.训练模型
提示:由于自己的电脑的用户名是中文,所以一直报下面的错误,因此我将没有修改的源码放置了之前在虚拟机里面配置好的Ubuntu系统下训练自己的代码,如果有读者也是存在这样报错的情况,可以搜索怎么在Ubuntu上配置和windows上差不多的代码运行环境(在配置过程可能存在很多的问题,但是CSDN都可以找到相关的解决方案)。
File "unuran_wrapper.pyx", line 221, in init scipy.stats._unuran.unuran_wrapper File "unuran_wrapper.pyx", line 200, in scipy.stats._unuran.unuran_wrapper._setup_unuran File "messagestream.pyx", line 36, in scipy._lib.messagestream.MessageStream.__cinit__ OSError: Failed to open file b'C:\\Users\\\xe5\x8d\xa2\\AppData\\Local\\Temp\\scipy-v8ge2mjp'
训练数据集文件目录格式
训练步骤:
- 第一步 - 标注数据集(基于darknet框架+yolov3训练自己的数据集)- 根据标注的数据集生成相应的anchors(运行generate_anchor_1.py,产生的anchors保存在当前目录下my_anchors.txt)-
- 第二步 - 下载预训练模型(https://pjreddie.com/media/files/darknet53.conv.74)
- 第三步 - 修改源码中的相关参数- - 修改配置文件相关参数(基于darknet框架+yolov3训练自己的数据集)-
- 第四步 - 运行voc_label.py对已经标注好的数据集产生2007_train.txt和2007_val.txt- 其中train.txt和val.txt中包含了用于训练和测试的图像绝对路径- 关于2007_train.txt和2007_val.txt里面路径的问题,由于里面的路径都是绝对路径,所以只要读者更换了环境或者系统,那么读者需要重新执行voc_label.py代码生成2007_train.txt和2007_val.txt文件。
- 第五步 - 上面提到修改配置文件(yolov3.cfg,coco.data,coco.names),注意在coco.data里面修改2007_train.txt和2007_val.txt的文件的路径(可以参考我给出的连接)。
提示:当完成上述的工作之后,也许在运行train.py文件时,会出现一些报错,一般是一些包的版本问题,网上可以找到相关的解决方法。
提示:以下是在Ubuntu上训练的结果:训练完成之后在checkpoints下会产生训练的yolov3_ckpt_{epoch}.pth(.weights)文件,用于后面的检测predict.py.
参考链接
目标检测 YOLOv5 - 在多类别中应用NMS(非极大值抑制)
YOLO-V3-SPP 训练时正样本筛选源码解析之build_targets
yolov5 nms 源码理解
版权归原作者 Keep_Trying_Go 所有, 如有侵权,请联系我们删除。