Python ile Gemi Tespiti

Python ile Gemi Tespiti

Ara 19, 2024 - 00:10
 0  21
Python ile Gemi Tespiti
Python Gemi Tespiti
import cv2
import torch
from torchvision import models, transforms
from PIL import Image
from torchvision.models.detection import ssdlite320_mobilenet_v3_large
from torchvision.models.detection import SSDLite320_MobileNet_V3_Large_Weights

# GPU veya CPU seçimi
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Modeli yükleyin ve en güncel ağırlıkları kullanın
model = ssdlite320_mobilenet_v3_large(weights=SSDLite320_MobileNet_V3_Large_Weights.COCO_V1)  # COCO_V1 ağırlıkları
model.eval().to(device)

# COCO sınıfları
COCO_CLASSES = [
    'N/A', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat',
    'traffic light', 'fire hydrant', 'N/A', 'stop sign', 'parking meter', 'bench', 'bird', 'cat',
    'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack',
    'umbrella', 'N/A', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
    'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle',
    'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich',
    'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant',
    'bed', 'N/A', 'dining table', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard',
    'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors',
    'teddy bear', 'hair drier', 'toothbrush'
]

# Video kaynağını aç (yerel dosya ya da webcam)
video_source = ('gemi.mp4')  # Videonun yolu veya "0" webcam için
cap = cv2.VideoCapture(video_source)

# Görüntü dönüşüm fonksiyonu (PIL'e dönüştürmek için)
transform = transforms.Compose([transforms.ToTensor()])

# Video işleme döngüsü
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # Görüntüyü küçültme (performans için)
    original_height, original_width = frame.shape[:2]
    frame_resized = cv2.resize(frame, (frame.shape[1] // 2, frame.shape[0] // 2))

    # OpenCV'den PIL formatına dönüştür
    pil_image = Image.fromarray(cv2.cvtColor(frame_resized, cv2.COLOR_BGR2RGB))
    image_tensor = transform(pil_image).unsqueeze(0).to(device)

    # Modeli kullanarak nesne tespiti yap
    with torch.no_grad():
        prediction = model(image_tensor)

    # Tespit edilen nesneleri işleme
    labels = prediction[0]['labels']
    boxes = prediction[0]['boxes']
    scores = prediction[0]['scores']

    # "boat" sınıfının indexi (COCO_CLASSES listesinde)
    boat_class_index = COCO_CLASSES.index('boat')

    for i in range(len(labels)):
        if scores[i] > 0.4:  # Skoru daha düşük bir eşiğe çekiyoruz
            label = labels[i].cpu().numpy()
            box = boxes[i].cpu().numpy()

            # Yalnızca "boat" olan nesneleri kontrol et
            if label == boat_class_index:
                # Koordinatları orijinal görüntü boyutlarına göre ölçekle
                box = [
                    int(box[0] * (original_width / frame_resized.shape[1])),
                    int(box[1] * (original_height / frame_resized.shape[0])),
                    int(box[2] * (original_width / frame_resized.shape[1])),
                    int(box[3] * (original_height / frame_resized.shape[0]))
                ]

                label_name = COCO_CLASSES[label]

                # Bbox çiz
                cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)

                # Etiketi ekle (nesnenin adı)
                cv2.putText(frame, label_name, (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9,
                            (0, 255, 0), 2)

    # Görüntüyü göster
    cv2.imshow('Video Stream', frame)

    # 'q' tuşuna basılırsa çık
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

1. Gerekli Kütüphanelerin Yüklenmesi

Kodun başında, gerekli Python kütüphaneleri içe aktarılır:

  • cv2 (OpenCV): Görüntü işleme ve video akışını okuma işlemleri için kullanılır.
  • torch ve torchvision: Derin öğrenme modellerini kullanmak ve görüntüleri işlemek için kullanılır.
  • PIL (Python Imaging Library): Görüntü formatlarını dönüştürmek için kullanılır.

2. Cihaz Seçimi

Kod, GPU (grafik işlem birimi) varsa, işlemlerin GPU üzerinde yapılmasını sağlar. Eğer GPU yoksa, işlem CPU üzerinde yapılır. Bu seçim, işlem hızını optimize etmek için önemlidir çünkü GPU, büyük verisetleriyle çalışırken çok daha hızlıdır.

3. Modelin Yüklenmesi

Burada, SSDLite320_MobileNet_V3_Large modelinin COCO_V1 ağırlıkları yüklenir. Bu model, COCO veri kümesi üzerinde eğitilmiş bir nesne tespiti modelidir ve birçok farklı nesneyi (örneğin, insan, araba, hayvanlar vb.) tanıyabilir. Bu model, mobil cihazlar için optimize edilmiştir ve görsel nesneleri doğru bir şekilde tespit edebilme yeteneğine sahiptir.

4. COCO Sınıflarının Tanımlanması

Modelin tanıyabileceği nesne sınıfları COCO_CLASSES listesinde tanımlanır. Bu liste, modelin eğitildiği COCO veri kümesindeki her bir sınıfı belirtir. Sınıflar, örneğin "person" (kişi), "car" (araba), "dog" (köpek), "boat" (gemi) gibi etiketler içerir. Bu etiketler, modelin tespit ettiği nesnelerin adlarını belirler.

5. Video Kaynağının Seçilmesi

Kod, bir video kaynağını açar. Burada, gemi.mp4 adlı bir video dosyasından görüntüler alınır. Eğer canlı video kaynağı kullanmak istenirse, "0" yerine webcam kullanılabilir. OpenCV'nin cv2.VideoCapture() fonksiyonu, video dosyasını veya webcam'ı açar ve video karelerini işlemeye başlar.

6. Görüntü Dönüşüm Fonksiyonu

Modelin doğru çalışabilmesi için her bir video karesi PIL formatına dönüştürülür ve ardından tensöre (modelin anlayacağı formata) dönüştürülür. Bu dönüşüm, transforms.ToTensor() fonksiyonu kullanılarak yapılır. Modelin verileri doğru bir şekilde alabilmesi için bu dönüşüm gereklidir.

7. Video Akışının İşlenmesi

Kod, video kaynağındaki her bir kareyi işler. Her kare, modelin tespit yapabilmesi için küçültülür (bu işlem performans için önemlidir) ve ardından nesne tespiti yapılır.

Nesne tespiti işlemi, modelin model(image_tensor) fonksiyonu ile gerçekleştirilir. Model, görüntüdeki tüm tespit edilen nesnelerin etiketlerini, sınıflarını, kutu koordinatlarını ve güven skorlarını döndürür.

8. Nesne Filtreleme ve "Boat" Tespiti

Kodda, modelin döndürdüğü tespitler arasında yalnızca "boat" (gemi) nesneleri seçilir. Bunun için:

  • boat_class_index değişkeni, COCO sınıflarında "boat" sınıfının indeksini bulur.
  • Modelin döndürdüğü her tespitte, etiket (label) "boat" sınıfına eşitse, bu nesne ekrana çizilir.

Skor Eşiği: Skor, modelin nesnenin doğru bir şekilde tespit edilip edilmediğini ne kadar güvenle belirlediğini gösterir. Kodda, skor eşiği 0.4 olarak belirlenmiştir, yani skor 0.4'ten büyük olan nesneler işleme alınır.

9. Tespit Edilen Nesnelerin Görüntü Üzerine Çizilmesi

Tespit edilen "boat" nesneleri, video karesine yeşil renkteki bir dikdörtgen (bounding box) ile işaretlenir. Ayrıca, nesnenin ismi (örneğin "boat") görüntü üzerine yazılır. Bu işlem için OpenCV'nin cv2.rectangle() ve cv2.putText() fonksiyonları kullanılır.

10. Görüntünün Gösterilmesi ve Kullanıcı Etkileşimi

İşlenen her video karesi, üzerinde "boat" nesneleri etiketlenmiş bir şekilde ekranda gösterilir. Eğer kullanıcı 'q' tuşuna basarsa, video işleme döngüsü sonlanır ve program kapanır.

11. Kaynakların Serbest Bırakılması

Video kaynağı kapatılır ve ekran pencereleri temizlenir. Bu, kaynakların düzgün bir şekilde serbest bırakılmasını sağlar.

Özetle:

Bu Python kodu, bir video dosyasındaki (örneğin, gemi temalı bir video) gemi nesnelerini tespit etmek için kullanılır. Modelin sunduğu nesne tespiti çıktılarından yalnızca "boat" (gemi) sınıfına ait nesneler işleme alınır, bu nesneler ekranda kutu ile işaretlenir ve etiketlenir. Bu tür bir uygulama, deniz taşımacılığı izleme sistemleri, otonom gemi navigasyonu veya video analitiği gibi alanlarda faydalı olabilir.

Bu Yazıya Tepkin Nedir?

like

dislike

love

funny

angry

sad

wow