含完整源代码和开发文档 人工智能图像识别绘本阅读方案

概述本文描述一个基于人工智能2D图像识别算法实现的绘本阅读方案,应用于绘本阅读机器人和绘本阅读手机App 。主要内容包括:基础算法,方案架构及工程化,项目遇到的坑及解决方案 。为了更容易理解,本文重点描述项目的工程化,对于算法也做一定程度的阐述、但不做深入,相关算法资料及论文在互联网可方便搜到 。
基础算法算法方案选型:本项目要解决的核心问题是:在低算力的硬件上通过普通摄像头(2D)采集图像快速(<1s)定位到是哪一本绘本的哪一页,即需要通过计算机视觉算法来评估当前摄像头图像帧是否存在一个预置的特有FLAG 。项目技术方案评估过方法主要有:
1) 基于目标分类算法,可以看作是一种图像分类的问题 。先对绘本封面图像进行分类定位,找到对应绘本后,再对绘本内页图像分类定位 。这个方法理论是可行的,但分布封面的分类过多(可能有超过两万本绘本),而且算法复杂度高,实际并不可行 。
2)另外还有目标检测的算法,但对于绘本图像来说,并没有相对固定的特征(例如人,动植物等),所以这个方法也不可行 。
3)基于图像特征匹配的图像识别,即对两个图像的特征进行匹配来预测是否为相同图像,这个算法复杂度较低,算法鲁棒性强,且绘本图像天然有较多的图像特征,这个方法与项目需求是非常匹配的,其实在技术选型时,就很快确定了这个算法基础 。、
基础算法描述图像特征匹配中算法基础是特征因子算法,如SIFT, SURF, FAST, ORB等,综合算法的鲁棒性和复杂度,项目主要采用的是SURF和SIFT算法因子 。以下是基于SURF算法因子匹配对两个图像进行匹配的代码片段,可以大概感受下:
...img1 = cv2.imread(imgname1)img1 = cv2.resize(img1, (600, 400))kp1, des1 = surf.detectAndCompute(img1,None) #des是特向量img2 = cv2.imread(imgname2)img2 = cv2.resize(img2, (600, 400))kp2, des2 = surf.detectAndCompute(img2,None)matches = flann.knnMatch(des1,des2,k=2)...算法层面上,实现了图像特征匹配还是不够,因为还有解决一个问题:在大数量的图像中(如10000+的绘本封面图像)快速定位到目标图像,如果程序是一张一张图像的比较匹配,时效是非常低,完全达不到秒识别的要求 。这时需要引用图像检索的算法,项目实现两种图像检索算法,建立图像索引,大概如下:
1)KD-tree, 基于树型布局的索引分为向量空间和度量空间 。向量空间使用欧式距离来比较特征相似度,度量空间不使用欧式距离来比较特征相似度,KD-Tree是典型的基于二叉树的索引结构 。
2)K-means,其首先通过聚类方法构建聚类中心,将图像特征库分成许多簇(类) 。检索时,查询图像的特征向量先和聚类中心向量比较,计算向量间的距离,然后只需在距离较近的簇中进行检索 。
总的来说,绘本图像的识别与查字典类似:先通过图像检索定位到少量的目标图像,然后再通过特征匹配预测出目标图像 。
工程化确定了算法基础,接下来就是充满荆棘的项目开发和落地的过程 。
摄像头方案首先是摄像头方案选定 。摄像头是产品的“眼睛”,摄像头方案对于识别的效果是有关键作用的,主要目的是保证摄像头有效成像区域覆盖绝大部分尺寸绘本翻开后的尺寸,而有效成像区域是摄像头采集到的、可用于视觉分析的图像,边角图像畸变大、失真属于无效成像区域 。摄像的方案主要考虑以下因素:
1)因为摄像头是固定安装的且与采集图像的距离是相对固定,因此摄像头需要时定焦的,避免对焦过程,图像不清晰影响到识别效果 。
2)FOV(摄像头视场角度),FOV越大,成像区域越广,但也会带来畸变,FOV的选定要结合产品结构 。本项目摄像头的FOV是110°
3)摄像头的高度(H)和倾斜角(α)直接影响到有效成像区域,在符合“有效成像区域覆盖绝大部分尺寸绘本翻开后的尺寸”的产品需求下,根据结构综合决定 。本项目中,H是13cm,α是40°

含完整源代码和开发文档 人工智能图像识别绘本阅读方案

文章插图
 
软件架构
含完整源代码和开发文档 人工智能图像识别绘本阅读方案

文章插图
 
整体软件架构是经过不断设计,验证和优化得出的 。
软件主要分三部分:1、绘本SDK,包括Android 和 linux SDK,核心算法部分是C++写的,在Android中通过NDK融合到SDK中 。SDK包含本地识别和云识别模块 。本地识别主要包括:检索和识别算法,不同系统的交互逻辑;云识别模块:云服务器交互的客户端部分功能(如各种HTTP Client) 。


推荐阅读