Xilinx hat kürzlich sein brandneues Machine-Learning-Entwicklungskit veröffentlicht – Vitis AI. Wir hatten die Gelegenheit, seine KI-Entwicklungsumgebung und den Tool-Flow zu erkunden. In diesem Blog möchten wir den Lesern ein klares Verständnis vermitteln, wie man ein Echtzeit-Objekterkennungssystem auf einem der eingebetteten Xilinx-Ziele entwickelt. Wir werden das VGG-basierte Single Shot Detector (SSD) Modell für die Erkennungsanwendung verwenden. Da unser Publikum aus verschiedenen Bereichen kommt und unterschiedliche Erfahrungen mit Deep Learning sowie Xilinx-Geräten hat, möchten wir mit den Grundlagen beginnen. Wir werden also kein Modell von Grund auf trainieren, sondern den Workflow vom Machine-Learning-Framework-Modell bis zu einem auf Xilinx Zynq UltraScale+ MPSoC ZCU104 einsatzfähigen Modell abdecken.
Umgebungseinrichtung und Installation
Für die Machine-Learning-Modellentwicklung verwenden wir das Caffe-Framework. Ich weiß, viele Leser fragen sich vielleicht, warum Caffe, es ist alt und warum nicht Tensorflow. Ja, Sie haben recht, Caffe ist alt, aber es gibt immer noch Leute, die es verwenden, wie Xilinx, und wir dachten, es wäre schön für Anfänger, die ML-Konzepte leicht zu verstehen. Aber keine Sorge, wir werden im nächsten Blogbeitrag ein funktionierendes Beispiel mit Tensorflow behandeln.
Hinweis: Das Tutorial basiert auf Vitis AI 1.1.
Host-Einrichtung
Lassen Sie uns also besprechen, wie wir Caffe einrichten können und ob es schwierig ist? Nein, es ist ziemlich einfach mit dem neuen Vitis AI 1.1, da es Caffe vorinstalliert im Docker-Paket bereitstellt, das unter https://github.com/Xilinx/Vitis-AI verfügbar ist. Auf dieser Seite finden Sie alle Details zur Einrichtung von Vitis AI auf Ihrem Host-PC (in unserem Fall Ubuntu 18.04). Wir ermutigen fortgeschrittene Benutzer, einen GPU-fähigen Docker-Container zu installieren, da dies den Quantisierungs-Tool-Flow beschleunigen würde.

An diesem Punkt ist die Umgebung eingerichtet und die Caffe-Conda-Umgebung kann mit dem folgenden Befehl instanziiert werden
robin@ubuntu:/workspace$ conda activate vitis-ai-caffeNun wird Ihr Terminal etwas Ähnliches wie folgt ausgeben:
(vitis-ai-caffe) robin@ubuntu:/workspace$Host-Einrichtung (Mit VART)
Die Vitis AI Runtime ermöglicht es Anwendungen, die einheitliche High-Level-Runtime-API sowohl für Cloud als auch Edge zu nutzen. Dadurch werden Cloud-zu-Edge-Deployments nahtlos und effizient. Das Verfahren zur Installation des Cross-Compilation-Systems und zur Einrichtung der glob-Bibliothek wird hier klar erklärt: https://github.com/Xilinx/Vitis-AI/tree/master/VART.
Schließlich werden Sie in der Lage sein, ein Beispiel zu cross-kompilieren, nehmen wir resnet50 als Beispiel.

