Rockchip · AI & Linux Hub

KI-Inferenz

RKNN-Toolkit2-API: Konfiguration, Konvertierung, Quantisierung und Inferenz

Vollständige V2.3.2-Referenz zu Framework-Abhängigkeiten, sämtlichen API-Parametern, gemischter Quantisierung, Genauigkeits-/Leistungs-/Speicherbewertung und eigenen Operatoren.

· ArmSoM Editorial · Rockchip source documentation · 32 Min. Lesezeit

Anwendbarkeit auf ArmSoM und Quelle

Dies ist eine Rockchip-Plattformreferenz, kein ArmSoM-Testbericht. Quellen: RK-YH-YF-412, V2.3.2, 22 chinesische und 25 englische Seiten. Chinesisch folgt dem chinesischen, Englisch dem englischen Original; Russisch und Deutsch übersetzen Englisch vollständig. Die PDFs enthalten keine technischen Abbildungen: Der gesamte Inhalt besteht aus editierbarem Text, Tabellen und Code, ohne erfundene englische Bilder. Genannt sind RV1103/RV1103B/RV1106/RV1106B/RV1126B, RK2118, RK3562 und RK3566/3568/3576/3588-Serien, aber keine SDK/BSP- oder Kernelkombination eines konkreten ArmSoM-Boards. NPU-Treiber, Toolkit2/Runtime/Server-Versionen, Hostsystem/-architektur, Python, Framework und Modellformat abgleichen. x64-Funktionen nicht auf ARM64 verallgemeinern. Versions-, top-5-, Speicher- und SDK-Ausgaben sind Quellbeispiele, keine ArmSoM-Tests. V2.3.2 bezeichnet den Quellstand, nicht die neueste Veröffentlichung.

Redaktionshinweis: Auch die Quellen derselben Version unterscheiden sich. Die Python-Zelle für Ubuntu20.04 enthält chinesisch 3.8/3.9, englisch 3.8/3.8; im ARM64-Abschnitt sind Debian-Einträge als x64 markiert. Quellwerte bleiben ohne vermutete Kompatibilitätskorrektur erhalten. Weitere Zweifel stehen in den redaktionellen Hinweisen; API/Code sind keine ArmSoM-validierten Anpassungen.

EDITORIAL-NOTES · ArmSoM Docs

1 Anforderungen

1.1 Unterstützte Chipmodelle

RV1103

RV1103B

RV1106

RV1106B

RV1126B

RK2118

RK3562

RK3566-Serie

RK3568-Serie

RK3576-Serie

RK3588-Serie

Hinweis: RK3566 / RK3568 / RK3576 / RK3588 bezeichnen im Folgenden jeweils die entsprechenden RK3566-/RK3568-/RK3576-/RK3588-Serien.

1.2 Anforderungen an Umgebung und Abhängigkeiten

Für die Betriebssystemumgebung werden folgende Anforderungen empfohlen:

Betriebssystem-
version
Ubuntu18.04
(x64)
Ubuntu20.04
(x64)
Ubuntu22.04
(x64)
Ubuntu24.04
(x64)
Python-Version 3.6 / 3.7 3.8 / 3.8 3.10 / 3.11 3.12

Für ARM64:

Betriebssystemversion Debian10 (x64) Debian11 (x64) Debian12 (x64)
Python-Version 3.6 / 3.7 3.8 / 3.8 3.10 / 3.11 / 3.12

Hinweise:

1. Detaillierte Python-Bibliotheksabhängigkeiten stehen in doc/requirements*.txt.

2. Die Dokumentbeispiele verwenden hauptsächlich Ubuntu 20.04 / Python3.8.

1.3 Unterstützte Deep-Learning-Frameworks

RKNN-Toolkit2 unterstützt Caffe, TensorFlow, TensorFlow Lite, ONNX, DarkNet und PyTorch.

Die Zuordnung zwischen RKNN-Toolkit2 und den Framework-Versionen ist nachfolgend aufgeführt:

RKNN-Toolkit2 Caffe TensorFlow TF Lite ONNX DarkNet PyTorch
1.4.0
1.4.2
1.5.0
1.5.2
1.0 1.12.0
~2.8.0
Schema-
Version=3
1.7.0
~1.10.0
Commit-ID:
810d7f7
1.6.0
~1.10.1
1.6.0 1.0 1.12.0
~2.14.0
Schema-
Version=3
1.7.0
~1.14.0
Commit-ID:
810d7f7
1.6.0
~1.13.1
2.0.0
2.1.0
2.2.0
1.0 1.12.0
~2.14.0
Schema-
Version=3
1.7.0
~1.14.1
Commit-ID:
810d7f7
1.10.1
~2.1.0
2.3.0
2.3.2
1.0 1.12.0
~2.14.0
Schema-
Version=3
1.7.0
~1.17.0
Commit-ID:
810d7f7
1.10.1
~2.4.0

Hinweise:

1. Aufgrund der TensorFlow-Versionskompatibilität werden theoretisch auch pb-Dateien unterstützt, die vor TensorFlow 1.12.0 exportiert wurden. Einzelheiten zur Kompatibilität verschiedener Versionen stehen in der offiziellen Dokumentation: https://www.tensorflow.org/guide/versions

2. Die Schemas verschiedener TFLite-Versionen sind nicht miteinander kompatibel. Unterscheidet sich das Schema eines exportierten TFLite-Modells von der durch RKNN-Toolkit2 verwendeten Schemaversion, kann das Laden fehlschlagen.

3. Das Caffe-Protokoll von RKNN-Toolkit2 basiert mit Änderungen auf dem offiziellen Berkeley-Protokoll. Quelle: https://github.com/BVLC/caffe/tree/master/src/caffe/proto, Commit 828dd10. RKNN-Toolkit2 ergänzt darauf aufbauend einige Operatoren.

4. Die Zuordnung zwischen ONNX-Releases, opset- und IR-Versionen ist in der onnxruntime-Dokumentation beschrieben: https://github.com/microsoft/onnxruntime/blob/v1.10.0/docs/Versioning.md

