Sabtu, 13 April 2024

Tom & Jerry Object Detection Using YOLOv8

 

1. Pengumpulan Data

Untuk memulai proyek ini, langkah pertama adalah mengumpulkan data yang diperlukan untuk pelatihan dan pengujian model deteksi objek. Penulis memilih untuk menggunakan cuplikan dari beberapa episode Tom & Jerry sebagai sumber data.

Penulis memilih cuplikan yang menampilkan berbagai adegan yang khas dari seri Tom & Jerry. Ini termasuk adegan di dalam rumah, di luar rumah, di taman, dan di tempat-tempat lain yang sering muncul dalam animasi. Tujuannya adalah untuk memastikan bahwa model deteksi objek  terlatih dengan baik untuk mengenali karakter Tom dan Jerry di berbagai konteks. 

 2.  Anotasi Data Secara Manual

Dalam konteks anotasi data secara manual, tujuan penggunaan bounding box adalah untuk memberikan informasi yang akurat tentang lokasi, ukuran, dan bentuk objek dalam gambar kepada model deteksi objek. Ini tidak hanya memfasilitasi pelatihan model dengan data yang terstruktur, tetapi juga memungkinkan evaluasi kinerja model, bantuan dalam validasi model, serta mempermudah interpretasi hasil deteksi objek. Penulis memilih perangkat lunak anotasi khusus seperti CVAT.ai untuk memudahkan proses anotasi, karena alat ini memungkinkan dengan mudah menandai lokasi karakter Tom dan Jerry pada setiap gambar dengan tingkat presisi yang tinggi, memastikan data yang dihasilkan adalah yang terbaik.




 3. Pelatihan Model Dengan Yolov8 dengan Kostum Dataset

from ultralytics import YOLO

path: '../Data'
train: images/train
val: images/val

names:
    0: Tom
    1: Jerry
 
Setelah berhasil melakukan proses anotasi data, langkah selanjutnya adalah melatih model menggunakan arsitektur YOLOv8 dengan menggunakan dataset kustom yang telah disiapkan. Dataset yang telah dianotasi dibuat dalam format yang sesuai dengan YOLO, memastikan kompatibilitas yang tepat dengan arsitektur model yang akan digunakan.

Penulis memilih YOLOv8 karena keunggulannya dalam deteksi objek real-time dan kemampuan untuk mengenali objek dalam berbagai konteks secara akurat. Dengan melatih model menggunakan dataset kustom, dapat meningkatkan kinerja deteksi objek, sehingga memungkinkan model untuk mengenali karakter Tom dan Jerry dengan presisi yang lebih tinggi dalam cuplikan animasi.

from ultralytics import YOLO

# Load a model
model = YOLO("yolov8n.yaml")

# Use the model
results = model.train(data="tom_and_jerry.yaml", epochs=10)  # train the model
 

 4. Evaluasi Model




Setelah proses pelatihan selesai, tahap selanjutnya dalam pengembangan proyek adalah evaluasi model yang telah dilatih. Evaluasi ini dilakukan untuk menilai kinerja model dalam deteksi objek, khususnya dalam konteks karakter Tom & Jerry. Hasil evaluasi menunjukkan bahwa performa model cukup baik dalam mengenali dan menandai lokasi karakter dalam gambar-gambar uji yang belum pernah dilihat sebelumnya

 5. Percobaan Model


Setelah melalui proses pelatihan dan evaluasi, model deteksi objek yang telah dikembangkan diuji dengan menggunakan video baru yang belum pernah dilihat sebelumnya. Percobaan ini bertujuan untuk menguji kemampuan model dalam mengenali dan melacak karakter Tom & Jerry dalam konteks yang berbeda dari data latih


import os
import cv2
from ultralytics import YOLO

# Direktori video
FOLDER_VIDEO = os.path.join('.', 'video')
# Path video input
video_input_path = os.path.join(FOLDER_VIDEO, '2.mp4')
# Path video output
video_output_path = '{}_out.mp4'.format(video_input_path)

# Inisialisasi capture video
cap = cv2.VideoCapture(video_input_path)
ret, frame = cap.read()
H, W, _ = frame.shape
# Inisialisasi penulisan video output
out = cv2.VideoWriter(video_output_path, cv2.VideoWriter_fourcc(*'MP4V'), int(cap.get(cv2.CAP_PROP_FPS)), (W, H))

# Path model
MODEL_PATH = os.path.join('.', 'runs', 'detect', 'train', 'weights', 'last.pt')

# Load model
model = YOLO(MODEL_PATH)

threshold = 0.5

while ret:
    # Prediksi dengan model
    results = model(frame)[0]

    # Loop hasil prediksi
    for result in results.boxes.data.tolist():
        x1, y1, x2, y2, score, class_id = result

        # Jika skor lebih dari threshold, gambar kotak dan tulisan
        if score > threshold:
            cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 4)
            cv2.putText(frame, results.names[int(class_id)].upper(), (int(x1), int(y1 - 10)),
                        cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3, cv2.LINE_AA)

    # Tulis frame ke video output
    out.write(frame)
    ret, frame = cap.read()

# Tutup capture dan penulisan video
cap.release()
out.release()
cv2.destroyAllWindows()
 

Hasil:

Posting Komentar