Wäre es nicht lustig, wenn Sie mit AI mit einer Webkamera leicht "*
Dinge erkennen **" könnten?
Sie können dies ** einfach ** tun, indem Sie das veröffentlichte Modell verwenden.
Lass es uns jetzt machen!
Nehmen Sie das Bild von der Webkamera auf den PC auf, lassen Sie AI ** "Echtzeiterkennung" **, was dort reflektiert wird, und zeigen Sie bis zu TOP3 auf dem Bildschirm an. Dieses Mal werden wir ** trainiertes Modell
** verwenden, so dass es kein zeitaufwändiges KI-Lernen gibt, so dass Sie ** schnell ** spielen können.
Es verwendet eine Bibliothek namens "OpenCV", um Bilddaten von einer Webkamera zu erfassen, und eine KI-Bibliothek namens "Keras", die die Bilddaten identifiziert. Installieren Sie die erforderlichen Bibliothekspakete.
Was du brauchst | Spalte Bemerkungen |
---|---|
Hinweis PC mit Webkamera usw. | Eine über USB an einen PC angeschlossene Webkamera ist ebenfalls in Ordnung |
Entwicklungssprache | Python3.7 * Die verwendete Version ist 3.7.7 |
Erforderliche Hauptbibliotheken | 【 OpenCV 】 Bibliothek zur Verarbeitung von Bildern und Videos * Die verwendete Version ist 4.3.0 【 keras 】 Neuronale Netzwerkbibliothek in Python-Sprache * Die verwendete Version ist 2.3.1 |
DenseNet121
Ich mache es, weil es einfach ist Plötzlich
DenseNet121
genannt, Wakewakaran! Nicht mehr!
Es ist in Ordnung. bitte beruhigen. Dies ist ein ** trainiertes Modell **, was bedeutet, dass wir dieses Mal ein Trainingsmodell namens DenseNet121
verwenden werden. Sie können es tun, ohne die Details zu kennen!
――Warum haben Sie sich für das Modell DenseNet121
entschieden?
Verschiedene Bildklassifizierungsmodelle wie "VGG16" und "ResNet50" können leicht aus der "Keras-Bibliothek" verwendet werden, aber das diesmal verwendete Bildklassifizierungsmodell ist **. Die Modellgröße ist mit 33 MB relativ klein. Ich habe DenseNet121
gewählt, weil es eine gute Erkennungsrate hat **. Laut "Keras-Dokumentation" beträgt die Erkennungsgenauigkeitsrate bis zu TOP5 etwa 92%, wenn Sie "DenseNet121" Dinge erkennen lassen. (Ungefähr 75% nur für TOP1)
Quelle: Keras-Dokumentation https://keras.io/ja/applications/#documentation-for-individual-models
Kopieren Sie nach der Installation des Pakets der zu verwendenden Bibliothek (Keras, OpenCV usw.) das folgende AI-Programm.
main.py
# -------------------------------------------------------------------------------------
#Zeigen Sie die Kamera auf dem Bildschirm an.
#Bildbeurteilung mit DenseNet121
# [+]Kameragerät mit Schlüssel wechseln
# [s]Bild mit Schlüssel speichern
# [ESC] or [q]Mit Schlüssel beenden
# -------------------------------------------------------------------------------------
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:
#Nehmen Sie Bilder vom Kameragerät auf
ret, frame = capture.read()
if not ret:
k = ord('+')
return k
#DenseNet121 Bildbeurteilung
resize_frame = cv2.resize(frame, (300, 224)) # 640x480(4:3) -> 300x224(4:3)Bildgröße ändern
trim_x, trim_y = int((300-224)/2), 0 #Zur Beurteilung auf 224 x 224 gekürzt
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) #Bild AI Urteil
# 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)
#Ausgabe des Bildbeurteilungszeichens
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)
#Kamerabildschirmausgabe
cv2.imshow('camera', disp_frame)
#
k = cv2.waitKey(1) & 0xFF
# [ESC] or [q]
if (k == ord('q')) or (k == 27):
return k
# [+]
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]
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):
#
capture.release()
cv2.destroyAllWindows()
break
if ret == ord('+'):
dev += 1
if dev == 9:
dev = 0
# -------------------------------------------------------------------------------------
# main
# -------------------------------------------------------------------------------------
# ●DenseNet121
# https://keras.io/ja/applications/#densenet
#
#
# (1)(2)Zwei der Klassifizierungsdateien werden automatisch heruntergeladen.
#Daher beim ersten Start das DenseNet121-Modell (ca. 33 MB) und die Klassifizierungsdatei
#Der Start dauert lange, da er heruntergeladen werden muss.
#Nach dem zweiten Start wird der Download weggelassen, sodass der Start schneller erfolgt.
#
#Die Download-Datei wird im folgenden Verzeichnis gespeichert.
# 「C:/Users/xxxx/.keras/models/」
#
# (1)Modell DenseNet121: DenseNet121_weights_tf_dim_ordering_tf_kernels.h5
# (2)Klassifizierungsdatei(Alle 1000 Kategorien):imagenet_class_index.json
#Bildklassifizierungsmodell
model = DenseNet121(weights='imagenet')
#Kameraaktivierung
camera(dev=0)
Durch Ausführen der DenseNet121-Bibliotheksfunktion werden sowohl das DenseNet121-Modell als auch die Klassifizierungsdatei automatisch heruntergeladen. Daher dauert der Start sehr lange, da beim ersten Start das DenseNet121-Modell und die Klassifizierungsdatei heruntergeladen werden müssen, die etwa 33 MB groß sind. Nach dem zweiten Start wird der Download jedoch weggelassen und der Start ist schneller.
Speicherort der Datei
C:/Users/xxxx/.keras/models/
Wenn das Fenster so geöffnet wird, das Bild der Webkamera ausgegeben wird und die von AI erkannten TOP3-Informationen auf dem Bildschirm angezeigt werden, ist dies erfolgreich. Das Ergebnis der Darstellung unseres Hundes (Spielzeugpudel) besagt übrigens, dass AI ein Spielzeugpudel mit einer Wahrscheinlichkeit von 76% ist, wie unten gezeigt, sodass die Erkennung von AI korrekt ist.
** [Beispiel für Ergebnisse] AI-Erkennungsrate TOP3 **
- toy_poodle : 76%
- miniature_poodle : 20%
- Dandie_Dinmont : 1%
- Die Erkennungsrate schwankt in Echtzeit.
Das unten stehende Download-Protokoll wird nur zum ersten Mal angezeigt.
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
~ Ausgelassen ~
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
Wenn Sie auf die Datei " imagenet_class_index.json
"verweisen, können Sie sehen, dass die Bilddaten in ** 1000 Klassen ** von Nr. 0 bis 999 unten klassifiziert werden können. Es ist auch eine ** Einschränkung **, aber selbst wenn Sie etwas erkennen, das hier nicht beschrieben ist, wird es als eine davon eingestuft. Wenn Sie Dinge klassifizieren möchten, die nicht hier sind, erstellen Sie bitte ein "neues Modell" oder aktivieren Sie "Transferlernen", "Feinabstimmung" usw.
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"],
~ Ausgelassen ~
"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"]
}
Danke für deine harte Arbeit!
Recommended Posts