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

Train Tensorflow Object Detection on own dataset

在花了几天时间尝试完成此任务后,我想分享一下我如何着手回答问题的经验:

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

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

免责声明

这个答案并不意味着正确训练对象检测模块的方式。这只是我分享我的经验和对我有用的东西。我乐于接受建议并了解更多相关信息,因为我对 ML 总体上还是个新手。

TL;DR

  1. 创建您自己的 PASCAL VOC 格式数据集
  2. 从中生成 TFRecords
  3. 配置管道
  4. 可视化

此答案的每个部分都包含相应的编辑(见下文)。阅读每个部分后,请阅读其编辑以及澄清。每个部分都添加了更正和提示。

使用的工具

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

1.创建您自己的 PASCAL VOC 数据集

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

查看 May 2012 dataset,您会发现该文件夹具有以下结构

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

暂时对以下文件夹进行了修改:

Annotations:这是所有图像对应的XML文件将被放置的地方。使用建议的工具上面创建注释。不要担心 <truncated><difficulty> 标签,因为它们会被训练和评估二进制文件忽略。

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

ImageSets->Main:这仅由文本文件组成。对于每个 class,存在对应的 train.txttrainval.txtval.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, they explicitly grab the aeroplane_train.txt only. For curios minds, 。将此文件名更改为任何 class 训练文本文件。

确保 VOCdevkitmodels/object_detection 里面然后你就可以继续 generate the TFRecords.

如果您 运行 遇到任何问题,请先检查他们的代码。它不言自明并且有据可查。


3。管道配置

instructions should be self explanatory to cover this segment. Sample configs can be found in object_detection/samples/configs.

对于那些希望像我一样从头开始训练的人,只需确保删除 fine_tune_checkpointfrom_detection_checkpoint 节点。 Here's 我的配置文件是什么样的以供参考。

从这里开始,您可以继续 tutorial 和 运行 训练过程。


4.可视化

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

the best way is to just run the eval.py binary. We typically run this binary in parallel to training, pointing it at the directory holding the checkpoint that is being trained. The eval.py binary will write logs to an eval_dir that you specify which you can then point to with Tensorboard.

You want to see that the mAP has "lifted off" in the first few hours, and then you want to see when it converges. It's hard to tell without looking at these plots how many steps you need.


编辑 I(17 年 7 月 28 日):

没想到我的回复会受到如此多的关注,所以我决定回来复习一下。

工具

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

帕斯卡 VOC

经过深挖,我终于意识到trainval.txt实际上是训练和验证数据集的联合。

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

标签地图生成

在我撰写本文时,ID 0 代表 none_of_the_above。建议您的 ID 从 1 开始。

可视化

运行完成评估并将 tensorboard 定向到您的 Eval 目录后,它会向您显示每个类别的地图以及每个类别的表现。这很好,但我喜欢与 Eval 并行查看我的训练数据。

为此,运行 不同端口上的 tensorboard 并将其指向您的训练目录

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}

我在 Medium 上写了一篇 blog post 关于我的经验以及我如何使用 Tensorflow 在我自己的数据集上训练对象检测器(特别是 Raccoon 检测器)的经验。这可能对其他人也有用,并且是对 eshirima 的回答的补充。