YOLO5 目标检测

2023-11-16

目录

1项目的克隆和必要的环境依赖

1.1项目的克隆

1.2项目代码结构整体介绍

1.3环境的安装和依赖的安装

2 数据集和预训练权重的准备

2.1利用labelimg标注数据和数据的准备

2.2 获得预训练权重

3训练自己的模型

3.1修改数据配置文件

3.2 修改模型配置文件

3.3训练自己的模型启用tensorbord查看参数

 3.4启用tensorbord查看参数

1项目的克隆和必要的环境依赖

1.1项目的克隆

       YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。不得不说GitHub的确是全球最大的男性交友网站,里面的人个个都是人才,yolov5发布才一年左右的时间,YOLOv5就已经更新了5个分支了,分别是yolov5.1-yolov5.5分支。该项目就是利用的yolov5.5分支来作为讲解。

       首先打开yolov5的github官网(这个网站在国外打开是很慢的,而且是有的时候能正常打开,有的时候是进不去的,但是大家第一次打不开的话,一定要多打开几次。)打开的官网界面如下,这个就是大神glenn-jocher开源的yolov5的项目。

       这个开源的项目通过大家的不断的完善和修复已经到了第5个分支,因此我们选择第五个版本来实验,首先点击左上角的master这个图标来选择项目的第5个分支,如下图所示,然后将版本选择好以后,点击右上角的code那个按键,将代码下载下来。至此整个项目就已经准备好了。

1.2项目代码结构整体介绍

       将我们下载好的yolov5的代码解压,然后用一款IDE打开(我用的是pycharm),打开之后整个代码目录如下图:

       现在来对代码的整体目录做一个介绍:

├── data:主要是存放一些超参数的配置文件(这些文件(yaml文件)是用来配置训练集和测试集还有验证集的路径的,其中还包括目标检测的种类数和种类的名称);还有一些官方提供测试的图片。如果是训练自己的数据集的话,那么就需要修改其中的yaml文件。但是自己的数据集不建议放在这个路径下面,而是建议把数据集放到yolov5项目的同级目录下面。

├── models:里面主要是一些网络构建的配置文件和函数,其中包含了该项目的四个不同的版本,分别为是s、m、l、x。从名字就可以看出,这几个版本的大小。他们的检测测度分别都是从快到慢,但是精确度分别是从低到高。这就是所谓的鱼和熊掌不可兼得。如果训练自己的数据集的话,就需要修改这里面相对应的yaml文件来训练自己模型。

├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等。

├── weights:放置训练好的权重参数。

├── detect.py:利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测。

├── train.py:训练自己的数据集的函数。

├── test.py:测试训练的结果的函数。

├──requirements.txt:这是一个文本文件,里面写着使用yolov5项目的环境依赖包的一些版本,可以利用该文本导入相应版本的包。

以上就是yolov5项目代码的整体介绍。我们训练和测试自己的数据集基本就是利用到如上的代码。

1.3环境的安装和依赖的安装

        关于深度学习的环境的安装,我已经写了一篇很详细的博客了,值得一提的一点就是,正常需要利用GPU去训练数据集的话,是需要安装对应的CUDA和cudnn的,但是我写的那篇博客是利用anaconda去配置环境,不要再额外的去英伟达的官网下载CUDA。

        博客的链接为利用Anaconda安装pytorch和paddle深度学习环境+pycharm安装---免额外安装CUDA和cudnn(适合小白的保姆级教学)

        打开requirements.txt这个文件,可以看到里面有很多的依赖库和其对应的版本要求。我们打开pycharm的命令终端,在中输入如下的命令,就可以安装了。

pip install -r requirements.txt
   
   

        至此,深度学习的环境和依赖包就都结束了。

2 数据集和预训练权重的准备

2.1利用labelimg标注数据和数据的准备

       这里有很完备教程,教你使用labelimg,给自己的数据集来打上标签。利用labelimg制作自己的深度学习目标检测数据集

        还有很完备的代码将labelimg标注好的voc格式或者yolo格式相互转换。labelimg标注的VOC格式标签xml文件和yolo格式标签txt文件相互转换

       还有完备的代码可以将格式转换好的数据集划分为训练集和验证集来训练我们自己的yolov5模型。目标检测算法---将数据集为划分训练集和验证集

        数据最好放在最外一级目录中,然后数据集的目录格式如下图所示。大家一定要严格按我的格式来,否则非常容易出问题。

