一、RK3588环境包括两个环境:
- 连接RK3588的host环境,一个Linux PC环境。该环境的要点:
- 确保RK3588板子的USB OTG接口(type-c)连接到PC的USB接口
- 该PC的Linux最好预装python3.8.
- 安装rknn-toolkit2-1.3.0和rknpu2_1.3.0两个包,可以参照该链接: https://wiki.t-firefly.com/zh_CN/Core-3588J/usage_npu.html
- 注意:由于ssd需要的一些算子只有在rknn-sdk-1.4中才有,所以建议安装rknn_toolkit2-1.4版本。安装方法依然与前面1.3步骤一样,但安装包需要从百度云盘下载,链接为:https://eyun.baidu.com/enterprise/share/link?cid=8272257679089781337&uk=1883176049&sid=202205053973938618#sharelink/path=%2FRK_NPU_SDK%2FRK_NPU_SDK_1.4.0%2Frelease&parent_path=%2FGPU%2Frknn-toolkit2 。若使用1.4版本,下面的环境和步骤中的 “1.3” 改为 “1.4” 即可。
- RK3588开发板环境
- 该开发板要使用Linux,并预装python3.9版本
- 安装rknpu2_1.3.0,并把执行下面三个命令,把相应的文件copy到制定路径。
cp ~/rknpu2_1.3.0/runtime/RK3588/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/
cp ~/rknpu2_1.3.0/runtime/RK3588/Linux/librknn_api/aarch64/librknnrt.so /usr/lib/
cp ~/rknpu2_1.3.0/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so /usr/lib/
二、在PC HOST上,从原有pytorch的代码生成RK3588需要的RKNN文件
- RK3588只能运行RKNN网络文件,所以需要使用rknn-toolkit2进行转换。
- 在warehouse_cls文件夹里面的warehouse_cls_run_from_host_to_rk3588.py文件是把ResNet训练好的模型文件resnet50_cpu_960.pth转换为cls_model.rknn,并自动部署到RK3588运行。在PC host上运行下面命令:
python3 warehouse_cls_run_from_host_to_rk3588.py
三、直接在RK3588上运行RKNN网络
- 在warehouse_cls文件夹里面的warehouse_cls_rk3588.py是在RK3588上面直接运行的例子。把cls_model.rknn拷贝到RK3588上面,并在RK3588上面直接运行下面命令:
python3 warehouse_cls_rk3588.py
四、在RK3588上支持SSD目标检测
- 生成onnx文件:在warehouse_detect文件夹里面的predict.py是用于生成onnx文件。需要在该文件中制定要训练好待转换的.pth文件
model_path = "forklift_person_vgg_500epoch.pth
以及类别文件
class_path = "warehouse_classes.txt"
该类别文件中定义了目标检测的类别,可以修改为实际需要的。 然后,需要设置predict.py的工作模式。"dir_predict"是用于给定一个测试文件夹,对该文件夹下面的图片进行目标检测测试。“export_onnx”是用于对给定的.pth文件进行onnx转换。通过predict.py中的下面语句进行设置:
mode = "export_onnx"
修改完成后,运行下面命令,即可获得onnx文件models.onnx。
python3 predict.py
- 把ONNX转换为RKNN:在warehouse_detect文件夹里面的predict_rknn.py是用于生成rknn文件。把前面步骤产生的onnx文件路径放到该.py文件中,执行下面命令,即可获得rknn文件detect_model.rknn。
python3 predict_rknn.py
注意:rknn.config将设置rknn中,对图片进行的预处理,包括减去均值mean_values、以及除去标准方差std_values。所以,我们需要确保在这里面进行的预处理(包括mean_values, std_values)的取值,和训练时一致。例如,在我们的例子中,训练时采用的mean_values是[104, 117, 123],并且并没有除以标准方差。那么,必须设置如下的config:
rknn.config(mean_values=[104, 117, 123], std_values=[1, 1, 1], target_platform=target_platform)
另外,还需要确保在inference中,不会重复进行preprocessing。也就是确保rknn中的预处理和inference中对每张图片的预处理不会重复执行,否则将会数值出错。