0


Pytorch实现的开源YOLOV3代码使用讲解+API测试+YOLOV3训练(详解)

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.权重文件和配置文件下载

https://pjreddie.com/darknet/yolo/

3.调用API

提示:根据上面的开源代码,这里先尝试调用API进行测试,后面再进入开源代码理解其中的细节:

  • 第一步:建议读者首先创建一个新的虚拟环境,不要把原来的环境和现在下载的包给混在一起了 - conda create -n 环境名 python=版本号(3.8.5)
  • 第二步: - pip install pytorchyolo(这里面包含检测,模型,训练等模块)

(1)测试API

提示:读者可能已经发现了,如果使用下面的方式调用API,整个过程非常的清晰和简单,如果想要了解其中的具体原理,只需要进入具体的包里面了解即可。甚至可以调用API进行训练。

  1. """
  2. @Author : Keep_Trying_Go
  3. @Major : Computer Science and Technology
  4. @Hobby : Computer Vision
  5. @Time : 2023/5/26 18:01
  6. """
  7. import cv2
  8. import time
  9. import cvzone
  10. from util.utils import load_classes
  11. from pytorchyolo import detect, models
  12. # import detect
  13. # import models
  14. # Load the YOLO model
  15. """
  16. when the weights and cfg is yolov3-tiny.weights ,yolov3-tiny.cfg
  17. #detections.shape: torch.Size([1, 2535, 85])
  18. # 2535 = 3 x 13 x 13 + 3 x 26 x 26 ; 85 = len(cx,cy,w,h,conf) + len(classes)
  19. when the weights and cfg is yolov3.weights ,yolov3.cfg
  20. #detections.shape: torch.Size([1, 2535, 85])
  21. # 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)
  22. """
  23. model = models.load_model("config/yolov3-tiny.cfg","weights/yolov3-tiny.weights")
  24. classes = load_classes('data/coco.names')
  25. def detectSignalImage(img_path):
  26. """
  27. 对单张图像进行检测
  28. """
  29. # Load the image as a numpy array
  30. img = cv2.imread(img_path)
  31. # Convert OpenCV bgr to rgb
  32. imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  33. # Runs the YOLO model on the image
  34. boxes = detect.detect_image(model, imgRGB)
  35. print(boxes)
  36. # Output will be a numpy array in the following format:
  37. # [[x1, y1, x2, y2, confidence, class]]
  38. for i ,box in enumerate(boxes):
  39. xmin = int(box[0])
  40. ymin = int(box[1])
  41. xmax = int(box[2])
  42. ymax = int(box[3])
  43. confidence = round(box[4] * 100,2)
  44. class_id = int(box[5])
  45. cv2.rectangle(img,pt1=(xmin,ymin),pt2=(xmax,ymax),color=(0,255,255),thickness=2)
  46. cvzone.putTextRect(img,text=str(classes[class_id]) + ':'+str(confidence),pos=(xmin,ymin - 10),scale=1,thickness=1)
  47. cv2.imshow('detect',img)
  48. cv2.waitKey(0)
  49. cv2.destroyAllWindows()
  50. def detectTime():
  51. cap = cv2.VideoCapture(0)
  52. while cap.isOpened():
  53. ret,frame = cap.read()
  54. if ret is False:
  55. break
  56. frame = cv2.flip(src=frame, flipCode=2)
  57. frame = cv2.resize(src=frame,dsize=(520,520))
  58. # 输出预测的结果
  59. start_time = time.time()
  60. # Convert OpenCV bgr to rgb
  61. imgRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  62. # Runs the YOLO model on the image
  63. boxes = detect.detect_image(model, imgRGB)
  64. # 绘制矩形框
  65. for i, box in enumerate(boxes):
  66. xmin = int(box[0])
  67. ymin = int(box[1])
  68. xmax = int(box[2])
  69. ymax = int(box[3])
  70. confidence = round(box[4] * 100, 2)
  71. class_id = int(box[5])
  72. cv2.rectangle(frame, pt1=(xmin, ymin), pt2=(xmax, ymax), color=(0, 255, 255), thickness=2)
  73. cvzone.putTextRect(frame, text=str(classes[class_id]) + ':' + str(confidence), pos=(xmin, ymin - 10), scale=1,
  74. thickness=1)
  75. # 计算结束时间
  76. end_time = time.time()
  77. FPS = round(1 / (end_time - start_time), 0)
  78. cv2.putText(img=frame, text='FPS: ' + str(FPS), org=(10, 50),
  79. fontFace=cv2.FONT_HERSHEY_SIMPLEX,
  80. fontScale=1.0, color=(0, 255, 0), thickness=2)
  81. cv2.imshow('detect', frame)
  82. key = cv2.waitKey(1)
  83. if key == 27:
  84. break
  85. cap.release()
  86. cv2.destroyAllWindows()
  87. if __name__ == '__main__':
  88. detectSignalImage('data/samples/dog.jpg')
  89. # detectTime()
  90. pass

4.源码理解

提示:以下的源码是在下载之后自己给添加的注释,主要是便于理解(很可能里面有理解错的地方,读者可自行修改方便自己查看),在里面添加了生成数据集相关文件的代码voc_label.py,生成anchors的代码generate_anchor.py以及用于预测的代码predict.py。

5.训练模型

提示:由于自己的电脑的用户名是中文,所以一直报下面的错误,因此我将没有修改的源码放置了之前在虚拟机里面配置好的Ubuntu系统下训练自己的代码,如果有读者也是存在这样报错的情况,可以搜索怎么在Ubuntu上配置和windows上差不多的代码运行环境(在配置过程可能存在很多的问题,但是CSDN都可以找到相关的解决方案)。

  1. File "unuran_wrapper.pyx", line 221, in init scipy.stats._unuran.unuran_wrapper
  2. File "unuran_wrapper.pyx", line 200, in scipy.stats._unuran.unuran_wrapper._setup_unuran
  3. File "messagestream.pyx", line 36, in scipy._lib.messagestream.MessageStream.__cinit__
  4. 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 源码理解


本文转载自: https://blog.csdn.net/Keep_Trying_Go/article/details/130900241
版权归原作者 Keep_Trying_Go 所有, 如有侵权,请联系我们删除。

“Pytorch实现的开源YOLOV3代码使用讲解+API测试+YOLOV3训练(详解)”的评论:

还没有评论