1.YOLOv5 目录结构

├──.github:包含了USSUE_TEMPLATE和workflows,是存一些配置文件的,不太重要,可以不用管他

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

 

               hyps文件夹   # 存放yaml格式的超参数配置文件

               images  # 存放着官方给的两张测试图片

               scripts  # 存放多类数据集和权重下载shell脚本

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

├── utils:存放的是工具类的函数,里面有loss函数,metrics函数,plots函数等等,还有连接和中断相关平台的工具。

同级其他目录文件

  • .dockerignore   # docker的ignore文件
  • .gitattributes   # 用于将.ipynb后缀的文件剔除GitHub语言统计
  • .gitignore   #  docker的ignore文件
  • CONTRIBUTING.md  # markdown格式说明文档
  • detect.py   #  利用训练好的权重参数进行目标检测,可以进行图像、视频和摄像头的检测
  • export.py  #  模型导出
  • hubconf.py  # pytorch hub相关
  • LICENSE    # 证书
  • README.md    # markdown格式说明文档
  • requirements.txt  # 可以通过pip install requirement进行依赖环境下载
  • setup.cfg  #  项目打包文件
  • train.py   # 训练自己的数据集的函数。
  • tutorial.ipynb  #  目标检测上手教程
  • val.py  # 目标检测验证脚本

2.文件夹 runs 训练后才出现

文件夹 train 存放着训练数据时记录的数据过程
文件夹 detect 存放着使用训练好的模型,每次预测判断的数据

3.训练自己的模型

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

       修改data目录下的相应的yaml文件。找到目录下的coco.yaml文件,将该文件复制一份,将复制的文件重命名,最好和项目相关,这样方便后面操作。我这里修改为test1.yaml

       打开这个文件夹修改其中的参数,

更改后

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

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

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

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

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

if __name__ == '__main__':
"""
    opt模型主要参数解析:
    --weights:初始化的权重文件的路径地址
    --cfg:模型yaml文件的路径地址
    --data:数据yaml文件的路径地址
    --hyp:超参数文件路径地址
    --epochs:训练轮次
    --batch-size:喂入批次文件的多少
    --img-size:输入图片尺寸
    --rect:是否采用矩形训练,默认False
    --resume:接着打断训练上次的结果接着训练
    --nosave:不保存模型,默认False
    --notest:不进行test,默认False
    --noautoanchor:不自动调整anchor,默认False
    --evolve:是否进行超参数进化,默认False
    --bucket:谷歌云盘bucket,一般不会用到
    --cache-images:是否提前缓存图片到内存,以加快训练速度,默认False
    --image-weights:使用加权图像选择进行训练
    --device:训练的设备,cpu;0(表示一个gpu设备cuda:0);0,1,2,3(多个gpu设备)
    --multi-scale:是否进行多尺度训练,默认False
    --single-cls:数据集是否只有一个类别,默认False
    --adam:是否使用adam优化器
    --sync-bn:是否使用跨卡同步BN,在DDP模式使用
    --local_rank:DDP参数,请勿修改
    --workers:最大工作核心数
    --project:训练模型的保存位置
    --name:模型保存的目录名称
    --exist-ok:模型目录是否存在,不存在就创建
"""
    训练自己的模型需要修改如下几个参数就可以训练了。首先将weights权重的路径填写到对应的参数里面,然后将修好好的models模型的yolov5s.yaml文件路径填写到相应的参数里面,最后将data数据的text1.yaml文件路径填写到相对于的参数里面。这几个参数就必须要修改的参数

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

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

  parser.add_argument('--epochs', type=int, default=300)
         其次是输入图片的数量和工作的核心数,这里每个人的电脑都不一样,所以这里每个人和自己的电脑的性能来, 这里就要调小这两个参数了,每个人的电脑配置不一样,所以可以根据自己的电脑配置来修改参数。官方给的是16,但是因为电脑的限制,可以把batch-size改为8

parser.add_argument('--batch-size', type=int, default=8, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--workers', type=int, default=8, help='max dataloader workers (per RANK in DDP mode)')


       以上都设置好了就可以训练了。但是pycharm的用户可能会出现如下的报错。这是说明虚拟内存不够了。  

     

可以根据如下的操作来修改,在utils路径下找到datasets.py这个文件,将里面的搜索 num_workers参数nw改完0就可以了。

 

 

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

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

 

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

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

tensorboard --logdir=runs
4 推理测试

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

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

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

f __name__ == '__main__':
"""
--weights:权重的路径地址
--source:测试数据,可以是图片/视频路径,也可以是'0'(电脑自带摄像头),也可以是rtsp等视频流
--output:网络预测之后的图片/视频的保存路径
--img-size:网络输入图片大小
--conf-thres:置信度阈值
--iou-thres:做nms的iou阈值
--device:是用GPU还是CPU做推理
--view-img:是否展示预测之后的图片/视频,默认False
--save-txt:是否将预测的框坐标以txt文件形式保存,默认False
--classes:设置只保留某一部分类别,形如0或者0 2 3
--agnostic-nms:进行nms是否也去除不同类别之间的框,默认False
--augment:推理的时候进行多尺度,翻转等操作(TTA)推理
--update:如果为True,则对所有模型进行strip_optimizer操作,去除pt文件中的优化器等信息,默认为False
--project:推理的结果保存在runs/detect目录下
--name:结果保存的文件夹名称

修改为相关路径的权重
""

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


        对图片进行测试推理,将如下参数修改成图片的路径,然后运行detect.py就可以进行测试了。
        推理测试结束以后,在run下面会生成一个detect目录,推理结果会保存在exp目录下。如图所示。

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

 

        对视频进行测试,和如上的图片的测试是一样的,只不过是将图片的路径改为视频的路径而已。

        利用摄像头进行测试只需将路径改写为0就好了。但是好像还是会报错,这一点卡了我很久。报错如下。

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

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

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

参考

YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析_yolov5 源码解析_路人贾'ω'的博客-CSDN博客目标检测---教你利用yolov5训练自己的目标检测模型_yolov5训练模型_炮哥带你学的博客-CSDN博客

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