雷锋网按:本文为雷锋字幕组编译的技术博客,原标题A complete Transfer Learning Toolchain for Object Detection,作者Ralph Fehrer。
翻译 | 龙珂宇 于志鹏 整理 | 凡江
迁移学习指的是,通过对预训练模型的参数进行微调,将训练好的模型应用到相似或者只有细微差异的不同任务中。通过这个方法,我们可以基于一些性能顶尖的深度学习模型得到别的高性能模型。尽管听上去较为简单,迁移学习仍然在预处理、搭建和测试上有很多的研究空间。
这份教程旨在提供一个工具链(流程中工具和相关库的集合),含有迁移学习中涉及语义分割的一些最基本的内容。以下的教程帮助你搭建一个典型的、具有生产可用性的迁移学习模型。本质上,它是一些特定的工具、框架和模型的结合。我们使用:
google-image-downloader通过图片URL链接向Google发送搜索请求,获取csv图片
Labelbox给数据集做标注,输出及转换
一个tf模型:TensorFlow’s model zoo,基于COCO dataset训练
TensorFlow Object Detection API:应用于迁移学习和推断
一台win10电脑,配备Intel的GPU
每一个单独的步骤沿一下叙述展开:
我们想要通过微调在COCO数据集上预训练的模型,来检测桃子。因为COCO数据集的模型训练目标是检测苹果和橘子,因此只调整预训练模型顶层的一些参数就足够了。
请注意,我们并不会在这个教程中制造出一个很成功的模型,因为那需要在步骤1中用到大得多的模型,也需要花费数倍的时间。我们主要致力于给大家展现一个可以应用于其他类似场景的迁移学习工具链,从如何构建一个自定义的数据集开始,最终得到一个微调完成的模型。
这个工具链中的每一步都有很多的替代选项,并且对于不同的任务,实现迁移学习的方法也有很多种。但如果你想尽快上手,不妨尝试这个工具链,再尽可能地根据你的需求调整每一个步骤。
我们也提供了一个对应的GitHub项目,上面的文件夹存有大部分我们需要的文件及操作过程中生成的文件。你可以克隆它来复现整个项目,也可以创建分支来扩展和修改该项目。
1. 创建一个数据集
如果你在已有的数据集中找不到一个你想检测的物体的数据集,你需要自己找到图片并给他们做标注。有几种工具可以帮助你减化这个痛苦的操作:接下来几步简单地描述了如何使用labelbox, 它是一个基于云端的标注工具,且操作界面十分简洁。如果想了解更详细的操作指南,可以看labelbox documentation.
1.1 收集图片URLs
因为找不到桃子图片的数据集,我们使用Google的图片搜索来构建我们的基础数据集。手动从Google上下载成千张图片非常乏味和耗时,幸运的是,有工具帮助我们通过脚本文件向Google发送搜索请求:
复制google-images-download.py script到脚本文件夹
在当前文件夹下打开command prompt
运行以下指令
我们的数据(桃子)文件夹现在就会出现一个image_urls.csv文件,里面是桃子图片的URL链接。
1.2 给图片做标注
在这一步里,我们创建一个labelbox的项目,导入我们的image_urls.csv文件,然后给图片们做标注。
(可选) Adapt the labeling interface调整做标注的界面
将the labeled datasets输出到json格式
使用这个脚本Use this script将json格式的数据集转化为COCO的格式
请注意:为了生成TFRecords文件,我们需要将coco-files分成训练集,验证集和测试集。你可以创建几个独立的labelbox project,然后重复几遍上述操作;也可以手动或者用脚本把上面生成的东西分成几部分。
下面这张图片展示了web-based labelbox的UI:
使用labelbox给桃子做标注,用于之后的语义分割
这一步的输出是三个json文件,以COCO格式存储其标签及其他信息,分别对应我们的训练集,验证集和测试集。你们可以在accompanying GitHub-repository中对应的data subfolder里找到示例文件。
2. 迁移学习
2.1 将COCO标签数据转换为TFRecords的数据格式
TensorFlow的对象检测API要求数据需为TFRecord格式,这是一种不易理解的数据格式。准确的理解TFRecord需要花费一定的时间,而且并非易事。幸运的是,Tensorflow提供了一些脚本,可以将大部分常用格式转换为TFRecord,例如create_coco_tf.record.py。你可以在我们的GitHub仓库中找到这个脚本的小改版本。
创建TFRecords数据
用命令行cd到与GitHub仓库中对应的脚本文件夹
运行下面的代码
脚本会为三个数据集中的每一个输出一个record文件,并且下载图片到data子目录中,你可以在here看到三个.record后缀的文件
2.2 配置模型参数
下面的步骤与与你准备使用的模型有关,也与新类和原始训练类的关系有关。在本例中,我们训练了可用于TensorFlow模型zoo中的faster_rcnn_resnet50_coco模型,用来监测桃子。桃子与原始数据集中的苹果和句子有着很强的相关性。
从here下载faster_rcnn_resnet50_coco
解压缩下载的tar包
将三个.ckpt后缀文件复制到模型的文件夹中
复制faster_rcnn_resnet50_coco配置文件到模型的子文件夹中
用标签映射创建label_map.pbtxt文件
打开配置文件并做如下更改
-将 fine-tune checkpoint 改为: fine_tune_checkpoint:“../model/model.ckpt”
- 将 train_input_reader 的input_path值改为: input_path: “../data/coco_train.record”
- 将 train_input_reader 的label_map_path 值改为: label_map_path: “../data/label_map.pbtxt”
- 将val_input_reader的 input_path值改为:
input_path: ”../data/coco_val.record”
- 将 val_input_reader 的label_map_path值改为: label_map_path: “../data/label_map.pbtxt”
7.(可选)根据需要,可以修改其他条目
经过以上步骤,我们创建了label_map.pbtxt,并且修改了faster_rcnn_resnet50_coco.config
2.3 训练模型
在这个环节,我们根据之前的配置重新训练模型
复制train.py到脚本的子文件夹
用命令行cd到这个子文件夹
运行下面的代码
检查model/train 子文件夹中是否存在此步骤产生的文件。
3. 生成推理图
首先执行下面的1~3操作,生成的.ckpt文件和frozen_inference_graph.pb文件将用于步骤4、检验推理图和5、推理和评估模型的操作:
将export_inference_graph.py复制到scripts 文件夹。
打开命令行并cd到scripts文件夹
执行下面的脚本:
脚本运行后会在model/fine_tuned_model 文件夹中产生几个.ckpt.*文件和一个frozen_inference_graph.pb文件
4. 检验推理图
TensorBoard是检验Tensorflow程序的一个强大的组件,我们可以用它来更好的理解、调试和优化Tensorflow图
用pip 命令安装TensorBoard
将import_pb_to_tensorboard.py拷贝到 scripts 目录下
在 model/fine_tuned_model 子目录中创建logdir 目录
打开命令行并cd到scripts文件夹
执行下面的脚本:
新创建的logdir文件夹中应当包含tensorboard所需的事件文件
完成以下步骤以开始tensorboard:
打开命令行cd到到scripts目录
运行下面的命令
TensorBoard开始运行后你可以访问 http://localhost:6006,可以在GUI界面中再次看到训练的模型。
关于TensorBoard的更多信息,详见TensorBoard documentation或阅读this tutorial。
5. 推理和评估模型
为了评估模型效果, 我们借助在步骤3中创建的 frozen_inference_graph.pb 文件,来运行在步骤2.1中创建的coco_testdev.record
将detection_inference.py脚本拷贝到scripts目录
将infer_detections.py脚本拷贝到scripts目录
打开命令行cd到scripts目录
运行下面的脚本
在 /data/inference文件夹中查看运行脚本结果 . 关于TensorFlow API的更多说明请参考this TensorFlow tutorial。
如果对模型最终的训练效果满意的话,那么此模型就算训练完成。
博客原址 https://medium.com/practical-deep-learning/a-complete-transfer-learning-toolchain-for-semantic-segmentation-3892d722b604
雷锋字幕组正在招募中,扫描下方二维码,备注“雷锋字幕组+姓名”加入我们。雷锋网雷锋网