Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于数据增强与长方形输入 #13

Closed
h-bo opened this issue Jul 20, 2023 · 20 comments
Closed

关于数据增强与长方形输入 #13

h-bo opened this issue Jul 20, 2023 · 20 comments

Comments

@h-bo
Copy link
Contributor

h-bo commented Jul 20, 2023

你好
感谢作者的工作,非常棒
我们在自己的数据集上进行了实验,效果不错,但还有一些关键问题,希望得到您的指导:

  1. 我们观察到实现中,数据增强只使用了简单的处理,没有使用目前复杂的马赛克增强等,如果使用该种增强性能会提升吗 (实际上,我们尝试了,发现性能很差,而且在多线程dataloader时报错 Traceback (most recent call last):
    File "/opt/conda/lib/python3.8/threading.py", line 932, in _bootstrap_inner
    self.run()
    File "/opt/conda/lib/python3.8/threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
    File "/opt/conda/lib/python3.8/site-packages/paddle/io/dataloader/dataloader_iter.py", line 637, in _thread_loop
    raise e
    File "/opt/conda/lib/python3.8/site-packages/paddle/io/dataloader/dataloader_iter.py", line 618, in thread_loop
    array.append(tensor)
    RuntimeError: (PreconditionNotMet) Tensor holds no memory. Call Tensor::mutable_data firstly.
    [Hint: holder
    should not be null.] (at ../paddle/phi/core/dense_tensor_impl.cc:44))
  2. 我们观察到目前只正方形的训练与推理,可以使用长方形吗,以符合一般视频长方形的尺寸 (实际上,我们尝试了,比如1088*1920,发现性能会下降很多)

以上两个问题,我们觉得比较困惑,希望得到您的建议
非常感谢

@h-bo h-bo changed the title 关于数据增强 关于数据增强与长方形推理 Jul 20, 2023
@lyuwenyu
Copy link
Owner

lyuwenyu commented Jul 21, 2023

  1. mosaic在coco上我们有试验过 效果不怎么好
  2. 长方形推理的 在你训练的时候也要和测试的时候逻辑一致吧?

@h-bo
Copy link
Contributor Author

h-bo commented Jul 21, 2023

  1. mosaic在coco上我们有试验过 效果不怎么好
    确实,虽然简单的数据增强,取得了较好的效果很惊人,但复杂的数据增强反而效果差,很奇怪
    detr仓库里也有人问这个问题Any plan about data augmentation facebookresearch/detr#42
  2. 长方形推理的 在你训练的时候也要和测试的时候逻辑一致吧?
    对的,长方形的一致训练与测试,但效果会差很多

@lyuwenyu
Copy link
Owner

lyuwenyu commented Jul 21, 2023

  1. mosaic在coco上我们有试验过 效果不怎么好
    确实,虽然简单的数据增强,取得了较好的效果很惊人,但复杂的数据增强反而效果差,很奇怪
    detr仓库里也有人问这个问题Any plan about data augmentation facebookresearch/detr#42
  2. 长方形推理的 在你训练的时候也要和测试的时候逻辑一致吧?
    对的,长方形的一致训练与测试,但效果会差很多
  1. detr系列的backbone一般都是有预训练的 可能这块不太适合强数据增强;yolo系列的一般都是from scratch训练 可能用Mosaic效果更好一些
  2. 你reader怎么配置的, 会有一些padding嘛?

@h-bo
Copy link
Contributor Author

h-bo commented Jul 21, 2023

  1. mosaic在coco上我们有试验过 效果不怎么好
    确实,虽然简单的数据增强,取得了较好的效果很惊人,但复杂的数据增强反而效果差,很奇怪
    detr仓库里也有人问这个问题Any plan about data augmentation facebookresearch/detr#42
  2. 长方形推理的 在你训练的时候也要和测试的时候逻辑一致吧?
    对的,长方形的一致训练与测试,但效果会差很多
  1. detr系列的backbone一般都是有预训练的 可能这块不太适合强数据增强;yolo系列的一般都是from scratch训练 可能用Mosaic效果更好一些
  2. 你reader怎么配置的, 会有一些padding嘛?
  1. 学习了
  2. 直接resize (- BatchRandomResize: {target_size: [[1088, 1920],], random_size: True, random_interp: True, keep_ratio: False})和padResize(train: PadResize: {target_size: 1280} @sample_transformstest, test: - Resize: {target_size: [1280, 1280], keep_ratio: True, interp: 1}
    • Pad: {size: [1280, 1280], fill_value: [114., 114., 114.]})都试过,效果都不佳,尤其padResize几乎没有性能,

@lyuwenyu
Copy link
Owner

lyuwenyu commented Jul 21, 2023

