Bei der Objekterkennung handelt es sich um ein Verfahren, mit dem das Computerprogramm den Standort und die Klassifizierung des Objekts ermitteln kann. Die Objekterkennung ist in der Robotik sehr nützlich, insbesondere bei autonomen Fahrzeugen. Es gibt viele Bibliotheken und Frameworks für die Objekterkennung in Python. In diesem Tutorial werden wir die Objekterkennung sowohl auf Fotos als auch auf Videos mit der OpenCV-Bibliothek anwenden und die Objekterkennung mit Python durchführen.

Voraussetzungen

Anaconda:

Die Anaconda-Distribution ist eine Sammlung von Paketen, die aus Python, R und über 120 der beliebtesten Open-Source-Pakete für Wissenschaft und Datenverarbeitung besteht. Das bedeutet, dass diese Distribution auf einem einzigen Rechner installiert werden kann, was die Datenanalyse in großem Maßstab enorm erleichtert! Sie können Conda über den folgenden Link herunterladen und installieren.

https://www.anaconda.com/products/individual

Danach erhalten Sie Zugriff auf das Terminal, mit dem Sie alle Ihre Bibliotheken installieren können.

Jupyter notebook:

Das Jupyter-Notebook ist eine kostenlose und quelloffene Webanwendung. Es wird häufig von Datenwissenschaftlern und anderen technischen Nutzern verwendet, die ihre Arbeit mit anderen teilen möchten, aber jeder kann diese Plattform für den Wissensaustausch nutzen. Sie können das Jupyter-Notizbuch mit dem folgenden Befehl in Ihrem Conda-Terminal installieren.

pip install jupyter notebook

Für den Zugriff auf das Notebook können Sie diesen Befehl verwenden.

jupyter notebook

Opencv:

openCV ist ein Werkzeug, das sich auf die Analyse von Bildern spezialisiert hat und Entwicklern ermöglicht, viele gängige Probleme bei der Erstellung von Computer-Vision-Anwendungen zu lösen. Open-Source-Tools wie openCV ermöglichen es Entwicklern, kostenlos an solchen Projekten zu arbeiten, und können sich als sehr nützlich erweisen, wenn es darum geht, ihre Projekte schnellstmöglich zu optimieren.

Die Bibliothek kann mit dem folgenden Befehl in Ihrer Eingabeaufforderung/Terminal installiert werden:

pip3 install opencv-python

Matplotlib:

Matplotlib ist eine wichtige Bibliothek in Python. Diese Python-Bibliothek wurde auf der Grundlage von MATLAB entwickelt, einem Grafikprogramm, das von Mathematikern und Ingenieuren in erster Linie für die Bereiche Kunst und Technik entwickelt wurde.

Die Bibliothek kann mit dem folgenden Befehl in Ihrer Eingabeaufforderung/Terminal installiert werden:

pip3 install matplotlib

Bereits trainiertes Modell:

In diesem Blog-Beitrag werden wir unser Modell nicht erstellen und trainieren, da es sich um ein Tutorial handelt, das nur eine grundlegende Anleitung darstellt. Deshalb benötigen wir ein vortrainiertes Modell, das bereits auf der opencv GitHub-Seite verfügbar ist. Gehen Sie auf den folgenden Link, um das Modell herunterzuladen. Entpacken Sie dann die .tar-Datei und fügen Sie die Datei frozen_inference_graph.pb in denselben Ordner ein, in dem Sie Ihr Jupyter-Notebook laufen haben.

https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API

Wir benötigen noch eine weitere Datei, die Sie über den folgenden Link herunterladen können. Entpacken Sie dann die .zip-Datei und fügen Sie die Datei ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt in denselben Ordner ein, in dem Sie Ihr Jupyter-Notebook ausführen.

https://gist.github.com/dkurt/54a8e8b51beb3bd3f770b79e56927bd7

Coco labels:

Um die Objekte aus Fotos oder Videos zu erkennen, benötigen wir auch die Namen/Beschriftungen des Objekts und derzeit unterstützt dies insgesamt 80 Objekte. Sie können den folgenden Link kopieren und in eine leere .txt-Datei einfügen und diese Datei dort speichern, wo Sie Ihr Jupyter-Notebook laufen lassen. 

https://github.com/pjreddie/darknet/blob/master/data/coco.names

Gehen Sie zu diesem Link, kopieren Sie alle 80 Namen in die Textdatei und speichern Sie die Datei dort, wo Sie Ihr Jupyter-Notebook laufen haben.

Erkennung von Objekten im Bild:

# import the dependencies
import cv2
import matplotlib.pyplot as plt

# load the files
config_file = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
frozen_model = 'frozen_inference_graph.pb'

#  load the model
model = cv2.dnn_DetectionModel(frozen_model, config_file)