5. Offizielles DarkNet-Repository: https://github.com/pjreddie/darknet. Die Konvertierungsregeln des Dokumentstands beruhen auf dessen letztem master-Commit 810d7f7; dies ist keine Aussage über den heutigen HEAD.

6. Beim Laden eines PyTorch-Modells (torchscript) wird dieselbe PyTorch-Version für Modellexport und RKNN-Konvertierung empfohlen. Unterschiedliche Versionen können zum Konvertierungsfehler führen.

7. Die ARM64-Version unterstützt laut Dokumentstand nur PyTorch und ONNX; andere Frameworks werden dort nicht unterstützt.

2 RKNN-Toolkit2-API-Beschreibung

2.1 RKNN initialisieren und freigeben

Diese Funktionsgruppe initialisiert das RKNN-Objekt und gibt es frei. Vor der Verwendung sämtlicher RKNN-Toolkit2-APIs RKNN() aufrufen; nach Abschluss der Aufgabe das Objekt mit release() freigeben.

Bei der Initialisierung steuern verbose und verbose_file die ausführliche Protokollierung etwa beim Laden und Erstellen von Modellen. verbose hat den Typ bool: True aktiviert detaillierte Ausgaben von RKNN-Toolkit2. verbose_file ist eine Zeichenfolge; enthält sie einen Dateipfad, wird das Protokoll dort gespeichert. Auch dafür muss verbose auf True stehen.

Beispielcode:

# Print the detailed log information.
rknn = RKNN(verbose=True)

…

rknn.release()

2.2 Modell konfigurieren

Vor dem Erstellen des RKNN-Modells dieses zunächst über config konfigurieren.

