应用测试 - 人脸五官检测 (RetinaFace)

在 RV1126B-p 上跑 Talowe
talowe_retinaface_cam:摄像头实时检测 人脸框 + 5 个五官关键点(双眼、鼻尖、嘴角),画在画面上后用 H.264 RTP 推到电脑,VLC 打开retinaface.sdp看画面。源码: https://github.com/hbt021211-coder/talowe-rv1126b-aidemo
推理: RKNN | 采集: V4L2
/dev/video12NV12 1920x1080| 编码: MPP | 收流: UDP5000
Talowe 原工程用 OpenCV + GStreamer。出厂 Buildroot IPC 没有 这两套库。
当前 Demo 已改成 V4L2 + RGA + MPP,刷 IPC 固件即可演示,不必重编 rootfs。
编码走摄像头 NV12 直拷,框和点画在 NV12 上,避免 RGB→NV12 导致 VLC 全黑。
本页流程按 rkipc、/dev/video12、S99rkipc)。
- 刷机见 升级固件 里的 RV1126B-p Buildroot IPC(
Rockchip-RV1126B-Buildroot-IPC) 不是必须重刷 :板子已经是这套 IPC 固件,直接演示即可- 若当前是 Debian / 其它镜像,请先按该页刷成 Buildroot IPC,再按下面步骤操作
IPC 推流、账号密码见 固件使用 - IPC 推流。
演示(直接看效果)
环境按下面三台机器。电脑 IP 不是 10.0.0.49 时,把脚本参数改成你的 IP。
| 角色 | 地址 | 说明 |
|---|---|---|
| 收流电脑 (Mac) | 10.0.0.49 | 装 VLC,打开 retinaface.sdp |
| RV1126B-p | ssh root@10.0.2.0 | 默认密码见 固件使用 |
| 程序目录 | /root/rknn_retinaface_demo | 已部署好的安装包 |
1. 电脑先开 VLC
把 retinaface.sdp 拷到电脑,例如 ~/retinaface.sdp。内容固定如下(端口 5000,不要改成板子 IP):
v=0
o=- 0 0 IN IP4 0.0.0.0
s=RetinaFace
c=IN IP4 0.0.0.0
t=0 0
m=video 5000 RTP/AVP 96
a=rtpmap:96 H264/90000
安装包里还有一份同内容的 play.sdp(s=RetinaFace)。演示本页请用 retinaface.sdp,不要和其它 Demo 的 sdp 混用。
open -a VLC ~/retinaface.sdp
或 VLC → 文件 → 打开文件 → 选 retinaface.sdp。
第一次可能会要本机防火墙放行 UDP 5000,点允许。
VLC 会停在黑屏等流,属正常,下一步再起板端。
2. 板子启动推流
ssh root@10.0.2.0
cd /root/rknn_retinaface_demo
./run_retinaface.sh 10.0.0.49
run_retinaface.sh 会:停掉其它 Demo / rkipc → 打开 /dev/video12 → 推理画框 / 五点 → 把 H.264 推到 10.0.0.49:5000。
看到类似日志即已出流:
v4l2 opened /dev/video12 1920x1080 stride=1920 nbufs=4
mpp rtp -> 10.0.0.49:5000 1920x1080
Pipeline initialized. Starting inference, RTP 10.0.0.49:5000 ...
[FACE] box:( 720 , 180)(1180 , 780) score=0.98
VLC 里应出现实时画面:绿色人脸框、分数、橙色 5 个关键点(左眼、右眼、鼻尖、左嘴角、右嘴角)、左上角 FPS。正脸入画效果最好。
手动等价命令(不用脚本时):
/etc/init.d/S99rkipc stop
cd /root/rknn_retinaface_demo
export LD_LIBRARY_PATH=./lib:$LD_LIBRARY_PATH
./rknn_retinaface_demo ./model/RetinaFace.rknn /dev/video12 10.0.0.49
第三个参数必须是 10.0.2.0。
3. 演示结束,恢复 IPC
Ctrl + C 停掉 Demo 后:
killall rknn_retinaface_demo rkaiq_3A_server 2>/dev/null
/etc/init.d/S99rkipc start
网页 / RTSP(rtsp://10.0.2.0:554/live/0)会恢复。
Demo 和 rkipc 不能同时占摄像头。
板端安装包内容
root@rv1126bp-buildroot:~/rknn_retinaface_demo# ls
lib model play.sdp retinaface.sdp rknn_retinaface_demo run_retinaface.sh
| 文件 | 作用 |
|---|---|
rknn_retinaface_demo | 主程序 |
run_retinaface.sh | 停 rkipc 并启动,参数为电脑 IP |
retinaface.sdp | 拷到电脑给 VLC 用(推荐) |
play.sdp | 与 retinaface.sdp 内容相同,s=RetinaFace |
model/RetinaFace.rknn | 人脸模型(约 925 KB) |
lib/librknnrt.so librga.so librockchip_mpp.so | NPU / RGA / 编码 |
启动参数:
./rknn_retinaface_demo <model_path> <camera_index> <target_ipv4>
<camera_index>: ISP 主路,本板是/dev/video12(v4l2-ctl --list-devices里rkisp_mainpath)<target_ipv4>: 收流电脑局域网 IP,端口写死 5000
5 个关键点顺序一般是:左眼、右眼、鼻尖、左嘴角、右嘴角。
从源码编译再部署
只演示可以跳过这一节。改代码或换板子时按下面做。
机器
| 角色 | 示例 |
|---|---|
| 本机 | ~/SDK/talowe-rv1126b-aidemo(Mac 只改代码、rsync) |
| 编译服务器 | ssh roy@10.0.0.18(x86_64 Ubuntu,交叉编译 aarch64) |
| 板子 | ssh root@10.0.2.0 |
编译器用发行版交叉编译器即可,不必编完整 SDK host:
# 编译服务器(root)
apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cmake
同步源码
3rdparty/opencv 约 525 MB,本 Demo 已不用,不同步。
ssh roy@10.0.0.18 'mkdir -p ~/talowe-rv1126b-aidemo/talowe_retinaface_cam'
rsync -av --progress \
--exclude '.git' \
--exclude 'cpp/3rdparty/opencv' \
--exclude 'cpp/build' \
--exclude 'cpp/install' \
~/SDK/talowe-rv1126b-aidemo/talowe_retinaface_cam/ \
roy@10.0.0.18:~/talowe-rv1126b-aidemo/talowe_retinaface_cam/
确认 model/RetinaFace.rknn 约 925 KB 已在工程 model/ 里。
交叉编译
ssh roy@10.0.0.18
cd ~/talowe-rv1126b-aidemo/talowe_retinaface_cam/cpp
chmod +x build-linux.sh
./build-linux.sh
产物:
~/talowe-rv1126b-aidemo/talowe_retinaface_cam/cpp/install/rv1126b_linux_aarch64/rknn_retinaface_demo/
# lib model play.sdp retinaface.sdp rknn_retinaface_demo run_retinaface.sh
CMakeLists.txt / build-linux.sh 使用 aarch64-linux-gnu-gcc,链板端已有的 librockchip_mpp(安装包里会带一份 so)。
推到板子
板子 Buildroot 一般没有 rsync,从编译机打 tar 再解:
ssh roy@10.0.0.18 \
'tar czf - -C ~/talowe-rv1126b-aidemo/talowe_retinaface_cam/cpp/install/rv1126b_linux_aarch64 rknn_retinaface_demo' \
| ssh root@10.0.2.0 'tar xzf - -C /root'
USB 已连 adb 时也可以:
adb push rknn_retinaface_demo /root/
然后回到上文 演示 第 1、2 步。
数据通路
IMX / Sensor
→ rkisp_mainpath /dev/video12 (NV12 1920x1080)
→ 拷一份 NV12 给编码(画框 / 点 / 字)
→ RGA 转 RGB888
→ RKNN RetinaFace(人脸框 + 5 点)
→ 在 NV12 上画框 / 五官点 / 分数 / FPS
→ MPP H.264(每个 IDR 带 SPS/PPS)
→ RTP PT=96 UDP → 电脑:5000
→ VLC 打开 retinaface.sdp
分辨率和端口写在 cpp/main.cc、cpp/run_retinaface.sh、retinaface.sdp / play.sdp,改 1080p / 5000 时三处一起改。
常见问题
| 现象 | 处理 |
|---|---|
| VLC 一直黑屏 | 先关 VLC 再开 retinaface.sdp,然后起板端;第三个参数必须是 电脑 IP;本机放行 UDP 5000 |
Camera open failed / VIDIOC_S_FMT failed | 其它 Demo / rkipc 还在跑。./run_retinaface.sh 会停它们 |
| 打开摄像头后画面全黑 | ISP 3A 没起来。脚本会起 rkaiq_3A_server /etc/iqfiles;确认模组已插好 |
| 有画面但没有框 | 人脸要完整、清晰入画;侧脸过偏可能检不到 |
| 演示完网页/RTSP 没了 | 没恢复 rkipc:killall rknn_retinaface_demo 后 /etc/init.d/S99rkipc start |
编译缺 aarch64-linux-gnu-gcc | 编译服务器 apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu |
The RKNN model can not be found | RetinaFace.rknn 没放到工程 model/ 就编译了 |
摄像头节点确认:
v4l2-ctl --list-devices
rkisp_mainpath (platform:rkisp-vir0):
/dev/video12
和姿态 / 检测的差别
| 人体姿态 | 本页 RetinaFace | |
|---|---|---|
| 工程 | talowe_yolov8_pose_cam | talowe_retinaface_cam |
| 模型 | yolov8_pose.rknn | RetinaFace.rknn ~925 KB |
| 输出 | 人体框 + 17 点骨架 | 人脸框 + 5 个五官点 |
| 收流 | VLC play.sdp | VLC retinaface.sdp |
| 和 rkipc | 必须停 | 必须停 |
安装包目录名是 rknn_retinaface_demo(原工程 CMake 项目名),源码目录是 talowe_retinaface_cam。
源代码和编译好的包下载
链接: https://pan.baidu.com/s/15rNLzfb12Af8Sh_DX-KVBw?pwd=fanc
提取码: fanc
网盘里是两份压缩包:
| 包 | 用途 |
|---|---|
talowe-rv1126b-aidemo | 源码,自己交叉编译 |
talowe-rv1126b-aidemo-app | 已经编好的板端程序(aarch64),拷到板子 /root/ 就能跑 |
发给客户 / 自己用时注意:
run_*.sh默认把 H.264 推到10.0.0.49:5000。这是示例电脑 IP,必须改成收流电脑自己的局域网 IP:./run_xxx.sh <电脑IP>。- 固件须为 RV1126B-p Buildroot IPC。Demo 和
rkipc共用/dev/video12,不能同时跑;脚本会先停rkipc。 - 电脑用 本页对应的 sdp 开 VLC(本页是
retinaface.sdp,端口 5000),不要和其它 Demo 的 sdp 混用。 talowe-rv1126b-aidemo-app里请忽略rknn_yolov5_demo(旧的图片推理残留)。摄像头实时检测用rknn_yolov5_detection_cam。- 源码里多数 Demo 已改为 V4L2 + RGA + MPP,不必带上全部
3rdparty/opencv(约 11 × 525 MB)。只有 PP-OCR 交叉编译还需要工程内的 OpenCV 静态库。
总结
- 电脑 VLC 打开
retinaface.sdp(等 UDP 5000) - 板子
cd /root/rknn_retinaface_demo && ./run_retinaface.sh 10.0.0.49 - 截图 / 演示后
killall rknn_retinaface_demo,/etc/init.d/S99rkipc start