HarmonyOS 6 自定义人脸识别模型9:基于 tflite 的人脸识别模型转换

引言

在之前的技术分享中,我们展示了如何利用官方预置模型实现图像分类。然而,在真实的人脸识别业务中,通用模型往往难以满足特定场景(如暗光环境、戴口罩识别等)的精度要求。

想要打造极致体验的 AI 应用,最核心的技能就是:学会将开源社区最前沿的模型(如 Google 的 TFLite)“过继”给鸿蒙,并转换为 MindSpore Lite 引以为傲的 .ms 推理格式。

1. tflite 模型:端侧 AI 的“军火库”

Google 的 TensorFlow Lite (TFLite) 是目前移动端部署最广泛的模型格式之一。在知名的开源项目 terryky/android_tflite 中,已经为我们准备好了丰富的“弹药”:

  • 轻量级人脸检测:极致小巧,适合实时预览。

    • 在这里插入图片描述
  • 高精度人脸检测:特征点抓取更准。

    • 在这里插入图片描述
  • 关键点预测:包括年龄、性别、姿态等。

    • 在这里插入图片描述

此外还涵盖了物体检测、语义分割等数十种高价值模型。本文将带大家完成这些模型从“安卓通用”到“鸿蒙专属”的变身:

  • Image Classification

    • 在这里插入图片描述
  • Object Detection

  • Hair Segmentation

  • 3D Handpose

  • Iris Detection

  • Posenet

  • Depth Estimation (DenseDepth)

  • Semantic Segmentation

  • Selfie to Anime

  • Anime GAN

  • U^2-Net portrait drawing

  • Artistic Style Transfer

  • MIRNet

2. 模型转换全流程:从第三方到 .ms

MindSpore Lite 的端侧推理流程如下:
开发者获取原始模型 -> 使用转换工具 (converter_lite) -> 生成 .ms 模型 -> 鸿蒙代码调用。

(1) 获取模型转换工具

获取 converter_lite 工具通常有以下两种方式:

方式 场景推荐 工具组件
直接下载 绝大多数 ONNX/Caffe/TFLite 场景 官方 Linux 预编译包
源码编译 需要支持 PyTorch 或针对 NNRt (NPU) 深度定制 build.sh 编译产物

[!IMPORTANT]
注意:下载的预编译包默认关闭了 PyTorch 转换支持。如果你手里是 .pth 格式,请务必开启 MSLITE_ENABLE_CONVERT_PYTORCH_MODEL=on 进行源码编译。同时,如果模型中有 transpose 与 convolution 算子融合需求,也建议通过源码编译获取工具。

(2) 编译环境要求 (仅限源码编译)
  • 操作系统:Linux x64 (推荐 Ubuntu 18.04.02 LTS)
  • 依赖库:GCC >= 7.3.0, CMake >= 3.18.3, Git >= 2.28.0
  • 取源码:MindSpore Lite 完整源码位于 mindspore-src/source/
  • 编译命令
    cd mindspore/lite
    # 若需支持 PyTorch 转换
    export MSLITE_ENABLE_CONVERT_PYTORCH_MODEL=on 
    # 指定 libtorch 路径
    export LIB_TORCH_PATH="/your/path/libtorch"
    bash build.sh -I x86_64 -j 8
    
    编译完成后,工具位于 output/tools/converter/converter/
(3) 配置环境变量

将转换工具所需的动态链接库加入系统路径:

export PACKAGE_PATH=/path/to/mindspore-lite
export LD_LIBRARY_PATH=${PACKAGE_PATH}/tools/converter/lib:${LD_LIBRARY_PATH}
3. converter_lite 参数“百科全书”

参数名与值之间用等号连接,中间严禁空格。你可以输入 ./converter_lite --help 获取实时帮助。

参数名 是否必选 参数说明 取值范围
--fmk 输入模型原始格式 MINDIR, CAFFE, TFLITE, TF, ONNX, PYTORCH, MSLITE
--modelFile 原始模型文件路径 -
--outputFile 输出路径(自动补全 .ms 后缀) -
--weightFile 转换 CAFFE 时必选 模型权重文件路径 -
--fp16 权重是否存为 float16 格式 on, off
--inputShape 强制指定输入维度(如 “in_0:1,224,224,3”) -
--inputDataFormat 导出模型输入 format(NHWC, NCHW) NHWC, NCHW
--configFile 引用配置(如量化、融合黑名单等) -
4. 实战:转换人脸检测 TFLite 模型

假设我们手中有一个基于 TFLite 的人脸检测模型 face_detection.tflite,我们希望将其转换为可以在鸿蒙端高性能运行的 .ms 格式:

./converter_lite --fmk=TFLITE --modelFile=face_detection.tflite --outputFile=face_detection --fp16=on

执行结果:

CONVERT RESULT SUCCESS:0

此时,你会在目录下得到一个 face_detection.ms 文件。通过开启 --fp16=on,我们在几乎不损失精度的情况下,成功压缩了模型的体积,更有利于端侧部署。

android_tflite中提供了很多模型,转换工具需要运行在Linux系统,平时用的Mac电脑,不过手边刚好有台配置了OpenClaw的云主机,加上要出门,直接把转换的任务丢给OpenClaw,很轻松就完成了转换:
![[HarmonyOS 6 自定义人脸识别模型9:基于tflite的人脸识别模型转换.png]]
![[HarmonyOS 6 自定义人脸识别模型9:基于tflite的人脸识别模型转换-1.png]]

5. 进阶:离线模型转换 (NNRt 加速)

当人脸识别场景对实时性要求极高(如毫秒级无感解锁)时,建议采用 基于 NNRt 的离线模型转换。这种方案让 AI 硬件直接处理厂商预编译的格式,大幅缩短模型加载时间。

  • 约束:fmk 必须指定为 THIRDPARTY
  • 扩展配置样例如下 (converter.cfg)
[third_party_model]
input_names=in_0;in_1
input_dtypes=float32;float32
input_shapes=1,256,256,3;1,256,256,3
output_names=out_0
output_dtypes=float32
output_shapes=1,64
extended_parameters=key_foo:value_foo
6. 避坑:算子融合与黑名单调优

在某些特定硬件架构下,自动算子融合可能会导致计算结果溢出或推理失败。此时可以创建配置文件手动关闭特定融合:

新建 converter.cfg

[registry]
disable_fusion=off
# 在黑名单中指定不进行融合的算子
fusion_blacklists=TransposeFusion,ConvActivationFusion,clip_convert_activation_pass

支持关闭的常见融合类型包括:
AddConcatActivationFusion, SqueezeFusion, TransposeFusion, ReshapeReshapeFusion, ConvBatchNormFusion, MatMulActivationFusion 等。

7. 模型运行效果

tflite模型成功转换为ms模型后就可以在HarmonyOS中直接使用了,还是以人脸检测为例,运行效果如下:
在这里插入图片描述

注:人脸检测图片来源网络,侵删

把其他模型也进行了配置,可以切换选择模型:
在这里插入图片描述

总结

从 TFLite 到 HarmonyOS 的跨越,关键就在于掌握 converter_lite 这个“翻译官”。通过合理配置参数、开启 FP16 乃至使用离线转换模式,我们可以确保人脸识别模型在鸿蒙设备上既准又快。

有了 .ms 模型后,下一篇我们将正式进入代码实战:如何在 Native 端调用 MindSpore Lite 接口,完成真正的“人脸发现”之旅。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