
身份证识别服务性能优化实践
本文作者为中国移动云能力中心云智团队图像处理算法工程师周华健。身份证识别场景下服务调用量大,往往对于服务的吞吐量要求较高。本文主要从业务逻辑、模型、工程三个层面对身份证识别服务进行优化,取得了较大的性能提升。
1. 业务逻辑优化
一个身份证通常包含了4个模型,身份证检测模型,身份证方向判断模型,身份证文字检测模型,身份证文字识别模型。由于身份证检测与身份证文字检测模型任务类型相似,模型输入图像也可以一致,因此将二者的模型进行合并。
这里采用一个骨干网+两个分支的架构实现模型的合并,采用轻量级模型mobilenetV3[1]作为模型的骨干网,分别取DBNet[2](常用文字检测算法)及PicoDet[3](百度轻量级检测算法)的头部分支作为模型的head。如此可以减少一个模型推理及其预处理的计算开销,提升效率。
2.模型效率优化
为了提升模型推理的效率,在模型设计中广泛使用分组卷积。分组卷积是一种高效的卷积。
假设标准卷积操作的输入特征图尺寸为{H,W,c1},卷积核尺寸为{h1,w1,c1},输出特征图尺寸为{H,W,c2},标准卷积层的参数量为:h1*w1*c1*c2。假设分组卷积操作将输入特征图按照通道数分成g组,则每组通道输入特征图的尺寸为{H,W,c1/g},对应的卷积核尺寸为{h1,w1,c1/g},每组输出特征图尺寸为{H,W,c2/g}。将g组结果拼接,得到最终尺寸为{H,W,c2}的输出特征图。分组卷积层的参数量为h1*w1*(c1/g)*(c2/g)*g=h1*w1*c1*c2/g。在相同输入输出大小的情况下,分组卷积较标准卷积参数量及计算量减少为原来的1/g。
为了整体性能,这次优化将所有的模型包括检测模型、方向判断模型、文字识别模型从标准卷积模型的骨干网升级为使用带分组卷积的MobileNet系列骨干网,大幅提升模型推理的效率。
3. 工程优化
服务化框架的性能通常是被忽略的,旧版服务采用multimodel server。本次优化选用Paddle C++ Serving[4]框架。Paddle C++ Serving采用brpc框进行Client/Server端的通信。brpc是百度开源的一款PRC网络框架,具有高并发、低延时等特点的核心执行引擎是一个有向无环图(也称作DAG图),DAG图中的每个节点(在PaddleServing中,借用模型中operator算子的概念,将DAG图中的节点也称为OP代表预估服务的一个环节,可以理解为模型的前后处理环节,DAG图支持多个OP按照串并联的方式进行组合,从而实现在一个服务中完成多个模型的预测整合最终产出结果。
整个框架原理如下图所示,可分为Client Side 和Server Side。
Client端通过Pybind API接口将Request请求,按照ProtoBuf协议进行序列化后,经由BRPC网络框架Client端发送给Server端。Paddle C++ Serving中定义了Client Side 和 Server Side之间通信的Protobuf, Portobuf的序列化的结果体积要比XML、JSON小很多,速度比XML、JSON快很多。对于较小的图片性能差异不大,但是对大图像性能差异明显。
Client端等待Server端的返回数据并反序列化为正常的数据,之后将结果返给Client调用方。Server端接收到序列化的Request请求后,反序列化正常数据,进入图执行引擎,按照定义好的DAG图结构,执行每个OP环节的操作。身份证识别模块定义了3个C++实现的OP,分别是身份证检测及文字检测前后处理OP,方向判断前后处理OP,文字识别前后处理OP,性能较multimodel server中python实现的前后处理更为优越。
当DAG图中所有OP环节均执行完成后,将结果数据序列化后返回给Client端。
Paddler Serving支持使用TensorRT推理引擎进行推理,性能较其原生的paddleinference更为优越。
4. 总结
本次从业务逻辑层面、模型层面、工程层面对身份证识别服务进行优化,精度轻微下降,性能得到了大幅提升,后续将继续探索低精度推理等性能优化技术以进一步提升服务性能,降低运营成本。
5. 参考文献
[1] Searching for MobileNetV3. https://arxiv.org/abs/1905.02244
[2] Real-time Scene Text Detection with Differentiable Binarization
https://arxiv.org/pdf/1911.0894
[3] PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices
https://arxiv.org/abs/2111.00902
4] https://github.com/PaddlePaddle/Serving
本文转载自 AI遇见云,作者:周华健
