测试平台:易佰纳rv1126 38板
rknn_toolkit安装
环境要求:ubutu18.04
建议使用docker镜像
安装docker
参考https://zhuanlan.zhihu.com/p/143156163
镜像地址 百度企业网盘-企业云盘-企业云存储解决方案-同步云盘
rknn_toolkit目录结构
docker load --input rknn-toolkit-1.7.3-docker.tar.gz
docker images
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb \
-v /home/wzw/rk_npu_sdk/rknn-toolkit-master-v1.7.3:/rknn_toolkit rknn-toolkit:1.7.3 /bin/bash
至此环境搭建完成
更新NPU驱动
查看板端版本
1:查看npu驱动版本
dmesg | grep -i galcore,可以看到版本为6.4.3.5
2:查看rknn-server版本
strings /usr/bin/rknn_server | grep build
3:查看librknn_runtime版本
strings /usr/lib/librknn_runtime.so | grep version
更新驱动
驱动连接-> https://github.com/rockchip-linux/rknpu/tree/master/drivers
我这里使用的是1.7.3版本,注意板端版本要尽量与rknn sdk的版本相一致,这里有两个版本的库
其中linux-armhf-puma是full版为95M,而linux-armhf-puma-mini是小型版本仅为5.3M,他们之间的区别是mini版不支持连板推理,且仅支持预编译的rknn模型,这里采用的是full版;
将linux-armhf-puma目录下的lib和bin文件 push到板端,将板端/usr/bin下的rknn_server用1.7.3的代替,并将lib下的所有库文件拷贝至/usr/lib目录下
替换完成后
sync
reboot
查看npu驱动,rknn-server以及librknn_runtime的版本,可以看到已全部更新为1.7.3
至此还要将库重新连接一下,因为有的库需要用到其他的库文件
ln -snf libOpenCL.so.1.2 libOpenCL.so.1
ln -snf libOpenVX.so.1.2 libOpenVX.so
ln -snf libOpenVX.so.1.2 libOpenVX.so.1
sync
测试
随便找一个demo进行测试,若成功则表示npu更新完成
至此npu更新至1.7.3
连板推理
rknn_server: 是一个运行在板子上的后台代理服务,用于接收PC通过USB传输过来的协议,然后执行板端runtime对应的接口,并返回结果给PC,没有启动rknnserver会报以下错误
vi /etc/profile增加
#start rknnserver
killall start_rknn.sh > /dev/null 2>&1
killall rknn_server > /dev/null 2>&1
cd /etc/init.d/
start_rknn.sh &
在/etc/init.d新增start_rknn.sh
#!/bin/sh
while true
do
sleep 1
rknn_server #>/dev/null 2>&1
done
重启即可
重新连板推理成功
NPU sdk添加opencv库
rv1126所使用的rknn sdk里默认是不带opencv库的,官方所用的例程里也没有使用opencv,但是这样在进行图像处理的时候有点麻烦了,这里有两种办法:
一是先用python将所需要的图片处理好后在转化为bin格式文件,在使用c++或c进行读取,可以参考->;
二是为其添加opencv库,可以直接在程序中调用opencv接口;下面介绍具体步骤
交叉编译opencv源码
1:首先利用rv1126的交叉编译工具,将opencv源码生成可在rv1126上运行的库,参考
2:将编译生成的install下的所有文件拷贝支/3rdparty/opencv/下
3:编辑CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
set(PROJECT_NAME rknn_template)
project(${PROJECT_NAME})
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
message(STATUS "64bit")
set(LIB_ARCH lib64)
else()
message(STATUS "32bit")
set(LIB_ARCH lib)
endif()
# rknn api
set(RKNN_API_PATH ${CMAKE_SOURCE_DIR}/../../librknn_api)
include_directories(${RKNN_API_PATH}/include)
set(RKNN_API_LIB ${RKNN_API_PATH}/${LIB_ARCH}/librknn_api.so)
# opencv
if(LIB_ARCH STREQUAL "lib")
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-3.4.3/share/OpenCV)
message(STATUS "--------armhf")
else()
set(OpenCV_DIR ${CMAKE_SOURCE_DIR}/../3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)
message(STATUS "aarch64")
endif()
find_package(OpenCV REQUIRED)
#stb
include_directories(${CMAKE_SOURCE_DIR}/../3rdparty/)
set(CMAKE_INSTALL_RPATH "lib")
add_executable(${PROJECT_NAME}
src/main.cc
)
target_link_libraries(${PROJECT_NAME}
${RKNN_API_LIB}
${OpenCV_LIBS}
dl
)
# install target and libraries
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install/${PROJECT_NAME})
install(TARGETS ${PROJECT_NAME} DESTINATION ./)
install(DIRECTORY model DESTINATION ./)
install(PROGRAMS ${RKNN_API_LIB} DESTINATION lib)
build.sh
#!/bin/bash
set -e
# for rv1109/rv1126 armhf
GCC_COMPILER=/opt/atk-dlrv1126-toolchain/bin/arm-linux-gnueabihf
ROOT_PWD=$( cd "$( dirname $0 )" && cd -P "$( dirname "$SOURCE" )" && pwd )
# build rockx
BUILD_DIR=${ROOT_PWD}/build
if [[ ! -d "${BUILD_DIR}" ]]; then
mkdir -p ${BUILD_DIR}
fi
cd ${BUILD_DIR}
cmake .. \
-DCMAKE_C_COMPILER=${GCC_COMPILER}-gcc \
-DCMAKE_CXX_COMPILER=${GCC_COMPILER}-g++
make -j4
make install
cd -
main.cc里加入opencv库
此时有可能报错,使用ldd xxxx查看
这是因为板端没有找到相应的库,此时把缺失的库拷贝到提示缺失的路径下,再次运行即可,若依然有报错则继续添加到相应路径下即可。