Dieser Artikel ist der Artikel zum 15. Tag des Adventskalenders der Kinki-Universität 2019. In diesem Artikel werde ich kurz über die Objekterkennung schreiben. Ich habe es unter Bezugnahme auf den Inhalt des Umfragepapiers "Objekterkennung in 20 Jahren: Eine Umfrage" geschrieben.
Die Objekterkennung ist die Aufgabe, Instanzen von Klassen und semantischen Objekten in Bildern und Videos zu erkennen. In der Vergangenheit war es schwierig, Genauigkeit zu erreichen, da es zwei Arten von Richtlinien gibt: Klassifizierung und Semantik. In den letzten Jahren hat die Kraft des tiefen Lernens wie bei anderen Aufgaben im Bereich des Lebenslaufs die Genauigkeit mit schwindelerregender Geschwindigkeit weiter verbessert.
Sie können SOTA-Methoden (State-of-the-Art) mit Object Detection on COCO test-dev untersuchen.
Zum Zeitpunkt des Schreibens (13. November 2019) war SOTA Cascade Mask R-CNN (Triple-) unter Verwendung von CBNet: Eine neuartige zusammengesetzte Backbone-Netzwerkarchitektur zur Objekterkennung. ResNeXt152, Multi-Scale) “hat mAP 53.3 (COCO).
Aufgrund des starken Wettbewerbs im Bereich Lebenslauf wird es sofort in 3 Monaten auf 6 Monate aktualisiert. M2Det, das um Januar 2019 SOTA war, ist mAP 44.2 (COCO) und hat sich in einem Jahr um fast 10 Punkte erhöht. Informationen zur neuesten Objekterkennung mithilfe von Deep Learning finden Sie in der Zusammenfassung von hoya012 (https://github.com/hoya012/deep_learning_object_detection).
Die Geschichte der Objekterkennung ist grob in zwei Begriffe unterteilt. "Vor der Invasion des tiefen Lernens" von 2001 bis 2013 und "Nach der Invasion des tiefen Lernens" von 2014. Neuronale Netze boomten in den letzten Jahren aufgrund von Verbesserungen der Maschinenspezifikationen und der Verwendung von GPUs in den letzten Jahren, aber auch die Objekterkennung hat sich in Verbindung mit ihnen entwickelt.
Die Abbildung stammt aus Objekterkennung in 20 Jahren: Eine Umfrage.
Vor der Invasion des tiefen Lernens wurde die Objekterkennung durchgeführt, indem die numerischen Werte des Bildes betrachtet und der Prozess des Extrahierens von Merkmalen berücksichtigt wurde. Nach der Invasion werden jedoch die Zusammensetzung und der Mechanismus des neuronalen Netzes berücksichtigt und angepasst. (Natürlich ist es wichtig, den Prozess des Extrahierens von Features zu lernen.)
In SNS wurden Humanressourcen benötigt, die als Entertainer für Feature-Extraktion bezeichnet wurden. In der tiefen Welt werden Humanressourcen benötigt, die als Entertainer für die Anpassung von Hyperparametern bezeichnet werden. [Quelle]
Die Haupttechnologien jedes Begriffs werden nachstehend kurz erläutert.
Die Objekterkennung vor der tiefen Invasion wurde durch die Erkennung von Schiebefenstern durchgeführt, die Merkmale extrahiert und das Fenster mit dem Bereich verschiebt. Das Folgende ist eine typische Methode.
VJ Det(2000)
Es ist ein Echtzeitdetektor für das menschliche Gesicht namens Viola Jones Detector. Dies ist eine Art Detektor, der haarartige Merkmale extrahiert, die sich auf den Helligkeitsunterschied konzentrieren, und eine Kaskadenklassifizierung unter Verwendung eines Schiebefensters durchführt. Haarartige Merkmale sind einfach die Summe der Pixel in einem bestimmten Bereich. "Gesichtserkennung mit Harr Cascades ”, Die Methode zur Gesichtserkennung wird beschrieben und der Beispielcode für die Kaskadenerkennung mit OpenCV geschrieben.
Es ist eine Operation, die den Additionswert von Pixeln berechnet und prüft, ob die Muster übereinstimmen.
Hier können Sie das Lernergebnis (xml) des Detektors herunterladen. https://github.com/opencv/opencv/tree/master/data/haarcascades
Wenn Sie die OpenCV-Installation nicht erstellen, sieht es so aus.
pip install opencv-python opencv-contrib-python
VJDetector selbst kann so verwendet werden.
import cv2
img = cv2.imread("input.jpg ")
detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = detector.detectMultiScale(gray_img,scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
for (x, y, w, h) in face:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 300), 4)
cv2.imwrite("output.jpg ", img)
Sie können es einfach verwenden, indem Sie die XML-Datei in cv2.CascadeClassifier werfen.
Dies ist ein Beispiel, das ich tatsächlich verwendet habe.
Sie erkennen das Gesicht des Präsidenten und setzen ein Mosaik darauf! (Ich mache mir Sorgen, dass dies ein internationales Problem sein wird)
HOG Det(2006)
Es ist ein Detektor, der HOG-Merkmale extrahiert, die sich auf die Verteilung der Helligkeit in der Gradientenrichtung konzentrieren, und diese nach SVM klassifiziert, während ein Schiebefenster ausgeführt wird. Für die Erkennung durch den Menschen wird gesagt, dass die HOG-Funktion, die Konturinformationen erfassen kann, besser ist als die Haar-Funktion des Helligkeitsunterschieds. In OpenCV ist es als cv2.HOGDescriptor implementiert. Der Code sieht so aus.
import cv2
img = cv2.imread("input.jpg ")
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
hogParams = {'winStride': (8, 8), 'padding': (32, 32), 'scale': 1.05}
human, r = hog.detectMultiScale(img, **hogParams)
for (x, y, w, h) in human:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 300), 4)
cv2.imshow("results human detect by def detector", img)
cv2.waitKey(0)
Nach der Ankunft von Deep hat sich die Genauigkeit des Bereichs der Objekterkennung dramatisch verbessert. Es gibt verschiedene Fachbegriffe wie das Erscheinungsbild von CNN, das Erscheinungsbild von VGG und das Erscheinungsbild von ResNet. Diese Technologien sind im Grunde genommen Aufgaben, die aus der Bildklassifizierungsaufgabe abgeleitet wurden, und die Aufgabe der Objekterkennung verbessert sich tendenziell basierend auf ihnen.
Die Methoden sind nach der Handhabung der beiden Prozesse der Klassifizierung und Positionsschätzung unterteilt. Es ist ein One-Shot-Detektor, der beide gleichzeitig ausführt, und ein Two-Shot-Detektor, der nach der Positionsschätzung eine Klassifizierung durchführt.
Im Allgemeinen weist der One-Shot-Detektor eine hervorragende Erkennungsgeschwindigkeit und der Two-Shot-Detektor eine hervorragende Erkennungsgenauigkeit auf.
(Ehrlich gesagt habe ich das Gefühl, dass es keinen großen Unterschied zur neuesten Methode gibt.)
One-shot Detector Der One-Shot-Detektor ist eine Erkennungsmethode, die gleichzeitig eine Bildklassifizierung und eine Positionserkennung durchführt. In vielen Fällen kann es in YOLO-Typ und SSD-Typ klassifiziert werden. Unter den One-Shot-Detektoren mit ausgezeichneter Erkennungsgeschwindigkeit ist das SSD-System häufig schneller, und es wird häufig gesagt, dass das YOLO-System hinsichtlich der Erkennungsgenauigkeit überlegen ist.
Two-shot Detector
In der zweistufigen Klassifizierung wird hauptsächlich die mit RCNN beginnende Technologie verwendet. In den letzten Jahren wird manchmal eine semantische Segmentierung durchgeführt, die nach Pixeln klassifiziert wird, und in Bezug auf die Genauigkeit übertrifft sie häufig den One-Shot-Detektor. (Der zugrunde liegende Datensatz ist natürlich der beschriftete Datensatz, der ihn unterstützt.)
Grundsätzlich besteht die Tendenz, GPU zu verwenden, um Rechenleistung zu gewinnen, sodass die meisten Bibliotheken mit CUDA arbeiten müssen. (Natürlich kann nur die CPU verwendet werden) Um ehrlich zu sein, ist es wirklich ein Schmerz, die Version in diesem Bereich zu finden.
tensorflow
Dies ist eine von Google entwickelte Bibliothek. Das Versions-Upgrade schreitet mit großer Dynamik voran, und es wird schwierig sein, die Version mit CUDA abzugleichen. Bitte hör auf, die API ohne Gnade zu ändern (leise Stimme)
pytorch
Dies ist eine Bibliothek von Bildern, die im Kampf mit Tensorflow stehen. Ich habe den Eindruck, dass die Reproduktionsimplementierung der jüngsten Tsuyotsuyo-Papiere viele Pytorch enthält. Besonders beliebt bei jungen Leuten (egoistisches Image)
chainer
Dies ist eine Bibliothek, deren Aktualisierung PFN kürzlich eingestellt hat. Ich mag es sehr, aber ich denke, es wird eine schwierige Option für neue Benutzer sein.
keras
Es ist eine Bibliothek, die mit Tensorflow als Backend arbeitet. Der Abstraktionsgrad ist sehr hoch, und selbst Anfänger des Deep Learning können mithilfe von CNN problemlos ein Netzwerk zur Bildklassifizierung erstellen. Wenn Sie jedoch versuchen, etwas Fortgeschritteneres als die Klassifizierung zu handhaben, müssen Sie Tensorflow-Code schreiben, und die Definition der Verlustfunktion ist problematisch.
Hier sind einige Schlüsselwörter für Tools, die zur Unterstützung einer umfassenden Entwicklungsumgebung beitragen können. Ich persönlich empfehle nvidia-docker + native python + pip + etc ..
Docker (kubernetes)
Es ist ein großartiges Tool, mit dem die Umgebung mithilfe eines virtuellen Containers (Vokabular) gespeichert werden kann. Ab Version 19 wird die GPU nativ unterstützt. Zuvor können Sie einen Container erstellen, der GPU verwendet, indem Sie nvidia-docker installieren. Insbesondere bietet es die Vorteile einer einfachen Versionsanpassung mit CUDA und einer einfachen Reproduktion der Bibliotheksumgebung. Der Nachteil sind die Lernkosten von Docker ...
Anaconda
Es ist eine Python-Version und ein Bibliotheksverwaltungstool, das bei der Berechnung von Wissenschaft und Technologie verwendet wird. Es verschmutzt das Terminal und kann aus religiösen Gründen zufällig entlassen werden.
pyenv
Es gibt verschiedene Python-Bibliotheksverwaltungstools, die in Nennwerte unterteilt sind (ich verstehe den Unterschied zwischen virtualenv und pyenv nicht ganz).
Alle Aufgaben im Bereich Lebenslauf stehen in einem harten Wettbewerb und entwickeln sich mit enormer Geschwindigkeit. Ich empfehle es nicht, weil es eine heiße Branche ist, als Grundlagenforschung einzusteigen, aber ich denke, dass es eine Aufgabe ist, die als Anwendung mit diesen Technologien immer noch in Frage gestellt werden kann. Insbesondere beim Reproduzieren und Implementieren eines Papiers ist es sehr lehrreich, da mit der Verarbeitung, die nicht in das Papier geschrieben ist, zu tun ist, die Verarbeitungszeit, die in das Papier geschrieben ist, nicht angegeben werden kann und die Verarbeitung, die sich nicht in der Bibliothek befindet, überhaupt geschrieben werden muss. Ich werde. Empfohlen, wenn Sie Zeit haben. Bisher vorhandene Probleme wie Ressourcen und Verarbeitungszeit werden gelöst, und die Handhabung wird immer einfacher. Probieren Sie es also aus.
Ich bin auf dem Weg erschöpft, also kann ich es in Zukunft hinzufügen.
Recommended Posts