使用张量流进行多 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.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)
添加条目列表的随机播放。结果改善了很多,正如您在 Loss、Total Loss 和 mAP 图中所见:
损失和总损失:
mAp:
现在损失只有一个峰值,可能是我将清理的数据集中的一些错误。显然,现在的评价和检测也相当不错了。
请记住:您的 TFRecords 中的图像顺序非常重要(尤其是当批大小为 1 时)!
感谢 Suleiman 的提示。
我正在使用 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.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)
添加条目列表的随机播放。结果改善了很多,正如您在 Loss、Total Loss 和 mAP 图中所见:
损失和总损失:
mAp:
现在损失只有一个峰值,可能是我将清理的数据集中的一些错误。显然,现在的评价和检测也相当不错了。
请记住:您的 TFRecords 中的图像顺序非常重要(尤其是当批大小为 1 时)!
感谢 Suleiman 的提示。