Lu_Shen 2024-08-10 14:59 采纳率: 0%
浏览 349
已结题

yolov5中train过程中,第一次完整训练的验证过程中,图像处理尺寸和设置尺寸不一致(设置尺寸失效)的问题

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

img

该图显示了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文件

img

img

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

img

但在第一轮训练的末尾,进行验证时,发现输入图像的处理尺寸与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文件打印模型架构也是可以正常打印的.如果能解决这部分问题,真是非常感谢!

  • 写回答

24条回答 默认 最新

  • 专家-皆知 2024-08-10 15:00
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    根据您提供的信息,问题似乎出现在验证阶段 (val.run) 中,尽管您已经明确设置了 imgsz=640,但验证时图像处理尺寸却不符合预期,导致模型中的残差连接部分出现尺寸不匹配的错误。这可能是由于以下几个方面的原因造成的:

    1. 检查val.py中的resize_images逻辑

    确保 val.py 文件中的图像预处理函数正确地使用了 imgsz 参数。特别注意图像缩放或padding的逻辑,确保它们确实按照设定的 imgsz 处理图像。

    def preprocess_image(img_path, imgsz):
        img = cv2.imread(img_path)
        img = letterbox(img, new_shape=(imgsz, imgsz))[0]
        # 确保这里或后续步骤使用了正确的imgsz
        ...
    

    2. 检查验证集加载器 (val_loader) 的配置

    验证集的数据加载器 (val_loader) 配置也需要检查,确保它在加载图像时没有覆盖 imgsz 设置。通常在PyTorch的DataLoader初始化中,可以通过 collate_fn 控制数据预处理逻辑,确保该逻辑与 imgsz 设置相符。

    3. 模型内部尺寸调整逻辑

    考虑到错误信息中提到的维度不匹配问题,可能是在模型内部的某些层(如上采样、下采样层)中,尺寸计算或处理逻辑与 imgsz 不一致。尤其是当涉及到动态尺寸变化(如步长为2的卷积)时,要确保这些操作后的尺寸计算逻辑正确考虑到了 imgsz 的影响。

    4. 检查环境变量或外部依赖

    有时候,问题可能来源于外部依赖库的版本不兼容或者环境变量设置。确保您的环境干净,所有依赖库(特别是与图像处理相关的,如OpenCV、Pillow等)都更新至最新或与Yolov5版本相匹配的版本。

    5. Debugging建议

    • 添加日志打印:在 val.py 的图像预处理和模型前向传播的关键位置加入打印语句,确认 imgsz 是否被正确传递并应用于图像尺寸调整。
    print(f"Val imgsz set to: {imgsz}")
    # 在预处理后
    print(f"Processed image shape: {img.shape}")
    
    • 逐行调试:使用Python调试工具(如pdb)在验证阶段逐步执行,观察 imgsz 如何被应用,以及在哪个具体操作后尺寸开始不匹配。

    6. 检查自定义代码

    虽然您提到核心代码功能测试无误,但仍需注意自定义部分可能对图像尺寸处理有间接影响。重新审视这些自定义部分,特别是涉及图像尺寸处理的逻辑。

    综上所述

    首先从数据预处理和模型输入尺寸处理逻辑入手,通过细致的调试和日志记录定位问题所在。若以上步骤未能解决问题,可能需要更深入地审查您的自定义代码逻辑,或者考虑是否有其他环境因素干扰了尺寸处理流程。希望这些建议能帮助您找到并解决问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月15日
  • 赞助了问题酬金100元 8月14日
  • 赞助了问题酬金20元 8月10日
  • 创建了问题 8月10日