在边缘计算设备上部署AI模型已成为工业检测、智能安防等场景的核心需求。Rockchip RV1126凭借其NPU加速能力,成为轻量化AI落地的理想平台。本文将手把手带您完成YOLOv5s口罩检测模型从训练到RV1126实时推理的完整链路,涵盖数据准备、模型优化、RKNN转换、性能调优等关键环节,并分享多个实战中积累的避坑技巧。
RV1126开发需要交叉编译环境,推荐使用Ubuntu 18.04作为宿主机系统。以下是关键组件清单:
bash复制# 基础工具链
sudo apt-get install -y git cmake python3-pip adb
# Python依赖
pip install torch==1.8.0 torchvision==0.9.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install onnx==1.9.0 rknn-toolkit==1.7.1
常见问题排查:
sudo apt-get install libgl1-mesa-glxbash复制echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666"' | sudo tee /etc/udev/rules.d/51-rockchip.rules
sudo udevadm control --reload-rules
口罩检测数据集应包含多场景、多角度的正负样本。建议采用以下数据增强策略:
python复制# albumentations增强配置示例
transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.RandomGamma(p=0.2),
A.CLAHE(p=0.2),
A.Blur(blur_limit=3, p=0.1),
A.RandomResizedCrop(640, 640, scale=(0.8, 1.0), ratio=(0.9, 1.1))
], bbox_params=A.BboxParams(format='yolo'))
数据集目录结构应规范化为:
code复制mask_dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
提示:标注文件需使用YOLO格式,每个图像对应一个.txt文件,内容格式为
class_id x_center y_center width height
RV1126的NPU对YOLOv5s支持最佳,但需进行以下架构适配:
修改models/yolov5s.yaml:
yaml复制# 输出层调整为NPU兼容格式
head:
[[-1, 1, Conv, [255, 1, 1]], # 输出通道调整为(classes+5)*3
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]]]
关键训练参数配置:
bash复制python train.py --data mask.yaml --cfg yolov5s.yaml --weights '' \
--batch-size 64 --img 640 --epochs 100 --device 0 \
--hyp data/hyps/hyp.scratch-low.yaml
使用TensorBoard监控训练过程:
bash复制tensorboard --logdir runs/train
性能优化技巧:
--multi-scale参数增强尺度不变性--label-smoothing 0.1防止过拟合python复制# 在utils/autoanchor.py中重新聚类
anchors = kmean_anchors(dataset, n=9, img_size=640)
python复制# export.py修改建议
torch.onnx.export(
model,
im,
f,
verbose=False,
opset_version=12,
input_names=['images'],
output_names=['output'],
dynamic_axes=None,
do_constant_folding=True # 必须开启以优化计算图
)
常见导出问题:
output_names与RKNN预期匹配dynamic_axes=None创建量化配置文件quant.cfg:
ini复制[quantization]
channel_wise=True
quantized_dtype=asymmetric_affine
quantized_algorithm=normal
merge_conv=True
转换脚本核心逻辑:
python复制rknn = RKNN(verbose=True)
rknn.config(
target_platform='rv1126',
quantize_input_node=True,
output_optimize=1,
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]]
)
rknn.load_onnx(model='best.onnx')
rknn.build(do_quantization=True, dataset='./dataset.txt')
rknn.export_rknn('yolov5_mask.rknn')
注意:量化数据集应包含100-200张典型场景图片,避免使用纯色或无意义图像
通过ADB连接开发板执行预编译:
bash复制adb push yolov5_mask.rknn /data
adb shell
cd /data && rknn_precompile yolov5_mask.rknn yolov5_mask_pre.rknn
预编译可提升30%以上的模型加载速度,但需注意:
核心处理流程:
c复制// NPU初始化
rknn_context ctx;
rknn_init(&ctx, model_path, 0, 0, NULL);
// 输入输出设置
rknn_input inputs[1];
inputs[0].index = 0;
inputs[0].buf = img_data;
inputs[0].size = img_size;
inputs[0].pass_through = 0;
rknn_inputs_set(ctx, 1, inputs);
// 执行推理
rknn_run(ctx, NULL);
rknn_output outputs[3];
rknn_outputs_get(ctx, 3, outputs, NULL);
// 后处理
for(int i = 0; i < num_detections; i++) {
float x1 = dets[i].box.left * img_width;
float y1 = dets[i].box.top * img_height;
float x2 = dets[i].box.right * img_width;
float y2 = dets[i].box.bottom * img_height;
draw_rectangle(x1, y1, x2, y2, class_names[dets[i].cls_id]);
}
| 优化阶段 | 推理时延(ms) | 内存占用(MB) |
|---|---|---|
| 原始模型 | 78 | 152 |
| 量化后 | 42 | 98 |
| 预编译 | 36 | 95 |
| 线程优化 | 28 | 102 |
关键优化手段:
pthread实现流水线并行:c复制pthread_t input_thread, infer_thread, output_thread;
pthread_create(&input_thread, NULL, preprocess_func, NULL);
pthread_create(&infer_thread, NULL, inference_func, NULL);
bash复制echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
bash复制# 查看摄像头设备
v4l2-ctl --list-devices
# 设置分辨率与格式
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=NV12
mermaid复制graph TD
A[摄像头采集] --> B[图像预处理]
B --> C[NPU推理]
C --> D[结果渲染]
D --> E[显示输出]
实际部署时建议采用双缓冲机制:
c复制struct buffer {
void* start;
size_t length;
} buffers[2];
// 交替处理
while(1) {
select(fd, &fds, NULL, NULL, NULL);
read(fd, &buf, sizeof(buf));
process_frame(buffers[current_buf]);
current_buf ^= 1; // 切换缓冲区
}
典型问题1:画面卡顿
cat /sys/class/devfreq/dmc/cur_freqchrt -f 90 ./demo典型问题2:检测漏报
nms_threshold=0.6 → 0.45640x640 → 512x512在完成所有优化后,我们的RV1126口罩检测系统在720P分辨率下达到32FPS的稳定性能,满足绝大多数实时场景需求。开发过程中积累的模型压缩技巧和部署经验,同样适用于其他轻量化AI应用的落地实践。