TensorFlow Lite 简介

TensorFlow Lite 是一套工具,通过帮助开发人员在移动设备、嵌入式设备和边缘设备上运行模型,实现设备机器学习。TensorFlow Lite 用例使您能够运行图像分类、目标检测、图像分割和姿态估计等模型。下面以姿态估计中的 posenet 机器学习模型为例,可以对 posenet_mobilenet 数据集中的节点进行姿态识别。

下载posenet模型

部署模型

  1. 将模型和标签文件部署到 PI-SG565D 中,通过 adb 或者 scp 把这两个部署到 /opt/ 目录下。
  2. 模型特性
  • 模型检查点:mobilenet_v1_101
  • 输入分辨率:513x257
  • 参数数量:3.31M
  • 模型大小:12.7 MB

连接摄像头和显示器

  • 准备 MIPI 摄像头,并连接摄像头到 PI-SG565D 的第一个 CSI 插槽上。
  • 准备 HDMI 显示器,并连接显示器到 PI-SG565D 上。

使用 TFLite 进行姿势估计和显示

前提条件

export XDG_RUNTIME_DIR=/dev/socket/weston && export WAYLAND_DISPLAY=wayland-1

camera 流实时姿势估计显示

setprop persist.overlay.use_c2d_blit 2

gst-launch-1.0 -e \
qtiqmmfsrc name=camsrc camera=0 ! video/x-raw\(memory:GBM\),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc ! queue ! tee name=split \
split. ! queue ! qtimetamux name=metamux ! queue ! qtioverlay ! queue ! waylandsink fullscreen=true sync=false \
split. ! queue ! qtimlvconverter ! queue ! qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/posenet_mobilenet_v1.tflite ! queue ! qtimlvpose threshold=51.0 results=2 module=posenet labels=/opt/posenet_mobilenet_v1.labels constants="Posenet,q-offsets=<128.0,128.0,117.0>,q-scales=<0.0784313753247261,0.0784313753247261,1.3875764608383179>;" ! text/x-raw ! queue ! metamux.

命令说明:

  • gst-launch-1.0:
    这是 GStreamer 的命令行工具,用于启动一个 GStreamer 管道(pipeline)。-e 参数表示在管道结束时退出,而不是继续运行。
  • qtiqmmfsrc name=camsrc camera=0:
    基于 QMMF(Qualcomm Multimedia Framework),打开编号为 0 的摄像头(通常是后置主摄)。
  • !:
    是一个连接符号,用于将前一个元素的输出连接到后一个元素的输入。
  • video/x-raw(memory:GBM),format=NV12,width=1280,height=720,framerate=30/1,compression=ubwc:
    流类型是 raw 视频帧,内存类型是 GBM(Generic Buffer Management),即 GPU/DRM 共享内存,避免拷贝。颜色格式 NV12,分辨率 720p,帧率 30 fps,采用高通 UBWC(Universal Bandwidth Compression) 压缩,降低总线带宽。
  • queue :
    线程边界缓冲,防止上下游线程互相阻塞。
  • tee name=split:
    queue线程边界缓冲,防止上下游线程互相阻塞。tee 把一条流复制成 N 条一模一样的流;这里命名为 split,后面用 split. 来引用它的两个 src pad
  • split. ! queue ! qtimetamux name=metamux:
    split.tee 的第一个输出,queue 再建一个线程缓冲。qtimetamux 高通提供的元数据复用器,作用是把后续检测到的关键点结果(作为 GstMeta)附加到视频帧里,名字设为 metamux,让后面能引用。
  • qtioverlay ! queue ! waylandsink fullscreen=true sync=false:
    高通提供的 overlay 元件,负责把 GstMeta 里的关键点画在画面上。直接把帧送到 Wayland compositor(如 Weston)全屏显示。
  • split. ! queue ! qtimlvconverter:
    tee 的第二个输出。高通 MediaLib 视频 → ML 张量的格式转换器,把 NV12 转成 PoseNet 需要的 RGB 浮点张量,同时做缩放/归一化。
  • qtimltflite delegate=external external-delegate-path=libQnnTFLiteDelegate.so external-delegate-options="QNNExternalDelegate,backend_type=htp;" model=/opt/posenet_mobilenet_v1.tflite:
    qtimltflite 高通 TFLite 推理插件,用 QNN(Qualcomm Neural Network) 后端在 Hexagon/HTP 上跑 TensorFlow Lite 模型。使用外部 delegate(而非默认 CPU)。使用 QNN TFLite delegate 的共享库。告诉 delegate 使用 HTP(Hexagon Tensor Processor) 后端以及 PoseNet 模型文件的路径。
  • qtimlvpose threshold=51.0 results=2 module=posenet labels=/opt/posenet_mobilenet_v1.labels constants="Posenet,q-offsets=<128.0,128.0,117.0>,q-scales=<0.0784313753247261,0.0784313753247261,1.3875764608383179>;":
    高通 ML 后处理插件,解析 PoseNet 原始张量输出得到人体关键点坐标。threshold 置信度阈值,高于此值才视为有效关键点。最多保留 2 个结果。算法模块名为 posenet。标签文件为posenet_mobilenet_v1.labelsq-offsets,q-scales 为量化参数(均值/缩放因子),用于把网络输出的 int8 量化值还原成浮点坐标。
  • text/x-raw ! queue ! metamux.:
    把关键点结果封装成简单的 text meta(实际内部是 GstMeta)。把 meta 送回前面命名的 qtimetamux 元件(通过 pad name 匹配),让它把 meta 贴到对应的视频帧上。

运行命令后,显示器会显示camera流和姿势估计结果

测试示例