API config
Beschreibung Parameter für die Modellkonvertierung festlegen.
Parameter mean_values: Mittelwerte der Eingabe. Der Parameter ist eine Liste mit einer oder mehreren Mittelwert-Unterlisten. Bei mehreren Modelleingaben werden mehrere Unterlisten verwendet. Die Länge jeder Unterliste entspricht der Kanalzahl der Eingabe. Beispielsweise bedeutet [[128,128,128]], dass von den Werten aller drei Kanäle einer Eingabe jeweils 128 abgezogen wird.
Standardwert: None; alle Mittelwerte sind damit null.
Parameter std_values: Normalisierungswerte der Eingabe. Der Parameter ist eine Liste mit einer oder mehreren Unterlisten von Normalisierungswerten. Bei mehreren Eingaben werden mehrere Unterlisten verwendet. Die Länge jeder Unterliste entspricht der Kanalzahl der Eingabe. Beispielsweise bedeutet [[128,128,128]], dass von den Werten der drei Kanäle einer Eingabe zunächst der Mittelwert abgezogen und das Ergebnis anschließend durch 128 geteilt wird.
Standardwert: None; alle std-Werte sind damit eins.
Parameter quant_img_RGB2BGR: Gibt an, ob beim Laden eines Quantisierungsbildes zuerst RGB2BGR ausgeführt werden muss. Bei mehreren Eingaben werden die jeweiligen Parameter mit ‘,’ getrennt, etwa [True, True, False]. Standardwert: False.
Diese Einstellung wird meist für Caffe-Modelle verwendet. Beim Training der meisten Caffe-Modelle werden die Datensatzbilder zunächst mit RGB2BGR umgewandelt; in diesem Fall ist True einzustellen.
Die Einstellung gilt nur für Quantisierungsbilder im Format jpg/png/bmp. Beim Lesen von npy wird sie ignoriert. Wenn die Modelleingabe BGR verwendet, müssen daher auch die npy-Daten im BGR-Format vorliegen.
Die Einstellung wird nur zum Lesen der Bilder während der Quantisierung (Schnittstelle build) oder der Quantisierungsgenauigkeitsanalyse (accuracy_analysis) verwendet und nicht im endgültigen RKNN-Modell gespeichert. Bei einer BGR-Modelleingabe muss deshalb vor dem Aufruf von inference des Toolkits oder der run-Funktion der C-API sichergestellt sein, dass die importierten Bilddaten ebenfalls BGR verwenden.
Parameter quantized_dtype: Quantisierungstyp. Unterstützt werden “w8a8”, “w4a16”, “w8a16”, “w4a8”, “w16a16i” und “w16a16i_dfp”. Standardwert: “w8a8”.
- w8a8: Gewichte und Aktivierungen mit asymmetrischer 8-Bit-Quantisierung. (RK2118 wird nicht unterstützt.)
- w4a16: Gewichte mit asymmetrischer 4-Bit-Quantisierung, Aktivierungen mit 16-Bit-Gleitkommapräzision. (Nur RK3576/RV1126B.)
- w8a16: Gewichte mit asymmetrischer 8-Bit-Quantisierung, Aktivierungen mit 16-Bit-Gleitkommapräzision. (Nur RK3562.)
- w4a8: Gewichte mit asymmetrischer 4-Bit-, Aktivierungen mit asymmetrischer 8-Bit-Quantisierung. (Noch nicht unterstützt.)
- w16a16i: Gewichte und Aktivierungen mit asymmetrischer 16-Bit-Quantisierung. (Nur RV1103/RV1106.)
- w16a16i_dfp: Gewichte und Aktivierungen mit dynamischer 16-Bit-Festkommaquantisierung. (Nur RV1103/RV1106.)
Parameter quantized_algorithm: Algorithmus zur Berechnung der Quantisierungsparameter jedes Layers. Unterstützt werden normal, mmse, kl_divergence und gdq. Standardwert: normal.
normal ist schnell. Empfohlen werden gewöhnlich etwa 20-100 Quantisierungsdaten; mehr Daten verbessern die Genauigkeit möglicherweise nicht weiter.
mmse ist wegen seines iterativen Durchprobierens langsamer, erreicht jedoch meist eine höhere Genauigkeit als normal. Empfohlen werden etwa 20-50 Daten. Je nach Quantisierungsdauer kann ihre Anzahl entsprechend erhöht oder verringert werden.
kl_divergence benötigt mehr Zeit als normal, aber deutlich weniger als mmse. In manchen Szenarien, etwa bei ungleichmäßiger Merkmalsverteilung, erzielt kl_divergence bessere Ergebnisse. Empfohlen werden etwa 20-100 Daten.
gdq gilt nur für w4a16 und w8a16 und kann deren Gewichtsgenauigkeit wirksam verbessern. Empfohlen werden mehr als 200 Daten.
Parameter quantized_method: Unterstützt werden layer, channel und group{SIZE}. Standardwert: channel.
- layer: Jedes Gewicht besitzt nur einen Satz Quantisierungsparameter.
- channel: Jeder Gewichtskanal besitzt einen eigenen Satz Quantisierungsparameter. channel ist meist genauer als layer.
- group{SIZE}: Aufbauend auf channel werden die Gewichte jedes Ausgabekanals entlang des Eingabekanals entsprechend {SIZE} in mehrere Gruppen unterteilt. Jede Gruppe besitzt einen Parametersatz. group{SIZE} ist gewöhnlich genauer als channel. {SIZE} ist ein Vielfaches von 32 zwischen 32 und 256, etwa ‘group32’ oder ‘group128’. group{SIZE} gilt derzeit nur bei quantized_dtype = w4a16.
Parameter float_dtype: Datentyp für Gleitkommadaten im nicht quantisierten Fall. Unterstützt wird float16. Standardwert: float16.
Parameter optimization_level: Optimierungsstufe des Modells. Standardwert: 3.
Damit lassen sich einige oder alle bei der Konvertierung verwendeten Optimierungsregeln deaktivieren. Bei 3 sind alle Optimierungen eingeschaltet. Bei 2 oder 1 werden einige Optionen deaktiviert, die die Genauigkeit bestimmter Modelle beeinflussen können. Bei 0 werden alle Optimierungen ausgeschaltet.
Parameter target_platform: Ziel-Chipplattform des RKNN-Modells. Unterstützt werden ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk2118’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’ und ‘rk3588’. Standardwert: None.
Parameter custom_string: Fügt dem RKNN-Modell eine benutzerdefinierte Zeichenfolge hinzu, die zur Laufzeit abgefragt werden kann. Standardwert: None.
Parameter remove_weight: Entfernt die Gewichte, um ein untergeordnetes RKNN-Modell zu erzeugen, das die Gewichte mit dem vollständigen RKNN-Modell teilen kann. Dies reduziert den Speicherverbrauch. Standardwert: False.
Parameter compress_weight: Komprimiert die Modellgewichte und kann dadurch die Größe des RKNN-Modells reduzieren. Standardwert: False.
Parameter single_core_mode: Gibt an, ob nur ein Einkernmodell erzeugt werden soll. Dies kann Modellgröße und Speicherverbrauch reduzieren. Standardwert: False. Gilt nur für RK3588 / RK3576. Standardwert: False.
Parameter model_pruning: Beschneidet das Modell. Bei Modellen mit dünn besetzten Gewichten können dadurch Größe und Rechenaufwand des konvertierten RKNN-Modells reduziert werden. Standardwert: False.
Parameter op_target: Legt das Ausführungsziel jeder Operation fest (NPU/CPU/GPU usw.). Format: {‘op0_output_name’:’cpu’, ‘op1_output_name’:’cpu’, …}; alternativ über op_type: {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. Beide Verfahren lassen sich kombinieren, beispielsweise {‘op_type’:’cpu‘, ‘op0_output_name’:’cpu’….}. Standardwert: None.
‘op0_output_name’ und ‘op1_output_name’ sind die Ausgabetensornamen der jeweiligen OP und können den Ergebnissen von accuracy_analysis entnommen werden. ‘cpu’ und ‘npu’ bedeuten, dass die zu diesem Tensor gehörige OP auf CPU bzw. NPU ausgeführt wird. Verfügbar sind ‘cpu’ / ‘npu’ / ‘gpu’ / ‘auto’; ‘auto’ wählt das Ziel automatisch.
Auch op_type wird aus den Ergebnissen von accuracy_analysis ermittelt. Damit kann das Ausführungsziel aller OP dieses Typs im Modell eingestellt werden, etwa {‘Add’:’cpu’, ‘Expand’:’cpu’,….}.
Parameter dynamic_input: Simuliert dynamische Eingaben anhand mehrerer vom Benutzer vorgegebener Eingabeform-Sätze. Format: [[input0_shapeA, input1_shapeA, …], [input0_shapeB, input1_shapeB, …], …].
Standardwert: None; experimentell.
Beispielsweise lautet die ursprüngliche Eingabeform [1,3,224,224], [1,3,height,width] oder [1,3,-1,-1], das bereitzustellende Modell muss jedoch drei Formen unterstützen: [1,3,224,224], [1,3,192,192] und [1,3,160,160]. Dafür kann dynamic_input=[[[1,3,224,224]], [[1,3,192,192]], [[1,3,160,160]]] gesetzt werden. Bei der Inferenz mit dem konvertierten RKNN-Modell müssen Daten der entsprechenden Form übergeben werden.
Hinweise:
1. Die Funktion kann nur aktiviert werden, wenn das ursprüngliche Modell selbst dynamische Eingaben unterstützt; andernfalls entsteht ein Fehler.
2. Ist die ursprüngliche Eingabeform dynamisch, dürfen unterschiedliche Werte nur für dynamische Achsen gesetzt werden.
Parameter quantize_weight: Wenn ‘do_quantization’ von rknn.build False ist, wird die Größe des rknn-Modells durch Quantisierung einiger Gewichte reduziert.
Standardwert: False.
Parameter remove_reshape: Entfernt mögliche ‘Reshape’ an Modelleingängen und -ausgängen, um die Laufzeitleistung zu verbessern. Standardwert: False.
Hinweis: Dies kann die Form der Eingabe- oder Ausgabeknoten verändern. Beachten Sie die Warnmeldungen während der Konvertierung und berücksichtigen Sie die Auswirkungen der Formänderungen bei der Bereitstellung.
Parameter sparse_infer: Führt zur Leistungssteigerung eine dünn besetzte Inferenz auf bereits ausgedünnten Modellen aus. Gilt nur für RK3576/RV1126B. Standardwert: False.
Parameter enable_flash_attention: Gibt an, ob Flash Attention aktiviert werden soll. Standardwert: False.
Hinweis: FlashAttention basiert auf https://arxiv.org/abs/2307.08691. Durch die Cache-Nutzung innerhalb der Schleife lassen sich Beschleunigung und geringerer Bandbreitenbedarf erreichen. Die Modellgröße kann dabei jedoch steigen. Entscheiden Sie anhand des jeweiligen Szenarios und Modells. Weitere Details stehen bei ‘exSDPAttention’ in ‘RKNN Compiler Support Operator List’.
Parameter auto_hybrid_cos_thresh: Schwellenwert des Kosinusabstands bei der automatischen gemischten Modellquantisierung. Standardwert: 0.98.
Parameter auto_hybrid_euc_thresh: Schwellenwert des euklidischen Abstands bei der automatischen gemischten Modellquantisierung. Standardwert: None, also nicht aktiviert.
Rückgabewert None.

Beispielcode:

# model config
rknn.config(mean_values=[[103.94, 116.78, 123.68]],
     std_values=[[58.82, 58.82, 58.82]],
     quant_img_RGB2BGR=True,
     target_platform='rk3566')

2.3 Modell laden

RKNN-Toolkit2 unterstützt das Laden noch nicht in RKNN umgewandelter Modelle aus Caffe, TensorFlow, TensorFlow Lite, ONNX, DarkNet und PyTorch. Je Format bestehen unterschiedliche, nachfolgend beschriebene Schnittstellen.

2.3.1 Caffe-Modell laden

API load_caffe
Beschreibung Caffe-Modell laden. (Unter ARM64 nicht verfügbar.)
Parameter model: Pfad zur Caffe-Modellstrukturdatei (Endung “.prototxt”).
Parameter blobs: Pfad zur binären Caffe-Modelldatei (Endung “.caffemodel”).
Parameter input_name: Bei mehreren Eingaben des Caffe-Modells kann hier die Reihenfolge der Eingabeschichtnamen festgelegt werden, beispielsweise [‘input1’,’input2’,’input3’]. Die Namen müssen mit den Modelleingaben übereinstimmen. Standardwert: None; die Reihenfolge wird dann automatisch aus der Caffe-Modelldatei mit Endung .prototxt übernommen.
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load the mobilenet_v2 Caffe model in the current path
ret = rknn.load_caffe(model='./mobilenet_v2.prototxt',
          blobs='./mobilenet_v2.caffemodel')

2.3.2 TensorFlow-Modell laden

API load_tensorflow
Beschreibung TensorFlow-Modell laden. (Unter ARM64 nicht verfügbar.)
Parameter tf_pb: Pfad zur TensorFlow-Modelldatei (Endung “.pb”).
Parameter inputs: Eingabeknoten des Modells (Operandennamen); mehrere Knoten werden unterstützt. Alle Zeichenfolgen der Eingabeknoten werden in einer Liste abgelegt.
Parameter input_size_list: Formen der Eingabeknoten, gemeinsam in einer Liste. Für das Modell ssd_mobilenet_v1 muss input_size_list beispielsweise auf [[1,300,300,3]] gesetzt werden.
Parameter outputs: Ausgabeknoten des Modells (Operandennamen); mehrere Knoten werden unterstützt. Alle Ausgabeknoten werden in einer Liste abgelegt.
Parameter input_is_nchw: Gibt an, ob die Modelleingabe bereits im NCHW-Layout vorliegt. Standardwert: False; das Standardlayout ist damit NHWC.
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load ssd_mobilenet_v1_coco_2017_11_17 TF model in the current path
ret = rknn.load_tensorflow(tf_pb='./ssd_mobilenet_v1_coco_2017_11_17.pb',
            inputs=['Preprocessor/sub'],
            outputs=['concat', 'concat_1'],
            input_size_list=[[300, 300, 3]])

2.3.3 TensorFlow Lite-Modell laden

API load_tflite
Beschreibung TensorFlow-Lite-Modell laden. (Unter ARM64 nicht verfügbar.)
Parameter model: Pfad zur TensorFlow-Lite-Modelldatei (Endung “.tflite”).
Parameter input_is_nchw: Gibt an, ob die Modelleingabe bereits im NCHW-Layout vorliegt. Standardwert: False; das Standardlayout ist damit NHWC.
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load the mobilenet_v1 TF-Lite model in the current path
ret = rknn.load_tflite(model='./mobilenet_v1.tflite')

2.3.4 ONNX-Modell laden

API load_onnx
Beschreibung ONNX-Modell laden.
Parameter model: Pfad zur ONNX-Modelldatei (Endung “.onnx”).
Parameter inputs: Eingabeknoten des Modells (Operandennamen); mehrere Knoten werden unterstützt. Alle Zeichenfolgen der Eingabeknoten werden in einer Liste abgelegt. Standardwert: None; die Knoten werden aus dem Modell übernommen.
Parameter input_size_list: Formen der Eingabeknoten, gemeinsam in einer Liste. Wenn inputs gesetzt wird, muss auch input_size_list gesetzt werden. Standardwert: None.
Parameter input_initial_val: Anfangswerte der Modelleingaben als ndarray-Liste. Standardwert: None.
Hauptsächlich dazu gedacht, einige Eingaben als Konstanten festzulegen. Eingaben, die nicht konstant sein sollen, können auf None gesetzt werden, etwa [None, np.array([1])].
Parameter outputs: Ausgabeknoten des Modells (Operandennamen); mehrere Knoten werden unterstützt. Alle Ausgabeknoten werden in einer Liste abgelegt. Standardwert: None; sie werden aus dem Modell übernommen.
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load the arcface onnx model in the current path
ret = rknn.load_onnx(model='./arcface.onnx')

2.3.5 DarkNet-Modell laden

API load_darknet
Beschreibung DarkNet-Modell laden. (Unter ARM64 nicht verfügbar.)
Parameter model: Pfad zur DarkNet-Modellstrukturdatei (Endung “.cfg”).
Parameter weight: Pfad zur Gewichtsdatei (Endung “.weight”).
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load the yolov3-tiny DarkNet model in the current path
ret = rknn.load_darknet(model='./yolov3-tiny.cfg',
           weight= './yolov3.weights')

2.3.6 PyTorch-Modell laden

API load_pytorch
Beschreibung PyTorch-Modell laden.
Modelle mit quantisierungsbewusstem Training (Quantization Aware Training, QAT) werden unterstützt; dafür muss torch auf Version ‘1.9.0’ oder höher aktualisiert werden.
Parameter model: Pfad zur PyTorch-Modellstrukturdatei (Endung “.pt”); erforderlich ist ein Modell im torchscript-Format.
Parameter input_size_list: Formen der Eingabeknoten, gemeinsam in einer Liste.
Rückgabewert 0: Import erfolgreich.
Rückgabewert -1: Import fehlgeschlagen.

Beispielcode:

# Load the PyTorch model resnet18 in the current path
ret = rknn.load_pytorch(model='./resnet18.pt',
           input_size_list=[[1,3,224,224]])

2.4 RKNN-Modell erstellen

API build
Beschreibung Aus dem importierten Modell das entsprechende RKNN-Modell erstellen.
Parameter do_quantization: Gibt an, ob das Modell quantisiert werden soll. Standardwert: True.
Parameter dataset: Eingabedatensatz zur Kalibrierung der Quantisierungsparameter. Unterstützt wird eine Textdatei, in der Pfade zu Kalibrierungsbildern (jpg oder png) oder npy-Dateien stehen. Pro Zeile ein Pfad, beispielsweise:
a.jpg
b.jpg
oder
a.npy
b.npy
Bei mehreren Eingaben werden die zugehörigen Dateien durch Leerzeichen getrennt, etwa:
a.jpg a2.jpg
b.jpg b2.jpg
oder
a.npy a2.npy
b.npy b2.npy
Hinweis: Im Allgemeinen sollten die Quantisierungsbilder dem späteren Vorhersageszenario entsprechen.
Parameter rknn_batch_size: Passt die Batch-Größe der Eingabe an. Standardwert: None.
Bei Werten größer als 1 kann die NPU mehrere Eingabebilder oder Datensätze in einem Inferenzlauf verarbeiten. Beispielsweise hat MobileNet ursprünglich die Eingabeform [1, 224, 224, 3] und Ausgabeform [1, 1001]. Bei rknn_batch_size = 4 werden daraus [4, 224, 224, 3] und [4, 1001].
Hinweise:
1. rknn_batch_size verbessert die Leistung (Kernauslastung) nur auf NPU-Mehrkernplattformen. Der Wert sollte daher der Anzahl der NPU-Kerne entsprechen.
2. Eine Änderung von rknn_batch_size verändert die Eingabe- und Ausgabeformen. Die Eingaben für inference müssen die richtige Größe besitzen; auch die zurückgegebenen Ausgaben sind in der Nachverarbeitung entsprechend zu behandeln.
Parameter auto_hybrid: Aktiviert die automatische gemischte Quantisierung zur Anpassung der Genauigkeit oder Behandlung von Überläufen. Standardwert: False, also keine Anpassung. Während der Modellquantisierung wandelt auto_hybrid Operationen, deren Kosinusabstand und euklidischer Abstand unter den festgelegten Schwellenwerten liegen, in FP16-Berechnungen um (derzeit nur bei ‘w8a8’-Quantisierung unterstützt). Wird das Modell nicht quantisiert, wandelt auto_hybrid Operationen außerhalb des FP16-Wertebereichs in INT16-Berechnungen um.
Hinweis:
1. Die Schwellenwerte lassen sich über auto_hybrid_cos_thresh und auto_hybrid_euc_thresh der Schnittstelle config festlegen.
Rückgabewert 0: Erstellung erfolgreich.
Rückgabewert -1: Erstellung fehlgeschlagen.

Beispielcode:

# Build and quantize RKNN model
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')

2.5 RKNN-Modell exportieren

Das über build erstellte RKNN-Modell kann zur Bereitstellung in einer Datei gespeichert werden.

API export_rknn
Beschreibung RKNN-Modell in der angegebenen Datei speichern (Endung “.rknn”).
Parameter export_path: Pfad zur erzeugten RKNN-Modelldatei.
Rückgabewert 0: Export erfolgreich.
Rückgabewert -1: Export fehlgeschlagen.

Beispielcode:

# save the built RKNN model as a mobilenet_v1.rknn file in the current path
ret = rknn.export_rknn(export_path='./mobilenet_v1.rknn')

2.6 RKNN-Modell laden

API load_rknn
Beschreibung RKNN-Modell laden.
Danach entfallen Modellkonfiguration, Laden des ursprünglichen Modells und Erstellen des RKNN-Modells. Das geladene Modell kann nur mit angeschlossener NPU-Hardware für Inferenz oder Leistungsmessdaten verwendet werden, nicht für Simulator oder Genauigkeitsanalyse.
Parameter path: Pfad zur RKNN-Modelldatei.
Rückgabewert 0: Laden erfolgreich.
Rückgabewert -1: Laden fehlgeschlagen.

Beispielcode:

# Load the mobilenet_v1 RKNN model in the current path
ret = rknn.load_rknn(path='./mobilenet_v1.rknn')

2.7 Laufzeitumgebung initialisieren

Vor Inferenz oder Leistungsbewertung die Laufzeitumgebung initialisieren. Diese Schnittstelle legt deren Typ fest: Hardwareplattform oder Softwaresimulator.

API init_runtime
Beschreibung Laufzeitumgebung initialisieren.
Parameter target: Ziel-Hardwareplattform. Unterstützt werden ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’ und ‘rk3588’. Standardwert: “None”; das Modell läuft damit im Simulator.
Hinweis: Bei target = None muss zuerst build oder hybrid_quantization aufgerufen werden.
Parameter device_id: Gerätekennung. Wenn mehrere Geräte am PC angeschlossen sind, muss dieser Parameter angegeben werden. Er lässt sich über list_devices ermitteln. Standardwert: None.
Parameter perf_debug: Debug-Modus für die Leistungsbewertung. Damit lässt sich die Laufzeit jedes Layers ermitteln; andernfalls wird nur die Gesamtlaufzeit des Modells ausgegeben. Standardwert: False.
Parameter eval_mem: Aktiviert den Speicherbewertungsmodus. Bei True kann anschließend eval_memory aufgerufen werden, um den Speicherverbrauch während der Modellausführung zu ermitteln. Standardwert: False.
Parameter async_mode: Gibt an, ob der asynchrone Modus verwendet werden soll. Standardwert: False.
inference umfasst das Setzen des Eingabebildes, die Modellausführung und das Abholen des Ergebnisses. Im asynchronen Modus erfolgt das Setzen der aktuellen Eingabe gleichzeitig mit der Inferenz des vorherigen Frames. Mit Ausnahme des ersten Frames lässt sich dadurch die Eingabevorbereitung jedes weiteren Frames überlappen, was die Leistung verbessert. Das jeweils zurückgegebene Ergebnis gehört zum vorherigen Frame. (Noch nicht unterstützt.)
Parameter core_mask: Legt die NPU-Kerne zur Laufzeit fest. Unterstützt werden RK3588 / RK3576 mit folgenden Konfigurationen:
RKNN.NPU_CORE_AUTO: automatische Planung; das Modell läuft auf einem aktuell freien NPU-Kern.
RKNN.NPU_CORE_0: Ausführung auf NPU0.
RKNN.NPU_CORE_1: Ausführung auf NPU1.
RKNN.NPU_CORE_2: Ausführung auf NPU2.
RKNN.NPU_CORE_0_1: gleichzeitige Ausführung auf NPU0 und NPU1.
RKNN.NPU_CORE_0_1_2: gleichzeitige Ausführung auf NPU0, NPU1 und NPU2.
RKNN.NPU_CORE_ALL: Die Anzahl verwendeter NPU-Kerne hängt von der Plattform ab.
Standardwert: “RKNN.NPU_CORE_AUTO”.
Hinweis: RK3576 besitzt nur 2 Kerne; NPU_CORE_2 und NPU_CORE_0_1_2 dürfen daher nicht gesetzt werden.
Parameter fallback_prior_device: Bevorzugtes Ausweichgerät für eine von der NPU nicht unterstützte OP. Unterstützt werden ‘gpu’ und ‘cpu’; ‘gpu’ gilt nur für Plattformen mit GPU-Hardware. Standardwert: ‘cpu’.
Rückgabewert 0: Laufzeitumgebung erfolgreich initialisiert.
Rückgabewert -1: Initialisierung der Laufzeitumgebung fehlgeschlagen.

Beispielcode:

# Initialize the runtime environment
ret = rknn.init_runtime(target='rk3566')

2.8 Inferenz mit dem RKNN-Modell

Diese Schnittstelle startet die RKNN-Modellinferenz und liefert deren Ergebnis.

API inference
Beschreibung Mit dem Modell und den angegebenen Eingaben eine Inferenz durchführen und das Ergebnis abrufen.
Wenn bei der Initialisierung target auf Rockchip NPU gesetzt wurde, erfolgt die Inferenz auf der angegebenen Hardwareplattform. Ohne target wird der Simulator verwendet.
Parameter inputs: Liste der zu inferierenden Eingaben. Der Objekttyp ist ndarray.
Parameter data_format: Liste der Eingabedatenlayouts: “nchw” oder “nhwc”; nur bei 4-dimensionalen Eingaben wirksam. Standardwert: None; alle Eingaben verwenden dann “nhwc”.
Parameter inputs_pass_through: pass_through-Flag. Standardwert: None; für alle Eingaben ist pass_through damit deaktiviert.
Ohne pass_through zieht das Werkzeug vor der Übergabe an den NPU-Treiber den Mittelwert ab, dividiert durch die Varianz usw.; mit pass_through entfallen diese Operationen.
Der Parameter ist eine Liste. Soll beispielsweise input0 direkt durchgereicht werden, input1 jedoch nicht, lautet der Wert [1, 0].
Rückgabewert results: Inferenzergebnis als ndarray-Liste.

Beispielcode:

Für ein Klassifikationsmodell wie mobilenet_v1 folgt dieser Code; der vollständige Code wird in der Quelle unter example/tfilte/mobilenet_v1 angegeben. Die Schreibweise tfilte bleibt als Quellangabe erhalten.

# Preform inference for a picture with a model and get a top-5 result
outputs = rknn.inference(inputs=[img])
show_outputs(outputs)

Beispielergebnis für top-5:

-----TOP 5-----
[ 156] score:0.928223 class:"Shih-Tzu"
[ 155] score:0.063171 class:"Pekinese, Pekingese, Peke"
[ 205] score:0.004299 class:"Lhasa, Lhasa apso"
[ 284] score:0.003096 class:"Persian cat"
[ 285] score:0.000171 class:"Siamese cat, Siamese"

2.9 Modellleistung bewerten

API eval_perf
Beschreibung Modellleistung bewerten.
Das Modell muss auf einem mit dem PC verbundenen RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588 laufen. Ist perf_debug bei init_runtime False, enthalten die von der Hardware ermittelten Leistungsdaten nur die Gesamtlaufzeit. Bei perf_debug = True werden zusätzlich die Laufzeiten der einzelnen Layer detailliert erfasst.
Parameter is_print: Gibt an, ob Leistungsdaten ausgegeben werden. Standardwert: True.
Parameter fix_freq: Gibt an, ob die Hardwarefrequenz festgehalten wird. Standardwert: True.
Rückgabewert perf_result: Leistungsinformationen (Zeichenfolgen).

Beispielcode:

# Evaluate model performance
perf_detail = rknn.eval_perf()

2.10 Speicherbedarf bewerten

API eval_memory
Beschreibung Speicherverbrauch bei der Modellausführung auf der Hardwareplattform ermitteln.
Das Modell muss auf einem mit dem PC verbundenen RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588 laufen.
Parameter is_print: Gibt an, ob die Speicherbewertung im Standardformat ausgegeben wird. Standardwert: True.
Rückgabewert memory_detail: Detaillierte Speicherverbrauchsdaten als Dictionary.
Beispiel:
{
‘weight_memory’: 3698688,
‘internal_memory’: 1756160,
‘other_memory’: 484352,
‘total_memory’: 5939200,
}
- ‘weight_memory’ bezeichnet den Speicherbedarf der Modellgewichte.
- ‘internal_memory’ bezeichnet den Speicherverbrauch der internen Tensoren.
- ‘other_memory’ bezeichnet den Speicherverbrauch anderer Tensoren.
- ‘total_memory’ bezeichnet den gesamten Modellspeicherbedarf, also die Summe aus Gewichten, internen Tensoren und sonstigem Speicher.

Beispielcode:

# eval memory usage
memory_detail = rknn.eval_memory()

Für das Beispiel examples/caffe/mobilenet_v2 zeigt die Quelle folgende Speicherbelegung auf RK3588. Dies sind Originalwerte, keine ArmSoM-Messungen.

======================================================
     Memory Profile Info Dump
======================================================
NPU model memory detail(bytes):
  Weight Memory: 3.53 MiB
  Internal Tensor Memory: 1.67 MiB
  Other Memory: 473.00 KiB
  Total Memory: 5.66 MiB

INFO: When evaluating memory usage, we need consider
the size of model, current model size is: 4.09 MiB
======================================================

2.11 SDK-Version abfragen

API get_sdk_version
Beschreibung API- und Treiberversion des verwendeten SDK abrufen.
Hinweis: Vorher müssen das Modell geladen und die Laufzeitumgebung initialisiert werden. Die API ist nur auf RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588 nutzbar.
Parameter None.
Rückgabewert sdk_version: API- und Treiberversion. Datentyp: Zeichenfolge.

Beispielcode:

# Get SDK version
sdk_version = rknn.get_sdk_version()
print(sdk_version)

Beispielausgabe der SDK-Version:

==============================================
RKNN VERSION:
  API: 1.5.2 (8babfea build@2023-08-25T02:31:12)
  DRV: rknn_server: 1.5.2 (8babfea build@2023-08-25T10:30:12)
  DRV: rknnrt: 1.5.3b13 (42cbca6f5@2023-10-27T10:13:21)
==============================================

2.12 Gemischte Quantisierung

2.12.1 hybrid_quantization_step1

Die erste Phase der gemischten Quantisierung verwendet hybrid_quantization_step1. Er erzeugt eine temporäre Modelldatei (<model_name>.model), eine Datendatei (<model_name>.data) und die Quantisierungskonfiguration (<model_name>.quantization.cfg). Schnittstellendetails:

API hybrid_quantization_step1
Beschreibung Aus dem geladenen ursprünglichen Modell werden entsprechende temporäre Modelldateien, Datendateien und Quantisierungskonfigurationen erzeugt.
Parameter dataset: Siehe 2.4 „RKNN-Modell erstellen“.
Parameter rknn_batch_size: Siehe 2.4 „RKNN-Modell erstellen“.
Parameter proposal: Erzeugt Konfigurationsvorschläge für gemischte Quantisierung. Standardwert: False.
Parameter proposal_dataset_size: Größe des für proposal verwendeten Datensatzes. Standardwert: 1. Da proposal zeitaufwendig ist, beträgt die voreingestellte Größe 1.
Parameter custom_hybrid: Wählt den Teilgraphen für gemischte Quantisierung anhand mehrerer vom Benutzer vorgegebener Eingabe-/Ausgabenamenpaare aus. Format: [[input0_name, output0_name], [input1_name, output1_name], …]. Standardwert: None.
Hinweis: Die Namen sind anhand der temporären Modelldatei (<model_name>.model) auszuwählen.
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

# Call hybrid_quantization_step1 to generate quantization config
ret = rknn.hybrid_quantization_step1(dataset='./dataset.txt')

2.12.2 hybrid_quantization_step2

Zur Erzeugung des gemischt quantisierten RKNN-Modells wird hybrid_quantization_step2 aufgerufen. Schnittstellendetails:

API hybrid_quantization_step2
Beschreibung Nimmt die temporäre Modelldatei, Datendatei, Quantisierungskonfiguration und den Kalibrierdatensatz entgegen und erzeugt daraus ein gemischt quantisiertes RKNN-Modell.
Parameter model_input: Pfad zur von hybrid_quantization_step1 erzeugten temporären Modelldatei (<model_name>.model).
Parameter data_input: Pfad zur von hybrid_quantization_step1 erzeugten Modelldatendatei (<model_name>.data).
Parameter model_quantization_cfg: Pfad zur bearbeiteten, von hybrid_quantization_step1 erzeugten Quantisierungskonfigurationsdatei (<model_name>.quantization.cfg).
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

# Call hybrid_quantization_step2 to generate hybrid quantized RKNN model
ret = rknn.hybrid_quantization_step2(
       model_input='./ssd_mobilenet_v2.model',
       data_input='./ssd_mobilenet_v2.data',
       model_quantization_cfg='./ssd_mobilenet_v2.quantization.cfg')

2.13 Quantisierungsgenauigkeit analysieren

Diese Schnittstelle führt die Inferenz mit dem quantisierten Modell aus und erzeugt die Ausgaben jeder Schicht zur Analyse der Quantisierungsgenauigkeit.

API accuracy_analysis
Beschreibung Mit dem quantisierten Modell eine Inferenz durchführen und einen Snapshot erzeugen, also die Tensordaten jedes Layers ausgeben. Zur Berechnung des Quantisierungsfehlers werden Snapshots beider Datentypen fp32 und quant ausgegeben.
Hinweise:
1. Die Schnittstelle darf erst nach build oder hybrid_quantization_step2 aufgerufen werden.
2. Ist target None und das ursprüngliche Modell bereits quantisiert (QAT-Modell), schlägt der Aufruf fehl.
3. Das Quantisierungsverfahren entspricht der Einstellung in config.
Parameter inputs: Liste der Bildpfade (jpg/png/bmp/npy).
Parameter output_dir: Ausgabeverzeichnis für sämtliche Snapshot-Daten. Standardwert: ‘./snapshot’.
Ohne target werden in output_dir folgende Inhalte erzeugt:
- Verzeichnis simulator: Ergebnisse jedes Layers im Simulator bei vollständiger Ausführung des quantisierten Modells (die Ausgabe wurde in float32 konvertiert).
- Verzeichnis golden: Ergebnisse jedes Layers im Simulator bei vollständiger Ausführung des Gleitkommamodells.
- error_analysis.txt: Kosinusabstand (entire_error und single_error) zwischen den Layer-Ergebnissen des quantisierten Modells im Simulator und dem Gleitkommamodell im Simulator während der vollständigen Berechnung des quantisierten Modells. entire_error/single_error unterscheiden sich darin, ob die Eingabe des jeweiligen Layers aus dem quantisierten Modell oder dem Gleitkommamodell stammt. Weitere Details stehen in error_analysis.txt.
Mit target werden zusätzliche Inhalte in output_dir erzeugt:
- Verzeichnis runtime: Ergebnisse jedes Layers bei vollständiger Ausführung des quantisierten Modells auf der NPU (die Ausgabe wurde in float32 konvertiert).
- error_analysis.txt: zusätzlich der Kosinusabstand (entire_error) zwischen den Layer-Ergebnissen im Simulator und auf der NPU während der vollständigen Berechnung des quantisierten Modells. Weitere Details stehen in error_analysis.txt.
Parameter target: Ziel-Hardwareplattform. Unterstützt werden ‘rv1103’, ‘rv1103b’, ‘rv1106’, ‘rv1106b’, ‘rv1126b’, ‘rk3562’, ‘rk3566’, ‘rk3568’, ‘rk3576’ und ‘rk3588’. Standardwert: “None”.
Bei gesetztem target werden die Ausgaben jedes NPU-Layers ermittelt und auf Genauigkeit analysiert.
Parameter device_id: Gerätekennung. Bei mehreren am PC angeschlossenen Geräten muss sie angegeben werden; der Wert wird über list_devices ermittelt. Standardwert: “None “.
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

# Accuracy analysis
ret = rknn.accuracy_analysis(inputs=['./dog_224x224.jpg'])

2.14 Geräte auflisten

API list_devices
Beschreibung Angeschlossene RV1103 / RV1103B / RV1106 / RV1106B / RV1126B / RK3562 / RK3566 / RK3568 / RK3576 / RK3588 auflisten.
Hinweis: Es gibt zwei Geräteverbindungsmodi, ADB und NTB. Bei mehreren Geräten müssen die Modi übereinstimmen.
Parameter None.
Rückgabewert Gibt die Listen adb_devices und ntb_devices zurück. Wenn keine Geräte am PC angeschlossen sind, werden zwei leere Listen zurückgegeben.

Beispielcode:

rknn.list_devices()

Beispielgeräteliste:

*************************
all device(s) with adb mode:
VD46C3KM6N
*************************

2.15 Verschlüsseltes RKNN-Modell exportieren

Diese Schnittstelle verschlüsselt ein gewöhnliches RKNN-Modell und liefert das verschlüsselte Modell.

API export_encrypted_rknn_model
Beschreibung Verschlüsselt das normale RKNN-Modell gemäß der vom Benutzer gewählten Verschlüsselungsstufe.
Hinweis: RV1103/RV1103B/RV1106/RV1106B/RK2118 werden noch nicht unterstützt.
Parameter input_model: Pfad zum zu verschlüsselnden RKNN-Modell.
Parameter output_model: Speicherpfad für das verschlüsselte Modell. Standardwert: None; dann wird {original_model_name}.crypt.rknn verwendet.
Parameter crypt_level: Verschlüsselungsstufe. Unterstützt werden 1, 2 oder 3; Standardwert: 1.
Je höher die Stufe, desto höher die Sicherheit und desto zeitaufwendiger die Entschlüsselung; bei niedrigerer Stufe sinkt die Sicherheit, die Entschlüsselung wird jedoch schneller.
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

ret = rknn.export_encrypted_rknn_model('test.rknn')

2.16 Benutzerdefinierten Operator registrieren

Diese Schnittstelle registriert einen benutzerdefinierten Operator.

API reg_custom_op
Beschreibung Benutzerdefinierten Operator registrieren; nur für ONNX-Modelle unterstützt.
Parameter custom_op: Benutzerdefinierte Operatorklasse für einen neuen OP außerhalb der ONNX-OP-Spezifikation. op_type des neuen OP sollte mit ‘cst’ beginnen; die Funktionen shape_infer und compute müssen vom Benutzer implementiert werden.
Hinweis: Die Klasse custom_op dient nur der Modellkonvertierung und Erzeugung von RKNN-Modellen mit benutzerdefinierten Operatoren. Für die Bereitstellung auf dem Gerät ist zusätzlich Kapitel 5.5 des ‘RKNN SDK User Guide’ zu beachten.
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

import numpy as np
from rknn.api.custom_op import get_node_attr
class cstSoftmax:
  op_type = 'cstSoftmax'
  def shape_infer(self, node, in_shapes, in_dtypes):
    out_shapes = in_shapes.copy()
    out_dtypes = in_dtypes.copy()
    return out_shapes, out_dtypes
  def compute(self, node, inputs):
    x = inputs[0]
    axis = get_node_attr(node, 'axis')
    x_max = np.max(x, axis=axis, keepdims=True)
    tmp = np.exp(x - x_max)
    s = np.sum(tmp, axis=axis, keepdims=True)
    outputs = [tmp / s]
    return outputs

ret = rknn.reg_custom_op(cstSoftmax)

2.17 C++-Bereitstellungsbeispiel erzeugen

API codegen
Beschreibung C++-Bereitstellungsbeispiel erzeugen.
Parameter output_path: Ausgabeverzeichnis; dessen Name kann vom Benutzer festgelegt werden.
Parameter inputs: Liste der Pfade zu den Modelleingaben; sie darf leer bleiben. Gültige Dateiformate sind jpg/png/npy. Bei npy-Eingaben müssen die Datendimensionen mit denen der Modelleingabe übereinstimmen.
Parameter overwrite: Bei True werden die Dateien im Verzeichnis output_path überschrieben. Standardwert: False.
Rückgabewert 0: Erfolgreich.
Rückgabewert -1: Fehlgeschlagen.

Beispielcode:

ret = rknn.codegen(output_path='./rknn_app_demo',
        inputs=['./mobilenet_v2/dog_224x224.jpg'],
        overwrite=True)

Dieses Thema entdecken → · Lernpfade →