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!
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 **.
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!
――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)
Source: Documentation Keras https://keras.io/ja/applications/#documentation-for-individual-models
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)
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/
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 **
- toy_poodle : 76%
- miniature_poodle : 20%
- Dandie_Dinmont : 1%
- Le taux de reconnaissance fluctue en temps réel.
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
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"]
}
Je vous remercie pour votre travail acharné!
Recommended Posts