在自己的数据集上训练Tensorflow对象检测

时间:2017-07-07 14:22:50

标签: machine-learning tensorflow object-detection

在花了几天时间试图完成这项任务之后,我想分享一下我如何回答这个问题的经验:

如何使用TS Object Detection来训练使用我自己的数据集?

2 个答案:

答案 0 :(得分:48)

这假定模块已经安装。如果没有,请参考他们的documentation

<强>声明

这个答案并不是正确训练对象检测模块的方式。这只是我分享我的经验以及对我有用的东西。我可以接受建议并了解更多相关信息,因为我一般都是ML的新手。

<强> TL; DR

  1. 创建您自己的PASCAL VOC格式数据集
  2. 从中生成TFRecords
  3. 配置管道
  4. 可视化
  5. 此答案的每个部分都包含相应的编辑(见下文)。阅读完每个部分后,请阅读其编辑内容以进行说明。每个部分都添加了更正和提示。

    使用的工具

    LabelImg:用于创建PASCAL VOC格式注释的工具。

    <强> 1。创建您自己的PASCAL VOC数据集

    PS: 为简单起见,我的答案的文件夹命名惯例遵循Pascal VOC 2012

    查看May 2012 dataset,您会注意到该文件夹​​具有以下结构

    +VOCdevkit +VOC2012 +Annotations +ImageSets +Action +Layout +Main +Segmentation +JPEGImages +SegmentationClass +SegmentationObject

    目前,对以下文件夹进行了修改:

    注释 :这是所有图片&#39;将放置相应的XML文件。使用上面建议的工具创建注释。不要担心<truncated><difficulty>标记,因为它们会被训练和eval二进制文件忽略。

    JPEGImages :实际图片的位置。确保它们是JPEG类型,因为它是当前支持的,以便使用提供的脚本创建TFRecords。

    ImageSets-&gt; Main :这只包含文本文件。对于每个类,都存在相应的 train.txt trainval.txt val.txt 。以下是VOC 2012文件夹中 aeroplane_train.txt 的内容示例

    2008_000008 -1
    2008_000015 -1
    2008_000019 -1
    2008_000023 -1
    2008_000028 -1
    2008_000033  1
    

    结构基本上是图像名称,后跟一个布尔值,表示相应的对象是否存在于该图像中。例如,图像 2008_000008 不包含飞机,因此标有 -1 ,但图像 2008_000033

    我写了一个小的Python脚本来生成这些文本文件。只需遍历图像名称并在它们旁边分配1或-1即可存在对象。我通过改变图像名称在我的文本文件中添加了一些随机性。

    {classname} _val.txt 文件由 testing 验证数据集组成。将此视为培训期间的测试数据。您希望将数据集划分为培训和验证。可以找到更多信息here。这些文件的格式类似于培训。

    此时,您的文件夹结构应为

    +VOCdevkit +VOC2012 +Annotations --(for each image, generated annotation) +ImageSets +Main --(for each class, generated *classname*_train.txt and *classname*_val.txt) +JPEGImages --(a bunch of JPEG images)

    1.1生成标签地图

    准备好数据集后,我们需要创建相应的标签贴图。 导航到 models / object_detection / data 并打开 pascal_label_map.pbtxt

    此文件包含一个JSON,用于为每个项目分配ID和名称。对此文件进行修改以反映您想要的对象。

    <强> 2。生成TFRecords

    如果您查看他们的代码,尤其是line,他们只会明确获取 aeroplane_train.txt 。对于古玩人士来说,here's why。将此文件名更改为任何班级列车文本文件。

    确保 VOCdevkit 位于 models / object_detection 中,然后您可以继续generate the TFRecords

    如果您遇到任何问题,请先检查他们的代码。它是自我解释的并且有详细记录。

    第3。管道配置

    instructions应自我解释以涵盖此细分。样本配置可以在object_detection/samples/configs中找到。

    对于那些希望像我一样从头开始训练的人,请确保删除fine_tune_checkpointfrom_detection_checkpoint个节点。 Here's我的配置文件看起来像是供参考。

    从此处开始,您可以继续tutorial并运行培训流程。

    <强> 4。可视化

    确保与培训并行运行eval,以便能够可视化学习过程。引用Jonathan Huang

      

    最好的方法是运行eval.py二进制文件。我们通常运行这个   二进制并行训练,将其指向目录持有   正在训练的检查站。 eval.py二进制文件将写入   记录到您指定的eval_dir,然后指向该none_of_the_above   与Tensorboard。

         

    你想看到mAP已经解除了#34;在最初的几个小时里   然后你想看看它何时收敛。没有它很难说   看看这些图表你需要多少步骤。

    编辑I(7月28日&#39; 17):

    我从没想过我的回应得到了这么多的关注所以我决定回来看看它。

    工具

    对于我的Apple用户,您实际上可以使用RectLabel进行注释。

    Pascal VOC

    在挖掘之后,我终于意识到 trainval.txt 实际上是训练和验证数据集的结合。

    请查看他们的official development kit以更好地了解格式。

    标签地图生成

    在我写作时,ID 0代表tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER} 。建议您的ID从1开始。

    <强>可视化

    运行评估并将张量板指向您的Eval目录后,它会显示每个类别的mAP以及每个类别的性能。这很好,但我喜欢看到我的训练数据与Eval平行。

    要执行此操作,请在其他端口上运行tensorboard并将其指向您的列车目录

    {{1}}

答案 1 :(得分:16)

我在Medium上写了一篇关于我的经验的blog post以及如何在我自己的数据集上使用Tensorflow训练一个物体探测器(特别是它是一个浣熊探测器)。这可能对其他人有用,并且与eshirima的答案互补。