在自己的数据集上训练Tensorflow对象检测
machine-learning
object-detection
tensorflow
5
0

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

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

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

这假定模块已经安装。否则请参阅其文档

免责声明

该答案并不意味着是训练对象检测模块的正确唯一方法。这仅仅是我分享我的经验以及对我有用的东西。由于我对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>标记,因为它们将被训练和评估二进制文件忽略。

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

ImageSets-> Main :它仅由文本文件组成。对于每个类,都有一个对应的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文件由测试验证数据集组成。将此视为训练期间的测试数据。您想将数据集分为训练和验证。更多信息可以在这里找到。这些文件的格式与培训的格式相似。

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

+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组成,该JSON为每个项目分配ID和名称。对该文件进行修改以反映您想要的对象。


2.生成TFRecords

如果您查看他们的代码(尤其是这一行) ,他们将仅显式获取aeroplane_train.txt 。出于好奇, 这就是原因 。将此文件名更改为您的任何班级训练文本文件。

确保VOCdevkitmodels / object_detection内部,然后可以继续生成TFRecords

如果您遇到任何问题,请先阅读他们的代码。这是不言自明的,有据可查。


3.管道配置

这些说明应该是自解释性的,以涵盖此部分。样本配置可在object_detection / samples / configs中找到

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

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


4.可视化

确保评估与培训并行进行,以便能够可视化学习过程。引用黄宗盛

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

您希望看到在最初的几个小时中mAP已经“升高”,然后您希望看到它何时收敛。不看这些图很难说出您需要多少步。


编辑一(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}
收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号