# empty list of python
classLabels = []
# loading the labels
file_name = 'Labels.txt'
with open(file_name, 'rt') as fpt:
    classLabels = fpt.read().rstrip('\n').split('\n')
    #classlables.append(fpt.read())

# checking if the labels are loaded correctly or not
print(classLabels)
print(len(classLabels))

Nun überprüfen wir, ob alle Einstellungen für unsere Etiketten korrekt sind, indem wir den Code ausführen.

Ausgabe:

# we have to defend the input size 320/320 because our model only supports this format
model.setInputSize(320,320)
model.setInputScale(1.0/127.5)
model.setInputMean((127.5,127.5,127.5))
model.setInputSwapRB(True)

# load the image
img = cv2.imread('men.jpg')

# show the image
# its in bgr format
plt.imshow(img)

# converting the image into RGB format
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# setting the threshold or accuracy you want we are just fixed for 50% confidence
ClassIndex, confidence, bbox = model.detect(img,confThreshold=0.6)

print(ClassIndex)

Hier haben wir den Punkt erreicht, an dem wir das Objekt im Bild erkennen können. Aber wenn Sie den Code ausführen, erhalten Sie eine Ausgabe wie diese 

Er gibt uns nur eine Nummer, die die Position des Objekts in der Beschriftungsdatei angibt. Sie können in der Beschriftungsdatei nachsehen, dass die Nummer 3 ein Auto ist, was bedeutet, dass der Code perfekt und auch genau funktioniert. Zur Veranschaulichung fügen wir einen Rahmen um das Bild und seine Beschriftung ein.

font_scale = 2
font = cv2.FONT_HERSHEY_PLAIN
for ClassInd, conf, boxes in zip(ClassIndex. flatten(), confidence.flatten(), bbox):
    # adding the box around the image and defining the color and width of the box
    cv2.rectangle(img, boxes, (255, 0, 0), 1)
    # adding the label in the box and defining the color,style and width of the font
    cv2.putText(img, classLabels[ClassInd-1], (boxes[0]+10, boxes [1]+40), font, fontScale=font_scale, color=(255, 255, 0), thickness=2 )

plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

Hinweis: Wenn sich mehrere Objekte auf dem Foto befinden, werden auch diese erkannt und mit einem Begrenzungsrahmen versehen.

Ausgabe:

Erkennung von Objekten im Video:

# import the dependencies
import cv2
import matplotlib.pyplot as plt

# load the files
config_file = 'ssd_mobilenet_v3_large_coco_2020_01_14.pbtxt'
frozen_model = 'frozen_inference_graph.pb'

#  load the model
model = cv2.dnn_DetectionModel(frozen_model, config_file)

# empty list of python
classLabels = []
# loading the labels
file_name = 'Labels.txt'
with open(file_name, 'rt') as fpt:
    classLabels = fpt.read().rstrip('\n').split('\n')
    #classlables.append(fpt.read())
# we have to define the input size 320/320 because our model only supports this format
model.setInputSize(320,320)
model.setInputScale(1.0/127.5)
model.setInputMean((127.5,127.5,127.5))
model.setInputSwapRB(True)
cap = cv2.VideoCapture("sample.mp4") # you can leave this blank if you want to use your webcam for object detection.
# Check if the video is playing correctly or not
if not cap. isOpened():
    cap = cv2. VideoCapture (0)
if not cap. isOpened():
    raise IOError("Cannot open video")

font_scale = 3
font = cv2. FONT_HERSHEY_PLAIN

while True:
    ret, frame = cap.read()
    ClassIndex, confidence, bbox = model.detect(frame, confThreshold=0.55)

    print(ClassIndex)
    if (len(ClassIndex)!=0):
        for ClassInd, conf, boxes in zip(ClassIndex. flatten(), confidence.flatten(), bbox):
            if (ClassInd<=80):
                cv2.rectangle(frame,boxes, (255, 0, 0), 2)
                cv2. putText(frame, classLabels[ClassInd-1], (boxes[0]+10, boxes [1]+40), font, fontScale=font_scale, color=(0, 255, 0), thickness=3 )
    cv2.imshow('object Detection Tutorial', frame)
    if cv2.waitKey(2) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Ausgabe:

Letzte Worte

In diesem Blog haben wir das Konzept der Objekterkennung und dessen Implementierung in Python vorgestellt. Unser Ziel war es, Entwicklern, die noch keine Erfahrung mit Beispielcode haben, zu zeigen, wie man bestimmte Objekte in Fotos oder Videos erkennt, und die gleiche Funktionalität in Echtzeit über eine Webcam zu betrachten. Wir hoffen, dass Ihnen dieser Beitrag gefallen hat und lassen Sie uns wissen, wenn Sie Fragen dazu haben!