张量流的多类对象检测:评估中的怪异行为

时间:2019-01-29 11:46:56

标签: tensorflow deep-learning object-detection

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

我正在尝试使用自定义数据集训练多类对象检测,但是我有一些奇怪的行为。我有2个类别:手枪和刀(分别具有876和664图像,尺寸从360x200到640x360相似,并且比例相似)。因此,我认为数据集是平衡的。我将其分为火车套装(1386张图片:594刀,792手枪)和测试套装(154张图片:70刀,84手枪)

CNN似乎只能准确地检测到两个对象中的一个,并且哪个对象可以在训练步骤中随机检测到(两个类别中的)变化,并且在同一图像中(例如:步骤10000,它仅检测到手枪) ,仅步20000刀,步30000刀,步40000手枪,步50000刀,等等。),如下所示:

Weird behavior in evaluation][3]]

此外,“损失”看起来很奇怪,并且两个类别的评估过程中的准确性从来都不高。

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

损失:

Loss

总损失:

TotalLoss

从mAp(下图)中,您可以看到两个对象永远不会在同一步骤中一起被识别:

mAp

如果我分别培训这两个课程,则可以达到50-60%的良好准确性。如果我将这两个课程一起训练,那么结果就是您所看到的。

在这里您可以找到generate_tfrecord.pymodel configuration file(我将其更改为多类)。标签图如下:

item {
  id: 1
  name: 'knife'
}

item {
  id: 2
  name: 'pistola'
}

欢迎提出任何建议。

更新 经过60万次迭代,损耗仍在振荡。  该场景如下:LossTotal LossmAp

1 个答案:

答案 0 :(得分:0)

最后,我解决了我的问题。

我遵循@Suleiman的建议,但是第一次我只改组了 test.csv train.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)

添加条目列表的随机播放。正如您在“损耗”,“总损耗”和“ mAp”图中所看到的那样,结果有了很大改善:

损失和总损失: Loss and Total Loss

mAp: mAp

现在损失只有一个峰值,也许是我将要清理的数据集中的某些故障。显然,评估和检测现在也很好。

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

感谢苏莱曼