Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

KI-Ziffernerkennung mit PiCamera

Ziffern erkennen mit Raspberry Pi, Pi Kamera, OpenCV und TensorFlow.

Geschichte

In diesem Projekt werden wir ein tiefes Faltungs-Neuralnetzwerk trainieren, um Ziffern zu transkribieren. Dann verwenden wir die Daten aus der Lernphase, damit die Pi-Kamera Ziffern lesen und erkennen kann. Die KI-Pipeline wird mit Scikit und OpenCV 3.3 für die Bildbearbeitung und Keras implementiert, das Tensorflow als Back-End für den Deep-Learning-Teil verwendet.


Um dies einfach zu halten, wird keine Feature-Lokalisierungsphase durchgeführt. Du musst das Bild vor das Kameraobjektiv schieben, damit es die einzige Funktion ist, die es sieht.

Das MNIST-Dataset wird verwendet. Es besteht aus 60.000 Trainingsbeispielen und 10.000 Testbeispielen der handgeschriebenen Ziffern 0–9, die als 28×28-Pixel-Monochrombilder formatiert sind. Grundsätzlich wandeln wir alle von der Kamera aufgenommenen Bilder in Bilder um, die wie folgt aussehen:

Die Hauptnetzwerktopologie kann durch das folgende Bild beschrieben werden:

Die letzte Ebene ist eine vollständig verbundene Ebene, die 10 Kategorien zugeordnet ist, die die 10 Ziffern darstellen.

Wir werden zwei Dinge tun. Zuerst trainieren wir ein Netzwerk zur Erkennung von Ziffern. Dann haben wir die Gewichte des Netzwerks verwendet, das wir trainiert haben, um Live-Kamera-Feed-Ziffern von der Raspberry Pi-Kamera zu erkennen.

Ich habe die Raspberry Pi-Kamera mit einer dritten Hand gehalten, da das alles war, was ich hatte. Der mechanische Aufbau kann durch dieses Bild unten beschrieben werden:

Bevor wir mit all dem beginnen, lassen Sie uns jedoch zuerst alles installieren, was wir brauchen. Ich habe virtuelle Python-Umgebungen verwendet, um das Programm einzurichten. Vorausgesetzt, Sie haben alle unten aufgeführten Programme, können Sie Folgendes ausgeben:

source ~/.profile workon cvpython PiCameraApp.py --picamera 1

Also kommen wir zu den Details. Lassen Sie uns zuerst eine Reihe von Programmen installieren.

Tensorflow installieren

pip install tensorflow

Keras installieren

Pip install keras 

Open-CV 3.3 installieren

Die Installation von OpenCV ist etwas kompliziert, wenn Sie alle Optimierungen benötigen. Dies bedeutet, dass wir es von Grund auf neu kompilieren müssen, da das Paket vom pip-Paketmanager nicht alle Optimierungen enthält.

Das beste Tutorial, das ich gefunden habe, ist unter diesem Link:

https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/ 

Installiere endlich die Picamera mit Numpy-Optimierungen.

pip install "picamera[array]" 

Nachdem wir den gesamten Software-Stack auf dem RPI installiert haben, müssen wir jetzt etwas trainieren. Das Netzwerk sollte auf einem Laptop, vorzugsweise mit einer GPU, trainiert werden, es sei denn, Sie sind ein Held, der mit einer langsamen Gletscherleistung vertraut ist und entscheiden sich dafür, dies auf einem RPI zu tun.

Das Netzwerk trainieren

Um das Netzwerk zu trainieren, führen Sie die Python-Datei auf einem Laptop aus, indem Sie Folgendes ausführen:

python Train_MNIST.py

Dies setzt voraus, dass Cuda (bei Verwendung der GPU-Version), Tensorflow, Keras und matplotlib auf Ihrem Laptop installiert sind.

Das Programm in dieser Datei verwendet Keras, um ein tiefes neuronales Netzwerkmodell zu definieren, es zu kompilieren und nach Abschluss der Trainings- und Validierungsphasen die Gewichte des Netzwerks zu speichern.

Am Ende speichert das Programm die Gewichte des Netzwerks als h5-Datei. Dies ist die Datei mit den Netzwerkgewichten, die wir in das Erkennungsskript laden werden, das auf dem RPI ausgeführt wird, um Live-Ziffernbilder zu erkennen.

Kopieren Sie die Gewichtsdatei entweder mit scp oder WinSCP in Ihr RPI.

Wenn Sie eine NVIDIA-GPU haben, dauert das Training je nach Rechenleistung Ihrer Karte einige Minuten. Um die GPU zu nutzen, müssen Sie jedoch die GPU-Version von Tensorflow sowie die ausführbare CUDA-Datei von der NVIDIA-Website installieren. Andernfalls kann es etwas länger dauern, wenn Sie nur die CPU verwenden.

Erkennen von Live-Bildern von Ziffern

Am Ende habe ich sowohl handgeschriebene als auch gedruckte Ziffern getestet. Die Genauigkeit der Vorhersage hängt hauptsächlich von der Beleuchtung und dem Bildwinkel ab und wie zweideutig (beschissen gelesen) Ihr Schreiben wirklich ist. Nachdem Sie die App gestartet haben, drücken Sie t um die Ziffern zu lesen und q beenden.

Die Ziffer 4 erkennen. Ich musste viel Tinte verwenden, um diese 4 zu zeichnen.

Manchmal gibt das Netzwerk unendlich kleine Wahrscheinlichkeiten für die anderen Zahlen aus. Es besteht also eine Wahrscheinlichkeit von 0,0001 %, dass es sich um eine Sieben handelt.

Werkzeuge des Handels.

Programmerklärung

Das Programm nimmt beim Drücken der 't'-Taste einen Schnappschuss von der Kamera auf und wendet eine Reihe von Transformationsschritten auf das Bild an, bevor es an das DNN weitergeleitet wird.

Das erste, was man beachten muss, ist, dass die Farbbilder als große Reihe von Gleitkommazahlen erfasst werden. Zuerst wird das Bild von einem RGB-Format in ein Graustufenbild umgewandelt, damit wir effektiv sind werfen zwei Kanäle aus.

Der nächste Schritt besteht darin, das Gleitkommaformat des Bildes in eine 8-Bit-Zahl mit einem Bereich von 0-255 zu konvertieren.

Als nächstes verwenden wir OpenCV, um die Schwellenwertbildung durchzuführen. Die Otsu-Methode wird verwendet, um das Bild automatisch mit Schwellenwerten zu versehen, damit die Merkmale der Zahl offensichtlich sind. Der nächste Schritt besteht darin, das Bild auf ein Format von 28 × 28 Pixeln zu skalieren. Dies ist das gleiche Format, das vom MNIST DNN akzeptiert wird.

Man kann entweder Scikit-Image, open-cv oder Keras verwenden, um die Neuskalierung durchzuführen.

Nachdem das Bild neu skaliert wurde, besteht der nächste Schritt darin, die Farben zu invertieren, da das MNIST erwartet, dass Zahlen einen schwarzen Hintergrund haben und keine schwarzen Linien auf weißem Hintergrund.

Nach der Nachbearbeitung wird das Bild an das DNN gesendet, das eine Vorhersage der beobachteten Ziffer macht.

Das Ausgabearray stellt die Wahrscheinlichkeiten dar, dass das beobachtete Bild diese Zahl hat. Eine 1 in Position 2 zeigt also 100%ige Sicherheit, da es eine 1 ist. Denken Sie daran, dass Position 1 für 0 reserviert ist.

Algorithmusschritte

1. Lesen Sie das Bild

Der erste Schritt besteht darin, offensichtlich ein Bild vor die Kamera zu stellen. Dies wird später skaliert, da das CNN (Convolutional Neural Network) Bilder einer bestimmten Größe erwartet.

2. In Graustufen umwandeln

Das aufgenommene Bild wird dann mithilfe des scipy-Funktionsaufrufs in Graustufen umgewandelt. Zufälligerweise können Sie opencv nur für die Bildbearbeitung verwenden, müssen sich aber alle Funktionsnamen merken. Noch ein weiterer Punkt, es gibt einige sehr feine Unterschiede zwischen scipy und open-cv, wenn es um bestimmte Funktionen geht.

3. Bildbereich skalieren

Hier wird das Bild von einem Gleitkommaformat in einen uint8-Bereich [0, 255] umgewandelt

4. Schwellenwert

Um ein schönes Schwarz-Weiß-Bild zu erhalten, erfolgt die Schwellenwertbildung über die Otsu-Methode. Dies ist der magische Schritt, da bei der manuellen Schwellenwertbildung die Werte einzeln eingegeben werden müssen.

5. Bildgröße ändern

Die Bildgröße wird auf ein 28 x 28 Pixel großes Array angepasst. Dies wird dann auf ein lineares Array der Größe (28×28) abgeflacht

6. Bild invertieren

MNIST DNN akzeptiert Bilder als 28×28 Pixel, die als Weiß auf schwarzem Hintergrund gezeichnet werden. Also müssen wir das Bild invertieren.

7. In ein trainiertes neuronales Netzwerk einspeisen

Dies ist der letzte Schritt. Hier laden wir die Gewichte des tiefen neuronalen Netzwerks und speisen das Bild in das Netzwerk ein. Es dauert 2-3 Sekunden, um eine Vorhersage zu treffen.

8. Antwort drucken

Schließlich haben wir ein Ausgabearray mit 10 Klassen, die alle Ziffern von 0-9 anzeigen. Die Position des Arrays stellt die Wahrscheinlichkeit dar, dass die Schlussfolgerung vom Netzwerk gezogen wird. Dies in menschliche Sprache zu übersetzen bedeutet, die Position mit der höchsten Wahrscheinlichkeit auszuwählen.

Der Hauptaufbau sieht aus wie ein medizinisches Gerät.

Flosse!

Das ist alles. Dies zeigte, wie man ein neuronales Netzwerk implementiert, das Ziffern erkennen kann.

Code wie immer auf GitHub hochgeladen.

Quelle:  KI-Ziffernerkennung mit PiCamera


Herstellungsprozess

  1. Zutritt:12-Port-Gigabit-Switch mit 4 SFP-Ports
  2. AAEON arbeitet mit Intel zusammen, um leistungsstarke Netzwerklösungen bereitzustellen
  3. Lanner aktualisiert Netzwerkgeräte mit Intel Xeon der 2. Generation
  4. Temperatur lesen mit DS18B20 | Raspberry Pi 2
  5. Temperaturmessung mit RASPBERRY PI
  6. Überwachen der Temperatur mit Raspberry Pi
  7. Posture Pal with Walabot
  8. Erste Schritte mit TJBot
  9. Einen Segway mit Raspberry Pi bauen
  10. GoPiGo v2 mit Windows IoT