python - CNN 使用具有显着尺寸差异的图像
问题描述
我开发了一个用于图像图像分类的卷积神经网络 (CNN)。
我可用的数据集相对较小(训练集和测试集的图像约为 35k)。数据集中的每个图像的大小都不同。最小图像为 30 x 77,最大图像为 1575 x 5959。
我看到了这篇关于如何处理大小不同的图像的帖子。该帖子确定了以下处理不同尺寸图像的方法。
“Squash”图像意味着它们将被调整大小以适应特定尺寸而不保持纵横比
将图像居中裁剪为特定大小。
- 用纯色填充图像到平方大小,然后调整大小。
- 结合以上内容
这些似乎是合理的建议,但我不确定哪种方法最适合我的情况,即图像尺寸存在显着差异。我认为调整图像大小但保持相同的纵横比(每个图像具有相同的高度)对我来说是有意义的,然后对这些图像进行中心裁剪。
其他人有什么想法吗?
解决方案
第一个重要的事情是:调整大小会恶化图像吗?
尽管图像大小,您在图像中所需的元素是否都合理地具有相同的比例?
- 如果是,则不应调整大小,请使用具有可变输入大小的模型(尽管有最小值)。
- 如果不是,调整大小是否会使您想要的元素达到类似的比例?
- 如果是:调整大小!
- 如果不是:最好考虑其他解决方案
当然你可以有可以识别你的元素的模型有很多不同的大小,但是差异越大,模型越强大(我相信这个说法是很合理的)
Keras 为您提供了使用不同图像大小的可能性(您并不真的需要它们具有相同的大小)。
为此,您只需指定input_shape=(None,None,input_channels)
.
请注意,如果要创建和合并分支,则需要注意兼容性。
但是,对于不同的形状,您将无法使用Flatten
图层。您将需要GlobalMaxPooling2D
或GlobalAveragePooling2D
。其他一些层也仅限于固定大小,但卷积层、池化层和上采样层都可以。
困难的部分是您不能将不同的大小放在单个 numpy 数组中。那么你也能:
- 将大小调整为相同大小的组,而不会有很大的变化,以使训练更容易。
- 根本不用一张一张地调整和训练图像
- 保持纵横比并填充侧面
但最佳答案取决于您的测试。
推荐阅读
- c# - 如何修复派生类中的构造函数循环?
- r - .N 操作符的 data.table 存在于包的函数中时无法访问
- python - 在 Localhost 上测试 Google SSO SAML
- r - 使用browseURL,但让URL在某些时候是可变的
- excel - 在工作表中查找 ID 并在用户表单中返回行
- d3.js - 带有 NaN 的堆积面积图数据
- java - 如何从 docx4j 运行中简洁地提取文本?
- java - 如何防止 Wicket AutocompleteAjaxComponent 转义?
- excel-dna - 在 Excel-DNA XLL 内的 VBA 中以编程方式引用多个 COM dll
- mapbox - Mapbox GL JS 在不同的缩放级别上缺少一些符号