在尝试完成这项任务花费了几天后,我想分享我的经验,来说明我是如何解决这个问题的:
如何使用TS对象检测来训练我的数据集?
回答:
这假设模块已经安装。如果没有,请参考他们的文档。
免责声明
这个回答并不是训练对象检测模块的正确或唯一方法。这只是我在分享我的经验和对我有效的方法。作为一个对机器学习整体还比较新的学习者,我乐于接受建议和进一步学习。
TL;DR
- 创建自己的PASCAL VOC格式数据集
- 从中生成TFRecords
- 配置管道
- 可视化
本回答的每个部分都包含相应的编辑(见下文)。阅读每个部分后,请同时阅读其编辑部分以获取澄清。每部分都增加了修正和提示。
使用的工具
LabelImg:用于创建PASCAL VOC格式注释的工具。
1. 创建自己的PASCAL VOC数据集
PS: 为了简化,我的回答遵循Pascal VOC 2012的文件夹命名约定
查看2012年5月的数据集,你会注意到文件夹具有以下结构
+VOCdevkit +VOC2012 +Annotations +ImageSets +Action +Layout +Main +Segmentation +JPEGImages +SegmentationClass +SegmentationObject
目前,对以下文件夹进行了修改:
Annotations:这是所有图像对应的XML文件存放的地方。使用上面建议的工具来创建注释。不要担心<truncated>
和<difficulty>
标签,因为训练和评估的二进制文件会忽略它们。
JPEGImages:实际图像的位置。确保它们是JPEG格式,因为这是目前支持的格式,以便使用他们提供的脚本创建TFRecords。
ImageSets->Main:这仅包含文本文件。对于每个类别,都有一个对应的train.txt、trainval.txt和val.txt。以下是VOC 2012文件夹中aeroplane_train.txt的内容示例
2008_000008 -12008_000015 -12008_000019 -12008_000023 -12008_000028 -12008_000033 1
基本结构是图像名称后跟一个布尔值,指示相应的对象是否存在于该图像中。例如,图像2008_000008不包含飞机,因此标记为-1,但图像2008_000033包含飞机。
我编写了一个小型Python脚本来生成这些文本文件。只需遍历图像名称并在它们旁边分配1或-1表示对象的存在。我通过打乱图像名称在文本文件中增加了一些随机性。
{classname}_val.txt文件包含测试验证数据集。可以将其视为训练期间的测试数据。你需要将数据集划分为训练和验证。更多信息可以在这里找到这里。这些文件的格式与训练文件类似。
此时,你的文件夹结构应该是
+VOCdevkit +VOC2012 +Annotations --(为每个图像生成的注释) +ImageSets +Main --(为每个类别生成的 *classname*_train.txt 和 *classname*_val.txt) +JPEGImages --(一堆JPEG图像)
1.1 生成标签映射
数据集准备好后,我们需要创建相应的标签映射。导航到models/object_detection/data并打开pascal_label_map.pbtxt。
这个文件包含一个JSON,分配每个项目的ID和名称。修改这个文件以反映你希望检测的对象。
2. 生成TFRecords
如果你查看他们的代码,特别是这一行,他们明确只抓取aeroplane_train.txt。对于好奇的读者,这里解释了原因。将这个文件名更改为你任何类别的训练文本文件。
确保VOCdevkit在models/object_detection内,然后你可以继续生成TFRecords。
如果遇到任何问题,请先查看他们的代码。它是自解释的且文档齐全。
3. 管道配置
说明应该足以涵盖这一部分。样本配置可以在object_detection/samples/configs中找到。
对于像我一样希望从头开始训练的人,只需确保删除fine_tune_checkpoint
和from_detection_checkpoint
节点。这里是我的配置文件供参考。
从这里你可以继续教程并运行训练过程。
4. 可视化
确保在训练的同时并行运行评估,以便能够可视化学习过程。引用Jonathan Huang的话
最好的方法是运行eval.py二进制文件。我们通常在训练的同时并行运行这个二进制文件,指向正在训练的检查点所在的目录。eval.py二进制文件会将日志写入你指定的
eval_dir
,然后你可以用Tensorboard指向它。你希望看到在最初几个小时内mAP已经“起飞”,然后你希望看到它何时收敛。如果不查看这些图表,很难判断你需要多少步数。
编辑I(2017年7月28日):
我没想到我的回答会受到如此多的关注,所以我决定回来审查一下。
工具
对于我的苹果用户朋友们,你们实际上可以使用RectLabel进行注释。
Pascal VOC
经过一番研究,我终于意识到trainval.txt实际上是训练和验证数据集的联合体。
请查看他们的官方开发工具包以更好地理解格式。
标签映射生成
在我撰写时,ID 0代表none_of_the_above
。建议你的ID从1开始。
可视化
在运行你的评估并将tensorboard指向你的Eval目录后,它会显示每个类别的mAP以及每个类别的性能。这很好,但我喜欢同时看到我的训练数据与Eval并行显示。
为此,在不同的端口运行tensorboard并指向你的训练目录
tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}