Wenn keine Fehler auftreten, dann ist VART erfolgreich auf dem Host-PC installiert.
Einrichtung der Vitis AI Library
Die Vitis AI Library ist eine Sammlung von High-Level-Bibliotheken und APIs, die für effiziente KI-Inferenz mit der Deep-Learning Processor Unit (DPU) entwickelt wurden. Sie basiert auf der Vitis AI Runtime mit Unified APIs und unterstützt vollständig XRT 2019.2. Sie kapseln viele hochwertige und effiziente neuronale Netze, was die Verwendung von Deep-Learning-Neuronalen-Netzen ohne Kenntnisse über Deep Learning oder FPGAs vereinfacht.
Bitte folgen Sie den Anweisungen zur Einrichtung des Host-PCs mit der Vitis AI Library auf der folgenden Seite: https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library. Wenn Sie das VART-Setup durchgeführt haben, müssen Sie keine weiteren Installationen vornehmen, aber stellen Sie sicher, dass Sie einige Beispiele aus der Vitis AI Library kompilieren können.
Evaluierungsboard-Einrichtung
Das Xilinx ZCU104 Evaluierungsboard verwendet das Mittelklasse-Zynq-UltraScale+-Gerät, um Ihnen den schnellen Einstieg in Ihre Machine-Learning-Anwendungen zu ermöglichen. Weitere Informationen zum ZCU104-Board finden Sie auf der Xilinx-Website: https://www.xilinx.com/products/boards-and-kits/zcu104.html. Die wichtigsten Konnektivitätsschnittstellen für ZCU104 sind in der folgenden Abbildung dargestellt.

Der erste Schritt ist das Herunterladen des Demo-Linux-Images mit aktiviertem Vitis AI DPU von hier.

Es wird dringend empfohlen, den Power-Management-Patch auszuführen, indem Sie irps5401 ausführen, um Stromausfälle oder Systemhänger beim Ausführen der Beispiele zu vermeiden. Wenn Sie diesen Befehl im vorgefertigten Image nicht finden können, laden Sie bitte das aktualisierte Image von hier herunter: https://www.xilinx.com/bin/public/openDownload?filename=xilinx-zcu104-dpu-v2019.2-v2.img.gz.
Wir ermutigen die Leser, alle Verfahren (Seite 20 – 30) zur Einrichtung des ZCU104-Boards im Vitis AI-Benutzerhandbuch durchzugehen: https://www.xilinx.com/support/documentation/sw_manuals/vitis_ai/1_0/ug1414-vitis-ai.pdf.
Während Sie der obigen Ressource folgen, stellen Sie bitte sicher, dass Sie die erforderlichen Pakete sowohl für VART als auch für die Vitis AI Library installieren. Das Benutzerhandbuch erwähnt nur die VART-Installation, aber Sie können die Vitis Library-Installation für das Board hier finden: https://github.com/Xilinx/Vitis-AI/tree/master/Vitis-AI-Library
VART-Installationsprüfung
Es ist sehr wichtig, die VART-Installation auf dem Zielboard zu überprüfen. Wechseln Sie auf Ihrem Zielboard in das Verzeichnis, in das die VART-Beispiele heruntergeladen wurden.
#cd ~/VART/samples/resnet50Führen Sie das Beispiel aus.
#./resnet50 model_dir_for_zcu104Wenn das obige ausführbare Programm nicht existiert, führen Sie den folgenden Befehl aus, um das entsprechende ausführbare Programm zu kompilieren und zu generieren.
#bash -x build.sh
Vitis AI Library-Prüfung
Da wir die Leistung der Vitis AI Library für bestimmte Vor- und Nachverarbeitungsschritte während der Inferenz nutzen werden, ist es großartig, einige vorgefertigte Beispiele der Vitis AI Library auszuführen. Wenn Sie das oben genannte Verfahren zur Installation des KI-Modellpakets für das Zielboard befolgt haben, werden alle Modelle unter /usr/share/vitis_ai_library/models/ gespeichert. Jedes Modell wird in einem separaten Ordner gespeichert, der aus Folgendem besteht:
- [model_name].elf
- [model_name].prototxt
- meta.json
Wir werden sehen, was all diese Dateien sind, wenn wir die Objekterkennung besprechen, bleiben Sie dran!!!. Lassen Sie uns also einige Beispiele ausführen, um die Installation zu überprüfen. Wir werden das Gesichtserkennungsbeispiel ausführen und das dense_640_360.elf-Modell verwenden. Gehen Sie zu Ihrem Terminal und geben Sie ein
#cd /usr/share/vitis_ai_library/models/#cp -r dense_640_360/ ~/overview/samples/facedetect/Erstellen Sie die ausführbare Datei.
#sh -x build.shFühren Sie die Demo auf einem einzelnen Bild aus
#./test_jpeg_facedetect densebox_640_360 sample_facedetect.jpgHier ist die Ausgabe. Ich weiß, das Modell hat eines dieser Gesichter nicht erkannt. Da das Modell von Xilinx vortrainiert und kompiliert wurde, können wir keine Schlussfolgerung darüber ziehen, warum das Modell das tut, und es liegt außerhalb des Umfangs dieses Blogs.

