Finden von Objekten in einem Foto mit Python / Sudo Null IT News

In diesem Artikel möchte ich über das Finden von Objekten in einem Bild mit Python und OpenCV sprechen. Als Bild kann sowohl Captcha als auch jedes andere Bild verwendet werden.

Den vollständigen Code und alle Quellen finden Sie auf meiner GitHub.

Um eine einfache Anwendung zum Erkennen von Objekten in einem Bild zu schreiben, installieren Sie die erforderlichen Bibliotheken:

pip installiere opencv-python pip installiere numpy

Außerdem habe ich für eine schöne Textausgabe auf der Konsole die folgende Bibliothek hinzugefügt:

Pip-Installationskunst

Jetzt können wir mit dem Schreiben der Anwendung selbst fortfahren, die mit YOLO Objekte im Bild findet und markiert.

herunterladen von meiner GitHub Quellcode und platzieren Sie ihn im Ressourcenverzeichnis des Projekts. Mal sehen, welche Objekte unser zukünftiges Programm definieren kann:

‘Person’, ‘Fahrrad’, ‘Auto’, ‘Motorrad’, ‘Flugzeug’, ‘Bus’, ‘Zug’, ‘LKW’, ‘Boot’, ‘Ampel’, ‘Feuerhydrant’, ‘Stoppschild’ , ‘Parkuhr’, ‘Bank’, ‘Vogel’, ‘Katze’, ‘Hund’, ‘Pferd’, ‘Schaf’, ‘Kuh’, ‘Elefant’, ‘Bär’, ‘Zebra’, ‘Giraffe’, ‘Rucksack’, ‘Regenschirm’, ‘Handtasche’, ‘Krawatte’, ‘Koffer’, ‘Frisbee’, ‘Skier’, ‘Snowboard’, ‘Sportball’, ‘Drachen’, ‘Baseballschläger’, ‘Baseballhandschuh’ , ‘Skateboard’, ‘Surfbrett’, ‘Tennisschläger’, ‘Flasche’, ‘Weinglas’, ‘Tasse’, ‘Gabel’, ‘Messer’, ‘Löffel’, ‘Schüssel’, ‘Banane’, ‘Apfel’ , ‘Sandwich’, ‘Orange’, ‘Brokkoli’, ‘Karotte’, ‘Hot Dog’, ‘Pizza’, ‘Donut’, ‘Kuchen’, ‘Stuhl’, ‘Sofa’, ‘Topfpflanze’, ‘Bett’, ‘Esstisch’, ‘Toilette’, ‘TV-Monitor’, ‘Laptop’, ‘Maus’, ‘Fernbedienung’, ‘Tastatur’, ‘Handy’, ‘Mikrowelle’, ‘Ofen’, ‘Toaster’, ‘Spüle’, ‘ Kühlschrank’, ‘Buch’, ‘Uhr’, ‘Vase’, ‘Schere’, ‘Teddybär’, ‘Fön’, ‘Zahnbürste’

Zunächst importieren wir die notwendigen Bibliotheken:

import cv2 import numpy as np from art import tprint

Lassen Sie uns Funktionen schreiben, um YOLO zu verwenden. Mit seiner Hilfe werden die wahrscheinlichsten Klassen von Objekten im Bild sowie die Koordinaten ihrer Grenzen bestimmt, die später zum Rendern verwendet werden.

def apply_yolo_object_detection(image_to_process): “”” Erkennung und Bestimmung der Koordinaten von Objekten auf dem Bild :param image_to_process: Originalbild :return: Bild mit markierten Objekten und Beschriftungen dazu “”” height, width, _ = image_to_process.shape blob = cv2.dnn.blobFromImage(image_to_process, 1/255, (608, 608), (0, 0, 0), swapRB=True, crop=False) net.setInput(blob) outs = net.forward(out_layers) class_indexes , class_scores, boxen = ([] for i in range(3)) objects_count = 0 # Starten einer Suche nach Objekten in einem Bild for out in outs: for obj in out: scores = obj[5:]
class_index = np.argmax(scores) class_score = scores[class_index]
wenn class_score > 0: center_x = int(obj[0] * Breite) center_y = int(obj[1] * Höhe) obj_width = int(obj[2] * Breite) obj_height = int(obj[3] *Höhe)Box= [center_x – obj_width // 2, center_y – obj_height // 2,
obj_width, obj_height]
boxes.append(box) class_indexes.append(class_index) class_scores.append(float(class_score)) # Selection selected_boxes = cv2.dnn.NMSBoxes(boxes, class_scores, 0.0, 0.4) for box_index in selected_boxes: box_index = box_index box = boxes[box_index]
class_index = class_indizes[box_index]

# Zum Debuggen zeichnen wir Objekte, die in den gewünschten Klassen enthalten sind, wenn Klassen[class_index] in class_to_look_for: objects_count += 1 image_to_process = draw_object_bounding_box(image_to_process, class_index, box) final_image = draw_object_count(image_to_process, objects_count) return final_image