2.2 获得预训练权重

       一般为了缩短网络的训练时间,并达到更好的精度,我们一般加载预训练权重进行网络的训练。而yolov5的5.0版本给我们提供了几个预训练权重,我们可以对应我们不同的需求选择不同的版本的预训练权重。通过如下的图可以获得权重的名字和大小信息,可以预料的到,预训练权重越大,训练出来的精度就会相对来说越高,但是其检测的速度就会越慢。预训练权重可以通过这个网址进行下载,本次训练自己的数据集用的预训练权重为yolov5s.pt。

3训练自己的模型

3.1修改数据配置文件

         预训练模型和数据集都准备好了,就可以开始训练自己的yolov5目标检测模型了,训练目标检测模型需要修改两个yaml文件中的参数。一个是data目录下的相应的yaml文件,一个是model目录文件下的相应的yaml文件。

       修改data目录下的相应的yaml文件。找到目录下的voc.yaml文件,将该文件复制一份,将复制的文件重命名,最好和项目相关,这样方便后面操作。我这里修改为hat.yaml。该项目是对安全帽的识别。

       打开这个文件夹修改其中的参数,首先将箭头1中的那一行代码注释掉(我已经注释掉了),如果不注释这行代码训练的时候会报错;箭头2中需要将训练和测试的数据集的路径填上(最好要填绝对路径,有时候由目录结构的问题会莫名奇妙的报错);箭头3中需要检测的类别数,我这里是识别安全帽和人,所以这里填写2;最后箭头4中填写需要识别的类别的名字(必须是英文,否则会乱码识别不出来)。到这里和data目录下的yaml文件就修改好了。

3.2 修改模型配置文件

       由于该项目使用的是yolov5s.pt这个预训练权重,所以要使用models目录下的yolov5s.yaml文件中的相应参数(因为不同的预训练权重对应着不同的网络层数,所以用错预训练权重会报错)。同上修改data目录下的yaml文件一样,我们最好将yolov5s.yaml文件复制一份,然后将其重命名,我将其重命名为yolov5_hat.yaml。

        打开yolov5_hat.yaml文件只需要修改如图中的数字就好了,这里是识别两个类别。

       至此,相应的配置参数就修改好了。

