6

我正在使用faster_rcnn_inception_v2_coco作为预训练模型在 Windows 10 上训练Tensorflow 对象检测。我在 Windows 10 上,在 NVIDIA GeForce GTX 1080、CUDA 9.0 和 CUDNN 7.0 上使用 tensorflow-gpu 1.6。

我的数据集仅包含一个对象“手枪”和 3000 张图像(2700 个训练集,300 个测试集)。图像的大小从 ~100x200 到 ~800x600。

我训练这个模型进行了 55k 次迭代,其中mAP约为 0.8,TotalLoss似乎收敛到 0.001。但是,但是,看到评估,在同一个检测到的对象上有很多多个边界框(例如thisthis),并且有很多误报(房屋被检测为手枪)。例如,在我拍摄的这张照片中(后来应用了模糊滤镜),模型将人和汽车检测为手枪,以及正确检测。

数据集与 tfrecords 和标签映射一起上传到此处。我使用了这个配置文件,其中我唯一更改的是:num_classes为 1、fine_tune_checkpoint、train 和 eval的input_pathlabel_map_path以及num_examples。 由于我认为多个框是一个非最大抑制问题,我将score_threshold(第 73 行)从 0 更改为 0.01,将iou_threshold(第 74 行)从 1 更改为 0.6。使用标准值,结果比这差得多。

我该怎么做才能获得良好的检测?我应该改变什么?也许我错过了一些关于参数调整的东西......

谢谢

4

2 回答 2

5

我认为,在深入研究参数调整(即提到的score_threshold)之前,您必须查看您的数据集。

我没有检查您共享的整个数据集,但从高层次来看,我发现的主要问题是大多数图像非常小并且具有高度可变的纵横比。

在我看来,这与您的配置文件的这一部分冲突:

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 600
    max_dimension: 1024
  }
}

如果取数据集中的一张图像并手动应用该转换,您会发现结果对于小图像来说非常嘈杂,对于许多具有不同纵横比的图像来说非常变形。

我强烈建议您使用具有更多定义的图像重新构建您的数据集,并尝试使用填充、裁剪或其他策略对具有不寻常纵横比的图像进行预处理。

如果您想坚持使用小图像,您至少必须更改最小和最大尺寸,image_resizer但是根据我的经验,这里最大的问题是数据集,我会花时间尝试解决这个问题。

钯。

如果我们认为它来自数据集的一个完全不同的域,我不认为房子误报是一个大问题。

您可能可以调整最小置信度以将检测视为真阳性并将其删除。

如果你拿 COCO 的当前获胜者并用卡通片等奇怪的图像喂它,你会发现它会产生很多误报。

因此,这更像是当前对象检测方法的一个问题,它对域变化并不鲁棒。

于 2018-04-07T11:01:15.640 回答
4

我在网上看到的很多人都在使用 Tensorflow API 时遇到过同样的问题。我认为在家中使用带有自定义分类器的预训练模型的想法/过程存在一些固有问题。例如,人们想使用 SSD Mobile 或 Faster RCNN Inception 来检测“带头盔的人”、“手枪”或“工具箱”等对象。一般过程是输入该对象的图像,但大多数那个时候,无论有多少图像...... 200 到 2000,当你在你的办公桌上实际运行它时,你仍然会得到误报。

当您在自己的上下文中显示对象时,对象分类器效果很好,但您最终会在卧室窗户、桌子、电脑显示器、键盘等日常物品上获得 99% 的匹配。人们提到了以下策略引入负面图像或柔和图像。我认为问题与大多数人使用的图像中的有限上下文有关。预训练模型在多种环境中使用十几个分类器进行训练,例如在一个示例中可能是街上的汽车。CNN 看到汽车,然后该图像中不是汽车的所有内容都是负面图像,包括街道、建筑物、天空等。在另一张图像中,它可以看到瓶子以及该图像中的所有内容,包括桌子,桌子、窗户等 我认为训练自定义分类器的问题在于它是一个负面图像问题。即使您有足够多的对象本身的图像,也没有足够的同一对象在不同上下文和背景中的数据。所以从某种意义上说,即使在概念上你不应该需要负面图像,也没有足够的负面图像。当您在家中运行该算法时,您会在各处发现误报,以识别您自己房间周围的物体。我认为以这种方式进行迁移学习的想法是有缺陷的。我们最终只是在网上看到了很多关于人们识别扑克牌、千年隼等的很棒的教程,但是这些模型都不能在现实世界中部署,因为当它看到任何东西之外的东西时,它们都会产生一堆误报它的图像池。最好的策略是使用多个分类器从头开始重新训练 CNN,并在其中添加所需的分类器。我建议使用 10-20 个预先存在的分类器重新引入 ImageNet 或 Pascal 的先前数据集,并添加您自己的分类器并重新训练它。

于 2019-08-29T19:42:05.090 回答