YOLO-v6 modelini özelleştirilmiş veri seti üzerinde nasıl eğitiriz?

Ahmet
5 min readOct 10, 2023

--

Nesne tanıma, bilgisayarla görü işlemenin heyecan verici bir dalıdır ve günlük yaşantımızda birçok uygulama potansiyeli taşır. Bu yazıda, TEKNOFEST 2023 Ulaşımda Yapay Zeka kategorisinde finalist olduğumuz NST ekibimizin de kullandığı, YOLO ailesinden güçlü bir nesne tanıma modeli olan YOLO-v6'yı, özelleştirilmiş bir veri seti üzerinde eğitelim.

YOLO Ailesinden Modellerin TensorRT Ortamında Karşılaştırılması [Meituan/YOLOv6]

İlk işimiz: YOLO-v6 Modelini Yükleyelim

İlk olarak Meituan tarafından geliştirilen YOLO-v6 modelini ve gereksinimlerini yükleyelim.

git clone https://github.com/meituan/YOLOv6
cd YOLOv6
pip install -r requirements.txt

Yükleme tamamlandıktan sonra önceden hazırlanmış modellerden projeye uygun olanı seçip indiriyoruz, ardından dizine taşıyoruz.

YOLOv6 Modelleri

Veri Seti Hazırlığı

Veri seti, görüntü tanımlama modellerinin en önemli kısımlarından biridir. Verilerimizi işaretlemek için LabelImg uygulamasını kullanabiliriz.

LabelImg Uygulaması

LabelImg uygulamasını açtığımızda ilk yapmamız gereken işlem, sol tarafta bulunan menüden, işaretleme tipini PascalVoc türünden YOLO türüne çevirmemiz. Bu şekilde modelimizin girdilerine uygun bir veri oluşturabiliriz.

Ardından, LabelImg uygulaması ile resimlerimizin bulunduğu klasörü ve kayıt klasörünü seçtikten sonra tüm cisimlerimizi CreateRectbox butonuna basıp dikdörtgen içerisine alarak işaretliyoruz ve isimlendiriyoruz.

İsimlendirme yaparken dikkat etmemiz gereken en önemli durum sınıflara farklı isimler vermemek. Eğer bir işaretlemeyi araba olarak yaptıysak tüm arabaları, araba olarak işaretlemeli, yazım hatalarına da dikkat etmeliyiz.

YOLO modeli kayıt klasöründe aşağıdakine benzer TXT dosyaları oluşturmuş olmalı.

# class_id center_x center_y bbox_width bbox_height
0 0.3875 0.15000000000000002 0.1 0.059375000000000004
1 0.6195312500000001 0.04296875 0.2015625 0.0890625

Tüm verileri işaretledikten sonra resimlerimizin ve kayıt klasöründe LabelImg tarafından oluşturulan TXT dosyalarımızı eğitim, doğrulama ve test için ayırmalıyız. Ben veri setinin %70'ini eğitim, %15 doğrulama ve %15 test için kullanmayı tercih ediyorum. Bu oranları değiştirip model değerlerini kontrol ederek daha iyi bir sonuç elde edebilirsiniz.

Verileri YOLOv6 Modeline Uygun Bir Şekilde Klasörleyelim

Aşağıdaki dizin yapısı YOLOv6 modelinin eğitiminde sıklıkla kullanılan ve model ile uyumlu bir dizin yapısıdır:

custom_dataset
├── images
│ ├── train
│ │ └── train1.jpg
│ ├── val
│ │ └── val1.jpg
│ └── test
│ └── test1.jpg
└── labels
├── train
│ └── train1.txt
├── val
│ └── val1.txt
└── test
└── test1.txt

Verileri bu dizine otomatik olarak ayırmak için düzenlediğim bir komut dosyasından yardım alalım.

Veri setini dizinlere bölmek için otomasyon kod dosyası.
# Örnek Kullanım
python3 dataset2folders.py 70 15 ./custom_dataset/

Komut dosyası işini yaparken, YOLOv6/data dizini içerisinde bulunan “images” klasörünü silelim. Bu klasördeki resimler örnek olması açısından repoya koyulmuş resimlerdir, bizim işimize yaramayacaklar. Komut dosyası işlemi tamamladıktan sonra bize 2 adet klasör oluşturmuş olmalı. Bu klasörler sırasıyla “images” ve “labels” klasörleridir. Ardından Bu iki klasörü YOLOv6 dizini içerisinde bulunan “data” dizini içerisine taşıyalım.

Eğitim Öncesi Son Ayarlamalar

YOLOv6 modelinin veri setimizi okuyabilmesi için bazı konfigürasyonlar yapmamız gerekiyor. İlk olarak YOLOv6 dizini içerisinde dataset.yaml adında bir dosya oluşturalım. Dosya içeriği aşağıdaki şekilde olmalı (Dizin isimleri farklılık gösterebilir, kendi dizinlerinize göre dosyayı düzenleyin.):

