Inhaltsverzeichnis:

Objekterkennung mit Sipeed MaiX Boards (Kendryte K210) - Gunook
Objekterkennung mit Sipeed MaiX Boards (Kendryte K210) - Gunook

Video: Objekterkennung mit Sipeed MaiX Boards (Kendryte K210) - Gunook

Video: Objekterkennung mit Sipeed MaiX Boards (Kendryte K210) - Gunook
Video: M5 UnitV Einleitung 2024, November
Anonim
Image
Image

Als Fortsetzung meines vorherigen Artikels über die Bilderkennung mit Sipeed MaiX Boards habe ich beschlossen, ein weiteres Tutorial zu schreiben, das sich auf die Objekterkennung konzentriert. Kürzlich tauchte einige interessante Hardware mit dem Kendryte K210-Chip auf, darunter Seeed AI Hat für Edge Computing, M5StickV von M5-Stack und HuskyLens von DFRobot (obwohl diese proprietäre Firmware hat und eher für absolute Anfänger gedacht ist). Aufgrund seines günstigen Preises hat Kendryte K210 Menschen angesprochen, die ihren Projekten Computer Vision hinzufügen möchten. Aber wie bei chinesischen Hardwareprodukten üblich, fehlt der technische Support und das versuche ich mit meinen Artikeln und Videos zu verbessern. Denken Sie jedoch daran, dass ich nicht zum Entwicklerteam von Kendryte oder Sipeed gehöre und nicht alle Fragen zu ihrem Produkt beantworten kann.

In diesem Sinne fangen wir an! Wir beginnen mit einem kurzen (und vereinfachten) Überblick über die Funktionsweise von CNN-Modellen zur Objekterkennung.

UPDATE MAI 2020: Da mein Artikel und mein Video zur Objekterkennung mit K210-Boards immer noch sehr beliebt sind und zu den Top-Ergebnissen auf YouTube und Google gehören, habe ich beschlossen, den Artikel zu aktualisieren, um die Informationen über aXeleRate, Keras-basiertes Framework für KI auf dem Edge entwickle ich. aXeleRate basiert im Wesentlichen auf der Sammlung von Skripten, die ich zum Trainieren von Bilderkennungs-/Objekterkennungsmodellen verwendet habe – kombiniert in einem einzigen Framework und optimiert für den Workflow auf Google Colab. Es ist bequemer zu bedienen und aktueller.

Die alte Version des Artikels ist noch auf steemit.com zu sehen.

Schritt 1: Architektur des Objekterkennungsmodells erklärt

Architektur des Objekterkennungsmodells erklärt
Architektur des Objekterkennungsmodells erklärt
Architektur des Objekterkennungsmodells erklärt
Architektur des Objekterkennungsmodells erklärt

Modelle zur Bilderkennung (oder Bildklassifizierung) verwenden das gesamte Bild als Eingabe und geben eine Liste von Wahrscheinlichkeiten für jede Klasse aus, die wir zu erkennen versuchen. Es ist sehr nützlich, wenn das Objekt, an dem wir interessiert sind, einen großen Teil des Bildes einnimmt und wir uns nicht um seine Position kümmern. Was aber, wenn unser Projekt (z. B. Face-Tracking-Kamera) erfordert, dass wir nicht nur die Art des Objekts im Bild kennen, sondern auch seine Koordinaten. Und was ist mit einem Projekt, bei dem mehrere Objekte erkannt werden müssen (z. B. zum Zählen)?

Hier kommen Objekterkennungsmodelle zum Einsatz. In diesem Artikel verwenden wir die YOLO-Architektur (Sie sehen nur einmal nach) und konzentrieren die Erklärung auf die interne Mechanik dieser speziellen Architektur.

Wir versuchen zu bestimmen, welche Objekte im Bild vorhanden sind und welche Koordinaten sie haben. Denn maschinelles Lernen ist keine Magie und keine "Denkmaschine", sondern nur ein Algorithmus, der Statistiken verwendet, um die Funktion (neuronales Netz) zu optimieren, um ein bestimmtes Problem besser zu lösen. Wir müssen dieses Problem umschreiben, um es "optimierbarer" zu machen. Ein naiver Ansatz wäre hier, dass der Algorithmus den Verlust (die Differenz) zwischen seiner Vorhersage und den korrekten Koordinaten des Objekts minimiert. Das würde ziemlich gut funktionieren, solange wir nur ein Objekt im Bild haben. Bei mehreren Objekten verfolgen wir einen anderen Ansatz – wir fügen das Raster hinzu und lassen unser Netzwerk die Anwesenheit (oder Abwesenheit) des Objekts/der Objekte in jedem Raster vorhersagen. Klingt gut, hinterlässt aber immer noch zu viel Unsicherheit für das Netzwerk - wie gibt man die Vorhersage aus und was ist zu tun, wenn sich mehrere Objekte mit Mittelpunkt innerhalb einer Gitterzelle befinden? Wir müssen eine weitere Einschränkung hinzufügen - sogenannte Anker. Anker sind anfängliche Größen (Breite, Höhe), von denen einige (die der Objektgröße am nächsten kommen) auf die Objektgröße angepasst werden – unter Verwendung einiger Ausgaben des neuronalen Netzwerks (endgültige Merkmalskarte).

Hier ist also eine Ansicht auf oberster Ebene, was passiert, wenn das neuronale Netzwerk der YOLO-Architektur eine Objekterkennung auf dem Bild durchführt. Gemäß den vom Merkmalsextraktornetzwerk erkannten Merkmalen wird für jede Gitterzelle ein Satz von Vorhersagen gemacht, der den Ankerversatz, die Ankerwahrscheinlichkeit und die Ankerklasse enthält. Dann verwerfen wir die Vorhersagen mit geringer Wahrscheinlichkeit und voila!

Schritt 2: Bereiten Sie die Umgebung vor

Bereiten Sie die Umgebung vor
Bereiten Sie die Umgebung vor

aXeleRate basiert auf einem wunderbaren Projekt von penny4860, dem SVHN yolo-v2 Zifferndetektor. aXeleRate hebt diese Implementierung des YOLO-Detektors in Keras auf die nächste Stufe und verwendet sein komfortables Konfigurationssystem, um das Training und die Konvertierung von Bilderkennungs-/Objekterkennungs- und Bildsegmentierungsnetzwerken mit verschiedenen Backends durchzuführen.

Es gibt zwei Möglichkeiten, aXeleRate zu verwenden: lokal auf einem Ubuntu-Computer oder in Google Colab ausgeführt. Für die Ausführung in Google Colab sehen Sie sich dieses Beispiel an:

PASCAL-VOC-Objekterkennung Colab Notebook

Das lokale Trainieren Ihres Modells und das Exportieren für die Verwendung mit Hardwarebeschleunigung ist jetzt auch viel einfacher. Ich empfehle Ihnen dringend, alle erforderlichen Abhängigkeiten in der Anaconda-Umgebung zu installieren, um Ihr Projekt von anderen zu trennen und Konflikte zu vermeiden.

Laden Sie das Installationsprogramm hier herunter.

Erstellen Sie nach Abschluss der Installation eine neue Umgebung:

conda erstellen -n yolo python=3.7

Lasst uns die neue Umgebung aktivieren

conda aktivieren yolo

Vor Ihrer Bash-Shell wird ein Präfix mit dem Namen der Umgebung angezeigt, um anzuzeigen, dass Sie jetzt in dieser Umgebung arbeiten.

Installieren Sie aXeleRate auf Ihrem lokalen Computer mit

pip install git+https://github.com/AIWintermuteAI/aXeleRate

Führen Sie dann dies aus, um Skripte herunterzuladen, die Sie für das Training und die Inferenz benötigen:

git-Klon

Sie können Schnelltests mit tests_training.py im aXeleRate-Ordner ausführen. Es führt Training und Inferenz für jeden Modelltyp durch, speichert und konvertiert trainierte Modelle. Da es nur für 5 Epochen trainiert und der Datensatz sehr klein ist, werden Sie keine brauchbaren Modelle erhalten, aber dieses Skript ist nur dazu gedacht, die Fehlerfreiheit zu überprüfen.

Schritt 3: Trainieren Sie ein Objekterkennungsmodell mit Keras

Trainieren Sie ein Objekterkennungsmodell mit Keras
Trainieren Sie ein Objekterkennungsmodell mit Keras

Jetzt können wir ein Trainingsskript mit der Konfigurationsdatei ausführen. Da die Keras-Implementierung des YOLO-Objektdetektors ziemlich kompliziert ist, werde ich, anstatt jeden relevanten Codeabschnitt zu erklären, die Konfiguration des Trainings erklären und auch relevante Module beschreiben, falls Sie selbst einige Änderungen daran vornehmen möchten.

Beginnen wir mit einem Spielzeugbeispiel und trainieren einen Waschbärendetektor. Im Ordner /config befindet sich eine Konfigurationsdatei, raccoon_detector.json. Wir wählen MobileNet7_5 als Architektur (wobei 7_5 der Alpha-Parameter der ursprünglichen Mobilenet-Implementierung ist, steuert die Breite des Netzwerks) und 224x224 als Eingabegröße. Schauen wir uns die wichtigsten Parameter in der config an:

Typ ist Modell-Frontend - Classifier, Detector oder SegnetArchitecture ist Modell-Backend (Feature-Extraktor)

- Vollständiges Yolo - Winziges Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50

Weitere Informationen zu Ankern finden Sie hier

Labels sind Labels, die in Ihrem Dataset vorhanden sind. WICHTIG: Bitte listen Sie alle im Datensatz vorhandenen Labels auf.

object_scale bestimmt, wie stark eine falsche Vorhersage des Vertrauens von Objektprädiktoren bestraft wird

no_object_scale bestimmt, wie stark eine falsche Vorhersage der Konfidenz von Nicht-Objekt-Prädiktoren bestraft wird

coord_scale bestimmt, wie stark falsche Positions- und Größenvorhersagen bestraft werden (x, y, w, h)

class_scale bestimmt, wie viel eine falsche Klassenvorhersage bestraft wird

Augmentation - Bildvergrößerung, Größenänderung, Verschiebung und Unschärfe des Bildes, um eine Überanpassung zu verhindern und eine größere Vielfalt im Datensatz zu haben.

train_times,validation_times - wie oft der Datensatz wiederholt werden soll. Nützlich, wenn Sie Augmentation haben

aktiviert

first_trainable_layer - ermöglicht Ihnen das Einfrieren bestimmter Layer, wenn Sie ein vortrainiertes Feature-Netzwerk verwenden

Jetzt müssen wir den Datensatz herunterladen, den ich auf meinem Google Drive geteilt habe (Originaldatensatz), bei dem es sich um einen Waschbären-Erkennungsdatensatz handelt, der 150 kommentierte Bilder enthält.

Stellen Sie sicher, dass Sie die Zeilen in der Konfigurationsdatei (train_image_folder, train_annot_folder) entsprechend ändern und starten Sie dann das Training mit dem folgenden Befehl:

python axelerate/train.py -c configs/raccoon_detector.json

train.py liest die Konfiguration aus der.json-Datei und trainiert das Modell mit dem Skript axelerate/networks/yolo/yolo_frontend.py. In yolo/backend/loss.py wird die benutzerdefinierte Verlustfunktion implementiert und in yolo/backend/network.py wird das Modell erstellt (Eingabe, Feature-Extraktor und Erkennungsebenen zusammen). axelerate/networks/common_utils/fit.py ist ein Skript, das den Trainingsprozess implementiert und axelerate/networks/common_utils/feature.py enthält Funktionsextraktoren. Wenn Sie ein trainiertes Modell mit K210-Chip und Micropython-Firmware verwenden möchten, können Sie aufgrund von Speicherbeschränkungen zwischen MobileNet (2_5, 5_0 und 7_5) und TinyYolo wählen, aber ich habe festgestellt, dass MobileNet eine bessere Erkennungsgenauigkeit bietet.

Da es sich um ein Spielzeugbeispiel handelt und nur 150 Bilder von Waschbären enthält, sollte der Trainingsprozess auch ohne GPU ziemlich schnell sein, obwohl die Genauigkeit alles andere als hervorragend sein wird. Für ein arbeitsbezogenes Projekt habe ich einen Verkehrszeichendetektor und einen Nummerndetektor trainiert, beide Datensätze enthalten über ein paar tausend Trainingsbeispiele.

Schritt 4: Konvertieren Sie es in das.kmodel-Format

Konvertieren Sie es in das.kmodel-Format
Konvertieren Sie es in das.kmodel-Format

Bei aXeleRate erfolgt die Modellkonvertierung automatisch - das ist wohl der größte Unterschied zu den alten Trainingsskripten! Außerdem werden die Modelldateien und das Trainingsdiagramm ordentlich im Projektordner gespeichert. Außerdem habe ich festgestellt, dass die Validierungsgenauigkeit manchmal keine Schätzung der realen Modellleistung für die Objekterkennung liefert, und deshalb habe ich mAP als Validierungsmetrik für Objekterkennungsmodelle hinzugefügt. Hier können Sie mehr über mAP lesen.

Wenn sich der mAP, die mittlere durchschnittliche Präzision (unsere Validierungsmetrik) 20 Epochen lang nicht verbessert, wird das Training vorzeitig beendet. Jedes Mal, wenn sich mAP verbessert, wird das Modell im Projektordner gespeichert. Nach Abschluss des Trainings konvertiert aXeleRate automatisch das beste Modell in bestimmte Formate - Sie können ab sofort "tflite", "k210" oder "edgetpu" wählen.

Nun zum letzten Schritt, indem wir unser Modell tatsächlich auf Sipeed-Hardware ausführen!