后处理加个参数 bbox_decode_type:'pad' 试一下, ( ppdet里pad操作不改变inputs['im_shape']导致其和im.shape不一致, 会导致在后处理里默认得到的原图尺寸origin_shape不太对

@h-bo
Copy link
Contributor Author

h-bo commented Jul 21, 2023

后处理加个参数 bbox_decode_type:'pad' 试一下, ( ppdet里pad操作不改变inputs['im_shape']导致其和im.shape不一致, 会导致在后处理里默认得到的原图尺寸origin_shape不太对

  1. 在padResize中,使用了这个操作,确实取得了正常的结果,直接Resize的结果不受影响
  2. 但是不管pad(keepRatio)与否,矩形resize的结果,仍然明显低于正方形resize(比如800960的结果,比800800和960960的结果都明显差,数据集原始是10801920的图片,讲道理keep_ratio resize或者尽量大分辨率应该会更好),这个结果还是比较奇怪

(我打算实验下是不是和position embeding有关系,因为我发现同正方形跨尺寸还是有一定性能的,但是变成长方形就完全没有性能。您还有别的建议嘛)

配置如:

epoch: 150
snapshot_epoch: 5
TrainReader:
  sample_transforms:
    - Decode: {}
    - RandomDistort: {prob: 0.8}
    # - RandomExpand: {fill_value: [123.675, 116.28, 103.53]}
    - RandomCrop: {prob: 0.8}
    - RandomFlip: {}
  batch_transforms:
    - BatchRandomResize: {target_size: [[800, 960]], random_size: True, random_interp: True, keep_ratio: False}
    - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    - NormalizeBox: {}
    - BboxXYXY2XYWH: {}
    - Permute: {}
  batch_size: 4
  shuffle: true
  drop_last: true
  collate_batch: false
  use_shared_memory: true


weights: output/model_final
find_unused_parameters: True
log_iter: 200

pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ResNet18_vd_pretrained.pdparams
ResNet:
  depth: 18
  variant: d
  return_idx: [1, 2, 3]
  freeze_at: -1
  freeze_norm: false
  norm_decay: 0.

HybridEncoder:
  hidden_dim: 256
  use_encoder_idx: [2]
  num_encoder_layers: 1
  encoder_layer:
    name: TransformerLayer
    d_model: 256
    nhead: 8
    dim_feedforward: 1024
    dropout: 0.
    activation: 'gelu'
  expansion: 0.5
  depth_mult: 1.0

RTDETRTransformer:
  eval_idx: -1
  num_decoder_layers: 3

eval_size: [800, 960]
EvalReader:
  sample_transforms:
    - Decode: {}
    - Resize: {target_size: [800, 960], keep_ratio: False, interp: 2}
    - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    - Permute: {}
  batch_size: 4
  shuffle: false
  drop_last: false


TestReader:
  inputs_def: # used for export
    image_shape: [3, 800, 960]
  sample_transforms:
    - Decode: {}
    - Resize: {target_size: [800, 960], keep_ratio: False, interp: 2}
    - NormalizeImage: {mean: [0., 0., 0.], std: [1., 1., 1.], norm_type: none}
    - Permute: {}
  batch_size: 1
  shuffle: false
  drop_last: false

DETRPostProcess:
  bbox_decode_type: 'pad'

@lyuwenyu
Copy link
Owner

你上边贴的配置也是跑不出来?

@lyuwenyu lyuwenyu reopened this Jul 24, 2023
@h-bo
Copy link
Contributor Author

h-bo commented Jul 24, 2023

你上边贴的配置也是跑不出来?

是的 长方形性能显著低于正方形

@lyuwenyu
Copy link
Owner

我感觉还是后处理的问题 你可以再确定一下那个逻辑有问题没

@h-bo
Copy link
Contributor Author

h-bo commented Jul 24, 2023

我感觉还是后处理的问题 你可以再确定一下那个逻辑有问题没

ok我确定下

似乎没问题,从结果上看,检测框也分布在图片各处(抱歉公司不让放图)
image

性能图(960*800的实验跑完了,但是因为缩小了log step,所以图中显得指标还行,但是拉平来看,结果还是低)
image

@h-bo h-bo changed the title 关于数据增强与长方形推理 关于数据增强与长方形输入 Jul 24, 2023
@h-bo
Copy link
Contributor Author

h-bo commented Jul 25, 2023

似乎找到问题了 我先开了个mr 方便交流
TLNR:目前来看,长方形输入的性能符合预期了

具体分析:
实验结果图:img_v2_ef5fc6cc-4c09-48f3-a200-1a7d0b4e9ddg
(注:1120的实验显示问题,是因为在150epoch后又跑了150个epoch)
从实验来看,长方形输入的性能符合预期,且在前期明显高于相应的正方形
在实验后期,长方形输入的性能略低于相应的正方形,可能和数据集分布,数据策略有关,这个我继续做研究。
数据分布:
image

@h-bo h-bo mentioned this issue Jul 25, 2023
@lyuwenyu
Copy link
Owner

lyuwenyu commented Jul 26, 2023

歪一下楼: 你训练自己的数据时候 没有用用coco上的预训练嘛 比如修改pretrain_weights

@h-bo
Copy link
Contributor Author

h-bo commented Jul 26, 2023

歪一下楼: 你训练自己的数据时候 没有用用coco上的预训练嘛 比如修改pretrain_weights

确实,之前只用了应该是imagenet pretrain(https://paddledet.bj.bcebos.com/models/pretrained/ResNet18_vd_pretrained.pdparams)
我试试coco pretrain

@TsingWei
Copy link

TsingWei commented Aug 7, 2023

看了下对应的pr,这种bug真的哭笑不得😂

@h-bo
Copy link
Contributor Author

h-bo commented Aug 7, 2023

看了下对应的pr,这种bug真的哭笑不得😂

没有细查的话,其实也正常。甚至有可能是copilot自己生成的😂

@ghost
Copy link

ghost commented Sep 3, 2023

你好!
我按照你的代码进行了矩形训练,但准确度明显低于正方形训练。为了排除可能性,我尝试调整了 w 和 h 后重新训练,但结果并没有显著改变。

  1. 高准确度代码的唯一更改是 [h,w] 吗?
  2. 对于输入的矩形(800x960),重新训练的结果是否与960x960的结果相似甚至更好?您进行了相同尺寸的比较吗?

如果可能的话,我能从您这里获得一些答案吗?如果您能提供帮助,我将不胜感激。

@h-bo
Copy link
Contributor Author

h-bo commented Sep 3, 2023

你好! 我按照你的代码进行了矩形训练,但准确度明显低于正方形训练。为了排除可能性,我尝试调整了 w 和 h 后重新训练,但结果并没有显著改变。

  1. 高准确度代码的唯一更改是 [h,w] 吗?
  2. 对于输入的矩形(800x960),重新训练的结果是否与960x960的结果相似甚至更好?您进行了相同尺寸的比较吗?

如果可能的话,我能从您这里获得一些答案吗?如果您能提供帮助,我将不胜感激。

可以参考下我的配置,我就是按照那个配置跑的

@h-bo
Copy link
Contributor Author

h-bo commented Sep 4, 2023

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

你好! 我按照你的代码进行了矩形训练,但准确度明显低于正方形训练。为了排除可能性,我尝试调整了 w 和 h 后重新训练,但结果并没有显著改变。

  1. 高准确度代码的唯一更改是 [h,w] 吗?
  2. 对于输入的矩形(800x960),重新训练的结果是否与960x960的结果相似甚至更好?您进行了相同尺寸的比较吗?

如果可能的话,我能从您这里获得一些答案吗?如果您能提供帮助,我将不胜感激。

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

@ghost
Copy link

ghost commented Sep 5, 2023

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

你好! 我按照你的代码进行了矩形训练,但准确度明显低于正方形训练。为了排除可能性,我尝试调整了 w 和 h 后重新训练,但结果并没有显著改变。

  1. 高准确度代码的唯一更改是 [h,w] 吗?
  2. 对于输入的矩形(800x960),重新训练的结果是否与960x960的结果相似甚至更好?您进行了相同尺寸的比较吗?

如果可能的话,我能从您这里获得一些答案吗?如果您能提供帮助,我将不胜感激。

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

非常感谢您的回复
我的数据集图像尺寸为1280x720,已将其调整为608x352,使用的主干是resnet50(经过90个epochs的训练,性能始终较低)。您的配置和我的唯一区别在于 'bbox_decode_type: 'pad'',我尝试过包括这个配置进行重新训练,但仍无法获得类似正方形的性能。原因不确定,但在我的情况下,改变w和h的顺序并没有带来任何区别。
根据您的建议,可能是目标变小导致的。如果您有其他的建议,我将非常期待听取!

@ghost
Copy link

ghost commented Sep 9, 2023

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

你好! 我按照你的代码进行了矩形训练,但准确度明显低于正方形训练。为了排除可能性,我尝试调整了 w 和 h 后重新训练,但结果并没有显著改变。

  1. 高准确度代码的唯一更改是 [h,w] 吗?
  2. 对于输入的矩形(800x960),重新训练的结果是否与960x960的结果相似甚至更好?您进行了相同尺寸的比较吗?

如果可能的话,我能从您这里获得一些答案吗?如果您能提供帮助,我将不胜感激。

BTW,形状输入和数据分布是有关系的,而且resize成较小的矩形,比长边为准的正方形,目标是要变小,性能可能要变低的。需要确认下你的输入是否适合矩形

我使用了960x800的尺寸进行训练,结果表现出比正方形输入略微更好的性能
正如您所建议的,对象的大小问题似乎确实存在

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants