使用张量流进行多 class 对象检测:评估时出现奇怪的行为

Multi-class object detection with tensorflow: weird behavior on evaluation

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

我正在尝试使用自定义数据集训练多 class 对象检测,但我有一些奇怪的行为。我有 2 classes:Pistol 和 Knife(分别有 876 和 664 张图像,所有图像的尺寸都相似,从 360x200 到 640x360,比例相似)。所以,我认为数据集是平衡的。我把它分成训练集(1386 张图片:594 把刀,792 支手枪)和测试集(154 张图片:70 把刀,84 支手枪)

CNN 似乎只能检测到两个对象中的一个具有良好的准确性,并且哪个对象可以检测到(两个 classes)在训练步骤和同一图像中随机变化(示例: step 10000 只检测手枪, step 20000 只检测刀, step 30000 刀, step 40000 手枪, step 50000 刀等等),如下图:

]

此外,Loss 看起来很奇怪,而且评估期间的准确度从来都不高 classes 在一起。

在训练阶段,损失似乎在每个训练步骤都在波动。

损失:

总损失:

从 mAP(下图)可以看出,这两个对象从未在同一步骤中一起识别:

如果我分别训练这两个 class,我可以达到 50-60% 的准确率。如果我把这两个 class 一起训练,结果就是你看到的。

在这里你可以找到generate_tfrecord.py and the model configuration file(我改成了多class)。标签图如下:

item {
  id: 1
  name: 'knife'
}

item {
  id: 2
  name: 'pistola'
}

欢迎任何建议。

更新 在 600k 次迭代后,loss 仍在振荡。 场景如下:Loss, Total Loss, and mAp

终于解决了我的问题。

我听从了@Suleiman 的建议,但第一次我只洗牌了 test.csvtrain.csv.我看到在我的 generate_tfrecords.py 中,项目将按文件名重新排序,因此之前的随机播放没有用。 我通过更改

generate_tfrecords.py 中的数据集进行了混洗
    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, path)

对此:

    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    shuffle(grouped) // shuffling list of entries
    for group in grouped:
        tf_example = create_tf_example(group, path)

添加条目列表的随机播放。结果改善了很多,正如您在 Loss、Total Loss 和 mAP 图中所见:

损失和总损失:

mAp:

现在损失只有一个峰值,可能是我将清理的数据集中的一些错误。显然,现在的评价和检测也相当不错了。

请记住:您的 TFRecords 中的图像顺序非常重要(尤其是当批大小为 1 时)!

感谢 Suleiman 的提示。