• YOLO V5 使用


    目录

    前言:

    环境:

    1.安装python所需的数据库

    2.采集图片样本

    2.1勾选View内容

    2.2切换至YOLO模式?

    2.3打开训练图集文件以及labels文件

    2.4建立类名

    2.5开始标记:

    3.训练模型

    4.模型预测

    5.预测结果的返回

    补充:

    6.打包成exe文件


    前言:

    针对刚刚入门,本文旨在以最简单粗暴的方式跑起YOLOV5的模型训练与预测代码,暂时不对其原理做解析。针对学习的内容进行的总结,后续根据情况会持续更新。

    环境:

    操作系统:win10

    python:3.8.10(64bit)

    开发环境:eclipse

    yoloV5:github原下载地址

    yoloV5分流下载地址

    图片标注标注工具:labelImg——labelImg工具原github下载地址

    无需配置环境,可直接使用的labelImg.exe文件包——下载地址

    注意,原VOLO作者关于python版本有提到:

    python必须是大于等于3.7版本,pyTorch在下面执行自动安装库时,会自动安装最新版本的,所以不用担心。

    1.安装python所需的数据库

    打开yoloV5文件夹,找到requirements.txt文件,里面有需要下载的库

    然后打开cmd

    cmd——cd 到requirements.txt所在文件——执行pip install -r requirements.txt

    就能自动完成安装。本文为了方便管理库,我是把requirements.txt复制粘贴到了

    C:Users…AppDataLocalProgramsPythonPython38Libsite-packages中进行的安装

    2.采集图片样本

    图片标注——labelImg工具的使用:

    2.1勾选View内容

    2.2切换至YOLO模式

    2.3打开训练图集文件以及labels文件

    点击Open dir选择我们训练图片所在的文件夹images,选择之后会弹窗让你选择labels所在的文件夹。labels文件夹需要自己建立,名字随意,目的是用来存储图片标注后的信息。如果第二个弹窗没有弹出或者选错了,可以点击change save dir进行修改。以下是本文案例样式。

    最后A.yaml是YOLO训练数据的信息文件,也是需要自己建立,里面内容后面讲解。

    2.4建立类名

    2.5开始标记:

    常用快捷键:w,a,d

    w——创建一个检测box,就是方框

    a——前一张图片

    d——下一张图片

    Ctrl + s——保存结果,先前View中勾选了Auto Save mode后,只需框选,然后下一张,就能自动保存

    框选错误可以通过EditRectBox来删除,选中错误框后,按delete

    标记完成后,我们就能在labels文件夹下面看到标注的数据了。

    最后还需要编辑A.yaml文件

    编辑内容:

    # train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
    train: D:/mvsd/yolo_test/images
    val: D:/mvsd/yolo_test/images
    # number of classes
    nc: 1
    
    # class names
    names: ['A dog']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中需要自己修改的内容为:

    train与val后的地址,地址均指向训练图集的文件夹。以及names后的内容,类名这些。

    至此训练模型的数据就准备好了。

    3.训练模型

    3.1eclipse打开VOLO的工作站

    找到yolov5-master文件夹即可

    3.2在yolov5-master工作站中新建py文件,并执行代码

    import train
    if __name__ == '__main__':
        train.run(data='C:\yolov5-master\tese_data\yolo_dog\A.yaml',
        batch=8,epochs=300,single_cls=True,
        weights='C:\yolov5-master\tese_data\yolo_dog\yolov5s.pt')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    train中部分参数详解:

    data 数据集配置文件路径

    imgsz 训练测试图片分辨率

    single_cls 训练集是否只有一个类别

    训练参数只能参考,具体还需根据自身情况经行调整。

    模型训练完后,会显示结果保存的地方,如图:

    我这里虽然有乱码,但保存的地方就是yolov5-master uns rainexp463

    模型保存地方也就是weights这文件夹里。我的模型训练样本数有150张狗狗的照片。

    4.模型预测

    import detect
    if __name__ == '__main__':
        detect.run(weights="C:\yolov5-master\runs\train\exp463\weights\best.pt",
        data="C:\yolov5-master\tese_data\yolo_dog\A.yaml",
        conf_thres=0.25,view_img=True,nosave=True,
        source='D:\mvsd\test\0.JPG')
    while 1:
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    weights:训练的权重
    source:测试数据,可以是图片/视频路径,也可以是’0’(电脑自带摄像头),也可以是rtsp等视频流
    output:网络预测之后的图片/视频的保存路径
    img-size:网络输入图片大小
    conf-thres:置信度阈值(检测精度,作者是设置的0.25)
    iou-thres:做nms的iou阈值(),从这些框框中选出最优最准确的框。
    device:设置设备
    view-img:是否展示预测之后的图片/视频,默认False
    save_txt:是否将预测的框坐标以txt文件形式保存,默认False
    save_conf:是否将预测的置信度以txt文件形式保存,默认Falses
    save_crop:是否将框中图片保存,默认False
    nosave:是否保存结果,默认False
    classes:设置只保留某一部分类别,形如0或者0 2 3
    agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
    augment:推理的时候进行多尺度,翻转等操作(TTA)推理
    update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False

    效果如图:

    5.预测结果的返回

    原detect代码里面有保存结果的参数,即save_txt以及save_conf等,将这两个参数设置为True后,能在预测的文件里面找到中心坐标以及置信度了,比如:

    保存的地方就是yolov5-master unsdetectexp系列的文件里面。

    如果要单独提取结果,就需要对源代码进行部分修改,首先我们在detect.py里面找到:

    其中xywh就是框坐标的内容,即中心xy以及宽高。conf就是置信度。但要注意,原代码是建立在save_txt=True的基础上,也就意味着每次调用detect代码,都会在runsdetect里面新建exp文件,随着时间增加就会越建越多,需要清理。所以在不需要将结果保存到文件夹里面时,最好的办法就是将:

    代码放在if前面,同时nosave=True即可。我的做法是添加代码:

    xywh_result = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywh
    xywh_result.append(conf.item())
    
    • 1
    • 2

    即:

    最后可以在代码末端加入return xywh_result就能直接返回结果了。(上传的yoloV5分流文件中已经做好了修改)

    补充:

    通过上述方法返回的中心坐标是经过转换过后的坐标,不是原图片上的坐标。就和我们标注过后储存在labels里面的坐标一样,是有一定的差别需要转换的。

    以下是我补充的内容:找寻框坐标,即框中图片范围以数字形式表示出来。这个内容用参数save_crop也能提取出框的图片。

    找到代码:

    这里xyxy参数就是我们框在原图中的实际范围。 print一下该参数能得到类似以下的列表:

    [tensor(258.), tensor(26.), tensor(601.), tensor(352.)]

    tensor里面的数据就是框的范围,含义如图:

    图片左上角为原点,列表[左上y,左上x,右下y,右下x]

    这个数据可以由以下代码验证:

    #pip install matplotlib 
    import matplotlib.pyplot as plt # plt 用于显示图片
    import matplotlib.image as mpimg # mpimg 用于读取图片
    st='D:\mvsd\test\0.JPG'
    lena = mpimg.imread(st) 
    lena=lena[26:352,258:601]
    plt.imshow(lena)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    效果如图:

    6.打包成exe文件

    打包exe文件用的是pyinstaller库,具体打包方法就不赘述了,在打包过程中我遇到的坑,进行一下介绍。

    打包过程中出现报错:

    问题原因是出在编码错误 ,在确认自己写的主文件中无乱码时,尝试了各种办法,包括首行添加代码:# coding: utf-8,均无效。经排查发现,原代码detect.py中开头注释出现了乱码:

    删掉该注释才能成功打包成exe文件。

    同样在train.py中也有, 如果自己的主代码有引用train.py,同样也要删除才能成功打包。

  • 相关阅读:
    dart、flutter学习记录
    【PAT甲级 - C++题解】1062 Talent and Virtue
    R语言数学建模(三)—— 模型工作流
    国际经济合作知识点归纳
    前端html原生页面兼容多端H5和移动端适配方案
    Raid0创建
    边缘计算 KubeEdge+EdgeMash
    postman拦截浏览器请求
    Java 线程池、Thread类、创建线程的几种方式、Executor 框架、异步编排、completableFuture使用详解
    Swift中的内存访问冲突、指针、局部作用域
  • 原文地址:https://blog.csdn.net/m0_67401228/article/details/125346037