

目标检测技术在Android中的应用
source link: https://www.51cto.com/article/720642.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目标检测技术在Android中的应用
作者 | 陈磊,单位:中国移动智慧家庭运营中心
Labs 导读
无论在车水马龙中搜寻罪犯,还是通过刷脸进出小区门禁,生活中的点点滴滴都离不开目标检测技术的支持。目标检测任务旨在确定图像中是否包含有给定类别的对象实例(如人、汽车、猫、杯子等),如果所监控的对象存在,则返回每个对象实例在摄像头视野中的空间位置与范围。
Part 01 目标检测简介
图1展示了一个典型的目标检测场景。近年来,由于深度学习技术能够使计算模型从数据中获取极其复杂、抽象的特征表示,因此为目标检测任务的发展带来了突破。依照检测流程的差异,目前流行的检测算法可以被分为两阶段式和单阶段式方法。以R-CNN、SPP-Net、OHEM等为代表的两阶段模型将检测任务分为两部分工作,一个模型用于提取对象区域,第二个模型用于目标分类和进一步细化对象的定位,这种识别方法相对较慢,但检测精度非常高。而单阶段式方法(YOLO、SSD等)通过直接预测图像的对象边界识别物品,具有相对模型架构相对简单、运算较为快速的优势。

图1 在获取的图像中提取区域并识别物体类型
Part 02 Android端进行目标检测推理
现有面向企业用户的目标检测方案多数依赖于本地或云端的高性能GPU提供模型参数训练和推理的支持。出于隐私安全需求和成本需求的多重考量,基于移动端设备或IOT设备进行离线推理的应用需求方兴未艾。由于家庭接入终端等边缘设备在存储和计算能力方面的算力资源非常有限,Google针对这一市场发布了轻量级、快速和跨平台的机器学习框架TensorFlow Lite(TFLite)。作为TensorFlow的一部分,TFLite支持Android、iOS、嵌入式Linux、MCU等多种平台,对开发人员非常友好,极大加速了设备端机器学习(ODML)的开发。图2描述了使用TFLite在移动端部署目标检测模型的流程,下面对此进行简要介绍。

图2 典型的TFLite应用开发工作流
1.选择和训练模型:这一过程和传统的机器学习过程一致,开发者们选用基于Keras或TensorFlow支持库,构建能够处理实际任务的模型,并基于训练/测试数据集对模型参数进行优化与分析。以目标检测任务为例,在计算机上训练一个识别车辆类型的模型需要为每种车型提供数千张训练图片以及数小时乃至数天的训练时间。
本文采用了MobileNet-SSD算法来演示目标检测的模型训练过程。该算法是面向移动端的轻量级深度学习模型,相比原有的SSD算法,MobileNet-SSD通过将SSD方法中所涉及的部分标准卷积计算替换为由一个深度卷积和逐点卷积共同构成的MoblieNet卷积层,在性能类似的同时降低了计算量。从图3中可以认识到,若将K*K尺寸的标准卷积核替换为MobileNet卷积,模型的计算复杂度会降低为前者的。

图3 标准卷积与MobileNet提出的深度可分离卷积的计算过程对比
2.使用转换器转换模型:将庞大的计算过程迁移到移动端所需的时间和成本是难以想象的。因此,TFLite继承了第1步中已在大量相关数据上训练过的模型的权重设置,用以完成相类似的任务,这一过程需要使用TFLite转换器完成。由于在转换过程中会对原始模型进行压缩,用户可以选择通过权衡模型的执行速度来控制文件的大小。常用的TFLite转换过程主要涉及下列三种方法:
- tf.lite.TFLiteConverter.from_keras_model(),将实例化的Keras模型转换为TFlite平面缓冲区文件(.tflite)
- tf.lite.TFLiteConverter.from_saved_model(),转换TensorFlow所存储的模型文件为tflite文件
- tf.lite.TFLiteConverter.from_concrete_functions(),转换具体的函数为tflite文件
实际的转换过程非常简单,下面以TensorFlow的savedModel文件为例进行转换演示:
# Sample Code:
exp_dir = 'xxdir/1'
tf.saved_model.save(tf_model, exp_dir)
converter = lite.TFLiteConverter.from_saved_model(exp_dir)
tflite_model = converter.convert()
3.使用TFLite解释器进行模型推理:在将模型迁移到相应的边缘设备中后,TFLite解释器(TensorFlow Interpreter)利用设备的CPU/GPU来执行模型,在某些受支持的Android设备中,还能够使用神经网络API对推断过程进行加速。基于已导入的tflite文件,可以方便地使用解释器加载模型并让用户运行以输出推断结果。
// Sample Code:
Interpreter.Options tfLite_options = new Interpreter.Options();
tfLite_options.setNumThreads(Num_of_Threads);
Interpreter tfLite = new Interpreter(tfLite_Model_File, tfLite_Options);
用户若想对目标图像进行分类,只需要从相机中获取图像,并基于现有的Interpeter实例调用run方法或runForMultipleInputsOutputs方法(用于图像组),并传入图像数据(组)和输出标签数组作为参数即可,返回的值即为图像分类为各个物体的概率,实践结果如图4所示。

图4 利用TFLite在Android端实现的目标检测应用
Part 03 其他目标检测方法
除了MobileNet-SSD算法外,还有众多的目标检测方法可供使用,我们在本节对此进行一个简单的介绍。
R-CNN: R-CNN于2014年被提出,该模型利用selective search方法从待检测图像中提取候选图像,然后将候选区转换为统一的大小;再利用卷积神经网络计算各个区域的特征;最后经过全连接层并使用SVM方法对特征进行分类并输出多目标检测结果。
SPP-Net:该方法提出使用空间金字塔池化层,转化任意大小的候选图像并将信息输入全连接层,以提取固定长度的特征向量。SPP-Net能够从各种分辨率的图像中获得信息,拥有更强的泛化性能,但是固定的卷积层限制了网络的准确性。
Fast R-CNN:该模型直接对整张图像进行卷积计算以加快训练速度并节省缓存特征的时间,减少了对各候选区分别提取特征所带来的重复计算。此外,Fast R-CNN改进了损失函数,通过联合训练分类器和边框提取器,优化了模型的性能表现。
Part 04 小结与展望
作为图像理解和计算机视觉的基石,目标检测方法是解决复杂的计算机视觉任务的基础,并在图像分割、场景理解、目标跟踪、自动字幕和活动识别等任务中得到了广泛的应用。目前,随着消费电子产业的发展,自动驾驶、无人机避障、智能视频监控等场景在生活中也越发常见,而这些技术的实现都需要低时延、高准确率的目标检测方法作为支撑,这也给计算机视觉和嵌入式的相关从业者提出了更高挑战。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK