[PYTHON] Eine leichte Einführung in die Objekterkennung

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.

1. Was ist Objekterkennung?

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.

1.1 Was ist die neueste Objekterkennungsmethode?

Sie können SOTA-Methoden (State-of-the-Art) mit Object Detection on COCO test-dev untersuchen.

スクリーンショット 2019-11-13 16.48.32.png

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).

2. Verlauf der Objekterkennung

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.

image.png 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.

2.1 Vor dem tiefen Angriff

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.

image.png

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. image.png 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)

2.2 Nach dem tiefen Angriff

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. スクリーンショット 2019-12-15 0.05.22.png 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.)

3. Tiefe Bibliothek

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.

4. Tools, die die tiefe Umgebung unterstützen

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).

Fünf. Am Ende

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.

Verweise

Recommended Posts

Eine leichte Einführung in die Objekterkennung
Eine Einführung in die Objektorientierung - Geben Sie einem Objekt ein Kind.
Eine super Einführung in Linux
Einführung in die Anomalieerkennung 1 Grundlagen
Python Bit Arithmetic Super Einführung
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
So erstellen Sie mit YOLO in 3 Stunden ein Modell für die Objekterkennung
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in Scrapy (4)
Einführung in discord.py (2)
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So generieren Sie ein Python-Objekt aus JSON
[Einführung in Python3, Tag 23] Kapitel 12 Werden Sie Paisonista (12.1 bis 12.6)
Speichern Sie das Objekt in einer Datei mit pickle
Eine grobe Einführung in die neuronale maschinelle Übersetzungsbibliothek
Einführung in Lightning Pytorch
Erste Schritte mit Web Scraping
Einführung in nichtparametrische Felder
Einführung in EV3 / MicroPython
Einführung in die Python-Sprache
Einführung in die TensorFlow-Bilderkennung
Einführung in OpenCV (Python) - (2)
Ein einfaches System, das automatisch mit Objekterkennung aufnimmt und an LINE sendet
Einführung in PyQt4 Teil 1
Einführung in die lineare Algebra mit Python: A = LU-Zerlegung
Einführung in die Abhängigkeitsinjektion
Einführung in Private Chainer
Einführung in das maschinelle Lernen
Einführung in das maschinelle Lernen mit Simple Perceptron
Einführung in die Anomalieerkennung 2 Ausreißererkennung
Anwendung der affinen Umwandlung durch Tensor - von der Basis- zur Objekterkennung -
Tag 68 [Einführung in Kaggle] Random Forest war einfach.
Eine Einführung in die Objektorientierung: Ändern Sie den internen Status eines Objekts
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
Bildanalyse mit Objekterkennungs-API zum Ausprobieren in 1 Stunde
[Einführung in Tensorflow] Verstehen Sie Tensorflow richtig und versuchen Sie, ein Modell zu erstellen
AOJ Einführung in die Programmierung Thema Nr. 1, Thema Nr. 2, Thema Nr. 3, Thema Nr. 4
Einführung in das elektronische Papiermodul
Einführung in den Wörterbuch-Suchalgorithmus
Einführung in die Monte-Carlo-Methode
[Lernmemorandum] Einführung in vim
Einführung in PyTorch (1) Automatische Differenzierung
opencv-python Einführung in die Bildverarbeitung
Einführung in das Schreiben von Cython [Notizen]
Einführung in Private TensorFlow
Ein Weg zum mittleren Python
Eine Einführung in das maschinelle Lernen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
AOJ Einführung in die Programmierung Thema Nr. 7, Thema Nr. 8
So rufen Sie eine Funktion auf
Laden Sie eine Datei in Dropbox hoch
Senden Sie ein Signal an den Unterprozess