[PYTHON] Une introduction légère à la détection d'objets

Cet article est l'article du 15ème jour du Calendrier de l'Avent de l'Université de Kinki 2019. Dans cet article, j'écrirai brièvement sur la détection d'objets. Je l'ai écrit en référence au contenu du document d'enquête "Détection d'objets dans 20 ans: une enquête".

1. Qu'est-ce que la détection d'objets?

La détection d'objets est la tâche de détecter des instances de classes et d'objets sémantiques dans des images et des vidéos. Dans le passé, il était difficile d'atteindre l'exactitude car il existe deux types de lignes directrices, la classification et la sémantique. Ces dernières années, comme d'autres tâches dans le domaine des CV, la puissance de l'apprentissage en profondeur a continué d'améliorer la précision à une vitesse vertigineuse.

1.1 Quelle est la dernière méthode de détection d'objets?

Vous pouvez vérifier les méthodes SOTA (State-of-the-Art) avec Object Detection on COCO test-dev.

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

Au moment de la rédaction de cet article (13 novembre 2019), SOTA était Cascade Mask R-CNN (Triple-) utilisant CBNet: A Novel Composite Backbone Network Architecture for Object Detection. ResNeXt152, multi-échelle) ”a mAP 53.3 (COCO).

En raison de la concurrence féroce dans le domaine du CV, il sera mis à jour immédiatement dans 3 mois à 6 mois. M2Det, qui était SOTA vers janvier 2019, est mAP 44.2 (COCO), il a donc augmenté de près de 10 points en un an. Pour en savoir plus sur la dernière détection d'objets à l'aide de l'apprentissage en profondeur, reportez-vous au résumé de l'article de hoya012 (https://github.com/hoya012/deep_learning_object_detection).

2. Historique de la détection d'objets

L'historique de la détection d'objets est à peu près divisé en deux termes. «Avant l'invasion du deep learning» de 2001 à 2013 et «Après l'invasion du deep learning» à partir de 2014. Les réseaux neuronaux sont en plein essor ces dernières années en raison de l'amélioration des spécifications des machines et de l'utilisation des GPU ces dernières années, mais la détection d'objets évolue également en parallèle avec eux.

image.png La figure est tirée de Détection d'objets en 20 ans: une enquête.

Avant l'invasion de l'apprentissage profond, la détection d'objets était effectuée en considérant le processus d'extraction des caractéristiques en regardant les valeurs numériques de l'image, mais après l'invasion, la composition et le mécanisme du réseau neuronal sont considérés et ajustés. (Bien sûr, il est important d'apprendre le processus d'extraction des fonctionnalités)

Dans SNS, des ressources humaines appelées animateurs d'extraction de fonctionnalités ont été nécessaires. Dans le monde profond, des ressources humaines appelées animateurs d'hyper paramétrage sont nécessaires [Source]

Les principales technologies de chaque terme sont brièvement expliquées ci-dessous.

2.1 Avant l'attaque profonde

La détection d'objet avant l'invasion profonde a été effectuée par détection de fenêtre de diapositive, qui extrait les caractéristiques et déplace la fenêtre affichant la zone. Voici une méthode typique.

VJ Det(2000)

Il s'agit d'un détecteur de visage humain en temps réel appelé Viola Jones Detector. Il s'agit d'un type de détecteur qui extrait des caractéristiques de type Haar en se concentrant sur la différence de luminosité et effectue une classification en cascade à l'aide d'une fenêtre de diapositive. Les caractéristiques de type Haar sont simplement la somme des pixels dans une certaine zone. "Détection de visage à l'aide de Harr Cascades », La méthode de détection de visage est écrite et l'exemple de code pour la détection en cascade avec OpenCV est écrit.

L'opération revient à calculer la valeur ajoutée des pixels et à vérifier si les motifs correspondent.

image.png

Vous pouvez télécharger ici le résultat d'apprentissage (xml) du détecteur. https://github.com/opencv/opencv/tree/master/data/haarcascades

Si vous ne compilez pas l'installation d'OpenCV, cela ressemble à ceci.

pip install opencv-python opencv-contrib-python

VJDetector lui-même peut être utilisé comme ceci.

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)

Vous pouvez facilement l'utiliser en lançant simplement le fichier xml dans cv2.CascadeClassifier.

