让我们先来先看一下最终实现的效果视频
现在很多科技巨头如 IBM、谷歌、微软和亚马逊都推出了简便易用的视觉识别 API,甚至一些小型公司如 Clarifai 等也推出的相似的 API。此外,Facebook今年年初宣布开源其物体检测平台Detectron,用于推动计算机视觉领域的研究。
下面两幅照片都用 IBM 的 Watson Visual Recognition 中的默认分类器打上了标签,但第一幅图在此之前首先被一个物体检测模型标注过
根据自己的实际用途,你可能并不需要一个自定义的物体检测模型。Ten sorFlow的物体检测 API 提供了几个模型,可以调整速度和准确率,都是基于COCO 数据集。为了让大家方便一些,引入网上(作者 Nick Bourdakos)一个列表,将用 COCO 模型可以检测出的物体放在了一起:
当然,如果你想检测的物体不在上述列表中,比如 logo 什么的,那么你需要创建一个自定义物体检测器。
火灾是一种频繁发生而又损失惨重的灾难,一直是人们极力关注而又要求预防、遏制的灾祸。大量的火灾案例说明,火灾早期探测是预防火灾、及时扑灭火灾、减少火灾损失的有效手段,发现越早,扑救越及时,形成灾祸的可能性就越小。随着机器人,无人机的出现与发展,火灾救援,山林/工厂的巡检,在不久的将来很有可能全部有机器完成,火焰的自动识别及定位就变得至关重要。所以,我们在此以火焰检测为例,一方面展示深度学习在自定义物体中的效果与应用,另一方便也展示一个高效快速的机器学习平台在这一过程中所展现的优势。我们开始吧!
中信机器学习平台做图像识别详细步骤
首先通过访问地址http://ml.c.citic/hub/login,打开中信云网站首页,页面如下:
如果该用户没有登录,点击登陆自动跳转至中信云登录界面,如下图:
注册账号密码登陆进入,得到界面
1.创建项目准备建模
点击【Lab View】创建新的项目,创建完成显示如图:
2.将数据上传至中信机器学习平台
点击上传按钮,上传数据文件和训练代码到平台
如果你使用的是我用的训练数据,那么你只需复制我的repo,目录结构应该是这样的:
但是如果你想用自己的训练数据搭建一个模型,你需要将训练图像添加至 images,将 XML 注释添加至 annotations/xmls,更新 trainval.txt 和 label_map.pbtxt。trainval.txt 是一列文件名,能让我们发现和将 JPG 文件与 XML 文件关联。label_map.pbtxt 是一列我们想要检测的对象。
3.选择开发引擎并运行代码
点击Terminal 为新项目搭建需要语言环境,以pathon3.0为例:
首先,在终端上安装的Python和pip安装脚本要求:
pip install -r requirement.txt
向 PYTHONPATH 中添加 models 和 models/slim:
export PATHONPATH=$PATHONPATH:`pwd`:`pwd`/slim
4.下载基础,训练模型
下载一个基本模型
从零训练一个物体检测器要花好几天,即便是在使用多个 GPU 的情况下也是如此。为了加快训练速度,我们会用一个由多种不同数据集上训练得来的模型,将该模型的参数重新用于初始化我们的新模型。
你可以从这个动物园模型上下载一个模型。每个模型的准确率和速度都各有不同,我用的是 faster_rcnn_resnet101_coco。
wget http://download.tensorflow.org/models/object_detection/faster_rcnn_resnet101_coco_11_06_2017.tar.gz
tar -xzvf faster_rcnn_resnet101_coco_11_06_2017.tar.gz
mv faster_rcnn_resnet101_coco_11_06_2017/model.ckpt.* .
下载model,解压,并将所有的 model.ckpt 文件提取并转移至我们的 repo 中的根目录。
你会看到一个叫 faster_rcnn_resnet101.config 的文件。它被设定用于处理 faster_rcnn_resnet101_coco 模型。如果你用的是另一种模型,你可以点击这里,获取相应的配置文件
运行如下语句,就会开始训练了!
python object_detection/train.py --logtostderr --train_dir=train --pipeline_config_path=faster_rcnn_resnet101.config
模型什么时候能准备好呀?这要根据你的训练数据的多少。数据越多,你需要的步骤就越多。我的模型差不过在 4500 步左右时趋于平稳,在 20000 步左右时达到顶峰。我继续训练,一直训练了 20 万步,但是效果没有进一步改善。
我建议你每 5000 步下载一次模型,然后进行评估,以确保你训练的方式是正确的。
5.导出推理图
要想用我们的代码使用整个模型,我们需要将检查点文件( model.ckpt-STEP_NUMBER.* )转换成一个冻结的推理图(inference graph)。
将刚才下载到的检查点文件转移至你一直在用的 repo 中的根文件夹里。
然后运行如下命令:
python object_detection/export_inference_graph.py \ --input_type image_tensor \ --pipeline_config_path faster_rcnn_resnet101.config \ --trained_checkpoint_prefix model.ckpt-STEP_NUMBER \ --output_directory output_inference_graph
记得 export PYTHONPATH=$PYTHONPATH:pwd:pwd/slim。
你应该会看到一个新的 output_inference_graph 目录,包含一个 frozen_inference_graph.pb 文件。这就是我们需要的文件。
6.测试模型
现在,运行如下命令:
python object_detection/object_detection_runner.py
test_images 目录里的所有图像上运行在 output_inference_graph/frozen_inference_graph.pb 中发现的对象检测模型,并将结果导出在 output/test_images 目录中。
Demo
我们把搭建的模型运行于视频中的片段,就得到如开头视频的检测结果了:
从视频中可以看到,我们搭建的模型成功地追踪到了影片中的火焰飞舞情况。
以上我们完整的展示了如何在中信机器学习做自定义图像识别,平台省去了许多环境配置麻烦,GPU处理器也大大加快了训练速度。感兴趣的小伙伴快自己上手试一试吧!