概要:
本篇文章介绍了TensorFlow Lite与OpenCV配合使用的一个应用场景,并详细介绍了其中用到的SSD模型从训练到端上使用的整个链路流程。在APP中的使用场景为,用户在发布图片时,在端上实现水印的检测和定位,并提供去水印的功能。
具体步骤有:
1,使用TensorFlow Object Detection API进行SSD模型的训练
2,模型的优化和转换,模型在端上的解析使用(本篇主要使用iOS端的C++代码作为示例)
3,将输出locations值通过NMS(非极大值抑制)算法得到最优的框
4,使用OpenCV去除水印
使用的库及工具:
TensorFlow v:1.8r +
TensorFlowLite v:0.0.2 +
OpenCV
labelImg
SSD检测并定位水印
SSD简介
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:
1,从YOLO中继承了将detection转化为regression的思路,同时一次即可完成网络训练
2,基于Faster RCNN中的anchor,提出了相似的prior box
3,加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,相当于半个FPN思路
TensorFlow Object Detection API提供了多种目标检测的网络结构预训练的权重,全部是用COCO数据集进行训练,各个模型的精度和计算所需时间如下:
我们直接使用TensorFlow提供的模型重训练,可以专注于工程不用重新构建网络,本文选用模型为SSD-300 mobilenet-based