如何解决无法使用 TensorFlow 对象检测 API 训练具有更大输入分辨率的 SSD Inception-V2
我希望使用 TensorFlow 对象检测 API 在分辨率大于 300x300 的自定义数据集上从头开始训练 SSD Inception-V2。
我将此作为示例配置文件引用:https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_inception_v2_coco.config
我已经通过设置成功地训练了一个性能不错的 4 类自定义模型:
num_classes: 4
并将训练数据路径指向我的自定义数据集。
但是,输入分辨率设置为 300x300:
image_resizer {
fixed_shape_resizer {
height: 300
width: 300
}
}
我的数据集有非常小的对象,我想在训练期间增加输入分辨率。
但是,如果我只是将此设置更改为:
image_resizer {
fixed_shape_resizer {
height: 640
width: 640
}
}
模型根本没有训练,损失保持停滞。我看到了其他一些讨论更改锚框和自定义 SSD 网络以与新分辨率兼容的帖子。
我尝试了几种锚框配置和模型自定义,但始终无法进行模型训练。 (看起来像它的训练,但损失并没有下降,推断是垃圾输出)
有没有人用 TensorFlow 对象检测 API 在 300x300 以外的分辨率上训练过 SSD Inception-V2,并且可以提供更具体的步骤来执行训练?
解决方法
最初于 2016 年问世的 SSD paper 设计有 2 种特定的输入图像尺寸,300x300
和 512x512
。然而,它的主干是 Mobilenet(将速度视为主要因素)。您可以尝试将图像大小调整为 512x512
,然后进行训练。但是,考虑到 repo 将 300x300
作为默认值,这可能意味着当输入具有该大小而不是其他任何大小时,模型效果最佳。
然而,还有许多其他模型允许输入大小为 640x640
在 Tensorflow 模型动物园 - 版本 1 中,您有 ssd_resnet50_v1
config file,而在 version 2 中,您有许多其他支持 640x640
的 SSD 和 EfficientDet 变体(具有不同的然而骨干)。
使用上述模型进行训练可能会获得更好的结果
,因为您的数据中有小对象,我建议您尝试以这种方式对 640x640 图片进行子采样;
...其中“黑色 640x640”是您的原始图像。当您知道技巧后,您可以通过随机位置采样 300x300 图像(由上面的蓝色、绿色、红色矩形表示)轻松获得该图像的原始图像,直接与 SSD-Inception V2 兼容。也许您可以通过这种方式进行可靠的对象识别?训练和推理。
另一种利用“众所周知的主干 SSD-Inception V2 的完整深度智能但仅适用于 300x300 输入图像”的方法是按以下方式并行拆分图像;
...这意味着您将为 300x300 大小的输入图像配置静态位置,以用于 SSD Inceptions-V2 的并行副本。并且,应用简单的“计数逻辑”,例如计算原始 640x640 图像中小物体的总数。
我希望这些想法能帮助您解决最初的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。