[Einfach] AI automatische Erkennung mit einer Webkamera!

Einführung

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!

Was speziell zu tun

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

Entwicklungsumgebung

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!

PIC.png

――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) FireShot Capture 003 - Applications - Keras Documentation - keras.io.png

Quelle: Keras-Dokumentation https://keras.io/ja/applications/#documentation-for-individual-models

KI-Programm

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)

AI Programmausführung

Beim ersten Start

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 der DL des Modells vorbei ist

internet_screenshot_computer.png 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 **

  1. toy_poodle : 76%
  2. miniature_poodle : 20%
  3. Dandie_Dinmont : 1%
  • Die Erkennungsrate schwankt in Echtzeit.

AI-Programmausführungsprotokoll

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

Identifizierbare Klasse

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"]
}

das ist alles

Danke für deine harte Arbeit!

Recommended Posts

[Einfach] AI automatische Erkennung mit einer Webkamera!
Einfacher Gesichtserkennungsversuch mit Jetson Nano und Webkamera
Verwenden einer Webkamera mit Raspberry Pi
Einfache Einführung der Spracherkennung mit Python
Machen wir mit Pylearn 2 eine dreiäugige KI
[Telewa gewidmet! ] Ich betreibe einen PC mit einer Webkamera.
Bedienen Sie Ihren PC mit einer Webkamera. [Auf Wiedersehen Maus! ]]
[Super einfach] Machen wir einen LINE BOT mit Python.
Easy Grad-CAM mit Pytorch-Gradcam
Gesichtserkennung mit Edison
Bilderkennung mit Keras
3. 3. KI-Programmierung mit Python
A4 Größe mit Python-Pptx
Visualisieren Sie Ansprüche mit AI
Mit Dekorateur dekorieren
Einfaches Debuggen mit ipdb
Einfache TopView mit OpenCV
Generieren Sie mit apg ein leicht zu merkendes Passwort
Eine Geschichte über den Wettbewerb mit einem Freund in Othello AI Preparation
FX automatischer Handel mit genetischem Algorithmus Teil 2 Implementierung der sich entwickelnden Handels-KI