記錄自己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,源碼里面還有RGA模塊的使用。
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 頻率設置
- 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 # 設置性能模式