【教程】使用TensorFlow对象检测接口标注数据集
当为机器学习对象检测和识别模型构建数据集时,为数据集中的所有图像生成标注非常耗时。而这些标注是训练和测试模型所必需的,并且标注必须是准确的。因此,数据集中的所有图像都需要人为监督。不过,这并不意味着机器学习模型不能提供帮助。
在仅包含60个图像的小数据集上训练之后,检测赛车
因为,检查和纠正大多数标注都正确的图像通常比所有的标注都由人完成省时。在处理包含数千个图像的数据集时,即使每个图像节省几秒钟,也可以最终节省数小时的工作时间。
本文的目的是要证明,对于不需要高精度的物体识别和检测任务,小的数据集和“开箱即用”的模型就可以提供不错的结果。
以图像中的赛车检测为例,本文将通过以下步骤进行指导:
1. 在小数据集中标注图像。
2. 从这个数据集中训练一个简单的模型。
3. 使用这个简单的模型来预测新数据集图像的标注。
代码和数据请访问下方链接。本文假设你已经安装了TensorFlow Object Detection API。
GitHub:https://github.com/AndrewCarterUK/tf-example-object-detection-api-race-cars
标注图像
PASCAL VOC文件格式是用于图像标注的格式。这是Image Net使用的XML文件格式。而LabelImg程序可以用来生成和修改这种格式的标注。
范例库中的数据目录显示了使用此方法生成的标注(如下链接)。这种标记的映射文件需要手动创建,因为它不是由LabelImg产生。
https://github.com/AndrewCarterUK/tf-example-object-detection-api-race-cars/tree/master/data
训练模型
该TensorFlow目标检测接口提供了关于调整和利用现有模型的自定义数据集的详细文档。
训练模型的基本过程是:
1. 将PASCAL VOC原始数据集转换为TFRecord文件。范例库提供了一个可用于执行此操作的Python脚本。
2. 创建一个对象检测管道。该项目提供有关如何执行此操作的官方文档,并且在代码库中有一个示例。存储库中的示例基于ssd_mobilenet_v1_coco检查点,需要更多检查点可从官方文档下载。
3. 训练模型。可以在本地或在Google云平台上完成。取得这篇文章中的结果大约迭代1万次。
4. 将最后一个检查点导出到推理图(inference graph)。
这个过程的最终结果将是一个名为frozen_inference_graph.pb的文件。它可以用来预测标注的模型。
预测标注
可以使用pascal- vocwriter库生成在PASCAL VOC文件格式的标注。它有个非常好用的接口,下面的代码展示了向图像添加“cat”标注的示例:
from pascal_voc_writerimport Writer
writer= Writer('path/to/img.jpg',800,400)
writer.addObject('cat',100,100,200,200)
writer.save('path/to/img.xml')
范例库中的annotate.py文件使用这个库来调整官方文档中的推理示例,以创建PASCAL VOC标注文件而不是进行图像可视化。
可以根据数据集和操作符的需要优化生成注释的阈值。合适的阈值应该在错误率与错过率之间找到平衡点。如果删除错误标注对于操作员而言比标注遗漏容易,那么应该使用较低的阈值。
下面是来自简易模型的三个预测。尽管数据集非常小,训练次数也不多,但模型依然做出了不错的预测,可以节省标注这些图像的时间。
在这个例子中,两个标注正确,一个错过。在最远的车中建议标注的可能性数值稍有下降。
这些图像需要很长时间手动标注。模型在缩减大部分工作量方面做了不错的贡献。对于一些模糊的汽车来说,它也在努力辨认,但是这些模糊的汽车人类也很难辨别。
两辆车都被识别出来,但是红的那个边界框太宽了。
- 【机器学习】实例详解机器学习如何解决问题
- 企业网站架构之Nginx+tomcat+memcached集群
- 企业级Docker Registry开源工具Harbor的介绍以及使用指南
- HLS Lesson8-基本操作
- Windows渗透测试工具:RedSnarf
- HLS Lesson7-复合数据类型
- matlab GUI基础3
- 【Python环境】《Python数据科学入门》试译 第一章 简介
- HLS Lesson20-实例分析
- WannaCry勒索病毒详细解读
- matlab GUI基础3
- 不使用反射的实体类方案
- matlab GUI基础1
- Why to do,What to do,Where to do 与 Lambda表达式!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- “Hello Node.js” 这一次是你没见过的写法
- 作为DBA,你不得不掌握的压测工具
- Mac之vim普通命令使用
- selenium库的基本使用
- 高效大数据开发之 bitmap 思想的应用
- 从0到1实现一个虚拟DOM
- Xenomai XDDP example and Posix Compling
- 项目实践|基于Flink的用户行为日志分析系统
- 手把手教你用Matplotlib画一个小清新配色的商业图表
- 高并发场景下锁的使用技巧
- Struts2第四天:Struts2的拦截器和标签库
- kubernete编排技术八:使用operator管理有状态应用
- Spring第一天:Spring的概述、SpringIOC入门(XML)、Spring的Bean管理、Spring属性注入
- Flink的处理背压原理及问题-面试必备
- Spring第二天:Spring的IOC的注解方式、Spring的AOP开发(XML)