在花了几天时间试图完成这项任务之后,我想分享一下我如何回答这个问题的经验:
如何使用TS Object Detection来训练使用我自己的数据集?
答案 0 :(得分:48)
这假定模块已经安装。如果没有,请参考他们的documentation。
<强>声明强>
这个答案并不是正确或仅训练对象检测模块的方式。这只是我分享我的经验以及对我有用的东西。我可以接受建议并了解更多相关信息,因为我一般都是ML的新手。
<强> TL; DR 强>
此答案的每个部分都包含相应的编辑(见下文)。阅读完每个部分后,请阅读其编辑内容以进行说明。每个部分都添加了更正和提示。
使用的工具
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_checkpoint
和from_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的答案互补。