注明:以下代码以及修改思路均来源于b站博主魔傀面具,特此感谢!魔导的主页奉上:
撰写此文章的目的是记录改进代码的过程以及碰到的一些问题及解决方式,如有侵权,可联系我,我会将文章进行隐藏。
更加细节的东西建议去b站听魔导讲解一下,此文章主要是对代码进行复现,不涉及任何理论知识。
Task-Specific Context Decoupling文章链接:2303.01047.pdf (arxiv.org)
完整代码链接:objectdetection_script/yolov5-TSCODE.py at master · z1069614715/objectdetection_script (github.com)
一、代码修改
1.打开yolo.py,将TSCODE_Detect,Decoupled_Detect类、_initialize_biases函数插入到最前面。
2.打开common.py,将SCE、DPE类插入到最后面。
运行时报错1:注意若之后运行时报错module 'torch' has no attribute 'concat',将SCE类中的torch.concat()改成torch.cat()。
(版本低的torch中没有concat的模块,cat和concat只是别名而已,直接修改完之后成功解决报错。)
3.打开yolo.py,找到parse_model函数找到含有Detect的elif语句,修改成
elif m in {Detect,Decoupled_Detect,TSCODE_Detect}:
其实也就是相当于在检测模块中多加了两种检测类型。(注意一定是修改成花括号,不然会报错list indices must be integers or slices, not list)
4.打开yolo.py,找到含有Model单词的类,在其中找到含Detect的语句,修改成
if isinstance(m, (Detect,Decoupled_Detect,TSCODE_Detect))
此处我使用的是6.0的版本,只有一个Model类,因此只需要再修改这一个地方。
如果是其他版本可能含有DetectModel和BaseModel类,需要在这两个类中找到含Detect的语句,将Decoupled_Detect,TSCODE_Detect加入到其中,注意这里三个检测的模块需要打括号。
5.在models文件夹下新建yolov5-TSCD.yaml的文件,将代码链接中的yolov5-PFPN-TSCODE或yolov5-FPN-TSCODE粘贴到yaml文件中
6.为防止验证报错,将train.py中的train函数中的gs参数由32改为64;将val.py中gs参数由32改为64;如需要使用detect.py需要将stride新增一个赋值,赋值为64
train.py中需要需改的地方
val.py中需要修改的地方
detect.py中需要修改的地方
注意:由于版本不同可能val中不是gs参数,而是stride,也是同样的在stride下面加一句,stride=64即可。
二、开始训练
在终端输入命令python train.py --cfg models/yolov5s-TSCD.yaml --data data/mydata.yaml
报错:wandb.errors.UsageError: Error communicating with wandb process
解决方案:在utils/loggers/wandb/wandb_utils.py的__init__函数中找到wandb.init()
在其参数列表中加入settings=wandb.Settings(start_method="fork")即可。
至此,成功开始训练。
建议:最好是跟着魔导使用7.0版本的代码,否则有许多需要修改的地方,对代码不太熟练的小伙伴可能极其容易出现其他错误。