修改C3模块的结构
- 一、commom.py文件解析
- 二、修改代码,运行train.py训练
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
📕本次任务:将yolov5s网络模型中C3模块中的结构按照如下方式修改,并跑通YOLOv5。
如左图,有3个conv模块,需要改为右图,右图只包含2个conv模块。
📕提示:仅需修改./models/common.py
文件
📕步骤:
(1)首先找到coomon.py中定义C3模块的地方;
(2)然后将代码与上图的左图对应起来,观察需要改动的位置,结合结构,更容易看懂代码;
(3)找到之后按照要求修改,并运行train.py,看是否能跑通。
./models/common.py
中,保存的是v5s各个模块的实现,包括基本模块(如autopad、Conv、Bottleneck、BottleneckCSP、C3、SPP、Concat、Expand和Contract)和重要模块(NMS、AutoShape、Detections、Classify)。
一、commom.py文件解析
yolov5-master的文件结构如下:
yolov5-master
|-classify
|-data
|-models (本次学习需要的文件在这里面)|-hub|-segment|-common.py(这是本次学习需要修改的文件,文件内容是yolov5s各个模块的定义)|-experi,emtal.py|-tf.py...
|-runs
|-segment
|-utils
...
打开common.py
文件,找到定义C3模块的位置:
class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):"""Initializes C3 module with options for channel count, bottleneck repetition, shortcut usage, groupconvolutions, and expansion."""super().__init__()c_ = int(c2 * e) # hidden channelsself.cv1 = Conv(c1, c_, 1, 1)self.cv2 = Conv(c1, c_, 1, 1)self.cv3 = Conv(2 * c_, c2, 1) # optional act=FReLU(c2)self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))def forward(self, x):"""Performs forward propagation using concatenated outputs from two convolutions and a Bottleneck sequence."""return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
这一段代码中定义了C3的模块结构,初始化时定义了3个卷积结构,然后在forward函数内部,给出了该模块的返回值,将返回值self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
拆解,并与给出的C3结构一一对应,得到下图:
由此可知,去掉concat后的卷积只需要将返回值的最外层丢掉即可。
二、修改代码,运行train.py训练
C3模块修改如下:【注释的那行是原来的结构,也就是concat后还经过了conv】
数据集:水果数据集 【使用week Y2的数据集】
命令行:python .\train.py --img 900 --batch 2 --epoch 100 --data .\fruit.yaml --cfg .\models\yolov5s.yaml --weights .\yolov5s.pt --device cpu
【与week Y2的训练命令是一样的】
开始训练: