Inhaltsverzeichnis:
- Schritt 1: Architektur des Objekterkennungsmodells erklärt
- Schritt 2: Bereiten Sie die Umgebung vor
- Schritt 3: Trainieren Sie ein Objekterkennungsmodell mit Keras
- Schritt 4: Konvertieren Sie es in das.kmodel-Format
- Schritt 5: Ausführen auf Micropython-Firmware
- Schritt 6: Zusammenfassung
Video: Objekterkennung mit Sipeed MaiX Boards (Kendryte K210) - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:15
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
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
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
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
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
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:
Heimwerken -- Einen Spinnenroboter herstellen, der mit einem Smartphone mit Arduino Uno gesteuert werden kann – wikiHow
Heimwerken || Wie man einen Spider-Roboter herstellt, der mit einem Smartphone mit Arduino Uno gesteuert werden kann: Während man einen Spider-Roboter baut, kann man so viele Dinge über Robotik lernen. Wie die Herstellung von Robotern ist sowohl unterhaltsam als auch herausfordernd. In diesem Video zeigen wir Ihnen, wie Sie einen Spider-Roboter bauen, den wir mit unserem Smartphone (Androi
Entwicklung des Drivemall-Boards: 5 Schritte
Entwicklung des Drivemall Boards: In diesem Tutorial sehen wir die grundlegenden Schritte zum Erstellen eines benutzerdefinierten Arduino-Boards. Die verwendete Software ist KiCad für das Boarddesign und die Arduino IDE für das Erstellen und Laden der Firmware für das Board
Installation De La Carte TagTagTag Pour Nabaztag:tag / Installieren des TagTagTag-Boards auf Ihrem Nabaztag:tag: 23 Schritte
Installation De La Carte TagTag Pour Nabaztag:tag / Installation des TagTagTag Boards auf Ihrem Nabaztag:tag: (siehe unten für die englische Version)La carte TagTagTag a été créée en 2018 lors de Maker Faire Paris pour faire renaitre les Nabaztag et les Nabaztag:tag . Elle a fait l'objet ensuite d'un financement participatif sur Ulule en juin 2019, si vous souhaitez
So organisieren Sie Ihre Pinterest-Boards in Abschnitte – wikiHow
So organisieren Sie Ihre Pinterest-Boards in Abschnitten: Willkommen zu diesem Tutorial, wie Sie: ganz einfach Abschnitte in Ihren Pinterest-Boards erstellen und Ihre Pins noch weiter organisieren. Dieses Tutorial verwendet Pinterest in Ihrem Webbrowser
So richten Sie die Arduino-IDE ein, um mit den Tinusaur-Boards zu arbeiten: 3 Schritte
So richten Sie die Arduino-IDE für die Arbeit mit den Tinusaur-Boards ein.: Dies ist eine kurze Anleitung, wie Sie die Arduino-IDE für die Arbeit mit den Tinusaur-Boards einrichten . Der einzige Unterschied ist, dass es auf der Liste der Boards als Tinusau erscheint