前前言

家里的r2s服役了好久了,但是受制于rk3328的性能并没有办法跑满家里的千兆宽带,所以最近一直在蹲一个好价的新卵代替,在傻大黑粗公模n100跟r6s之间来回看了一段时间,最后选择了🐟上挂750的r6s。

恰逢朋友最近一直在diss市面上的家(猫)用监控又贵又沙雕,又想起来rk3588上面有npu来着,就提了一嘴感觉不如自己搞个开源灵车甚至还能玩视觉识别,这个时候r6s也到手了,找一下发现有大佬已经手搓出来相关的项目,就尝试部署跑了起来,于是成了上面的视频。

事实上只是把kaylorchen大佬的demo跑起来了而已,自己一不熟c++暂时没法进行进一步开发,二是r6s本身其实已经是路由特化,跟路由功能无关的开发接口已经被友善砍得七七八八了,并不适合进行开发。但是觉得卵上都能跑起来就很好玩,所以发出来记录一下。如果有纯python的实现的话,到时候可以试着自己魔改,印象中rknn库里的demo是纯python,后续有机会的话,我估计会将r6s换掉r2s乖乖当卵,然后再整一块鲁班猫来正经搞事情。

前言

r6s目前适合作为卵使用吗?至发文为止,immortal有minimal的snapshot,可以用他们的image builder来起一个可用的包,不过这年头是个用卵的基本上都会自己编译了,能自己编译的话就是完全可用的状态。

至于现成包的状况就稍微差一点,istore还在玩22.03,而我需要的是firewall4,友善官方那个23.05的包感觉没必要尝试。就目前的开发情况来看,如果很在意某些新的插件/需要像imm一样激进(积极)更新的话,得等imm上主线支持更新。不然目前来看建议自己跑一下编译,从snapshot拿包始终会碰着自己装包内核小版本对不上导致装不上的情况。

部署流程

下面打算从零开始记录一下r6s从到手啥都没有到跑起来rk3588-yolo-demo的流程,本人并不熟悉单片机开发,基本上都是摸着石头过河看一个报错干一个。本文只当作自己的教程备忘,谨慎参考,虽然r6s也造不坏。

因为想在Armbian的Ubuntu 24.04系统跑起来这玩意(忘了rknn toolkit2暂时只支持到22.04,但是理论上armbian也能跑),所以之前用友善官方22.04跑的流程暂时不写上去,等新储存卡到手之后在上面再来一遍。

测试你的系统内核是否正常支持rknpu工作

先决条件,如果不正常的话请不要在这个系统上继续下面的操作,不会成的。在终端输入以下命令测试,如果能看到三个npu load 0%之类的字样,这个内核理论上就可以拿来跑这次的demo,我这次使用的系统是友善官方提供的rk3588-sd-ubuntu-jammy-desktop-6.1-arm64-20240818.img,下载链接在官方wiki里。

cat /sys/kernel/debug/rknpu/load

修正系统时间

装系统就不说了,没啥好说的,先从修正系统时间开始,不然一堆包可能会打不上,下面上流程,系统默认为Ubuntu22.04

  • 检查当前系统时区状态
timedatectl status
  • 输出大概会长这个样子
               Local time: Mon 2022-12-12 23:35:24 CST
           Universal time: Mon 2022-12-12 15:35:24 UTC
                 RTC time: Mon 2022-12-12 15:35:28
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: no
              NTP service: n/a
          RTC in local TZ: no

最底下的三行表明ntp并没有正常工作,如果这个显示的时间是对的话,sync是yes而且看得着ntp服务的话,可以跳步,没有的话,继续向下操作。

  • 启动ntp,并修改ntp相关设置项
sudo timedatectl set-ntp on
sudo nano /etc/systemd/timesyncd.conf
  • timesyncd.conf修改成下面的样子,前两行取消注释,加上tencent的ntp服务器地址
// timesyncd.conf
# ...

[Time]
NTP=ntp.tencent.com
FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048
  • 重启服务再检查时区状态
service systemd-timesyncd restart
timedatectl status
  • 输出有类似的几行,可以下一步了
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

更新系统软件

sudo apt-get update
sudo apt-get upgrade

配置编译环境(以下所有操作均在板端进行)

下面内容基本来自kaylorchenrk3588-yolo-demork3588_dev_rootfs的README

  • 安装交叉编译工具链
sudo apt update
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu qemu-user-static binfmt-support
  • 环境
git clone https://github.com/kaylorchen/rk3588_dev_rootfs.git
cd rk3588_dev_rootfs
bash ./build-rootfs.sh

执行完之后ls一下,当前目录应该生成了toolchain-aarch64.cmake文件,同时记下文件路径,待会编译要用

  • 依赖
