使用对象检测api的默认配置时,不同尺寸的图像缩放器有啥影响
Posted
技术标签:
【中文标题】使用对象检测api的默认配置时,不同尺寸的图像缩放器有啥影响【英文标题】:What the impact of different dimension of image resizer when using default config of object detection api使用对象检测api的默认配置时,不同尺寸的图像缩放器有什么影响 【发布时间】:2017-12-21 14:42:46 【问题描述】:我尝试使用 Tensorflow 的对象检测 API 来训练模型。 我正在使用更快的 rcnn resnet101 (https://github.com/tensorflow/models/blob/master/object_detection/samples/configs/faster_rcnn_resnet101_voc07.config) 的示例配置。 以下代码是我不太明白的配置文件的一部分:
image_resizer
keep_aspect_ratio_resizer
min_dimension: 600
max_dimension: 1024
我的问题是:
min_dimension
和 max_dimension
的确切含义是什么?这是否意味着输入图像的大小将被调整为 600x1024 或 1024x600?
如果我有不同尺寸的图像,并且可能其中一些相对大于 600x1024(或 1024x600),我可以/应该增加 min_dimension
和 max_dimension
的值吗?
我有这个问题的原因来自这篇文章: TensorFlow Object Detection API Weird Behaviour
在这篇文章中,作者自己给出了问题的答案:
然后我决定裁剪输入图像并将其作为输入提供。只是看看结果是否有所改善,而且确实如此! 事实证明,输入图像的尺寸远大于模型接受的 600 x 1024。因此,它将这些图像缩小到 600 x 1024,这意味着烟盒正在丢失它们的细节 :)
它使用与我使用相同的配置。 而且我不确定是否可以更改这些参数,如果它们是这个特殊模型的默认或推荐设置,faster_rcnn_resnet101。
【问题讨论】:
【参考方案1】:经过一些测试,我想我找到了答案。如有错误请指正。
在 .config 文件中:
image_resizer
keep_aspect_ratio_resizer
min_dimension: 600
max_dimension: 1024
根据'object_detection/builders/image_resizer_builder.py'的image resizer设置
if image_resizer_config.WhichOneof(
'image_resizer_oneof') == 'keep_aspect_ratio_resizer':
keep_aspect_ratio_config = image_resizer_config.keep_aspect_ratio_resizer
if not (keep_aspect_ratio_config.min_dimension
<= keep_aspect_ratio_config.max_dimension):
raise ValueError('min_dimension > max_dimension')
return functools.partial(
preprocessor.resize_to_range,
min_dimension=keep_aspect_ratio_config.min_dimension,
max_dimension=keep_aspect_ratio_config.max_dimension)
然后它尝试使用'object_detection/core/preprocessor.py'的'resize_to_range'函数
with tf.name_scope('ResizeToRange', values=[image, min_dimension]):
image_shape = tf.shape(image)
orig_height = tf.to_float(image_shape[0])
orig_width = tf.to_float(image_shape[1])
orig_min_dim = tf.minimum(orig_height, orig_width)
# Calculates the larger of the possible sizes
min_dimension = tf.constant(min_dimension, dtype=tf.float32)
large_scale_factor = min_dimension / orig_min_dim
# Scaling orig_(height|width) by large_scale_factor will make the smaller
# dimension equal to min_dimension, save for floating point rounding errors.
# For reasonably-sized images, taking the nearest integer will reliably
# eliminate this error.
large_height = tf.to_int32(tf.round(orig_height * large_scale_factor))
large_width = tf.to_int32(tf.round(orig_width * large_scale_factor))
large_size = tf.stack([large_height, large_width])
if max_dimension:
# Calculates the smaller of the possible sizes, use that if the larger
# is too big.
orig_max_dim = tf.maximum(orig_height, orig_width)
max_dimension = tf.constant(max_dimension, dtype=tf.float32)
small_scale_factor = max_dimension / orig_max_dim
# Scaling orig_(height|width) by small_scale_factor will make the larger
# dimension equal to max_dimension, save for floating point rounding
# errors. For reasonably-sized images, taking the nearest integer will
# reliably eliminate this error.
small_height = tf.to_int32(tf.round(orig_height * small_scale_factor))
small_width = tf.to_int32(tf.round(orig_width * small_scale_factor))
small_size = tf.stack([small_height, small_width])
new_size = tf.cond(
tf.to_float(tf.reduce_max(large_size)) > max_dimension,
lambda: small_size, lambda: large_size)
else:
new_size = large_size
new_image = tf.image.resize_images(image, new_size,
align_corners=align_corners)
通过上面的代码,我们可以知道我们是否有一个大小为 800*1000 的图像。最终输出图片大小为600*750。
也就是说,此图像调整器将始终根据 'min_dimension' 和 'max_dimension' 的设置调整输入图像的大小。
【讨论】:
我想保留 keep_aspect_ratio_resizer min_dimension: 2976 max_dimension: 4464 我应该改变什么来做到这一点 你的意思是输入图片的尺寸是(2976 x 4464)吗? 是的,输入图像是 1000+,每个都有分辨率(2976 x 4464)。我已经标记并标记了对象周围的每个图像的多个框以进行训练 嗯...这确实是一个难题。正如我之前提到的,您的图像将始终根据最小和最大尺寸调整大小。如果您真的想要您的对象检测器了解输入图像中对象的正确大小。您也许可以尝试使用几种最小和最大尺寸来训练您的模型。也就是说,它可以识别不同尺寸的物体。但!如果所有输入图像的大小都相同,则可以简单地设置 min=2976 和 max=4464。它应该可以工作。以上是关于使用对象检测api的默认配置时,不同尺寸的图像缩放器有啥影响的主要内容,如果未能解决你的问题,请参考以下文章
IOS - 将背景图像缩放到不同的屏幕尺寸并将标签放在固定位置上
UIWebview 缩放 PDF 和大 .图像缩放默认 IOS
使用 CGContext 缩放到小尺寸时,CGImage 的像素数据不完整
在 CircleImageView 中缩放不同大小的图像的问题