CNN-modellen uitvoeren op RK3576

Converteer YOLO11n op een Ubuntu-pc, implementeer het via SSH/SCP op RK3576 en controleer C++- en Python-inferentie op de ingebouwde NPU.


Snelstart: CNN-modellen uitvoeren op RK3576

Deze handleiding behandelt NPU-stuurprogramma controleren → Runtime en Toolkit Lite2 installeren → model op pc converteren → C++ bouwen en implementeren → inferentie op het board. Het voorbeeld gebruikt YOLO11n uit RKNN Model Zoo op de ingebouwde NPU van RK3576, via SSH/SCP of een lokale terminal op het board.

#Voordat je begint

OnderdeelConfiguratie en geteste omgeving
PCUbuntu 20.04.6 LTS,x86_64,Python 3.11
BoardreComputer RK3576, aarch64
Besturingssysteem van het boardDebian 12 / Armbian 26.05.0-trunk
Kernel van het board6.1.115-vendor-seeed-rk3576
NPU-stuurprogrammaGetest met 0.9.8
ToolversiesRKNN-Toolkit2 / Toolkit Lite2 2.3.2
RuntimeDeze handleiding installeert librknnrt.so 2.3.2
VoorbeeldYOLO11n, 640 × 640, INT8-kwantisatie
Conversie- / builddoelrk3576 / rk3576 + aarch64

Waar voer je opdrachten uit: ‘Op pc’ betekent de Ubuntu-ontwikkelcomputer; ‘Op het board’ een SSH-sessie of de lokale terminal. BOARD_IP is een tijdelijke aanduiding: vervang die door het LAN-IP-adres van je board.

Als SSH nog niet is ingeschakeld op het board, voer dan eerst lokaal op het board uit:

bash
sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
hostname -I

Maak daarna vanaf de pc verbinding. Controleer bij de eerste verbinding de hostvingerafdruk en voer op verzoek je wachtwoord in:

bash
ssh rk3576@BOARD_IP

#1. Een ontbrekend NPU-stuurprogramma oplossen

#1.1 Kernelstuurprogramma versus gebruikerssoftware

Het NPU-stuurprogramma van RK3576 is RKNPU in de kernel, ingesteld via CONFIG_ROCKCHIP_RKNPU. Noch het Runtime-.so-bestand, noch het Python-wheel van Toolkit Lite2 kan het kernelstuurprogramma vervangen.

#1.2 Stuurprogramma, apparaatknooppunt en belasting controleren

Op het board:

bash
uname -r
sudo dmesg | grep -i rknpu
sudo cat /sys/kernel/debug/rknpu/version
sudo cat /sys/kernel/debug/rknpu/load
ls -l /sys/class/drm/renderD*/device/driver

Fragment uit de werkelijke testuitvoer:

text
RKNPU driver: v0.9.8
NPU load:  Core0:  0%, Core1:  0%,

/sys/class/drm/renderD129/device/driver -> .../bus/platform/drivers/RKNPU

renderD129 was het NPU-knooppunt in deze test, geen vast nummer. Herken het aan de verwijzing van device/driver naar RKNPU. Andere render-knooppunten kunnen bij de beeldschermcontroller of GPU horen; alleen de aanwezigheid van /dev/dri bewijst niet dat de NPU werkt.

Als debugfs niet is aangekoppeld, voer dan eerst uit:

bash
mountpoint -q /sys/kernel/debug || sudo mount -t debugfs debugfs /sys/kernel/debug

Probeer de versiecontrole daarna opnieuw. Alleen een ontbrekend debugfs-querybestand bewijst niet dat het stuurprogramma ontbreekt; controleer ook opstartlogboeken en de stuurprogrammakoppeling.

Controleer de kernelconfiguratie op het board:

bash
grep '^CONFIG_ROCKCHIP_RKNPU=' /boot/config-$(uname -r)

Werkelijke uitvoer:

text
CONFIG_ROCKCHIP_RKNPU=y

=y betekent ingebouwd in de kernel; als rknpu niet in lsmod staat, is het stuurprogramma dus niet noodzakelijk afwezig. De officiële snelstart van RKNN SDK V2.3.2 beveelt RKNPU 0.9.2 of hoger aan; hier is inferentie met 0.9.8 geverifieerd.

#1.3 Als het stuurprogramma ontbreekt of moet worden bijgewerkt

Deze handleiding gebruikt de Seeed/Armbian-kernel voor reComputer RK3576. Als de stuurprogrammacontroles slagen, ga dan direct naar sectie 2 zonder de kernel opnieuw te installeren.

Controleer op hetzelfde boardmodel, met de Seeed-pakketbron ingesteld, eerst de kernel- en device-tree-pakketten:

bash
sudo apt update
apt-cache policy linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576

Controleer of beide pakketten uit de juiste bron voor dit board komen en of hun kandidaatversies overeenkomen. Installeer of werk daarna de passende kernel en device tree bij:

bash
sudo apt install --reinstall linux-image-vendor-seeed-rk3576 linux-dtb-vendor-seeed-rk3576
sudo reboot

Dit onderhoud wijzigt de opstartkernel en verbreekt SSH. Controleer na opnieuw aanmelden sectie 1.2; een geslaagde installatieopdracht bewijst niet dat het stuurprogramma werkt.

Als deze pakketten ontbreken, gebruik dan een fabrikantsimage of BSP voor precies dit boardmodel. Installeer geen kernel van een ander board, kopieer rknpu.ko niet willekeurig en gebruik geen RK182x-DKMS-pakketten. Schakel voor een eigen BSP CONFIG_ROCKCHIP_RKNPU=y in de passende kernel in, behoud de juiste NPU-device tree en volg de build- en implementatiestappen van dat BSP. Kernel en device tree zijn boardspecifiek en kunnen niet met pip install van Toolkit worden aangevuld.

#2. Runtime en Toolkit Lite2 installeren en controleren

#2.1 De drie componenten

ComponentInstallatielocatieHoofdtaak
RKNN-Toolkit2Afzonderlijke Python-omgeving op Ubuntu-pcONNX converteren en kwantiseren tot .rknn
RKNN Runtime / librknnrt.soRK3576-boardC/C++-API voor modellen laden en NPU-inferentie uitvoeren
RKNN-Toolkit-Lite2Python-omgeving op RK3576-boardPython-inferentie-API; vereist Runtime en stuurprogramma op het board

Importeer op de pc from rknn.api import RKNN en op het board Lite2 met from rknnlite.api import RKNNLite. Lite2 voert inferentie uit, maar converteert ONNX niet naar RKNN; het C++-voorbeeld is niet afhankelijk van Lite2.

Deze handleiding draagt bestanden over met SCP en voert ze op het board uit. USB-inferentie vanaf de pc wordt niet gebruikt; rknn_server hoeft niet te draaien.

#2.2 Vaste revisies van de officiële repositories op de pc ophalen

Secties 3 en 4 gebruiken dezelfde twee mappen; kloon ze eenmalig in een nieuwe werkmap.

Op pc:

bash
sudo apt update
sudo apt install git wget cmake make gcc g++ openssh-client
mkdir -p ~/RKNN2_Project
cd ~/RKNN2_Project

git clone https://github.com/airockchip/rknn-toolkit2.git
git -C rknn-toolkit2 checkout 59a913d172e7f5ff03c9076e2ec7b1b1288ffd08

git clone https://github.com/airockchip/rknn_model_zoo.git
git -C rknn_model_zoo checkout bad6c7334531becaf90a561988519b7bec34d0ab

Dit zijn de tijdens de test gebruikte commits; Model Zoo komt overeen met v2.3.2. Zet code en pakketten vast zodat latere repository-updates de opdrachtpaden niet veranderen.

#2.3 Runtime op het board installeren

Op pc:

bash
ssh rk3576@BOARD_IP 'mkdir -p ~/RKNN2_Project/packages'

scp ~/RKNN2_Project/rknn-toolkit2/rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so \
  rk3576@BOARD_IP:~/RKNN2_Project/packages/

Op het board: maak een reservekopie van een eventuele oude bibliotheek voordat je de nieuwe installeert.

bash
sudo apt update
sudo apt install binutils

if [ -e /usr/lib/librknnrt.so ]; then
  sudo cp -a /usr/lib/librknnrt.so "/usr/lib/librknnrt.so.bak-$(date +%Y%m%d-%H%M%S)"
fi
sudo install -m 0644 ~/RKNN2_Project/packages/librknnrt.so /usr/lib/librknnrt.so
sudo ldconfig
strings /usr/lib/librknnrt.so | grep 'librknnrt version'

De versietekst van dit pakket is:

text
librknnrt version: 2.3.2 (429f97ae6b@2025-04-09T09:09:27)

Lite2 vereist deze stap. De geteste versie zoekt /usr/lib/librknnrt.so; LD_LIBRARY_PATH alleen voor de Demo-map instellen vervangt de controle van de systeembibliotheek niet. Op RK3588 veroorzaakte het ontbrekende bestand Can not find dynamic library on RK3588!; na installatie was de fout opgelost.

#2.4 Toolkit Lite2 op het board installeren

Het board gebruikt Debian 12 met Python 3.11; kies daarom het cp311-wheel voor aarch64.

Op pc:

bash
scp ~/RKNN2_Project/rknn-toolkit2/rknn-toolkit-lite2/packages/rknn_toolkit_lite2-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl \
  rk3576@BOARD_IP:~/RKNN2_Project/packages/

Op het board:

bash
sudo apt install python3.11-venv
python3 -m venv ~/venvs/rknn-lite2
source ~/venvs/rknn-lite2/bin/activate

python -m pip install \
  ~/RKNN2_Project/packages/rknn_toolkit_lite2-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
python -m pip check
python -c "from rknnlite.api import RKNNLite; print('RKNN Toolkit Lite2 import OK')"

Werkelijke resultaten van de twee controles:

text
No broken requirements found.
RKNN Toolkit Lite2 import OK

Kopieer het x86_64-wheel van de pc niet naar het board. Verschijnt ensurepip is not available, installeer dan python3.11-venv en maak de virtuele omgeving opnieuw. Een geslaagde import controleert alleen het Python-pakket; sectie 4 test echte NPU-inferentie.

#3. Toolkit op de Ubuntu-pc instellen en YOLO11n converteren

#3.1 Een Python 3.11-omgeving op de pc maken

Op pc: deze opdrachten installeren Miniforge op een nieuwe pc. Als Conda al aanwezig is, maak daarmee een omgeving met dezelfde naam.

bash
mkdir -p ~/Downloads
cd ~/Downloads
wget -c https://github.com/conda-forge/miniforge/releases/download/25.3.0-1/Miniforge3-25.3.0-1-Linux-x86_64.sh
bash Miniforge3-25.3.0-1-Linux-x86_64.sh -b -p "$HOME/miniforge3"
source ~/miniforge3/etc/profile.d/conda.sh
conda create -n rknn2 python=3.11 -y
conda activate rknn2

Voer in elke nieuwe pc-terminal source ~/miniforge3/etc/profile.d/conda.sh en conda activate rknn2 uit vóór de volgende Python-opdrachten.

#3.2 Toolkit2 2.3.2 installeren

Op pc:

bash
cd ~/RKNN2_Project/rknn-toolkit2/rknn-toolkit2
python -m pip install \
  -r packages/x86_64/requirements_cp311-2.3.2.txt \
  packages/x86_64/rknn_toolkit2-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl \
  'onnx==1.16.1' 'protobuf==4.25.4'

python -m pip check
python -m pip show rknn-toolkit2
python -c "from rknn.api import RKNN; print('RKNN Toolkit2 import OK')"

De geteste conversieomgeving gebruikte Python 3.11.14 en Toolkit2 2.3.2; na correctie van afhankelijkheden gaf pip check No broken requirements found. terug.

Door ONNX en protobuf expliciet vast te zetten, voorkom je restafhankelijkheden van oude projecten: conversie gebruikt ONNX 1.16.1 en protobuf 4.25.4 in een geïsoleerde omgeving zonder de oorspronkelijke Conda-omgeving te wijzigen.

#3.3 Officieel aangepast YOLO11n downloaden

Op pc:

bash
cd ~/RKNN2_Project/rknn_model_zoo/examples/yolo11/model
bash download_model.sh
ls -lh yolo11n.onnx

Het gedownloade yolo11n.onnx was 10,527,859 bytes groot.

Gebruik deze voor Rockchip aangepaste ONNX. De uitvoerindeling past bij de officiële C++-nabewerking; vervang het niet zomaar door een originele Ultralytics-export. Volg voor een zelfgetraind model de officiële YOLO11-exportinstructies.

#3.4 Converteren naar een RK3576 INT8-model

Op pc:

bash
conda activate rknn2
cd ~/RKNN2_Project/rknn_model_zoo
export PYTHONPATH="$PWD${PYTHONPATH:+:$PYTHONPATH}"
ls datasets/COCO/coco_subset_20.txt
ls datasets/COCO/subset

cd examples/yolo11/python
python convert.py ../model/yolo11n.onnx rk3576 i8 ../model/yolo11n_rk3576.rknn
ls -lh ../model/yolo11n_rk3576.rknn

De vier argumenten zijn het ONNX-pad, doelplatform, kwantisatietype en uitvoerpad. Gebruik op deze pagina rk3576.

Het conversiescript gebruikt datasets/COCO/coco_subset_20.txt uit de repository voor kalibratie. Voer het uit vanuit examples/yolo11/python zodat relatieve paden kloppen. Deze kleine dataset is voor een eerste test; kalibreer en beoordeel productiemodellen met gegevens die echte situaties vertegenwoordigen.

Fragment uit de werkelijke conversie-uitvoer:

text
I rknn-toolkit2 version: 2.3.2
...
--> Building model
...
I rknn building ...
I rknn building done.
done
--> Export rknn model
done

De eerste logregel kan interne buildinformatie bevatten; controleer vooral of het doelbestand is gemaakt. Een melding dat de standaard invoer-/uitvoertypen veranderen naar int8 is normaal voor dit kwantisatiescript. Laat het bijbehorende C++-voorbeeld de modelinvoer en -uitvoer verwerken; converteer de afbeelding niet willekeurig naar getekende waarden.

Voor dit RKNN2-voorbeeld hoeft maar één .rknn-modelbestand te worden geïmplementeerd.

#4. Bouwen, met SCP implementeren en uitvoeren

#4.1 ARM64-crosscompiler voorbereiden

Op pc:

bash
cd ~/RKNN2_Project
wget -c https://dn.odroid.com/compiler/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar
tar -xf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar

export GCC_COMPILER="$HOME/RKNN2_Project/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu"
"${GCC_COMPILER}-gcc" --version

De geteste compiler was Linaro GCC 6.3.1 20170404. GCC_COMPILER is een voorvoegsel zonder afsluitende -gcc; het buildscript voegt dit toe.

#4.2 Het YOLO11 C++-voorbeeld voor RK3576 bouwen

Op pc:

bash
cd ~/RKNN2_Project/rknn_model_zoo
bash build-linux.sh -t rk3576 -a aarch64 -b Release -d yolo11

Gebruik bash build-linux.sh om Permission denied te vermijden als het repositoryscript niet uitvoerbaar is. Converteer eerst het model en bouw daarna, zodat het script de gemaakte .rknn in de implementatiemap opneemt.

Zo ziet de structuur van de implementatiemap eruit; andere meegeleverde voorbeelden mogen blijven staan:

text
install/rk3576_linux_aarch64/rknn_yolo11_demo/
├── rknn_yolo11_demo
├── lib/
│   ├── librknnrt.so
│   └── librga.so
└── model/
    ├── yolo11n_rk3576.rknn
    ├── bus.jpg
    └── coco_80_labels_list.txt

Als je beide platforms in dezelfde repository converteert, kan de installatiemap twee .rknn-bestanden bevatten. Kies bij uitvoering expliciet het bestand met achtervoegsel rk3576.

#4.3 De volledige map via SCP implementeren

Op pc:

bash
ssh rk3576@BOARD_IP 'mkdir -p ~/RKNN2_Project'
cd ~/RKNN2_Project/rknn_model_zoo
scp -r install/rk3576_linux_aarch64/rknn_yolo11_demo \
  rk3576@BOARD_IP:~/RKNN2_Project/

Kopieer ook lib/ en model/, niet alleen het uitvoerbare bestand. De voorbeeld-Runtime zit in lib/; de geteste versie was 2.3.2.