Schritt 5: Ausführen auf Micropython-Firmware

Auf Micropython-Firmware ausführen
Auf Micropython-Firmware ausführen

Es ist möglich, Inferenz mit unserem Objekterkennungsmodell mit C-Code auszuführen, aber der Einfachheit halber werden wir stattdessen Micropython-Firmware und MaixPy-IDE verwenden.

Laden Sie die MaixPy-IDE von hier und die Micropython-Firmware von hier herunter. Sie können das Python-Skript kflash.py verwenden, um die Firmware zu brennen, oder hier ein separates GUI-Flash-Tool herunterladen.

Kopieren Sie model.kmodel in das Stammverzeichnis einer SD-Karte und legen Sie die SD-Karte in Sipeed Maix Bit (oder ein anderes K210-Gerät) ein. Alternativ können Sie.kmodel in den Flash-Speicher des Geräts brennen. Mein Beispielskript liest.kmodel aus dem Flash-Speicher. Wenn Sie eine SD-Karte verwenden, ändern Sie bitte diese Zeile

Aufgabe = kpu.load(0x200000)

zu

task = kpu.load("/sd/model.kmodel")

Öffnen Sie MaixPy IDE und drücken Sie die Verbindungstaste. Öffnen Sie das Skript raccoon_detector.py aus dem Ordner example_scripts/k210/detector und drücken Sie die Starttaste. Sie sollten einen Live-Stream von der Kamera mit Begrenzungsrahmen sehen … nun ja, Waschbären. Sie können die Genauigkeit des Modells erhöhen, indem Sie mehr Trainingsbeispiele bereitstellen, aber denken Sie daran, dass es sich um ein kleines Modell (1,9 M) handelt und es Probleme bei der Erkennung kleiner Objekte haben wird (aufgrund der geringen Auflösung).

Eine der Fragen, die ich in den Kommentaren zu meinem vorherigen Artikel über die Bilderkennung erhalten habe, ist, wie die Erkennungsergebnisse über UART/I2C an andere Geräte gesendet werden, die mit Sipeed-Entwicklungsboards verbunden sind. In meinem Github-Repository finden Sie ein weiteres Beispielskript, raccoon_detector_uart.py, das (Sie haben es erraten) Waschbären erkennt und die Koordinaten von Bounding Boxes über UART sendet. Denken Sie daran, dass sich die Pins, die für die UART-Kommunikation verwendet werden, von verschiedenen Boards unterscheiden. Dies müssen Sie selbst in der Dokumentation überprüfen.

Schritt 6: Zusammenfassung

Kendryte K210 ist ein solider Chip für Computer Vision, flexibel, wenn auch mit begrenztem verfügbaren Speicher. Bisher haben wir in meinen Tutorials die Verwendung zum Erkennen von benutzerdefinierten Objekten, zum Erkennen benutzerdefinierter Objekte und zum Ausführen einiger OpenMV-basierter Computer Vision-Aufgaben behandelt. Ich weiß mit Sicherheit, dass es auch für die Gesichtserkennung geeignet ist und mit etwas Bastelei sollte es möglich sein, Posenerkennung und Bildsegmentierung durchzuführen (Sie können aXeleRate verwenden, um das semantische Segmentierungsmodell zu trainieren, aber ich habe die Inferenz mit K210 noch nicht implementiert). Zögern Sie nicht, sich die Probleme mit dem aXeleRate-Repository anzusehen und eine PR zu machen, wenn Sie der Meinung sind, dass Sie einige Verbesserungen beitragen können!

Hier sind einige Artikel, die ich beim Schreiben dieses Tutorials verwendet habe. Werfen Sie einen Blick darauf, wenn Sie mehr über die Objekterkennung mit neuronalen Netzen erfahren möchten:

Bounding-Box-Objektdetektoren: YOLO verstehen, Sie schauen nur einmal

YOLO verstehen (mehr Mathematik)

Sanfte Anleitung zur Funktionsweise der YOLO-Objektlokalisierung mit Keras (Teil 2)

Echtzeit-Objekterkennung mit YOLO, YOLOv2 und jetzt YOLOv3

Ich hoffe, Sie können das Wissen, das Sie jetzt haben, nutzen, um einige großartige Projekte mit Machine Vision zu erstellen! Sie können hier Sipeed-Boards kaufen, sie gehören zu den günstigsten Optionen für ML auf eingebetteten Systemen.

Fügen Sie mich auf LinkedIn hinzu, wenn Sie Fragen haben und abonnieren Sie meinen YouTube-Kanal, um über weitere interessante Projekte im Bereich Machine Learning und Robotik informiert zu werden.

Empfohlen: