YOLOv10如何傻瓜改进,v5v7到v10的跨越学习!

1、理解模型文件作用

1.1基础知识训练

        首先,我们要明确我们主要文件都放在yolov10-main\ultralytics中,其次让我们看一下ultralytics下的文件都有什么,首先对于cfg中,我们只要关注ultralytics/cfg/models/v10下的不同配置yaml文件即可,而ultralytics/cfg/datasets下则是数据集的yaml文件,这里,跟v5,v7没什么区别,需要注意的就是在我们写数据集地址的时候,写绝对地址!

        数据集直接丢进去,yaml文件写对就行,对于训练文件,我个人用的直接写一个train文件,放在 ultralytics下进行训练,代码如下供大家参考:

from ultralytics import YOLOv10

# 模型配置文件
model_yaml_path = "yaml文件的相对地址"
# 数据集配置文件
data_yaml_path = '数据集yaml的相对地址'
# 预训练模型
pre_model_name = r'预训练权重的绝对地址'

if __name__ == '__main__':
    # 加载预训练模型
    model = YOLOv10("模型的yaml文件地址").load(r'预训练权重的绝对地址')
    # 训练模型
    results = model.train(data=data_yaml_path, epochs=100, batch=8, name='train_v10')

直接右键运行即可。

1.2在进行魔改中我们常用的几个文件

        在ultralytics/nn/modules下,我们发现有几个文件,根据文件名我们可以发现这几个文件分别对应着不同的阶段模块,例如conv,里面是我们常用的卷积,而block则是我们在主干网络中常见的模块,例如C3、C2f、SPPF等。而头文件init中,我们直接可以遍历所有的模块名字,并且点击即可转到对应的代码定义位置。到这里,可以发现,哇,作者将其写了一个目录,并且分类了,对于我们修改来说及其方便。

        所谓魔改,就是修改各种模块,效果好就塞,不好抬走下一个!那么在YOLOv5和v7中,我们有yolo和common文件,我们只要在common文件添加,yolo里面调用就好啦。在v10中,也是这个道理,由上面我们可以知道我们定义各种模块的位置啦,而文件末尾的tasks.py文件可以理解为我们常用的yolo文件调用啦,大家在可以tasks.py文件中,Ctrl+f 查找 def parse_model,就可以发现,哇,这不就是yolo.py文件经常修改的地方嘛!

         到这里,我们总结一下,我们定义模块的位置知道啦!调用的也知道啦!模型的yaml文件我们也知道啦!就是cfg下的,复制一下,修改一下就好啦!跟v5,v7一样!对于魔改的模块,我们第一步要定义对吧,第二步就是调用(注意看一下输入输出,维度啦,通道数啊)了,第三步就是修改模型(yaml,塞到你要放的位置),第四步训练!

        我自己开始的时候,就会卡在不知道怎么写入模块,怎么加载模块,怎么调用,初学者的痛苦!这次记录一下尝试魔改v10。

2、魔改步骤

2.1 定义魔改模块

        由于魔改,要很多很多模块,在v5时,很多大佬教的是直接塞到comom文件里,这样导致文件很乱,而且模块之间的不兼容也是我们导致一直报错的原因。所以我建议,大家在魔改的时候,直接定义一个mg.py文件,在里面定义我们的模块就好了!

        在这里,我们举例,我直接将conv复制了哈,改了名字为conv1,

        这里模块定义完毕,下一步就是调用!!

2.2 模块调用 

第一步:在 init 文件中进行调用,导入你定义的mg文件,并调用Conv1,在下面的all也要添加哈!!!!方便自己,后续也要需要!

第二步:在tasks中调用。首先我们在开头阶段调用嘛,就在下面from ultralytics.nn.modules import 这个里面新加你定义的模块名字就好了

然后,查找def parse_model,找到if m in这块,到这里,v5v7的小伙伴就熟悉啦!!!!添加就好了,我加的Conv1!到这里就完事啦

2.3 模型定义以及打印测试

        我复制了一下v10s.yaml,呐,修改后的如下,就是在主干的第二行将名字改了嘛,看看能不能调用成功,调用成功不就是意味着咱加了一个新的模块嘛,懒,就当他是一个新的吧!!!!hh

# Parameters
nc: 6 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  s: [0.33, 0.50, 1024]

backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv1, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2fCIB, [1024, True, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, PSA, [1024]] # 10

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 13], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 19 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 10], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True, True]] # 22 (P5/32-large)

  - [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

        上面给出了大家训练的代码,直接右键运行,,,看看是不是加载出啦!!!上图咯

到这就结束啦,第一次写这样的!算是给自己的笔记,欢迎大佬来指正啦啦,也给萌新有点指引叭!

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值