本文主要是介绍YOLOv8改进:融合Gold-YOLO Neck(RepGDNeck),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 非常重要
- 讲解视频链接(2024.1.22更新)
- 前言
- 一、ultralytics\ultralytics\nn\modules
- 二、ultralytics\ultralytics\nn
- 三、ultralytics\cfg\models\v8
- 四、训练
- Neck visio
- 资源下载
- 参考资料
- 实验结果(23.11.28更新)
非常重要
由于ulralytics在不断更新,所以下列直接替换可能会导致一系列的错误,所以建议大家在尝试之前先新建一个虚拟环境,然后安装ultralytics 8.0.164版本的,最新版本安装后续会出错。因为咱新建了一个新虚拟环境,所以咱没必要备份,直接跳过备份做下面,但别忘了先引入mmcv库。
讲解视频链接(2024.1.22更新)
基于YOLOV8,从零开始搭建的GOLD-YOLO颈部的一个视频讲解(但是讲解能力有限,可能讲解的并不是太好)
https://space.bilibili.com/368873460/channel/seriesdetail?sid=3921374
前言
备份!备份!备份!!!
替换文件前记得先备份
例如:
一、ultralytics\ultralytics\nn\modules
将gold_yolo.py复制到ultralytics\ultralytics\nn\modules下,_init_.py进行替换(该备份备份)
复制后的文件夹目录
from mmcv.cnn import ConvModule, build_norm_layer
由于gold_yolo中存在这一句代码,我们需要引入mmcv库
pip install -U openmim
mim install mmcv
二、ultralytics\ultralytics\nn
将tasks.py复制到该ultralytics\ultralytics\nn下
三、ultralytics\cfg\models\v8
将yolov8n_gold_yolo_neck_v2.yaml复制到该ultralytics\cfg\models\v8下
注意:记得先改文件中的nc参数,改为你的数据集的类别
四、训练
from ultralytics import YOLOif __name__ == '__main__':model = YOLO('yolov8n_gold_yolo_neck_v2.yaml')results = model.train(data='coco128.yaml', epochs=5, deterministic=False)
deterministic设置为False,不然会报下面的警告
D:\anaconda3\envs\yolov8\lib\site-packages\torch\autograd\__init__.py:200: UserWarning: upsample_bilinear2d_backward_out_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\Context.cpp:75.)Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass
D:\anaconda3\envs\yolov8\lib\site-packages\torch\autograd\__init__.py:200: UserWarning: adaptive_avg_pool2d_backward_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\Context.cpp:75.)Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass
意思是upsample_bilinear2d_backward_out_cuda和adaptive_avg_pool2d_backward_cuda都不是采用一个确定性的算法实现对应gold_yolo.py中的nn.functional.adaptive_avg_pool2d和F.interpolate(xxx, size=(H, W), mode='bilinear', align_corners=False)
。也就是说,结果不可复现,代码每次运行的结果都有所不同,但最终结果是差不多的。
from n params module arguments 0 -1 1 464 ultralytics.nn.modules.conv.Conv [3, 16, 3, 2] 1 -1 1 4672 ultralytics.nn.modules.conv.Conv [16, 32, 3, 2] 2 -1 1 7360 ultralytics.nn.modules.block.C2f [32, 32, 1, True] 3 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2] 4 -1 2 49664 ultralytics.nn.modules.block.C2f [64, 64, 2, True] 5 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2] 6 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True] 7 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2] 8 -1 1 460288 ultralytics.nn.modules.block.C2f [256, 256, 1, True] 9 -1 1 164608 ultralytics.nn.modules.block.SPPF [256, 256, 5] 10 [2, 4, 6, -1] 1 0 ultralytics.nn.modules.gold_yolo.Low_FAM [] 11 -1 1 343296 ultralytics.nn.modules.gold_yolo.Low_IFM [480, 96, 3, 192] 12 -1 1 0 ultralytics.nn.modules.gold_yolo.Split [[128, 64]] 13 9 1 33024 ultralytics.nn.modules.gold_yolo.SimConv [256, 128, 1, 1] 14 [4, 6, -1] 1 57856 ultralytics.nn.modules.gold_yolo.Low_LAF [128, 128] 15 [-1, 12] 1 49920 ultralytics.nn.modules.gold_yolo.Inject [128, 128, 0] 16 -1 1 658432 ultralytics.nn.modules.gold_yolo.RepBlock [128, 128, 4] 17 -1 1 8320 ultralytics.nn.modules.gold_yolo.SimConv [128, 64, 1, 1] 18 [2, 4, -1] 1 14592 ultralytics.nn.modules.gold_yolo.Low_LAF [64, 64] 19 [-1, 12] 1 12672 ultralytics.nn.modules.gold_yolo.Inject [64, 64, 1] 20 -1 1 165376 ultralytics.nn.modules.gold_yolo.RepBlock [64, 64, 4] 21 [-1, 16, 9] 1 0 ultralytics.nn.modules.gold_yolo.High_FAM [1, 'torch'] 22 -1 1 989696 ultralytics.nn.modules.gold_yolo.High_IFM [2, 448, 8, 4, 1, 2, 0, 0, [0.1, 2]]23 -1 1 172416 torch.nn.modules.conv.Conv2d [448, 384, 1, 1, 0] 24 -1 1 0 ultralytics.nn.modules.gold_yolo.Split [[128, 256]] 25 [20, 17] 1 0 ultralytics.nn.modules.gold_yolo.High_LAF [] 26 [-1, 24] 1 49920 ultralytics.nn.modules.gold_yolo.Inject [128, 128, 0] 27 -1 1 658432 ultralytics.nn.modules.gold_yolo.RepBlock [128, 128, 4] 28 [-1, 13] 1 0 ultralytics.nn.modules.gold_yolo.High_LAF [] 29 [-1, 24] 1 198144 ultralytics.nn.modules.gold_yolo.Inject [256, 256, 1] 30 -1 1 2627584 ultralytics.nn.modules.gold_yolo.RepBlock [256, 256, 4] 31 [20, 27, 30] 1 897664 ultralytics.nn.modules.head.Detect [80, [64, 128, 256]]
YOLOv8n_gold_YOLO_neck_v2 summary: 498 layers, 8210000 parameters, 8209984 gradients
Neck visio
这里附上一张Neck部分执行流程图。
进一步了解Neck部分各个模块可参考: Gold-YOLO RepGDNeck类解析
资源下载
戳这里下载blog中所需资源
参考资料
(1)Gold-YOLO源码
(1)Gold-YOLO论文
(3)YOLO v8源码
(4)ModuleNotFoundError: No module named ‘mmcv‘
实验结果(23.11.28更新)
这里阐明下我自己的实验结果
数据集:TT100K_2021数据集(这是一个交通标志数据集,原本有232类交通标志。但是原始交通标志类别数目极不均衡,我只提取了大于等于100个实例数的交通标志,共有45类)
用于对比的模型配置文件:YOLOv8n_tt100k_mt100_P2.yaml(解释一下哈:YOLOv8n:采用YOLOv8n做基准,tt100k_mt100:选择大于等于100(more than 100)的实例数的tt100k数据集,P2: 这个其实很简单的,原本的YOLOv8n.yaml不是输出P3/P4/P5嘛,就在上面一层仿照弄一个P2层,最后多输出一个P2,因为tt100k数据集的图片都是2048*2048的,交通标志大都比较小,多输出P2,就是为了得到更大的特征图,保留小目标的特征。
)
model cfg | batch | imgsz | precision | recall | map50 | map50-95 | GPU |
---|---|---|---|---|---|---|---|
YOLOv8n_tt100k_mt100_P2 | 32 | 640 | 0.8 | 0.7 | 0.784 | 0.598 | 2080Ti,11G |
YOLOv8n_tt100k_mt100_P2 | 4 | 2048 | 0.909 | 0.885 | 0.944 | 0.749 | 2080Ti,11G |
yolov8n_gold_yolo_neck_v2 | 48 | 640 | 0.757 | 0.626 | 0.714 | 0.547 | 2080Ti,11G |
yolov8n_gold_yolo_neck_v2 | 16 | 2048 | 0.941 | 0.912 | 0.962 | 0.766 | A40,48G |
由于显存的原因,这里并没有严格按照单一变量原则来。
这篇关于YOLOv8改进:融合Gold-YOLO Neck(RepGDNeck)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!