Skip to content

based on yolo-high-level project (detect\pose\classify\segment\):include yolov5\yolov7\yolov8\ core ,improvement research ,SwintransformV2 and Attention Series. training skills, business customization, engineering deployment C

License

Notifications You must be signed in to change notification settings

positive666/yolo_research

Repository files navigation

🚀 yolo_research PLUS High-level

🚀🚀🚀添加一键批量自动生成标注的工具You Only click Once ,Prompt-Can-Anything:Auto label tools 🚀🚀🚀Add latest V8 core yolov8解析:https://blog.csdn.net/weixin_44119362/article/details/129417459 ,(工作繁忙,会不断更新优化,有问题挂issue)

⭐新闻板块【实时更新&&记录学习】

- 2023/5/15 更新来自ultralytics的rt-detr模型和数据增强mosica9,工程还存在不少问题和优化工作,不影响使用前提下,会业余花时间会慢慢更新。
- 2023/4/27 添加一键批量自动生成标注的工具You Only click Once ,[Prompt-Can-Anything:Auto label tools](https://github.com/positive666/Prompt-Can-Anything)
- 2023/4/6  从2021年到2023年,即使不做检测,依然坚持更新,搬砖不易,后续会有更多更新,但是目前先集成稳定各个功能为主:更新v8的pose模块,支持v8代码训练自定义的网络结构并加载权重训练;之前的问题作个简单解释:就是在安装源码环境后其实只是支持你解析官方的预训练权重,如果你用本项目的代码训练后,可以卸载掉源码环境,继续更新中
- 2023/3/28 同步兼容最新的V8代码更新:目前V8依赖于pip install ultralytics,我在代码更新中也发现了该问题,虽然本项目做了分离,但是使用官方权重作为预训练权重去加载的前提下:仍然需要依赖中的ultralytics.nn文件夹,不然可能会报错,因为是这样的本项目改了模型层的参数名字,因为V8每层的名字是带“ultralytics.nn ”的,如果不安装这个部分代码,你torch打不开V8官方的权重,故目前两种解决办法:1.scratch 2.pip安装后打开将权重名字重构 3.代码目录修改 后续我会优化解决,不过目前项目中的工作太多了,故如果出现报错还是使用临时解决方案:pip install ultralytics,这样比较简单直接兼容,然后可以运行 python train_v8.py ,未解决的就是如果自定义机构可能无法直接加载官方的权重,汇后续解决!  
- 2023/3/1  add v8 core:春节期间看V8,由于近半年项目比较多也是耽误了好久(原版本是将V8的所有功能全部融合到了V5的代码中,和V8命令一样,但是训练的时候发生了问题,排查发现问题发生在V5的数据读取处理,所以暂时使用V8的训练结构代码,也便于区分),然后抓紧时间不停更新;
- 2022/11/23 修复已知BUG,V7.0版本更新兼容,年底比较忙后续忙完业务会大更新
- 2022/10/20 修复适配V7结构和额外任务引起的一些代码问题,实时更新V5的代码优化部分,添加了工具grad_cam在tools目录。
- 2022/9/19 修复已知BUG,更新了实时的V5BUG修复和代码优化融合验证,核心检测、分类、分割的部分CI验证,关键点检测实测训练正常,基本功能整理完毕。
- 2022/9/15 分类、检测、分割、关键点检测基本整合完毕,工程结构精简化中,关键点检测训练正常已经验证,分割待调试,火速迭代中
- 分割代码结合V5和V7的代码进行了合并DEBUG调试,训练部分待验证,另外注意力层训练过程中,没法收敛或者NAN的情况,排除代码问题,需要在超参数YAML里,先对学习衰减率从改为0.2 ,比如GAM的注意力头部问题,训练周期加到400epoch+ 就可以。
- 去年的decoupled结构虽然能提点,不过FLOPS增加的太多,目前用V5作者分支的解耦头替换,效果待验证。
- 融合了代码做了部分的优化,这里看了下V7的代码优化较差,后续会集成精简版本的分类、分割、检测、POSE检测的结构,目前已经完成了一部分工作,更新频繁有问题欢迎反馈和提供实验结果。

关于这个项目的使用说明详请可参考下面博客: csdn持续更新2021-2022年 ,csdn持续更新2023年

当前 Project 结构说明
yolo_research
│   pose  
│   └─────   ## 关键点检测任务使用
│   ...    
│   models   ## 存储模型:算子定义和所有模型的yaml结构定义,包含yolov5\yolov7\yolov8  

    └─────   common.py   模型算子定义
             yolo.py     模型结构定义
│   └─────   cls         分类模型结构
│            pose        关键点模型结构
│            segment     分割模型结构
│            detect  v5u_cfg/v7_cfg/v8_cfg    检测模型结构..其余是V5版本以及一些改的参考示例      
│   ....
│   segment
│   └─────   ## 分割任务
|   classify
│   └─────   ## 分类任务
|   tracker
│   └─────   ## 跟踪任务 Fork V8
│   utils
│   └─────   #通用部分代码
|          .
|          .
|            segment   ##分割的数据处理操作部分
|   yolo
│   └─────   v8        ## yolov8 core ,主要包含训练部分和推理使用部分的相关代码
│             └───── .
|            cfg       ## default.yaml 设置所有V8相关参数
|            engine    ## 定义基类结构
|            utils
|            data
|               .
|               .
|       .
|       .    ##其余为检测核心代码和通用部分

Feature 🚀

 - 最新的yoloV5工程风格代码融合,支持自由定义搭配所有组件,加入V8部分,兼容了anchor-free的yolov8,针对High-level任务:完成先进的检测器、跟踪器、分类器、分割、关键点检测功能任务集成,逐步删除额外库依赖
 
 - 实时的v5代码更新改动&&v7等work的结构适配(每周同步yolov5的代码优化)
 
 - 早期集成的attention、self-attention维护和调试
 
 - 额外的网络结构和Tricks补充
	
 - deepstream部署工程(仅限Linux平台:目前git上是21年开源的5.1版本,后续如果有空整理好说明上传6.xxx的版本)
关于模型修改和设计
 - 2021年在CSDN中介绍过一些范式示例包含注意力、自注意力层等机制早期引入了一些比较有热度的修改,其实在如今图像基础任务表现里,CNN和transformer并不没有明显差距,个人觉得作为学习积累就好。比如swinv1和v2等一些当时流行的论文网络组件,以及同样的NECK、HEAD、LOSS的添加,你可以参考github项目中的yaml结构示例去自己尝试修改模型,就是希望大家能够多思考多积累且自己动手实现,也是我当初文章的本意,而不是只限于一种范式或几种结构,如果遇到问题欢迎分享讨论,具体可以看博客中的[修改建议](https://editor.csdn.net/md/?articleId=126895964)

 - 对于自注意力机制的使用:很多人与CNN相结合使用得到精度提升,个人理解:原因不仅仅是长距离的依赖,早期我们使用固定权重的滤波器提取边缘再到CNN,CNN也许是对应着高通滤波,而self-attention对应于低通滤波,那么相当于对featuremap进行了一次平滑,这样从某种程度上可以解释互补之后的提升;而且transfromer是很难发生过拟合或者说不存在,同时由于增量爆炸和工程开发的现象,使得其并不好训练,但是动态特性确实更具泛化性,常规情况中优先考虑你训练数据集的拟合够不够好,你的模型是否能反映出数据之间的特征特异性,其次扩充构建相应的辅助分支加入特征属性描述。

CSDN同步更新,主页可按兴趣原创文章点击 (保证每周同步更新一次维护,不定期更新算法代码和引进结果实验!关于消融实验大多来自朋友的热心反馈,探究范式CNN和transformer,如何根据经验设计网络结构、LOSS改进、辅助训练分支、样本匹配.... 欢迎提供实验数据和結果~)

Install Clone repo and install [requirements.txt](https://github.com/positive666/yolo_research/requirements.txt)
git clone https://github.com/positive666/yolo_research  # clone
cd yolov5_research
pip install -r requirements.txt  # install
YOLOV8 install in conda env and offical command

pip install ultralytics

if you pip install ultralytics,you can run offical command

yolo task=detect    mode=train   data=<data.yaml path>      model=yolov8n.pt        args...
          classify       predict        coco-128.yaml       yolov8n-cls.yaml  args...
          segment        val                                yolov8n-seg.yaml  args...
                         export                             yolov8n.pt        format=onnx  args...

ps: if your model=*.yaml -->scratch else use pretrained models python command :

if use this repo ,you need set your data and model path in cfg/default.yaml

    
    python train_v8.py  --<args>

推理部分和V5、V8的代码兼容 add --v8_det(supprot v8 models)

Multi-GPU DistributedDataParallel 使用DistributedDataParallel,多个进程只进行倒数传播,每个GPU都进行一次梯度求导和参数更新,这比DataParallel的方式更高效,因为DataParalledl只有一个主GPU进行参数更新,所以需要各个子进程调用的GPU传递倒数到主GPU后,才会更新参数給各个GPU,所以这会比DistributedDataParallel每个GPU直接进行参数更新要慢很多。 –nproc_per_node: 作为GPU的使用数量节点数 –batch:总batch-size ,然后除以Node数量 ,平均给每个GPU。 ```bash python -m torch.distributed.run --nproc_per_node 2 train.py --batch 64 --data coco.yaml --weights yolov5s.pt --device 0,1 ```
Multi -machines && Multi-GPU ```bash 主机 python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank 0 --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' #多个副机 python -m torch.distributed.run --nproc_per_node G --nnodes N --node_rank R --master_addr "192.168.1.1" --master_port 1234 train.py --batch 64 --data coco.yaml --cfg yolov5s.yaml --weights '' ``` –master_port:端口号 master_addr:主进程ip地址 G:每个机器的GPU数量 N:机器数量 R:子机器序号

目标检测篇

Inference with detect.py
python detect.py --source 0  # webcam     --weights <your model weight>
                          img.jpg  # image
                          vid.mp4  # video
                          path/  # directory
                          'path/*.jpg'  # glob
                          'https://youtu.be/Zgi9g1ksQHc'  # YouTube
                          'rtsp:https://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

yolov7 官方的訓練权重打包链接:https://pan.baidu.com/s/1UIYzEZqTPMUpWWBBczOcgA?pwd=v7v7(由于我删除了P6模型里的Reorg操作和Focus没本质区别,所以删掉需要重新训练,如果你想使用V7原始权重,你只需要在YAML里改回去,还有一种方式是遍历Reorg的权重把它替换掉) 提取码:v7v7

Train

see train.py args ,command as :

python train.py --data <your data yaml>  --cfg  <your model yaml> --weights <weights path>  --batch-size 128    --hyp   <hyps yaml>  --batch-size <numbers>  
Notes
  • "--swin_float" for "SwinTransformer_Layer" layers,because of " @" not support fp16,so you can use offical yolov7 “ Swinv2Block”
  • "--aux_ota_loss" for aux- head only . Such "models/detect/v7_cfg/training/yolov7x6x.yaml, (P6-model) ,you can create aux -head models.
  • "ota_loss" in hyps filse ,ota_loss default=0
Training commnd example
  • run yolov7-P5 model train and yolov5 seriese models ,scratch or fine ,your need a weights
python train.py  --data data/coco128.yaml  --cfg models/detect/yolov5s_decoupled.yaml   
python train.py  --cfg  models/detect/v7_cfg/training/yolov7.yaml  --weights yolov7.pt  --data (custom datasets) --hyp data/hyps/hyp.scratch-v7.custom.yaml	
  • run yolov7-aux model train ,your model must P6-model !