3.3训练自己的模型启用tensorbord查看参数

       如果上面的数据集和两个yaml文件的参数都修改好了的话,就可以开始yolov5的训练了。首先我们找到train.py这个py文件。

         然后找到主函数的入口,这里面有模型的主要参数。模型的主要参数解析如下所示。


   
   
  1. if __name__ == '__main__':
  2. """
  3. opt模型主要参数解析:
  4. --weights:初始化的权重文件的路径地址
  5. --cfg:模型yaml文件的路径地址
  6. --data:数据yaml文件的路径地址
  7. --hyp:超参数文件路径地址
  8. --epochs:训练轮次
  9. --batch-size:喂入批次文件的多少
  10. --img-size:输入图片尺寸
  11. --rect:是否采用矩形训练,默认False
  12. --resume:接着打断训练上次的结果接着训练
  13. --nosave:不保存模型,默认False
  14. --notest:不进行test,默认False
  15. --noautoanchor:不自动调整anchor,默认False
  16. --evolve:是否进行超参数进化,默认False
  17. --bucket:谷歌云盘bucket,一般不会用到
  18. --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
  19. --image-weights:使用加权图像选择进行训练
  20. --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
  21. --multi-scale:是否进行多尺度训练,默认False
  22. --single-cls:数据集是否只有一个类别,默认False
  23. --adam:是否使用adam优化器
  24. --sync-bn:是否使用跨卡同步BN,在DDP模式使用
  25. --local_rank:DDP参数,请勿修改
  26. --workers:最大工作核心数
  27. --project:训练模型的保存位置
  28. --name:模型保存的目录名称
  29. --exist-ok:模型目录是否存在,不存在就创建
  30. """
  31. parser = argparse.ArgumentParser()
  32. parser.add_argument( '--weights', type= str, default= 'yolov5s.pt', help= 'initial weights path')
  33. parser.add_argument( '--cfg', type= str, default= '', help= 'model.yaml path')
  34. parser.add_argument( '--data', type= str, default= 'data/coco128.yaml', help= 'data.yaml path')
  35. parser.add_argument( '--hyp', type= str, default= 'data/hyp.scratch.yaml', help= 'hyperparameters path')
  36. parser.add_argument( '--epochs', type= int, default= 300)
  37. parser.add_argument( '--batch-size', type= int, default= 16, help= 'total batch size for all GPUs')
  38. parser.add_argument( '--img-size', nargs= '+', type= int, default=[ 640, 640], help= '[train, test] image sizes')
  39. parser.add_argument( '--rect', action= 'store_true', help= 'rectangular training')
  40. parser.add_argument( '--resume', nargs= '?', const= True, default= False, help= 'resume most recent training')
  41. parser.add_argument( '--nosave', action= 'store_true', help= 'only save final checkpoint')
  42. parser.add_argument( '--notest', action= 'store_true', help= 'only test final epoch')
  43. parser.add_argument( '--noautoanchor', action= 'store_true', help= 'disable autoanchor check')
  44. parser.add_argument( '--evolve', action= 'store_true', help= 'evolve hyperparameters')
  45. parser.add_argument( '--bucket', type= str, default= '', help= 'gsutil bucket')
  46. parser.add_argument( '--cache-images', action= 'store_true', help= 'cache images for faster training')
  47. parser.add_argument( '--image-weights', action= 'store_true', help= 'use weighted image selection for training')
  48. parser.add_argument( '--device', default= '', help= 'cuda device, i.e. 0 or 0,1,2,3 or cpu')
  49. parser.add_argument( '--multi-scale', action= 'store_true', help= 'vary img-size +/- 50%%')
  50. parser.add_argument( '--single-cls', action= 'store_true', help= 'train multi-class data as single-class')
  51. parser.add_argument( '--adam', action= 'store_true', help= 'use torch.optim.Adam() optimizer')
  52. parser.add_argument( '--sync-bn', action= 'store_true', help= 'use SyncBatchNorm, only available in DDP mode')
  53. parser.add_argument( '--local_rank', type= int, default=- 1, help= 'DDP parameter, do not modify')
  54. parser.add_argument( '--workers', type= int, default= 8, help= 'maximum number of dataloader workers')
  55. parser.add_argument( '--project', default= 'runs/train', help= 'save to project/name')
  56. parser.add_argument( '--entity', default= None, help= 'W&B entity')
  57. parser.add_argument( '--name', default= 'exp', help= 'save to project/name')
  58. parser.add_argument( '--exist-ok', action= 'store_true', help= 'existing project/name ok, do not increment')
  59. parser.add_argument( '--quad', action= 'store_true', help= 'quad dataloader')
  60. parser.add_argument( '--linear-lr', action= 'store_true', help= 'linear LR')
  61. parser.add_argument( '--label-smoothing', type= float, default= 0.0, help= 'Label smoothing epsilon')
  62. parser.add_argument( '--upload_dataset', action= 'store_true', help= 'Upload dataset as W&B artifact table')
  63. parser.add_argument( '--bbox_interval', type= int, default=- 1, help= 'Set bounding-box image logging interval for W&B')
  64. parser.add_argument( '--save_period', type= int, default=- 1, help= 'Log model after every "save_period" epoch')
  65. parser.add_argument( '--artifact_alias', type= str, default= "latest", help= 'version of dataset artifact to be used')
  66. opt = parser.parse_args()

         训练自己的模型需要修改如下几个参数就可以训练了。首先将weights权重的路径填写到对应的参数里面,然后将修好好的models模型的yolov5s.yaml文件路径填写到相应的参数里面,最后将data数据的hat.yaml文件路径填写到相对于的参数里面。这几个参数就必须要修改的参数。


   
   
  1. parser.add_argument( '--weights', type= str, default= 'weights/yolov5s.pt', help= 'initial weights path')
  2. parser.add_argument( '--cfg', type= str, default= 'models/yolov5s_hat.yaml', help= 'model.yaml path')
  3. parser.add_argument( '--data', type= str, default= 'data/hat.yaml', help= 'data.yaml path')

         还有几个需要根据自己的需求来更改的参数:

        首先是模型的训练轮次,这里是训练的300轮。

