问题:全连接层改为卷积后??可以接受任意大小的输入图像??训练图像和测试图像可以不同尺寸??那训练的时候??图像尺寸大小不一训练可以吗
解答:可以
1、resize到相同尺寸便于统一处理,同时也考虑到机器的配置,图像越大在进行运算处理时要求的配置就越高,常规情况下图像resize到500以下进行处理。
很多预训练模型的图片size大小为299*288*3(Xception、InceptionV3。。。)、224*224*3(VGG16、ResNet50.。。。)
- 将输入图像resize到一个固定的尺寸这件事贯穿了DL在目标检测领域的始终:
- 在r-cnn刚提出的阶段,由于网络结构的限制,进入 全连接层的输入维度必须是固定的,那么一个最简单的解决方案就是把输入图像归一化到固定的尺寸,得到输出后反变换回去。这种resize的做法实际上是为了适应卷积神经网络的一种让步。
- 随着人们对检测精度的追求,大家开始关注resize所带来的损失。不论是sppnet还是roi pooling,他们都致力于将任意维度的特征图转化成固定的维度以适应全连接的输入,这一思路从理论上解除了整个检测网络对输入的尺寸依赖,这也是fast r-cnn的一个改进点,从此输入图像可以是任意宽高。
- 然而各路算法在使用gpu做加速的过程中遇到了新的问题,每一个batch的计算必须拥有相同的size,这是算法本身之外的一个限制,但这个限制却成为了并行加速计算的拦路虎。yolo的作者针对这个情况,在不改变原始图像宽高比的前提下进行了resize操作,具体的做法是对不符合原图比例的区域进行padding。
?
现在很多的检测网络都不使用全连接层,就是考虑到图像输入尺寸不一致的问题,从而构建全卷积网络!对于全卷积网络,输入图片的尺度可以为任意的,相当于滑动窗口检测,但为什么很多算法要在测试阶段也变成统一尺寸呢?这就是考虑训练阶段的问题,由于现在训练集的图片可能大小也不一致,而batch的读取方式就限制了必须保持训练图像尺寸的一致性,所以最终网络的感受野也就限定了那个尺度范围内,从而在测试时不能直接使用原图像,还是要进行相同的缩放操作!
但对于超大分辨率的图片,但目标却很小,如kaggle的卫星图船舶检测,上述操作就不太管用了,这时候就要考虑到对图像进行切割,分别送到现在的神经网络,所以还是看你的数据怎么训练的!
2、PyTorch中的DataLoader为了并行计算,要求batch内的图像矩阵必须有相同的size,但是却没有要求不同的batch之间必须是相同的size。你可以自定义一个sampler,让每个batch内部的图片的size尽量接近,然后再在collate_fn函数里面稍微resize一下(比如按batch内最大的图片尺寸进行resize),就可以实现不同size的图片的并行训练了。
3、最简单的是一个batch一个图像。
参考链接:
https://blog.csdn.net/weixin_42535423/article/details/103720514
https://blog.csdn.net/heroybc/article/details/116233679
|