针对数据集的训练过程中,1000个epoch的训练中,第一轮完整训练的最后一次验证部分中,针对图像的处理尺寸与val.run中设置的imgsz不对应.其中,train.py和val.py文件中的imgsz均设置为640,在调试中,训练过程的imgsz=640起到了作用,val设置的imgsz=640没有起到作用

该图显示了yolo.py运行对应模型的yaml文件所显示的结果,运行结果没有问题
其中主体模块MobileNetv3_BiMSDA,经过单独例子测试(即设置一个输入x(b,c,h,w),经过该模块后,打印输出的形状和对应值),确认模块在指定尺寸下运行时没有问题的,其中,该网络架构在特定尺寸的输入下(640*640),每个模块经过调试后都是没有问题的.
nc: 7 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 v6.0 backbone
backbone:
[[-1, 1, conv_bn_act, [16,2]], # 0
[-1, 1, MobileNetv3_BiMSDA, [16, 16, 3, 1, 0, 0]], # 1
[-1, 1, MobileNetv3_BiMSDA, [24, 64, 3, 2, 1, 0]], # 2
[-1, 1, MobileNetv3_BiMSDA, [24, 72, 3, 1, 0, 0]], # 3
[-1, 1, MobileNetv3_BiMSDA, [40, 72, 5, 2, 1, 0]], # 4
[-1, 1, MobileNetv3_BiMSDA, [40, 120, 5, 1, 0, 0]], # 5
[-1, 1, MobileNetv3_BiMSDA, [40, 120, 5, 1, 0, 0]], # 6
[-1, 1, MobileNetv3_BiMSDA, [80, 240, 3, 2, 1, 1]], # 7
[-1, 1, MobileNetv3_BiMSDA, [80, 200, 3, 1, 0, 1]], # 8
[-1, 1, MobileNetv3_BiMSDA, [80, 184, 3, 1, 0, 1]], # 9
[-1, 1, MobileNetv3_BiMSDA, [80, 184, 3, 1, 0, 1]], # 10
[-1, 1, MobileNetv3_BiMSDA, [80, 480, 3, 1, 0, 1]], # 11
[-1, 1, MobileNetv3_BiMSDA, [112, 672, 3, 1, 0, 1]], # 12
[-1, 1, MobileNetv3_BiMSDA, [112, 672, 5, 1, 0, 1]], # 13
]
# YOLOv5 v6.0 head
head:
[[-1, 1, Conv, [256, 1, 1]], # 16
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 13], 1, Concat, [1]], # cat backbone P4
[-1, 1, C3, [256, False]], # 19
[-1, 1, Conv, [128, 1, 1]], # 20
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P3
[-1, 1, C3, [128, False]], # 23 (P3/8-small)
[-1, 1, Conv, [128, 3, 2]], # 24
[[-1, 20], 1, Concat, [1]], # cat head P4
[-1, 1, C3, [256, False]], # 26 (P4/16-medium)
[-1, 1, Conv, [256, 3, 2]], # 27
[[-1, 16], 1, Concat, [1]],
[-1, 1, C3, [512, False]], # 29 (P4/16-medium)
[[23, 26, 29], 1, Detect, [nc, anchors]],
]
上即为模型的yaml文件


此为报错信息,打印y和对应残差连接中的identity的形状,观察训练中每一个batch_size中y和其identity的形状是否保持一致,在输入尺寸为640*640的情况下,训练过程是没有问题的

但在第一轮训练的末尾,进行验证时,发现输入图像的处理尺寸与val设置的imgsz=640不一致(卷积stride=2的情况下,尺寸缩小2倍,算出输入尺寸为(384,672)),因此没办法知道是val文件的哪里出了问题
if RANK in [-1, 0]:
# mAP
callbacks.run('on_train_epoch_end', epoch=epoch)
ema.update_attr(model, include=['yaml', 'nc', 'hyp', 'names', 'stride', 'class_weights'])
final_epoch = (epoch + 1 == epochs) or stopper.possible_stop
if not noval or final_epoch: # Calculate mAP
results, maps, _ = val.run(data_dict,
batch_size=batch_size // WORLD_SIZE * 2,
imgsz=imgsz,
model=ema.ema,
single_cls=single_cls,
dataloader=val_loader,
save_dir=save_dir,
plots=False,
callbacks=callbacks,
compute_loss=compute_loss)
此为train.py中的关于验证部分的调用方法,其中val.run将参数进行装载,imgsz=imgsz表示图像的处理尺寸与train中--imgsz的参数设置保持相同,这里train.py中的imgsz默认设置=640,且此处将imgsz=640,验证结果也会出现同样的错误,即残差连接中,y和identity在第四个维度上的尺寸不一致,如前图所示。
如果是yolo.py的设置有问题,但在之前进行的一些关于MobileNetv3的模型测试中,并没有出现由于val文件参数错误出现过相关的问题,也没有出现过yolo.py文件参数设置导致出现的问题.且该问题在第一个完整训练过程的最后一轮,也就是第一次验证过程就报错,提示图像尺寸不一致的问题,说明val.run()中的imgsz设置根本没有起到作用,或者说出现了奇怪的输入尺寸(384,672)而且不知道是从哪里来的.
希望大家能给出解决这个问题的方法和一些思路,谢谢!最好能给出出错的相关地方和补救措施,这对我真的很重要,谢谢各位!
如果有知道这个出错信息如何解决的大佬,请在评论区私聊我,因为关于核心代码的部分还是我个人独创的,且没有公开(用于学业),不方便在这里透露了,但明确的是,核心代码的功能测试和案例测试都是没有问题的,在yolo.py文件打印模型架构也是可以正常打印的.如果能解决这部分问题,真是非常感谢!