0.前言
一段时间的折腾之后,终于对添加注意力机制的代码操作了解了不少,写个笔记,以免忘记,也和大家一起分享。但仅仅对如何修改代码以能够添加相应模块进行说明。
首先,将注意力机制模块分为三类:无参数注意力机制、一个通道数(一个参数)注意力机制以及两个通道数(两个参数)注意力机制。
通用步骤
1_. 找代码,下载代码
2_. 在tasks.py文件下导入代码模块,并对修改部分代码
3_. 重新创建yaml文件,在其中添加注意力机制模块
4_. 测试文件是否可行,参数是否错误
5_. 在训练中调用添加了注意力机制的yaml文件,进行训练使用
1.添加无参数注意力机制SimAM
- 论文:http://proceedings.mlr.press/v139/yang21o/yang21o.pdf
- 代码:https://github.com/ZjjConan/SimAM
1_. \ultralytics-main\ultralytics\nn 在该路径下创建SimAM.py文件(也可以是任意路径,习惯了这个路径),并将代码路径mmdetection/mmdet/models/backbones/attentions/simam_module.py下的simam_module复制到该文件中。
2_. 在.\ultralytics-main\ultralytics\nn\tasks.py文件中导入SimAM模块。
tips: simam_module是文件下的类名,可以更改,但同时要记得在super中的名称一起改。
from ultralytics.nn.SimAM import simam_module
3_. 因为是无参数,所以就不需要在tasks文件再修改内容了。(这里的无参数是指类simam_module除去具有默认值的参数外,没有一定需要指定值的参数了) 修改yaml文件,可以复制一份yolov8.yaml文件出来,以免改错;加入simam_module模块。
tips:该文件夹下的各个数据的含义可以参考下面博主写的内容,清晰易懂。https://blog.csdn.net/qq_40835644/article/details/130085632
其中,几个数字被圈出来是因为这些数字代表行数,加入一行内容,对应的行数就会发生变化,所以需要做相应的调整。此外在27行的1e-4数值是类simam_module下e_lambda参数的默认值。
4_. 测试yaml文件是否可行。在目录.\ultralytics-main下创建文件test-model.py,在变量CFG中指定刚刚yaml文件的绝对路径或相对路径,执行python文件,若为pass,则表明添加成功;否则,需要查看报错做出对应的修改。
5_. 调用。我使用的是python代码的调用方式。具体如下。其中,mytrain-original.py文件是在.\ultralytics-main目录下创建的,不过,也可以在任意路径创建,只需要注意yaml文件的路径正确即可。
2.添加一个通道数注意力机制EMA
- 论文:https://arxiv.org/abs/2305.13563v2
- 代码:https://github.com/yoloonme/ema-attention-module
1_. 在.\ultralytics-main\ultralytics\nn路径下创建EMA.py文件,并将代码复制粘贴到文件。
2_. 在同一路径下的tasks.py文件中导入EMA模块,并对添加部分代码。
from ultralytics.nn.EMA import EMA
elif m in {EMA}:
args = [ch[f]]
3_. 在.\ultralytics-main\ultralytics\models\v8路径下创建yolov8-ema.yaml文件,将yolov8.yaml的代码复制粘贴到yolov8-ema.yaml文件中并在其中添加注意力机制模块代码。
其中,27行的【1024,8】数值分别对应EMA类中参数channels和 factor的值;其中1024是channels通道数,8是factor的默认值。
4_. 测试文件是否可行,参数是否错误。在目录.\ultralytics-main下创建文件test-model.py,在变量CFG中指定刚刚yaml文件的绝对路径或相对路径,执行python文件,若为pass,则表明添加成功;否则,需要查看报错做出对应的修改。
5_. 在训练中调用添加了注意力机制的yaml文件,进行训练使用。具体同注意力机制SimAM。
3.添加两个通道数注意力机制GAM
- 论文:https://arxiv.org/abs/2112.05561
- 代码:https://github.com/northBeggar/Plug-and-Play/blob/main/00-GAM/GAM%20attention.py
1_. 在.\ultralytics-main\ultralytics\nn路径下创建GAM.py文件,并将代码复制粘贴到文件。
2_. 在同一路径下的tasks.py文件中导入GAM模块,并对添加部分代码。
from ultralytics.nn.GAM import GAM_Attention
elif m in {GAM_Attention}:
args = [ch[f], *args]
3_. 在.\ultralytics-main\ultralytics\models\v8路径下创建yolov8-ema.yaml文件,将yolov8.yaml的代码复制粘贴到yolov8-ema.yaml文件中并在其中添加注意力机制模块代码。第三步是注意力机制区分开的关键。
这里对加入了三次注意力机制中的32、64和128的数值设置进行说明;首先,这三个数分别对应传入GAM中in_channels和out_channels,前面截图也说了两者的数值一致所以就只需要传入一个就行;他们接收是上一层的输出和下一层的输入,我们使用test_model.py查看原始yolov8的yaml文件的具体通道数就可以得出32、64和128。如下图。
4_. 测试文件是否可行,参数是否错误。在目录.\ultralytics-main下创建文件test-model.py,在变量CFG中指定刚刚yaml文件的绝对路径或相对路径,执行python文件,若为pass,则表明添加成功;否则,需要查看报错做出对应的修改。
5_. 在训练中调用添加了注意力机制的yaml文件,进行训练使用。具体同注意力机制SimAM。
参考
- https://blog.csdn.net/qq_40835644/article/details/130085632
如果你觉得这篇文章对你有所启发的话,期待你的点赞、收藏和打赏,对我创作的支持!!!