Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于tensorflow的多类目标检测:评估中的怪异行为_Tensorflow_Deep Learning_Object Detection - Fatal编程技术网

基于tensorflow的多类目标检测:评估中的怪异行为

基于tensorflow的多类目标检测:评估中的怪异行为,tensorflow,deep-learning,object-detection,Tensorflow,Deep Learning,Object Detection,我正在使用Tensorflow对象检测,使用更快的rcnn\U inception\U v2\U coco作为预训练模型。我使用的是Windows 10,NVIDIA GeForce GTX 1080、CUDA 9.0和CUDNN 7.0上的tensorflow gpu 1.6 我试图用自定义数据集训练多类对象检测,但我有一些奇怪的行为。我有两类:手枪和刀(分别有876和664张图片,大小从360x200到640x360,比例相似)。因此,我认为数据集是平衡的。我把它分成火车组(1386张图片:

我正在使用Tensorflow对象检测,使用更快的rcnn\U inception\U v2\U coco作为预训练模型。我使用的是Windows 10,NVIDIA GeForce GTX 1080、CUDA 9.0和CUDNN 7.0上的tensorflow gpu 1.6

我试图用自定义数据集训练多类对象检测,但我有一些奇怪的行为。我有两类:手枪和刀(分别有876和664张图片,大小从360x200到640x360,比例相似)。因此,我认为数据集是平衡的。我把它分成火车组(1386张图片:594把刀,792把手枪)和测试组(154张图片:70把刀,84把手枪)

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

]

此外,损失看起来很奇怪,两个类在评估过程中的准确性从来都不高

在训练阶段,损失似乎在每一个训练步骤都会振荡

损失:

总损失:

从地图(下图)中,您可以看到这两个对象从未在同一步骤中同时标识:

如果我分别训练这两门课,我可以获得50-60%的准确率。如果我一起训练这两个班,结果就是你所看到的。

在这里您可以找到和(我将其更改为多类)。标签图如下所示:

item {
  id: 1
  name: 'knife'
}

item {
  id: 2
  name: 'pistola'
}
欢迎任何建议

更新 在600k迭代之后,损耗仍在振荡。
场景如下:,和

最后,我解决了我的问题

我听从了@Suleiman的建议,但第一次我只修改了test.csv和train.csv。我看到在我的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)
添加条目列表的无序排列。结果改善了很多,如损失、总损失和地图图所示:

损失和总损失:

地图:

现在损失只有一个峰值,可能是因为数据集中的一些错误,我将清理这些错误。显然,现在的评估和检测都很好

因此请记住:TF记录中图像的顺序非常重要(尤其是当批量大小为1时)


感谢苏莱曼的提示。

你是否将1386张图片的顺序随机化:594把刀,792把枪,然后输入网络进行训练?@Suleiman否,这是一个“交错”顺序(200把枪,然后是50把刀,50把枪,200把刀等等),批次为1(更快的rcnn默认值)。重要吗?有一种聪明/简单的方法可以做到这一点,或者我需要手动完成,随机重命名数据集?最好是随机洗牌,如果不是的话,你的网络可能只是学习和预测最后一节课。有了tensorflow,您可以使用类似@Suleiman的python代码轻松实现它。是的,谢谢,但我使用的是tensorflow的对象检测工具(.你知道我在哪里可以洗牌我的火车输入吗?我在火车里找不到它。py我不知道物体检测工具,但看起来你可以自己手动洗牌图像,但这会很乏味