一文教你创建免费的图像识别App

背景描述

在AI大行其道的今天,你是不是也很好奇它是怎么应用的?比如,你拍一张照片,上传到App,它就能自动识别出照片中的物体,这是一只猫,还是一只狗。这里就用到了计算机视觉里,最简单的图像分类技术。

图像分类,换成容易理解的词语,就是图像识别。比如识别图像里是否有一个人,还是有一辆车,还是一个动物什么的。前几年在CV界有一项著名的图像分类挑战赛,由Image-Net组织,每年产生的模型,在分类准确率上不断提升。如下图所示:

在top 1准确率上,最新的Inception-v4已高达80分。也就是说,在数千个分类里,你随机上传一张狗的照片,App有80%的把握确认这就是一只狗。详细的技术对比分析,有兴趣的话,请阅读此论文

上述图里的各种Net(深度神经网络),对不熟悉的人来说,是很难上手应用的。前几天我看到一篇新闻,百度公司推出一个神器,叫easyDL,轻松的解决了图像分类模型的落地问题。

如果你仔细阅读这篇新闻,就会发现easyDL背后关键的技术是自动模型搜索与迁移学习。所谓自动模型搜索,是指自动搜索多个经典的分类模型和它的超参数,并同时训练,从结果里挑选最好的一个模型。所谓迁移学习,是指各种基础模型在已有的大规模数据集上进行预训练,并将从中学习到的知识(Knowledge)运用到用户提交的小规模训练数据集上,从而实现出色的模型效果和快速的模型训练。

有了这两项技术,用户实际不用关心分类背后跑的什么模型,什么ResNet、Inception你完全可以不用管了。你只要明确自己目标就好,比如我要识别上传图片里的动物,是猫还是狗,这就是一个二分类的问题。

数据准备

虽然不用管模型,但训练数据还是要准备的。有了迁移学习,你不用准备非常完整的训练数据集。世界上的猫狗可能有几千种,我们不可能收集那么全。在迁移学习的帮助下,每类准备几十张样本就可以了。

训练数据按一定的目录进行组织,是这种结构:

分类1、分类2是两个子目录,代表分类的标准,子目录下面就是各分类的样本图片。

还是以猫狗分类为例,分类1的目录名就是dogs(代表狗,不能是中文目录),分类2的目录名就是cats(代表猫,同样不能是中文)。dogs下面放的是狗的图片,cats下面放的是猫的图片。然后把这2个目录,打包成一个压缩文件,这就是easyDL要的训练文件。

为了方便大家测试,我在本博上传这个训练文件,在dogs和cats目录里,各有200张狗和猫的图片。点击下载

在线模型训练

访问百度的easyDL,地址是:http://ai.baidu.com/easydl/

当然你需要一个百度账号,并登录。登录进去后,选择顶部“定制模型”里的“图像分类”,页面情况如下:

左侧那一排是功能栏,包括模型和数据两个大栏目。首先你要上传训练数据,在“创建数据集”那里,上传你的训练样本,也即是刚才下载的那个包含猫和狗图片的压缩文件。

上传完后,在“数据集管理”那里,可以看到数据上传和解压的情况:

上传了训练数据,就可以创建模型了。点左侧的“创建模型”,出来如下页面:

填写相应字段,点下一步就创建好了。

然后在“我的模型”里,可以看到你刚创建的模型。点“训练模型”,出来如下页面:

点“添加训练数据”,这里很关键,勾选上你刚上传好的训练数据:

注意:增加一个“其他”的默认分类,在分类时,如果模型既不确认是猫,又不确认是狗,就分类为其他。然后点“开始训练”即进入训练阶段。

这个过程会持续数分钟,在“我的模型”里,可看到模型的状态:

模型训练完后,是这个结果:

你可以查看“完整评估结果”,是模型的评估报告,如下图所示:

可以看到各项评估数据,准召率、F1-Score等,都是98以上,这很NB了!

top1的准确率也高达98分,远超Image-Net的通用分类模型,我想这是百度的迁移学习的结果。

点左侧的“校验模型”,启动模型校验服务后,上传猫或狗的图片进行测试,比如:

这个图片识别为狗,置信度是99.92%,几乎零差错。

最后点“发布模型”,填写相应字段后,即可进行发布:

请注意,发布是需要百度后台审核的,可能会打电话进行人工确认。发布完后,你就获得了一个在线API地址,在你的App里,上传图片访问这个API,就可以自动识别啦。

成功发布后,在“我的模型”里,点模型的“服务详情”,看到如下信息:

点“查看接口地址”,可以获取在线API的服务地址,是一个基于HTTP协议的URL。

在使用此接口前,你要绑定一个APP ID,点上述图示的“APPID状态管理”,添加APP ID。这个APP ID是用来进行认证的。

如何获取APP ID呢?请到这个地址,点“应用列表”,创建一个应用:

创建后,你就获得了自己的APP ID,以及API Key和Secret Key。回到前面的步骤,将APP ID与我的模型绑定。

至此,所有服务端配置完成了,现在进行客户端编程。

编写客户端

访问百度的在线服务接口,首先需要拿到access_token用于认证。access_token是基于上述API Key和Secret Key获取到的。访问这个URL,得到这个脚本:

client_id就是前述API Key,client_secret就是前述Secret Key。代入这两个变量,执行这个bash脚本,就得到了你的access_token。是一串长达70个字符的由数字、字母、标点组成的字串。

然后编写客户端程序。我随手写了个perl脚本,内容如下:

脚本很简单,使用HTTP客户端上传dog.3234.jpg这张图片(base64编码),到服务接口API进行识别,并带上access_token进行认证。

服务端返回的结果如下:

服务端:我99.99%确认你是一只狗,别想欺骗我,:-)

好了,一个图像识别App就搞好了。看着图文有点多,实际操作并不复杂。照着来一遍吧,有问题可以联系我