Tensorflow 高误报率和非最大抑制问题

dar*_*ake 6 object-detection false-positive non-maximum-suppression tensorflow object-detection-api

我正在使用fast_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。使用标准值,结果比这更糟糕。

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

谢谢

Dav*_*sia 5

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

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

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

image_resizer {
  keep_aspect_ratio_resizer {
    min_dimension: 600
    max_dimension: 1024
  }
}
Run Code Online (Sandbox Code Playgroud)

如果采用数据集的其中一张图像并手动应用该转换,您将看到小图像的结果非常嘈杂,而具有不同纵横比的许多图像的结果非常变形。

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

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

钯。

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

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

如果你把 COCO 的当前获胜者和像卡通一样的奇怪图像喂给它,你会发现它会产生很多误报。

因此,这更像是当前对象检测方法的一个问题,它对域更改不具有鲁棒性。