apt install -y --no-install-recommends vim libopencv-dev g++ gcc \
fakeroot devscripts libspdlog-dev libsystemd-dev libcap-dev liblz4-dev \
libgcrypt-dev libzstd-dev debhelper rknpu2-dev librockchip-mpp-dev librga-dev \
libstb-dev libturbojpeg0-dev libjpeg-turbo8-dev kaylordut-dev

安装运行时库和cmake

cat << 'EOF' | sudo tee /etc/apt/sources.list.d/kaylordut.list 
deb [signed-by=/etc/apt/keyrings/kaylor-keyring.gpg] http://apt.kaylordut.cn/kaylordut/ kaylordut main
EOF
sudo mkdir /etc/apt/keyrings -pv
sudo wget -O /etc/apt/keyrings/kaylor-keyring.gpg http://apt.kaylordut.cn/kaylor-keyring.gpg
sudo apt update
sudo apt install kaylordut-dev libbytetrack
sudo apt install cmake

编译

  • 将下面的/path/to/toolchain-aarch64.cmake替换成前面记下的路径再运行
git clone https://github.com/kaylorchen/rk3588-yolo-demo.git 
cd rk3588-yolo-demo/src/yolov8
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain-aarch64.cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
  • 多线程编译
make -j $(nproc)

顺利的话,当前目录会生成videofile_demo,camera_demo,imagefile_demo三个文件,不过我们暂时还不能运行他们,rknn相关的库通常都是缺的,要先装好。

安装RKNN-Toolkit2

sh Miniconda3-latest-Linux-aarch64.sh

然后一路脸滚回车完成安装,最后询问要不要默认在终端开启base环境的选择yes,默认是no,yes会比较方便,安装完之后,关掉目前的终端重开,终端每行最左边应该能看见多出来个(base),显示当前是在base环境。

  • 创建conda环境with python3.9
conda create -n rknn python=3.9
  • 创建并安装完环境之后,启动环境
conda activate rknn

应该能看到(base)变成了(rknn)

  • 在rknn环境内安装rknn-toolkit-lite2
git clone https://github.com/airockchip/rknn-toolkit2.git
  • 进入rknn-toolkit2/rknn-toolkit-lite2/packages文件夹,安装对应版本的whl,我们的环境是python3.9,所以需要安装的是rknn_toolkit_lite2-2.1.0-cp39-cp39-linux_aarch64.whl
pip install rknn_toolkit_lite2-2.1.0-cp39-cp39-linux_aarch64.whl
  • 安装opencv
pip install opencv-python
  • 安装(复制)rknpu2所需文件
git clone https://github.com/rockchip-linux/rknpu2.git
  • 复制rknpu2相关文件到指定目录,进入rknpu2/runtime/RK3588/Linux/librknn_api/aarch64
cp *.so /usr/lib
  • 进入runtime/RK3588/Linux/rknn_server/aarch64/usr/bin
cp rknn_server /usr/bin

至此,基础环境一般已经完成安装,下面我们来跑一下rk官方提供的example测试rknn是否在正常工作。

官方demo测试

  • 回到我们的rknn-toolkit2/rknn-toolkit-lite2/examples/resnet18,这是官方提供的一个小demo,运行test.py测试
python test.py
  • 终端会输出大概这样子的东西,证明rknn有在正常工作
W rknn-toolkit-lite2 version: 2.1.0--> Load RKNN model
done--> Init runtime environment
……
done--> Running model
resnet18-----TOP 5-----
[812] score:0.999680 class:"space shuttle"
[404] score:0.000249 class:"airliner"
[657] score:0.000013 class:"missile"
[466] score:0.000009 class:"bullet train, bullet"
[895] score:0.000008 class:"warplane, military plane"
done

然后我们就可以回去尝试跑rk3588-yolo-demo了

运行rk3588-yolo-demo

  • 回到编译输出的build文件夹,补充两个文件
  • 首先是kaylorchen大佬转换好的rknn模型,链接,我们选择v10里面的yolov10n-2.0.0.rknn下载下来放到build文件夹里
  • 然后新建一个coco_80_labels_list.txt,里面的内容如下,其实就是模型识别的内容物
person
bicycle
car
motorcycle
airplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
couch
potted plant
bed
dining table
toilet
tv
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
  • 万事俱备只欠东风,将摄像头连接到机子上,最好是免驱的不然不保证会出什么问题
./camera_demo -m yolov10n-2.0.0.rknn -i 0 -w 1920 -h 1080 -t 8 -f 30 -l coco_80_labels_list.txt

然后你应该能看到rknn用红框锁住模型认识的物体了,鼠标、手机、显示器、猫狗等等上面那个列表里的东西一般都能认出来。

小补充

  • cpu用htop就行了,那么查看npu占用呢
watch -n 1 -d cat /sys/kernel/debug/rknpu/load

还记得的参考链接