[Facile] Reconnaissance automatique AI avec une webcam!

introduction

Ne serait-il pas amusant de pouvoir facilement "* reconnaître des choses` **" avec l'IA à l'aide d'une webcam? Vous pouvez le faire ** facilement ** en utilisant le modèle publié. Faisons-le maintenant!

Que faire spécifiquement

Capturez l'image de la caméra Web vers le PC, laissez AI ** reconnaissance en temps réel ** ce qui y est reflété et affichez jusqu'à TOP3 à l'écran. Cette fois, nous utiliserons le ** modèle entraîné **, il n'y a donc pas d'apprentissage fastidieux de l'IA, vous pouvez donc jouer ** rapidement **. PIC2.png

Environnement de développement

Il utilise une bibliothèque appelée «OpenCV» pour capturer des données d'image à partir d'une caméra Web et une bibliothèque AI appelée «keras» qui identifie les données d'image. Installez les packages de bibliothèque requis.

De quoi as-tu besoin Colonne Remarques
Remarque PC avec webcam, etc. Une caméra Web connectée à un PC via USB est également OK
langage de développement Python3.7
* La version utilisée est 3.7.7
Principales bibliothèques requises 【 OpenCV 】
Bibliothèque de traitement d'images et de vidéos
* La version utilisée est 4.3.0

【 keras 】
Bibliothèque de réseaux neuronaux en langage Python
* La version utilisée est 2.3.1

DenseNet121

Je le fais parce que c'est facile Soudainement appelé DenseNet121, Wakewakaran! Pas plus!

Ça va. calmez-vous, s'il vous plait. Il s'agit d'un ** modèle entraîné **, ce qui signifie que nous utiliserons cette fois un modèle d'apprentissage appelé DenseNet121. Vous pouvez le faire sans connaître les détails!

PIC.png

――Pourquoi avez-vous choisi le «modèle DenseNet121»?

Divers modèles de classification d'images tels que «VGG16» et «ResNet50» peuvent être facilement utilisés à partir de la «bibliothèque keras», mais le modèle de classification d'image utilisé cette fois est ** la taille du modèle est relativement petite à 33 Mo. J'ai choisi «DenseNet121» car il a un bon taux de reconnaissance **. Selon "Keras Documentation", lorsque vous faites une chose reconnue par DenseNet121, le taux de réponse correcte de reconnaissance jusqu'à TOP5 est d'environ 92%. (Environ 75% pour TOP1 uniquement) FireShot Capture 003 - Applications - Keras Documentation - keras.io.png

Source: Documentation Keras https://keras.io/ja/applications/#documentation-for-individual-models

Programme d'IA

Après avoir installé le package de la bibliothèque à utiliser (keras, opencv, etc.), copiez le programme AI suivant.

main.py


# -------------------------------------------------------------------------------------
#Affichez la caméra sur l'écran.
#Jugement d'image avec DenseNet121
# [+]Changer d'appareil photo avec la clé
# [s]Enregistrer l'image avec la clé
# [ESC] or [q]Terminer avec la clé
# -------------------------------------------------------------------------------------
from keras.applications.densenet import DenseNet121
from keras.applications.densenet import preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
import cv2
import datetime


# -------------------------------------------------------------------------------------
# capture_device
# -------------------------------------------------------------------------------------
def capture_device(capture, dev):

    while True:

        #Capturer des images à partir de l'appareil photo
        ret, frame = capture.read()
        if not ret:
            k = ord('+')
            return k

        #Jugement d'image DenseNet121
        resize_frame = cv2.resize(frame, (300, 224))            # 640x480(4:3) -> 300x224(4:3)Redimensionnement de l'image
        trim_x, trim_y = int((300-224)/2), 0                    #Réduit à 224x224 pour jugement
        trim_h, trim_w = 224, 224
        trim_frame = resize_frame[trim_y : (trim_y + trim_h), trim_x : (trim_x + trim_w)]
        x = image.img_to_array(trim_frame)
        x = np.expand_dims(x, axis=0)
        x = preprocess_input(x)
        preds = model.predict(x)                                #Jugement de l'IA d'image

        # Usage
        disp_frame = frame
        txt1 = "model is DenseNet121"
        txt2 = "camera device No.(" + str(dev) + ")"
        txt3 = "[+] : Change Device"
        txt4 = "[s] : Image Capture"
        txt5 = "[ESC] or [q] : Exit"

        cv2.putText(disp_frame, txt1, (10,  30), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, txt2, (10,  60), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, txt3, (10,  90), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, txt4, (10, 120), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, txt5, (10, 150), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)

        #Sortie de caractère de jugement d'image
        output1 = 'No.1:{0}:{1}%'.format(decode_predictions(preds, top=3)[0][0][1],
                                         int(decode_predictions(preds, top=3)[0][0][2] * 100))
        output2 = 'No.2:{0}:{1}%'.format(decode_predictions(preds, top=3)[0][1][1],
                                         int(decode_predictions(preds, top=3)[0][1][2] * 100))
        output3 = 'No.3:{0}:{1}%'.format(decode_predictions(preds, top=3)[0][2][1],
                                         int(decode_predictions(preds, top=3)[0][2][2] * 100))

        cv2.putText(disp_frame, output1, (10, 300), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, output2, (10, 330), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
        cv2.putText(disp_frame, output3, (10, 360), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)

        #Sortie de l'écran de la caméra
        cv2.imshow('camera', disp_frame)

        #Attendez 1 ms et récupérez la clé
        k = cv2.waitKey(1) & 0xFF

        # [ESC] or [q]Continuez à afficher sur l'écran jusqu'à ce que vous appuyiez sur
        if (k == ord('q')) or (k == 27):
            return k

        # [+]Changer d'appareil avec
        if k == ord('+'):
            txt = "Change Device. Please wait... "
            XX = int(disp_frame.shape[1] / 4)
            YY = int(disp_frame.shape[0] / 2)
            cv2.putText(disp_frame, txt, (XX, YY), cv2.FONT_HERSHEY_PLAIN, 1, (255, 255, 255), 1, cv2.LINE_AA)
            cv2.imshow('camera', disp_frame)
            cv2.waitKey(1) & 0xFF
            return k

        # [s]Enregistrez l'image affichée à l'écran avec
        elif k == ord('s'):
            cv2.imwrite('camera_dsp{}.{}'.format(datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f'), "png"), disp_frame)
#           cv2.imwrite('camera_rsz{}.{}'.format(datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f'), "png"), resize_frame)
#           cv2.imwrite('camera_trm{}.{}'.format(datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f'), "png"), trim_frame)
#           cv2.imwrite('camera_raw{}.{}'.format(datetime.datetime.now().strftime('%Y%m%d_%H%M%S_%f'), "png"), frame)


# -------------------------------------------------------------------------------------
# camera
# -------------------------------------------------------------------------------------
def camera(dev):

    while True:

        capture = cv2.VideoCapture(dev)
        ret = capture_device(capture, dev)

        if (ret == ord('q')) or (ret == 27):
            #Libération des ressources
            capture.release()
            cv2.destroyAllWindows()
            break

        if ret == ord('+'):
            dev += 1

            if dev == 9:
                dev = 0


# -------------------------------------------------------------------------------------
# main
# -------------------------------------------------------------------------------------
# ●DenseNet121
# https://keras.io/ja/applications/#densenet
#
#En exécutant DenseNet121
# (1)Modèle DenseNet121,(2)Deux des fichiers de classification seront téléchargés automatiquement.
#Par conséquent, au premier démarrage, le modèle DenseNet121, qui fait environ 33 Mo, et le fichier de classification
#Le démarrage est long car il doit être téléchargé,
#Après le deuxième démarrage, le téléchargement sera omis, donc le démarrage sera plus rapide.
#
#Le fichier téléchargé est stocké dans le répertoire suivant.
# 「C:/Users/xxxx/.keras/models/」
#
# (1)Modèle DenseNet121: DenseNet121_weights_tf_dim_ordering_tf_kernels.h5
# (2)Dossier de classification(Toutes les 1000 catégories):imagenet_class_index.json

#Modèle de classification d'image
model = DenseNet121(weights='imagenet')

#Activation de la caméra
camera(dev=0)

Exécution du programme AI

Au premier démarrage

En exécutant la «fonction de bibliothèque DenseNet121», le «modèle DenseNet121» et le «fichier de classification» seront téléchargés automatiquement. Par conséquent, le démarrage prend beaucoup de temps car il est nécessaire de télécharger le modèle DenseNet121 et le fichier de classification, qui font environ 33 Mo, au premier démarrage, mais après le deuxième démarrage, le téléchargement est omis et le démarrage est plus rapide.

Emplacement de stockage des fichiers C:/Users/xxxx/.keras/models/

Lorsque la DL du modèle est terminée

internet_screenshot_computer.png Si la fenêtre s'ouvre ainsi, l'image de la webcam est sortie et les informations TOP3 reconnues par AI s'affichent à l'écran, c'est réussi. À propos, le résultat de la présentation de notre chien (caniche jouet) indique que l'IA sera un caniche jouet avec une probabilité de 76%, comme indiqué ci-dessous, donc la reconnaissance de l'IA est correcte.

** [Exemple de résultats] Taux de reconnaissance IA TOP3 **

  1. toy_poodle : 76%
  2. miniature_poodle : 20%
  3. Dandie_Dinmont : 1%
  • Le taux de reconnaissance fluctue en temps réel.

Journal d'exécution du programme AI

Le journal de téléchargement ci-dessous ne s'affiche que pour la première fois.

C:\Users\xxxx\anaconda3\envs\python37\python.exe C:/Users/xxxx/PycharmProjects/OpenCV/sample09.py
Using TensorFlow backend.
2020-08-12 10:38:59.579123: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
Downloading data from https://github.com/keras-team/keras-applications/releases/download/densenet/densenet121_weights_tf_dim_ordering_tf_kernels.h5

    8192/33188688 [..............................] - ETA: 12:39
   16384/33188688 [..............................] - ETA: 8:26 
   40960/33188688 [..............................] - ETA: 5:03
  106496/33188688 [..............................] - ETA: 2:59
  245760/33188688 [..............................] - ETA: 1:42

~ Omis ~

32743424/33188688 [============================>.] - ETA: 0s
32776192/33188688 [============================>.] - ETA: 0s
32956416/33188688 [============================>.] - ETA: 0s
33005568/33188688 [============================>.] - ETA: 0s
33193984/33188688 [==============================] - 32s 1us/step
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/imagenet_class_index.json

 8192/35363 [=====>........................] - ETA: 0s
40960/35363 [==================================] - 0s 0us/step
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (436) `anonymous-namespace'::SourceReaderCB::~SourceReaderCB terminating async callback

Process finished with exit code 0

Classe identifiable

Si vous vous référez au fichier "ʻimagenet_class_index.json", vous pouvez voir que les données d'image peuvent être classées dans les ** 1000 classes ** suivantes du n ° 0 à 999. C'est aussi une ** restriction **, mais même si vous reconnaissez quelque chose qui n'est pas décrit ici, il sera classé comme l'un de ceux-ci. Si vous voulez classer des choses qui ne sont pas ici, veuillez créer un nouveau modèle ou cocher apprentissage par transfert, réglage fin`, etc.

imagenet_class_index.json


{
	"0": ["n01440764", "tench"],
	"1": ["n01443537", "goldfish"],
	"2": ["n01484850", "great_white_shark"],
	"3": ["n01491361", "tiger_shark"],
	"4": ["n01494475", "hammerhead"],
	"5": ["n01496331", "electric_ray"],
	"6": ["n01498041", "stingray"],
	"7": ["n01514668", "cock"],
	"8": ["n01514859", "hen"],
	"9": ["n01518878", "ostrich"],

~ Omis ~

	"990": ["n12768682", "buckeye"],
	"991": ["n12985857", "coral_fungus"],
	"992": ["n12998815", "agaric"],
	"993": ["n13037406", "gyromitra"],
	"994": ["n13040303", "stinkhorn"],
	"995": ["n13044778", "earthstar"],
	"996": ["n13052670", "hen-of-the-woods"],
	"997": ["n13054560", "bolete"],
	"998": ["n13133613", "ear"],
	"999": ["n15075141", "toilet_tissue"]
}

c'est tout

Je vous remercie pour votre travail acharné!

Recommended Posts

[Facile] Reconnaissance automatique AI avec une webcam!
Essai de reconnaissance faciale facile avec Jetson Nano et caméra Web
Utiliser une webcam avec Raspberry Pi
Introduction facile de la reconnaissance vocale avec Python
Faisons une IA à trois yeux avec Pylearn 2
[Dédié à Telewa! ] J'utilise un PC avec une webcam.
Faites fonctionner votre PC avec une webcam. [Au revoir souris! ]
[Super facile] Faisons un LINE BOT avec Python.
Easy Grad-CAM avec pytorch-gradcam
Reconnaissance faciale avec Edison
Reconnaissance d'image avec keras
3. 3. Programmation IA avec Python
Format A4 avec python-pptx
Visualisez les réclamations avec l'IA
Décorer avec un décorateur
Débogage facile avec ipdb
TopView facile avec OpenCV
Générez un mot de passe facile à retenir avec apg
Une histoire de compétition avec un ami dans Othello AI Preparation
Trading automatique FX avec algorithme génétique Partie 2 Mise en œuvre d'une IA de trading en évolution