Lassen Sie uns eine Funktion hinzufügen, die die im Bild gefundenen Objekte umkreist, indem sie die Randkoordinaten verwendet, die von der Funktion apply_yolo_object_detection erhalten wurden:

def draw_object_bounding_box(image_to_process, index, box): “”” Zeichnen von Objektgrenzen mit Beschriftungen :param image_to_process: Originalbild :param index: Index der mit YOLO definierten Objektklasse :param box: Koordinaten des Bereichs um das Objekt herum :return: Bild mit markierten Objekten “”” x, y, w, h = box start = (x, y) end = (x + w, y + h) color = (0, 255, 0) width = 2 final_image = cv2.rectangle (image_to_process, start, end, color, width) start = (x, y – 10) font_size = 1 font = cv2.FONT_HERSHEY_SIMPLEX width = 2 Text = Klassen[index]
final_image = cv2.putText(final_image, text, start, font, font_size, color, width, cv2.LINE_AA) return final_image

Zusätzlich zum Zeichnen von Objekten können Sie eine Anzeige ihrer Anzahl hinzufügen. Schreiben wir dafür eine weitere Funktion:

def draw_object_count(image_to_process, objects_count): “”” Signatur der Anzahl gefundener Objekte im Bild :param image_to_process: Originalbild :param objects_count: Anzahl der Objekte der gewünschten Klasse :return: Bild mit beschrifteter Anzahl gefundener Objekte ” “” start = (10, 120) font_size = 1.5 font = cv2.FONT_HERSHEY_SIMPLEX width = 3 text = “Objects found: ” + str(objects_count) # Textausgabe mit einem Strich # (damit er bei verschiedenen Lichtverhältnissen zu sehen ist des Bildes) white_color = (255, 255, 255) black_outline_color = (0, 0, 0) final_image = cv2.putText(image_to_process, text, start, font, font_size, black_outline_color, width * 3, cv2.LINE_AA) final_image = cv2.putText(final_image, text, start, font, font_size, white_color, width, cv2.LINE_AA) gibt final_image zurück

Um das Ergebnis zu erhalten, zeigen wir das Eingabebild nur mit den gerenderten Objekten und ihrer Anzahl an:

def start_image_object_detection(img_path): “”” Bildanalyse “”” try: # Anwenden von Objekterkennungstechniken in einem Bild durch YOLO image = cv2.imread(img_path) image = apply_yolo_object_detection(image) # Anzeigen des verarbeiteten Bildes auf dem Bildschirm cv2. imshow(“Image”, image) if cv2.waitKey(0): cv2.destroyAllWindows() außer KeyboardInterrupt: pass

Das Programm ist fast fertig, es bleibt nur noch die Hauptfunktion zu schreiben, wo wir Argumente an Funktionen übergeben werden.

Dieser Block ist optional, aber ich wollte eine schöne Textausgabe an die Konsole machen:

# Logo tprint(“Objekterkennung”) tprint(“by”) tprint(“paveldat”)

Lassen Sie uns die Hauptfunktion erstellen, in der wir unser Netzwerk einrichten:

if __name__ == ‘__main__’: # Laden von YOLO-Waagen aus Dateien und Einrichten des Netzwerks net = cv2.dnn.readNetFromDarknet(“Resources/yolov4-tiny.cfg”, “Resources/yolov4-tiny.weights”) layer_names = net .getLayerNames() out_layers_indexes = net.getUnconnectedOutLayers() out_layers = [layer_names[index – 1] für Index in out_layers_indexes]# Laden aus einer Datei von Objektklassen, die YOLO mit open(“Resources/coco.names.txt”) erkennen kann, als Datei:classes = file.read().split(“\n”) # Bestimmen Klassen, die für die Suche in einem Bild priorisiert werden # Die Namen befinden sich in der Datei coco.names.txt image = input(“Pfad zum Bild(recapcha): “) look_for = input(“Was wir suchen: “). split(‘,’) # Leerzeichen löschen list_look_for = []
for look in look_for: list_look_for.append(look.strip()) class_to_look_for = list_look_for start_image_object_detection(image)

Das Programm fragt nach dem Pfad zum Bild und den Objekten, die wir finden möchten. Objekte müssen durch Kommas getrennt aufgelistet werden, wenn es mehr als eines gibt.

Wir führen das Programm aus und testen es. Links ist das Originalbild und rechts das bearbeitete Bild.

Pfad zum Bild (recapcha): Ergebnis\input\bus1.png Was wir suchen: BusPfad zum Bild (recapcha): Ergebnis\input\truck.jpgPfad zum Bild(recapcha): Ergebnis\input\city.png Was wir suchen: Auto, Person, Ampel

Wir haben überprüft, wie der YOLO-Algorithmus im Test abgeschnitten hat. Es gibt immer noch einen Fehler, aber im Grunde findet das Programm erfolgreich die erforderlichen Objekte.

Similar Posts

Leave a Reply

Your email address will not be published.