parser.add_argument('--epochs', type=int, default=300)
   
   

         其次是输入图片的数量和工作的核心数,这里每个人的电脑都不一样,所以这里每个人和自己的电脑的性能来。这里可以根据我的电脑的配置做参考,我的电脑是拯救者R9000,3060版本的显卡,cpu的核心数是8核。我的电脑按默认的参数输入图片数量为16,工作核心为8的话就会出现GPU显存溢出的报错。报错信息如下:

         这里就要调小这两个参数了,每个人的电脑配置不一样,所以可以根据自己的电脑配置来修改参数。

parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs')
   
   
parser.add_argument('--workers', type=int, default=8, help='maximum number of dataloader workers')
   
   

       以上都设置好了就可以训练了。但是pycharm的用户可能会出现如下的报错。这是说明虚拟内存不够了。         可以根据如下的操作来修改,在utils路径下找到datasets.py这个文件,将里面的第81行里面的参数nw改完0就可以了。

        至此,就可以运行train.py函数训练自己的模型了。 

 3.4启用tensorbord查看参数

         yolov5里面有写好的tensorbord函数,可以运行命令就可以调用tensorbord,然后查看tensorbord了。首先打开pycharm的命令控制终端,输入如下命令,就会出现一个网址地址,将那行网址复制下来到浏览器打开就可以看到训练的过程了

tensorboard --logdir=runs/train
   
   

        如下图所示,这是已经训练了100轮了。

        如果模型已经训练好了,但是我们还想用tensorbord查看此模型的训练过程,就需要输入如下的命令。就可以看到模型的训练结果了。

tensorboard --logdir=runs

   
   

4 推理测试

        等到数据训练好了以后,就会在主目录下产生一个run文件夹,在run/train/exp/weights目录下会产生两个权重文件,一个是最后一轮的权重文件,一个是最好的权重文件,一会我们就要利用这个最好的权重文件来做推理测试。除此以外还会产生一些验证文件的图片等一些文件。

         找到主目录下的detect.py文件,打开该文件。

        然后找到主函数的入口,这里面有模型的主要参数。模型的主要参数解析如下所示。 


   
   
  1. f __name__ == '__main__':
  2. """
  3. --weights:权重的路径地址
  4. --source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流
  5. --output:网络预测之后的图片/视频的保存路径
  6. --img-size:网络输入图片大小
  7. --conf-thres:置信度阈值
  8. --iou-thres:做nms的iou阈值
  9. --device:是用GPU还是CPU做推理
  10. --view-img:是否展示预测之后的图片/视频,默认False
  11. --save-txt:是否将预测的框坐标以txt文件形式保存,默认False
  12. --classes:设置只保留某一部分类别,形如0或者0 2 3
  13. --agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
  14. --augment:推理的时候进行多尺度,翻转等操作(TTA)推理
  15. --update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
  16. --project:推理的结果保存在runs/detect目录下
  17. --name:结果保存的文件夹名称
  18. """
  19. parser = argparse.ArgumentParser()
  20. parser.add_argument( '--weights', nargs= '+', type= str, default= 'yolov5s.pt', help= 'model.pt path(s)')
  21. parser.add_argument( '--source', type= str, default= 'data/images', help= 'source') # file/folder, 0 for webcam
  22. parser.add_argument( '--img-size', type= int, default= 640, help= 'inference size (pixels)')
  23. parser.add_argument( '--conf-thres', type= float, default= 0.25, help= 'object confidence threshold')
  24. parser.add_argument( '--iou-thres', type= float, default= 0.45, help= 'IOU threshold for NMS')
  25. parser.add_argument( '--device', default= '', help= 'cuda device, i.e. 0 or 0,1,2,3 or cpu')
  26. parser.add_argument( '--view-img', action= 'store_true', help= 'display results')
  27. parser.add_argument( '--save-txt', action= 'store_true', help= 'save results to *.txt')
  28. parser.add_argument( '--save-conf', action= 'store_true', help= 'save confidences in --save-txt labels')
  29. parser.add_argument( '--nosave', action= 'store_true', help= 'do not save images/videos')
  30. parser.add_argument( '--classes', nargs= '+', type= int, help= 'filter by class: --class 0, or --class 0 2 3')
  31. parser.add_argument( '--agnostic-nms', action= 'store_true', help= 'class-agnostic NMS')
  32. parser.add_argument( '--augment', action= 'store_true', help= 'augmented inference')
  33. parser.add_argument( '--update', action= 'store_true', help= 'update all models')
  34. parser.add_argument( '--project', default= 'runs/detect', help= 'save results to project/name')
  35. parser.add_argument( '--name', default= 'exp', help= 'save results to project/name')
  36. parser.add_argument( '--exist-ok', action= 'store_true', help= 'existing project/name ok, do not increment')
  37. opt = parser.parse_args()

         这里需要将刚刚训练好的最好的权重传入到推理函数中去。然后就可以对图像视频进行推理了。