# dataset.yaml
train: ./images/train # Eğitim resimleri
val: ./images/val # Doğrulama resimleri
test: ./images/test # Test resimleri

# Eğer veri seti coco veri seti olsaydı burayı True olarak işaretlememiz gerekecekti.
# Biz özel veri seti ile eğitim yaptığımız için burası False olmalı.
is_coco: False

# Sınıflar
nc: 5 # Sınıf sayısı
names: ['ucak', 'bisiklet', 'kus', 'tekne', 'sise'] # Sınıf isimleri

YOLOv6, ağ yapısını ve eğitim ayarını belirtmek için bir yapılandırma dosyası kullanır. Bu yapılandırma dosyasını baştan sona kendiniz oluşturabilirsiniz. Bu konfigürasyon dosyası oluşturmak yüksek bilgi ve deneyim istemekte, bu yazıda Meituan tarafından sağlanmış konfigürasyon dosyalarından birini seçip devam edelim.

YOLOv6 dizininin configs alt dizininde bulunan “…-finetune.py” dosyalarından birini seçelim. Bu konfigürasyon dosyalarından modelimize uygun olanı seçmeliyiz. Eğer YOLOv6-M modelini seçtiysek bu model için yazılmış olan “yolov6m_finetune.py” dosyasını seçmeliyiz.

Eğitim

Verilerimizi ve konfigürasyon dosyalarımızı başarıyla hazırladıktan sonra en önemli bölüm olan eğitim bölümüne başarıyla ulaştık. Eğitim bölümü kolay bir bölüm fakat veri boyutuna göre ayarlama yapılması gereken, uzun sürecek bir bölüm.

Eğitimi başlatmak için yapmamız gereken tek bir komut var.

# YOLOv6 dizininde çalışıyoruz
python3 tools/train.py --epochs 100 --batch 8 --conf configs/yolov6m_finetune.py --data data/dataset.yaml --device 0
# --epochs: kaç adım eğitim yapılacak
# --batch: bir seferde eğitilen resim sayısıdır,
# yüksek batch sayısı yüksek bellek ister
# --conf: modelin eğitimi için gerekli konfigürasyon dosyası
# --data: veri setinin konfigürasyon dosyası
# --device: GPU id'si veya cpu

Eğitim sırasında Loss değerlerini kontrol ederek eğitimi durduracağınız zamanı belirleyebilirsiniz. Çoğu zaman, Loss değeri ne kadar düşük olursa, modelin tahminlerinin gerçek değerlere o kadar yakın olduğu anlamına gelir. Ancak bu durum her zaman geçerli değildir, modelin doğruluk oranını etkileyen bir çok parametre vardır. Modelin performansını ölçmek için en sağlıklı yöntem, test verileri üzerinde değerlendirme işlemi ile ölçüm yapmaktır.

Değerlendirme

Değerlendirme yapmak için YOLOv6 bize bir komut dosyası sunmuş, bu dosyayı kullanarak modelin performansını ölçebiliriz.

# YOLOv6 dizininde çalışıyoruz
python3 tools/eval.py --data data/dataset.yaml --weights runs/train/exp/weights/best_ckpt.pt --task val --device 0
# --data: dataset.yaml konfigürasyon dosyası
# --weights: eğitimi sonrasında kaydedilen ağırlık dosyası
# --device: GPU id'si veya cpu

Değerlendirme sonunda aşağıdakine benzer bir sonuç elde ederiz.

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.562
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.787
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.612
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.315
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.487
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.731
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.399
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.606
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.647
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.492
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.584
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.810

Metrikleri kontrol edip yeterli bulursanız modeli dışa aktarabilirsiniz.

Eğitilen Modeli Çalıştırmak

Eğitimi ve doğrulamayı tamamladıktan sonra modeli çalıştırmak için yine Meituan’ın oluşturduğu komut dosyalarından yardım alacağız.

# YOLOv6 dizininde çalışıyoruz
python3 tools/infer.py --weights runs/train/exp/weights/best_ckpt.pt --source img.jpg --device 0
# --weights: Eğitim sonrası kaydedillen ağırlık dosyası
# --source: Modelin çalıştırılacağı resim dosyası
# --device: GPU id'si veya cpu

Çalışma tamamlandıktan sonra çıktının nereye kaydedildiği komut satırında gösterilecektir.

Eğitilen Modelin İnternetten Alınan Bir Veri Üstünde Testi

Sonuç

Bu yazıda okuyuculara kendi nesne tanıma projelerini başlatma ve YOLOv6 modelini verilerine uyarlayarak güçlü sonuçlar elde etme konusunda temel bir rehber sunmayı amaçladım. Eğer bir hatam oldu ise affola, bana ulaşarak bu hatanın giderilmesini sağlayabilirsiniz.

--

--

Ahmet
Ahmet

Written by Ahmet

Bilgisayar Mühendisliği Öğrencisi | Kendi öğrendiklerimi paylaşıyorum.