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

esh*_*ima 25 machine-learning object-detection tensorflow

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

如何使用TS对象检测来训练使用我自己的数据集?

esh*_*ima 50

这假设模块已经安装.如果没有,请参阅他们的文档.

放弃

这个答案并不是训练物体检测模块的正确唯一方法.这只是我分享我的经验以及对我有用的东西.我愿意接受建议,并对此有所了解,因为我一般都是ML的新手.

TL; DR

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

本答案的每个部分都包含相应的编辑(见下文).阅读完每个部分后,请阅读其编辑内容以进行说明.每个部分都添加了更正和提示.

使用的工具

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

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

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

查看2012年5月的数据集,您会注意到该文件夹​​具有以下结构

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

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

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

JPEGImages:实际图像的位置.确保它们是JPEG类型,因为这是使用其提供的脚本创建TFRecords时当前支持的内容.

ImageSets-> 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

此时,您的文件夹结构应该是

+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

如果您查看他们的代码,尤其是这一,他们只会明确地获取aeroplane_train.txt.对于古玩人士来说,这就是原因.将此文件名更改为任何类训练文本文件.

确保VOCdevkit位于models/object_detection中,然后您可以继续生成TFRecords.

如果您遇到任何问题,请先查看他们的代码.这是自我解释和有据可查的.


3.管道配置

指令应该是自我解释来弥补这一部分.样本配置可以在object_detection/samples/configs中找到.

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

从这里开始,您可以继续学习本教程并运行培训过程.


4.可视化

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

最好的方法是运行eval.py二进制文件.我们通常将此二进制文件与训练并行运行,将其指向保存正在训练的检查点的目录.eval.py二进制文件会将日志写入eval_dir您指定的日志,然后您可以使用Tensorboard指向该日志.

您希望看到mAP在最初的几个小时内"解除",然后您希望看到它何时收敛.如果不看这些图表,你需要多少步骤,这很难说清楚.


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

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

工具

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

帕斯卡VOC

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

请查看他们的官方开发工具包,以便更好地理解格式.

标签图生成

在我写作时,ID 0表示none_of_the_above.建议您的ID从1开始.

想象

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

为此,请在其他端口上运行tensorboard并将其指向您的火车目录

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}
Run Code Online (Sandbox Code Playgroud)


Dat*_*ran 16

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

  • 嘿,谢谢你的建议:)我看过RectLabel。看起来还不错 我会试试看。关于第一个问题,`num_hard_examples`与难的示例矿工有关。看看这份[paper](https://arxiv.org/abs/1604.03540)可以理解这一点。num_examples与评估有关。在评估过程中,它会获取图像,您需要指定数量。他们还使用“ max_eval”来限制评估过程。对于数字3 :)是的,没关系哈哈,不是谁先来,而是彼此学习。 (2认同)