Home>>Nedir?>>Python OpenCV ve YOLOv3 ile Nesne Algılama
Nedir?OpenCVPython

Python OpenCV ve YOLOv3 ile Nesne Algılama

Bu makalede teknik detaylara girmeden sadece yüzeysel olarak YOLO nedir ve nasıl kullanılır bunlardan bahsedeceğim.

YOLO Nedir?

YOLO (You Only Look Once), gerçek zamanlı olarak nesne algılama algoritmasıdır. Bu algoritma Evrişimli Sinir Ağı (CNN) yöntemini kullanır. Bu yöntem ile görüntüyü bölgelere ayırır ve her bölge için olasılıkları tahmin eder, bu sayede doğruluk oranı oldukça yüksektir.

YOLO object detection with OpenCV - PyImageSearch

YOLO algoritması, adının hakkını vererek sinir ağından-görüntüye sadece bir kez bakar. Bu işlem, gerçek zamanlı çalışabilmesinin yanı sıra yüksek doğruluk oranı sağladığı için YOLO algoritmasını popüler kılıyor.

YOLO Modelleri

https://pjreddie.com/darknet/yolo/

Birkaç farklı seçenek görüyorsunuz. Bu modeller, farklı boyutlardaki görüntüler için eğitilmiştir.
320 x 320 (yüksek hız, daha az doğruluk),
416 x 416 (orta hız, orta doğruluk),
608 x 608 (daha düşük hız, yüksek doğruluk)
İstediğiniz modeli kullanabilirsiniz. Ancak ben YOLOv3–608 modelini kullanacağım.

İndirmemiz gereken 3 dosya var. Model, konfigürasyon ve nesnelerin isim dosyası.
Modeli indirmek için tıklayın yolov3.weights
Konfigürasyon dosyası için tıklayın yolov3.cfg
Nesne isim dosyası için tıklayın coco.names

YOLO Modelini OpenCV ile Algılamak

Gelelim kod kısmına. İndirdiğimiz modelin (yolov3 ağırlık dosyası) ve konfigürasyon (cfg) dosya yolunu net değişkenine yazıyoruz.
Coco.names dosyası, eğitilen nesnelerin adlarını içerir. Bunları classes(sınıflar) adı verilen bir listede saklıyoruz.

Diğerlerini kod arasında yorum satırı olarak açıkladım.

from cv2 import cv2
import numpy as np
import glob
import random

# Model ve cfg dosya yollarını yazın
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")

# Nesne isimlerini 'coco.names' dosyasından çekme
classes = []
with open("coco.names", "r") as f:
    classes = [line.strip().capitalize().strip() for line in f.readlines()]

# Resim yolu
images_path = glob.glob(r"resimler\*.jpg")

layer_names = net.getLayerNames()
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
colors = np.random.uniform(255, 0, size=(len(classes), 3))

random.shuffle(images_path)

for img_path in images_path:
    img = cv2.imread(img_path)
    # Görsel boyutu büyük ise yorum satırını kaldırıp yeniden boyutlandırabilirsiniz
    # img = cv2.resize(img, None, fx=0.4, fy=0.4)
    height, width, channels = img.shape

    # Detecting objects
    blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)

    net.setInput(blob)
    outs = net.forward(output_layers)

    class_ids = []
    confidences = []
    boxes = []
    for out in outs:
        for detection in out:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            
            # Doğruluk oranı kaçtan itibaren algılamasını istiyosanız kendiniz belirleyebilirsiniz
            if confidence > 0.3:
                center_x = int(detection[0] * width)
                center_y = int(detection[1] * height)
                w = int(detection[2] * width)
                h = int(detection[3] * height)

                # Rectangle coordinates
                x = int(center_x - w / 2)
                y = int(center_y - h / 2)

                boxes.append([x, y, w, h])
                confidences.append(float(confidence))
                class_ids.append(class_id)

    indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

    for i in range(len(boxes)):
        if i in indexes:
            x, y, w, h = boxes[i]
            # print(f"{round(confidences[i],2)}")

            dogruluk = (f"%{round(confidences[i],2)}")
            label = (f"{classes[class_ids[i]]} {dogruluk}")

            color = [int(c) for c in colors[class_ids[i]]]
            cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)

            # Text arka planı için text boyutunu alıyoruz
            (w, h), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)
            # Text arka planını çiziyoruz
            textBg = cv2.rectangle(img, (x, y - 15), (x + w, y), color, -1)
            # Etiketi yazdırıyoruz
            cv2.putText(textBg, label, (x, y-3), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,255,255), 1)

    cv2.imshow("Image", img)
    # Çıktıyı kayıt et
    # cv2.imwrite("resim.png", img)
    key = cv2.waitKey(0)

cv2.destroyAllWindows()

Model eğitecek sisteminiz yoksa, colab kullanamıyorsanız, bu tip hazır modeller üzerinden projeler geliştirebilirsiniz.

Gerçek zamanlı nesne algılama kodları için Github’a Göz Atın.

Diğer projelere ulaşmak için tıklayın.

Adblock Detected

Lütfen reklam engelleyicinizi devre dışı bırakarak bizi destekleyin.

Refresh Page