Jetzt haben wir die Umgebung (Host und Ziel) erfolgreich für die weiteren Entwicklungsschritte eingerichtet
Objekterkennung auf ZCU104
Objekterkennung ist einer der wichtigen Bereiche der Computer Vision, in dem viel Forschung betrieben wird. Wir bitten unsere Leser dringend, zunächst ein klares Verständnis zwischen den verschiedenen Computer-Vision-Aufgaben zu erlangen, nämlich Bildklassifikation, Erkennung und Segmentierung. Die Bildklassifikationsaufgabe weist entsprechenden Objekten in einem Bild ein Klassenlabel zu, während wir bei der Objekterkennung einen Begrenzungsrahmen um jedes Objekt von Interesse zeichnen und sie wie bei der Klassifikationsaufgabe beschriften. Wenn Sie eine sanfte Einführung für all diese Aufgaben erhalten möchten, besuchen Sie bitte diesen ausgezeichneten Blog des berühmten Jason Brownlee: https://machinelearningmastery.com/object-recognition-with-deep-learning/
Ein paar Beispiele zur Veranschaulichung der Idee.

Single Shot Objekterkennung
Das Single Shot Object Detection (SSD) Framework wurde erstmals von Christian Szegedy et al. in dem Paper mit dem Titel SSD: Single Shot MultiBox Detector beschrieben. Für die Objekterkennung haben wir hauptsächlich zwei Arten von Detektoren: Mehrstufige State-of-the-Art-Detektoren wie die RCNN-Familie RCNN, Faster RCNN, etc. und einstufige Detektoren wie Yolo und SSD. Im Vergleich zu den RCNN-Modellen sind einstufige Detektoren schneller und somit für die Echtzeit-Objekterkennung geeignet. Da SSD mehrschichtige Faltungsmerkmale am oberen Ende des Netzwerks anstelle einer vollständig verbundenen Schicht in Yolo verwendet, werden sie schneller und genauer. Bitte sehen Sie den Vergleich zwischen diesen Netzwerken für Geschwindigkeit und Genauigkeit.

Wie Sie bemerkt haben, gibt es SSD in verschiedenen Formaten, was von der Größe des Eingabebildes abhängt. Im obigen Vergleich haben wir VGG16 als Feature-Extraktor verwendet, und im Gegensatz zur realen Arbeit betragen die Eingabebildabmessungen 300 × 300. Wir empfehlen dem Publikum dringend, eine intuitive Vorstellung davon zu bekommen, wie genau SSD Objekte aus dem Eingabebild erkennt. Bitte besuchen Sie dieses ausgezeichnete Tutorial von Sagar Vinodbabu auf a-PyTorch-Tutorial-to-Object-Detection.
Hoffentlich verstehen wir jetzt, wie SSD funktioniert, zumindest den Workflow. Für die restlichen Blog-Schritte werden wir zugehörige Dateien für diejenigen bereitstellen, die selbst implementieren möchten. Dies wird Ihnen helfen zu verstehen, wie Sie die Vitis AI-Tools zur Beschleunigung aufrufen können.
Hinweis: Wenn Sie das Vitis AI Docker-Runtime-System auf Ihrem Host installiert haben, wird ein Workspace-Ordner im Docker-Runtime-System erstellt. Bitte kopieren Sie den Stammordner unserer zugehörigen Dateien nach /workspace.

Dateibeschreibung:
- VAI: Enthält die Dateien zum Quantisieren und Kompilieren Ihres vortrainierten Caffe-Modells.
- "float.prototxt": wird zum Quantisieren/Kompilieren der Modelle für die Bereitstellung auf der Zielhardware verwendet. Hinweis: Bitte achten Sie auf den Pfad, der für Kalibrierungsdaten und Textdateien angegeben ist, damit sie auf den richtigen Speicherort verweisen. Wenn Sie das Tutorial direkt befolgen, müssen keine Änderungen vorgenommen werden.
- "float.caffemodel": vortrainierte Gewichte.
- "quantize_and_compile.sh": Skript zur Automatisierung der Quantisierung und Kompilierung unseres Modells. Wir werden es bald etwas genauer untersuchen.
- data: Hier haben wir alle mit Trainingsdaten verbundenen Dateien wie Kalibrierungsdaten, Textdateien, Label-Maps usw., die von der "float.prototxt"-Datei beim Quantisieren des Netzwerks benötigt werden.
- ZCU104: enthält die Dateien für die Bereitstellung des kompilierten Modells auf dem Zielboard.
Jetzt können wir das Modell mit dem Vitis AI Quantizer quantisieren und mit dem AI Compiler kompilieren. Sie können diese Tools ausführen, indem Sie den folgenden Befehl ausführen (möglicherweise müssen Sie die Datei zuerst ausführbar machen)
/workspace/SSD$ cd VAI/workspace/SSD/VAI$ ./quantize_and_compile.shÖffnen Sie das Skript, wenn Sie Änderungen wie GPU-ID-Einstellung usw. vornehmen müssen. Ich habe mit einer reinen CPU-Maschine getestet. Für eine schnellere Quantisierung verwenden Sie GPU-fähige Geräte.
#!/usr/bin/env bash
#uncomment for GPU usage
#export GPUID=0
net=vgg16_ssd
#working directory
work_dir=$(pwd)
#path of float model
model_dir=quantize
#output directory
output_dir=compile
echo "quantizing network: $(pwd)/float.prototxt"
vai_q_caffe quantize \
-model $(pwd)/float.prototxt \
-weights $(pwd)/float.caffemodel \
-calib_iter 100 \
-output_dir ${model_dir} 2>&1 | tee ${model_dir}/quantize.txt
echo "Compiling network: ${net}"
vai_c_caffe --prototxt=${model_dir}/deploy.prototxt \
--caffemodel=${model_dir}/deploy.caffemodel \
--output_dir=${output_dir} \
--net_name=${net} \
--options "{'mode':'normal'}" \
--arch=/opt/vitis_ai/compiler/arch/dpuv2/ZCU104/ZCU104.json 2>&1 | tee ${output_dir}/compile.txtDas Skript führt den Quantizer auf Ihrem Float-Modell aus, indem es den Befehl vai_q_caffe ausführt, und Sie können eine Beispielausgabe vai_q_caffe Log-Datei von meiner Konsole als Referenz finden. Nach dem Quantisieren erhalten wir die "deploy.model"- und "deploy.prototxt"-Dateien, die für den Kompilierungsprozess erforderlich sind und hier gespeichert sind. Der KI-Quantizer gibt Ihnen die Möglichkeit, die Genauigkeit des quantisierten Modells zu testen, und stellt entsprechende Modelldateien bereit, die für die weitere Feinabstimmung verwendet werden können.
Schließlich ruft der Befehl vai_c_caffe den Vitis AI Compiler auf und kompiliert unser quantisiertes Modell, um eine DPU-kompatible Modelldatei namens "dpu_vgg_16_ssd.elf" zu erzeugen. Als Referenz wurde auch die vai_c_caffe Log-Datei hinzugefügt. Sie sollten etwas Ähnliches wie diese Log-Dateien sehen können. Wir werden die generierte "elf"-Datei für die Inferenz auf ZCU104 verwenden.
Ausführen des SSD-Modells auf ZCU104
Jetzt können wir unsere SSD-basierte Objekterkennung auf dem ZCU104-Board bereitstellen. Um diesen Prozess einfach und schneller zu machen, finden Sie alle erforderlichen Dateien in diesem Ordner ZCU104. Wir werden die Leistung der Vitis AI Library für die Vorverarbeitung, Modellbereitstellung und Nachverarbeitungsschritte wie Bounding-Box-Dekodierung, Anwendung von Non-Max-Suppression usw. nutzen. Wir bitten ambitionierte Leser, sich mit den Details der Vitis AI Library zu befassen, von der die meisten Komponenten Open Source sind und hier gefunden werden können. Das Anwendungsunterverzeichnis enthält die folgenden Dateien und Ordner.
- dpu_vgg16_ssd: Dieses Verzeichnis enthält das kompilierte ELF-Modell und andere zusätzliche Dateien, die von der Vitis AI Library für die Bereitstellung des Modells benötigt werden. Wenn Sie benutzerdefinierte Modelle verwenden, kopieren Sie bitte die kompilierten Dateien in dieses Verzeichnis. Die Datei "vgg16_ssd.prototxt" enthält die Parameter des Erkennungsmodells und die meta.json-Datei ist die Konfigurationsdatei des Modells. Die Anwendung erhält die Modellinformationen über diese Konfigurationsdatei.
- vgg16_ssd.prototxt: Diese Konfigurations-Prototxt-Datei enthält die Vor- und Nachverarbeitungsinformationen bezüglich des Modells. Wenn Sie Schwierigkeiten beim Verstehen der Parameter haben, insbesondere des prior_box_param, können Sie die Modell-Prototxt-Datei oder die deploy.prototxt-Dateien erkunden, um diese Parameter zu extrahieren.
- build.sh: Skript zum Erstellen der Inferenzanwendung.
- test_video_ssd.cpp: Diese Anwendung stellt das kompilierte Modell mit der Vitis AI Library bereit und ermöglicht es dem Benutzer, es mit einer Webcam oder Videoaufnahme zu testen.
- process_result.hpp: Hier zeichnen wir die Begrenzungsrahmen über die Erkennungen.
Kopieren Sie jetzt dieses ZCU104-Anwendungsverzeichnis über eine Ethernet-Verbindung auf Ihr ZCU104-Board. Der nächste Schritt erfordert, dass die Vitis AI-Pakete und -Tools auf Ihrem Board installiert sind. Wenn Sie dies noch nicht getan haben, lesen Sie bitte die vorherigen Abschnitte zur Einrichtung des Zielboards.
Jetzt auf dem Board,
root@xilinx-zcu104-2019_2:~# cd ZCU104/root@xilinx-zcu104-2019_2:~/ZCU104# sh -x build.shSobald der Build abgeschlossen ist, können Sie die Anwendung für eine Webcam oder Videoaufnahme ausführen, indem Sie die Anzahl der Threads (t) wie folgt angeben
für USB-Kamera:
./test_video_ssd dpu_vgg16_ssd -t 6 0für Videodatei:
./test_video_ssd dpu_vgg16_ssd -t 6 /path/to/video_fileFazit
Bisher haben wir die verschiedenen Funktionen der Vitis AI-Entwicklungsumgebung und ihren Tool-Flow beschrieben. Obwohl wir nicht viel über Machine-Learning-Konzepte behandelt haben, wird dieses Tutorial ein großartiger Ausgangspunkt für alle sein, die ihre Machine-Learning-Inferenzanwendung auf Xilinx-Edge-Geräten starten möchten. Wir haben den Workflow aus der Perspektive eines Machine-Learning-Frameworks gezeigt und wie man die Vitis AI-Tools für die Entwicklung einer beschleunigten Anwendung nutzt. Es gibt viele Beispiele und Demos auf der Vitis AI GitHub-Seite, die den Lesern helfen, sich mit neuen Tools und ihren Deep-Learning-Anwendungen vertraut zu machen. Wir werden in naher Zukunft neue Tutorials mit verschiedenen Beispielen veröffentlichen, bis dahin bleiben Sie dran.
