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进行训练。

"""
@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 源码理解


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

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

还没有评论