safesight/edge/transform/convert_scrfd.sh
tian 29d9ef5d0d refactor: 项目结构梳理 - 设备端/管理端对称布局
仓库结构:
  edge/     设备端(原根目录设备端代码整体移入)
  control/  管理端(清理后)
  docs/     文档(PRD 移入 design/)
  README.md 根导航(新增)

清理:
- control/.brainstorm 临时草稿删除
- control 根级重复文档(API表/PRD_04)并入 docs/design/
- control/plan.md -> docs/implementation/control-plan.md
- control/safesightd-linux-arm64 二进制取消版本控制(.gitignore)
- edge/transform 模型转换产物归入 models/,onnx/pt 大源文件取消跟踪(.gitignore)
- Readme.md(PRD) -> docs/design/PRD_Product_v1.2.md(避开 README 大小写冲突)

更新:
- 根 README.md 导航、docs/README.md 文档索引
- deployment.md/检查表路径加 edge/ 前缀
- .gitignore 重写(edge/control 分区规则)
2026-08-02 11:39:54 +08:00

88 lines
2.0 KiB
Bash
Executable File

#!/bin/bash
# SCRFD PTH -> ONNX -> RKNN 转换脚本
cd /home/orangepi/apps/OrangePi3588Media/utils
echo "=== 步骤1: 导出 ONNX ==="
python3 << 'PYEOF'
import torch
import sys
sys.path.insert(0, '/home/orangepi/apps/OrangePi3588Media')
# 加载 SCRFD 模型
print("加载 SCRFD 模型...")
from insightface.model_zoo.scrfd import SCRFD
import cv2
import numpy as np
# 创建模型实例
model = SCRFD(model_file='scrfd_2.5g_kps.pth')
model.eval()
# 检查是否有 CUDA
if torch.cuda.is_available():
model = model.cuda()
device = 'cuda'
else:
device = 'cpu'
print(f"使用设备: {device}")
# 创建 dummy input (640x640)
dummy_input = torch.randn(1, 3, 640, 640)
if device == 'cuda':
dummy_input = dummy_input.cuda()
# 导出 ONNX
print("导出 ONNX...")
torch.onnx.export(
model,
dummy_input,
'scrfd_2.5g_kps.onnx',
input_names=['input'],
output_names=['score_8', 'score_16', 'score_32', 'bbox_8', 'bbox_16', 'bbox_32', 'kps_8', 'kps_16', 'kps_32'],
dynamic_axes={'input': {0: 'batch', 2: 'height', 3: 'width'}},
opset_version=11,
do_constant_folding=True
)
print('ONNX 导出成功!')
PYEOF
echo ""
echo "=== 步骤2: 简化 ONNX ==="
python3 -m onnxsim scrfd_2.5g_kps.onnx scrfd_2.5g_kps_sim.onnx
echo ""
echo "=== 步骤3: 转换为 RKNN ==="
cd /home/orangepi/apps/OrangePi3588Media/models
python3 << 'PYEOF'
from rknn.api import RKNN
print("初始化 RKNN...")
rknn = RKNN(verbose=False)
# 配置 - SCRFD 使用标准预处理
rknn.config(
target_platform='rk3588',
mean_values=[[127.5, 127.5, 127.5]], # 归一化到 -1~1
std_values=[[128.0, 128.0, 128.0]],
quantized_dtype='w8a8',
)
print("加载简化后的 ONNX...")
rknn.load_onnx(model='../utils/scrfd_2.5g_kps_sim.onnx')
print("构建 RKNN 模型...")
rknn.build(do_quantization=True, dataset='./dataset.txt')
print("导出 RKNN...")
rknn.export_rknn('scrfd_2.5g_kps.rknn')
print("SCRFD 640 RKNN 模型转换完成!")
rknn.release()
PYEOF
echo ""
echo "=== 完成 ==="
ls -lh /home/orangepi/apps/OrangePi3588Media/models/scrfd_2.5g_kps.rknn