parser.add_argument('--weights', nargs='+', type=str, default='runs/train/exp/weights/best.pt', help='model.pt path(s)')
   
   

        对图片进行测试推理,将如下参数修改成图片的路径,然后运行detect.py就可以进行测试了。

 parser.add_argument('--source', type=str, default='000295.jpg', help='source') 
   
   

        推理测试结束以后,在run下面会生成一个detect目录,推理结果会保存在exp目录下。如图所示。

         图片的推理结果如下所示。效果还是很不错的。

        对视频进行测试,和如上的图片的测试是一样的,只不过是将图片的路径改为视频的路径而已。利用摄像头进行测试只需将路径改写为0就好了。但是好像还是会报错,这一点卡了我很久。报错如下。

         解决方法:首先找到datasets.py这个py文件。

        打开文件,找到第279行代码,给两个url参数加上str就可以了,如图所示,就可以完美运行电脑的摄像头了。 

        至此yolov5训练自己的模型就完全搞定了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

YOLO5 目标检测 的相关文章

随机推荐

  • Kendo UI开发教程(16): Kendo MVVM 数据绑定(五) Events

    本篇和Kendo UI开发教程 14 Kendo MVVM 数据绑定 三 Click类似 为事件绑定的一般形式 Events绑定支持将ViewModel的方法绑定到DOM元素的事件处理 如鼠标事件 例如 1
  • c++中管道代码_如何在管道中添加动态代码分析

    c 中管道代码 我们大多数人都对著名的马克 扎克伯格宣言 快速行动并打破事物 非常熟悉 在2014年 这是一个非常大胆的声明 正如扎克伯格很快意识到的那样 可能太过大胆了 后来他撤回了它 表明了他想要快速行动但保持稳定的新愿望 为了更好地解
  • layui复选框

    效果图 layui复选框 一个主的复选框控制多个从复选框 主复选框和从复选框的颜色不一样 layui复选框的样式 都是在选然后才会有的 所以直接通过css设置就实现不了了 只可以通过js动态设置 html代码使用了jfinal的模板 div
  • C++之string

    一些简单的关于string对象的知识 以后还会补充 1 2 3 4 5 6 7 8 9 10 11
  • 详解C结构体、C++结构体 和 C++类的区别

    先来说说C和C 中结构体的不同 a C语言中的结构体不能为空 否则会报错 1 gt d myproject visual studio 2013 projects myc main c 71 error C2016 C 要求一个结构或联合至
  • IP地址学习总结

    IP地址 IP地址是局域网中某台主机的唯一标识 一段二进制编码 由32位组成 但是通常使用点分十进制来表示 便于记忆 x x x x 子网掩码 在同一局域网中 所有的IP必须在同一网段才能相互通信 而子网掩码用来标识是属于哪一个网段 确定I
  • uniapp - 实现微信小程序电子签名板,横屏手写姓名签名专用写字画板(详细运行示例,一键复制开箱即用)

    效果图 实现了在uniapp项目中 微信小程序平台流畅的写字签名板 也可以绘图 功能源码 复制粘贴 改改样式几分钟即可搞定 支持自动横屏 持预览 真机运行测试非常流畅不卡顿 基础模板 如下代码所示
  • Harbor镜像仓库搭建

    1 安装docker comprose docker comprose是docker容器批量管理工具 curl L https get daocloud io docker compose releases download 1 25 0
  • Unity3d 物体速度、运动的控制——Input.GetAxis、transform.Translate、transform.Rotate、AddForce

    首先介绍Input GetAxis方法 官方文档给出的解释为 Returns the value of the virtual axis identified by axisName 返回根据参数名所指定的虚拟轴上的数值 public st
  • 深入浅出AXI协议(6)——传输属性

    一 前言 在之前的文章中 我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构 主要讲述了当遇到各种特殊情况时 AXI如何完成数据的读写操作 最后介绍了读写响应的4种类型 在本文中 我们将介绍AXI协议的传输属性 二 传输类型与属性
  • 性能测试流程

    参考书籍 软件测试 黑马程序员编著 性能测试与普通的功能测试目标不同 因此其测试流程与普通的测试流程也不相同 虽然性能测试也遵循测试需求分析 测试计划制订 测试用例设计 测试执行 编写测试报告的基本过程 但在实现细节上 性能测试有单独一套流
  • GDAL源码剖析(一)

    转载自 http blog csdn net liminlu0314 article details 6933772 前言 一直在使用和研究GDAL的相关东西 发现网上对GDAL的内容倒是不少 但是很少有系统的介绍说明 以及内部的一些结构说
  • Centos7 交叉编译boost_1_70_0源码 AArch架构

    环境准备 centos7 镜像 下载地址 http mirrors aliyun com centos 7 9 2009 isos x86 64 aarch64交叉编译链 下载地址 https releases linaro org com
  • JS 使用hash算法计算字符串的哈希值

  • DFS遍历框架解决岛屿问题

    补充在开头 这篇题解 是我在做leetcode无意中看到的 原po将此类问题解释的非常清晰 故将其转载并添加上对应题目的解题代码 仅用做个人的学习笔记 不做任何商业用途 引言 我们所熟悉的 DFS 深度优先搜索 问题通常是在树或者图结构上进
  • [UE4笔记] 3DUI空间交互

    在Actor中使用widget的时候制作3DUI 如果直接选择World模式 鼠标和UI是无法产生交互的 只要勾选了红框里的选项 就可以正常交互了 老是忘记 所以写个笔记记录一下 效果 注意 如果你还是点击不到 输入控制台命令showfla
  • 第十题

    第十题 限制元素 修改限制 把3改了即可
  • 【嵌入式基础】串口通信

    目录 1 前言 2 基本概念 2 1 波特率 2 2 起始位 2 3 数据位 2 4 校验位 2 5 停止位 2 6 空闲位 3 工作模式 3 1 单工模式 3 2 半双工模式 3 3 全双工模式 4 同步通信和异步通信 4 1 同步通信
  • 【Mac 教程系列第 18 篇】如何修改 iTerm2 的背景图片

    这是 Mac 教程系列第 18 篇 如果觉得有用的话 欢迎关注专栏 默认终端的效果图是这样的 修改后的效果如下图所示 如果你已经习惯了默认终端的样式 前期看有背景图片的可能会不太适应 不过有时候尝试一下不同的风格 也许会有不同的体验 如何实
  • YOLO5 目标检测

    目录 1项目的克隆和必要的环境依赖 1 1项目的克隆 1 2项目代码结构整体介绍 1 3环境的安装和依赖的安装 2 数据集和预训练权重的准备 2 1利用labelimg标注数据和数据的准备 2 2 获得预训练权重 3训练自己的模型 3 1修