#4.4 Objectdetectie op het board uitvoeren

Op het board:

bash
cd ~/RKNN2_Project/rknn_yolo11_demo
sudo env LD_LIBRARY_PATH="$PWD/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
  ./rknn_yolo11_demo model/yolo11n_rk3576.rknn model/bus.jpg

Fragment uit de werkelijke RK3576-uitvoer:

text
model input num: 1, output num: 9
model is NHWC input fmt
model input height=640, width=640, channel=3
...
rknn_run
bus @ (95 136 553 438) 0.944
person @ (108 236 222 535) 0.898
person @ (212 240 284 509) 0.835
person @ (476 229 559 522) 0.831
person @ (79 358 117 515) 0.452
write_image path: out.png width=640 height=640 channel=3 ...

De test slaagt als het proces normaal eindigt, bus en personen detecteert en out.png in de huidige map maakt. Coördinaten en scores kunnen iets verschillen per toolversie en kwantisatie. Stabiele FPS zijn niet gemeten; deze functietest is geen prestatiebenchmark.

Op pc de afbeelding ophalen:

bash
mkdir -p ~/RKNN2_Project/results
scp rk3576@BOARD_IP:~/RKNN2_Project/rknn_yolo11_demo/out.png \
  ~/RKNN2_Project/results/yolo11n-rk3576-out.png

Open de afbeelding op de pc om de detectiekaders te bekijken. Met een scherm op het board kan dat ook in de grafische interface van het board.

#4.5 Controleren of Lite2 hetzelfde model uitvoert

Test na de C++-detectie met hetzelfde model het Python-inferentiepad.

Op het board:

bash
cd ~/RKNN2_Project/rknn_yolo11_demo
sudo "$HOME/venvs/rknn-lite2/bin/python" - <<'PYCODE'
import numpy as np
from rknnlite.api import RKNNLite

rknn = RKNNLite()
try:
    ret = rknn.load_rknn('model/yolo11n_rk3576.rknn')
    if ret != 0:
        raise RuntimeError(f'load_rknn failed: {ret}')
    ret = rknn.init_runtime()
    if ret != 0:
        raise RuntimeError(f'init_runtime failed: {ret}')
    outputs = rknn.inference(inputs=[np.zeros((1, 640, 640, 3), dtype=np.uint8)])
    if outputs is None:
        raise RuntimeError('inference failed')
    print('Lite2 inference OK; output count:', len(outputs))
finally:
    rknn.release()
PYCODE

Werkelijk resultaat:

text
Lite2 inference OK; output count: 9

Gebruik het absolute pad naar Python in de virtuele omgeving, zodat sudo python3 niet per ongeluk de systeem-Python zonder Lite2 start.

#4.6 Veelvoorkomende problemen en acceptatiecriteria

ProbleemControle
NPU-stuurprogramma niet gevondenControleer de RKNPU-koppeling en het opstartlog uit sectie 1.2; een ingebouwd stuurprogramma hoeft niet in lsmod te staan
Lite2 importeert, maar initialisatie misluktControleer /usr/lib/librknnrt.so, het NPU-stuurprogramma en toegangsrechten
Can not find dynamic libraryInstalleer de systeem-Runtime volgens sectie 2.3; alleen Demo-lib/ is onvoldoende
pip check meldt conflictenGebruik de geïsoleerde pc-omgeving en afhankelijkheden uit sectie 3.2, geen oude ONNX/protobuf van een ander project
Kalibratieafbeeldingen of py_utils ontbrekenControleer de werkmap, kalibratiedataset in de repository en PYTHONPATH
Verkeerd modelplatformConverteer opnieuw voor rk3576 en voer yolo11n_rk3576.rknn uit
Model- of labelbestand ontbreektKopieer de volledige implementatiemap en ga eerst naar rknn_yolo11_demo
Dynamische bibliotheek ontbreektControleer lib/librknnrt.so en geef LD_LIBRARY_PATH door zoals in sectie 4.4

Na afloop moet het NPU-stuurprogramma opvraagbaar zijn, Runtime/Lite2 werken, pc-conversie slagen, het C++-programma een detectieafbeelding kunnen maken en Lite2 negen uitvoertensoren teruggeven.

#4.7 Bronnen