rk3399pro使用
记录自己rk3399proc的使用
rk3399proC 是属于 firefly的产品,官方维基教程。
rk3399proD 是属于 toybrick的产品,官方维基教程。
两家的rk3399pro开发板名字是不一样的,虽然都是用的瑞芯微的芯片,但可能因为底板的不同,刷机镜像也不同(proc是ubuntu、prod是debian)。
了解硬件可以参考: https://blog.csdn.net/SMF0504/article/details/120322652
rk3399pro上部署算法
- 模型转换: 使用rknn-toolkit(pc或者开发板都可以使用)模型转换(推荐使用可视化界面)
参考官方提供的文档。
conda create -n rknn-toolkit python=3.6 # 创建conda环境
conda activate rknn-toolkit # 激活环境
pip3 install tensorflow==1.11.0 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com # 安装cpu版本tensorflow
pip3 install torch==1.5.1 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com # 安装torch
pip3 install torchvision==0.6.1 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com # 安装torchvision
pip3 install mxnet==1.5.0 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com # 安装mxnet
pip3 install rknn_toolkit-1.6.0-cp36-cp36m-linux_x86_64.whl # 安装rknn-toolkit
python3 -m rknn.bin.visualization # 启动rknn-toolkit可视化界面
如果pip 下载安装包遇到了 下面这个错误
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 49: ordinal not in range(128)
解决(修改系统编码):
export LANG=en_US
export LC_ALL=en_US.UTF-8
模型转换如下:
-
c++实现
参考官方提供的rknn_demo,如果只是单个算法的使用也可以参考npu驱动里的demo。
librga源码
rkmedia的使用 -
开发板部署
需要准备开发板上的环境,主要是开发板npu-driver的升级,我使用的是rk3399proC(proD也一样)
sudo apt update # 更新源
sudo apt search 3399pro # 查看 驱动版本
sudo apt install firefly-3399pronpu-driver # 安装firefly的npu的驱动(开发板不同这个命令可能不同)
sudo apt search librga # 搜索 可安装的RGA
sudo apt install librga2 librga-dev # 安装librga(板子的/usr/lib目录下有一个librga,应该是镜像自带的,不是apt装的,然后我删除了)
sudo apt search mpp
sudo apt install librockchip-mpp-dev # 更新mpp
开发板的npu驱动版本多少,那么使用的rknn-toolkit版本不要超过该版本。
firefly rk3399ProC 的mpp试用
我参考了基于ffmpeg和mpp的 github上的demo,可能因为版本不同吧,我进行了一点点的改动才能正常使用。
- 环境准备
sudo apt install librockchip-vpu0 librockchip-mpp-dev librockchip-mpp-static librockchip-mpp1 # 更新 mpp
sudo apt install libavcodec-dev libavformat-dev libavutil-dev libavresample-dev libswscale-dev ffmpeg # 安装 ffmpeg
sudo apt install libopencv-dev # 安装opencv 源码编译也行
- 源码的修改
- CMakelist
cmake_minimum_required(VERSION 3.5.1)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
# set(tools /usr/local/cross-compile/aarch64-cc/)
# set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
# set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
project(mpp_test)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS "-O0 -g")
include_directories(
/usr/include/aarch64-linux-gnu
# ${CMAKE_CURRENT_LIST_DIR}/ffm_inc
${CMAKE_CURRENT_LIST_DIR}/rockchip
)
link_directories(
/env/platforms/aarch64/so
/env/platforms/aarch64/static
/usr/local/lib
# ${CMAKE_CURRENT_LIST_DIR}/firefly_mpplib
# ${CMAKE_CURRENT_LIST_DIR}/ffm_lib
)
# set(OpenCV_DIR /home/firefly/software/opencv-4.1.2/install/lib/cmake/opencv4)
set(OpenCV_DIR /home/firefly/software/opencv-3.2.0/install/share/OpenCV)
find_package(OpenCV)
if(OpenCV_FOUND)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
message(STATUS "OpenCV library status:")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
endif()
add_executable(mpp_test MppDecode.cpp MppDecode.h main.cpp)
target_link_libraries(mpp_test
rockchip_mpp
/home/firefly/ffmpeg_rtsp_mpp-master/firefly_mpplib/libutils.a
avformat
avcodec
avutil
# opencv_core
# opencv_highgui
# opencv_imgproc
# opencv_imgcodecs
m
${OpenCV_LIBS}
)
- yuv转bgr那个函数没有加引用(可能作者忘了吧,我把引用加上后,再把作者屏蔽的保存图片打开,测试验证保存的图片是正常的)
void YUV420SP2Mat(MppFrame frame, cv::Mat &rgbImg )
作者用的是opencv进行的转换,可以用RGA做转换
使用总结
使用firefly的 rk3399proc之后,个人感觉在其ubuntu系统上开发还是非常的简单的,另外github上的demo也很丰富。根据官方demo,我调通了以下流程:
- ffmpeg 读rtsp流(参考github demo)
- mpp中的VDEC对视频流解码(参考github demo)
- 利用RGA模块对mpp解码出来的yuv420sp数据进行处理得到模型输入的RGB数据(RGA支持格式转换、颜色填充、缩放等等操作)
- 利用rknn api调用npu获取模型输出
- rk3399pro上 npu是一个usb设备,可以通过 lsusb 查看设备,另外可以用 npu_powerctrl 来控制npu
rk3399pro 频率设置
- cpu
sudo -s
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies # 查看 4个A53核心 可设置的频率
cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_governors # 查看可设置模式
cat /sys/devices/system/cpu/cpufreq/policy0/cpuinfo_cur_freq # 查看当前cpu频率
echo 1416000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_max_freq # 设置最大频率
echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor # 设置性能模式 (定频且最大频率)
cat /sys/devices/system/cpu/cpufreq/policy4/scaling_available_frequencies # 查看 2个A72核心 可设置的频率
cat /sys/devices/system/cpu/cpufreq/policy4/scaling_available_governors # 查看可设置模式
cat /sys/devices/system/cpu/cpufreq/policy4/cpuinfo_cur_freq # 查看当前cpu频率
echo 1800000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_max_freq # 设置最大频率
echo performance > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor # 设置性能模式 (定频且最大频率)
echo userspace /sys/devices/system/cpu/cpufreq/policy4/scaling_governor # 设置用户自定义频率模式
echo 1608000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed # 设置频率并定频
- mali gpu
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/device/gpuinfo # 查看gpu信息
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/available_frequencies # 查看可设置的频率
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/available_governors # 查看可设置的模式
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/governor # 查看当前模式
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/cur_freq # 查看当前频率
cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load # 查看 gpu 占用
watch -n 1 cat /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/load # 监控 gpu 占用
echo 800000000 > /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/max_freq # 设置最大频率
echo performance > /sys/devices/platform/ff9a0000.gpu/devfreq/ff9a0000.gpu/governor # 设置性能模式