C'est un exemple que j'ai utilisé. image.png Vous reconnaissez le visage du président et y mettez une mosaïque! (Je crains que ce soit un problème international)

HOG Det(2006)

C'est un détecteur qui extrait les caractéristiques HOG en se concentrant sur la distribution de la luminosité dans la direction du gradient et les classe par SVM tout en effectuant une fenêtre de diapositive. Pour la détection humaine, on dit que la fonction HOG qui peut capturer les informations de contour est meilleure que la fonction Haar de la différence de luminosité. Dans OpenCV, il est implémenté en tant que cv2.HOGDescriptor. Le code ressemble à ceci.

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 Après l'attaque profonde

Après l'arrivée de Deep, le champ de détection d'objets s'est considérablement amélioré en précision. Il existe différents termes techniques tels que l'apparition de CNN, l'apparition de VGG et l'apparition de ResNet. Ces technologies sont essentiellement des tâches dérivées de la tâche de classification d'image, et la tâche de détection d'objets a tendance à s'améliorer en fonction d'elles. Les méthodes sont divisées en fonction du traitement des deux processus de classification et d'estimation de position. Il s'agit d'un détecteur à un coup qui effectue à la fois en même temps et d'un détecteur à deux coups qui effectue une classification après avoir effectué une estimation de position. スクリーンショット 2019-12-15 0.05.22.png En général, le détecteur à un coup a une excellente vitesse de détection, et le détecteur à deux coups a une excellente précision de détection. (Honnêtement, je pense qu'il n'y a pas beaucoup de différence avec la dernière méthode)

One-shot Detector Le détecteur à un coup est une méthode de détection qui effectue la classification d'image et la détection de position en même temps. Dans de nombreux cas, il peut être classé en type YOLO et en type SSD. Parmi les détecteurs à un coup avec une excellente vitesse de détection, le système SSD est souvent plus rapide, et on dit souvent que le système YOLO est supérieur en précision de détection.

Two-shot Detector

Dans la classification en deux étapes, la technologie commençant par RCNN est principalement utilisée. Ces dernières années, une segmentation sémantique, qui classe par pixel, est parfois effectuée, et en termes de précision, elle dépasse souvent le détecteur à un coup. (Bien sûr, le sous-jacent est l'ensemble de données étiqueté qui le prend en charge.)

3. Bibliothèque profonde

Fondamentalement, il existe une tendance à utiliser le GPU pour gagner en puissance de traitement, il est donc nécessaire de coopérer avec CUDA pour la plupart des bibliothèques. (Bien sûr, il est possible d'utiliser uniquement le CPU) Pour être honnête, il est vraiment difficile de faire correspondre la version dans ce domaine.

tensorflow

Il s'agit d'une bibliothèque développée par Google. La mise à jour de la version progresse avec une grande dynamique, et il sera difficile de faire correspondre la version avec CUDA. Veuillez arrêter de changer l'API sans pitié (voix basse)

pytorch

Il s'agit d'une bibliothèque d'images qui se battent contre tensorflow. J'ai l'impression qu'il y a beaucoup de pytorch dans la mise en œuvre de reproduction des papiers Tsuyotsuyo récents. Particulièrement populaire auprès des jeunes (image égoïste)

chainer

Il s'agit d'une bibliothèque que PFN a récemment arrêté de mettre à jour. Je l'aime beaucoup, mais je pense que ce sera une option difficile pour les nouveaux utilisateurs.

keras

C'est une bibliothèque qui fonctionne avec tensorflow comme back-end. Le degré d'abstraction est très élevé et même les débutants en apprentissage profond peuvent facilement créer un réseau de classification d'images à l'aide de CNN. Cependant, si vous essayez de gérer quelque chose de plus avancé que la classification, vous devrez écrire du code tensorflow et la définition de la fonction de perte sera gênante.

4. Des outils qui prennent en charge l'environnement profond

Voici quelques mots-clés pour les outils qui peuvent aider à prendre en charge un environnement de développement approfondi. Je recommande personnellement nvidia-docker + python natif + pip + etc.

Docker (kubernetes)

C'est un excellent outil qui permet de sauvegarder l'environnement en utilisant un conteneur virtuel (vocabulaire) À partir de la v19, il prend en charge le GPU de manière native. Avant cela, vous pouvez créer un conteneur utilisant GPU en installant nvidia-docker. En particulier, il présente les avantages d'une correspondance de version facile avec CUDA et d'une reproduction facile de l'environnement de la bibliothèque. L'inconvénient est le coût d'apprentissage de Docker ...

Anaconda

Il s'agit d'une version python et d'un outil de gestion de bibliothèque utilisé lors du calcul de la science et de la technologie. Il pollue le terminal et est susceptible d'être rejeté par hasard pour des raisons religieuses.

pyenv

Il existe divers outils de gestion de bibliothèque Python et ils sont divisés en dénominations (je ne comprends pas très bien la différence entre virtualenv et pyenv).

Cinq. À la fin

Toutes les tâches dans le domaine du CV sont en concurrence féroce et évoluent à une vitesse fulgurante. Je ne le recommande pas car c'est une industrie en vogue pour entrer dans la recherche fondamentale, mais je pense que c'est une tâche qui peut encore être remise en question en tant qu'application utilisant ces technologies. Surtout lors de la reproduction et de la mise en œuvre d'un papier, c'est très éducatif car il faut faire quoi faire avec le traitement qui n'est pas écrit dans le papier, le temps de traitement qui est écrit dans le papier ne peut pas être donné, et il est nécessaire d'écrire le traitement qui n'est pas dans la bibliothèque en premier lieu. Je vais. Recommandé lorsque vous avez le temps. Des problèmes tels que les ressources et le temps de traitement qui existaient jusqu'à présent sont en train d'être résolus, et cela devient très facile à gérer, alors pourquoi ne pas essayer?

Je suis épuisé en cours de route, alors je peux l'ajouter à l'avenir.

Les références

Recommended Posts

Une introduction légère à la détection d'objets
Une introduction à l'orientation des objets - Donnez à un objet un enfant.
Une super introduction à Linux
Introduction à la détection des anomalies 1 principes de base
Super Introduction Arithmétique Bit Python
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Comment faire un modèle pour la détection d'objets avec YOLO en 3 heures
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à Scrapy (4)
Introduction à discord.py (2)
Comment créer un objet fonction à partir d'une chaîne
Comment générer un objet Python à partir de JSON
[Introduction à Python3, Jour 23] Chapitre 12 Devenir un Paisonista (12.1 à 12.6)
Enregistrer l'objet dans un fichier avec pickle
Une introduction approximative à la bibliothèque de traduction automatique neuronale
Introduction à Lightning Pytorch
Premiers pas avec le Web Scraping
Introduction aux baies non paramétriques
Introduction à EV3 / MicroPython
Introduction au langage Python
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
Un système simple qui prend automatiquement des photos avec détection d'objet et l'envoie à LINE
Introduction à PyQt4 Partie 1
Introduction à l'algèbre linéaire avec Python: Décomposition A = LU
Introduction à l'injection de dépendances
Introduction à Private Chainer
Introduction à l'apprentissage automatique
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Détection d'anomalies Introduction 2 Détection des valeurs aberrantes
Application de la conversion affine par tenseur - de la détection de base à la détection d'objet -
Le jour 68 [Introduction à Kaggle] Random Forest était simple.
Une introduction à l'orientation des objets - changeons l'état interne d'un objet
[Introduction à AWS] Mémorandum de création d'un serveur Web sur AWS
Analyse d'image avec l'API Object Detection à essayer en 1 heure
[Introduction à Tensorflow] Comprendre correctement Tensorflow et essayer de créer un modèle
AOJ Introduction à la programmation Sujet 1, Sujet 2, Sujet 3, Sujet 4
Introduction au module de papier électronique
Introduction à l'algorithme de recherche de dictionnaire
Introduction à la méthode Monte Carlo
[Mémorandum d'apprentissage] Introduction à vim
Introduction à PyTorch (1) Différenciation automatique
opencv-python Introduction au traitement d'image
Introduction à l'écriture de Cython [Notes]
Introduction à Private TensorFlow
Une route vers Python intermédiaire
Une introduction à l'apprentissage automatique
[Introduction à cx_Oracle] Présentation de cx_Oracle
AOJ Introduction à la programmation Sujet n ° 7, Sujet n ° 8
Comment appeler une fonction
Télécharger un fichier sur Dropbox
Envoyer un signal au sous-processus