.
└── ML-Challange
├── Prediction
│ ├── ObjectTracker
│ │ ├── pred.py
│ │ ├── sort.py
│ │ ├── requirements.txt
│ │ └── requirements_gpu.txt
│ └── Final_Project_Prediction.ipynb
├── Preprocess
│ └── extractor.py
├── readme_media
│ ├── Untitled 1.png
│ ├── Untitled 2.png
│ └── Untitled.png
├── Training
│ └── BilgeKaan_Challange_StromaVision.ipynb
└── README.md
- Verilen Github reposunu incelendi.
- 640x640 pixel boyutunda Test, Train, Val olmak üzere 3 adet video dosyası verildi.
- COCO formatında Label işlemi yapılmış.
- Bolt ,Nut olarak 2 Class tespiti ve bunların sayılması istenmektedir.
Örnek verilmiş Bounding Box ile Object Detection yapılmış projenin aslında bizden istenen görüntüsü
JSON formatında verilen örnek annotation dosyası
{
"info": {
"description": "Nuts and Bolts Dataset",
"url": "",
"version": "1.0",
"year": 2023,
"contributor": "Dogukan",
"date_created": "2023/01/18"
},
"licenses": [],
"images": [
{
"file_name": "0000.jpg",
"width": 640,
"height": 640,
"id": 1
},
.................
{
"file_name": "1799.jpg",
"width": 640,
"height": 640,
"id": 1800
}
]
Bize Verilen videolardan örneğin 60 Saniyelik 30FPS Video’nun 1800 Frame’den oluştuğu bilinmektedir. Bunun sonucunda alacağımız video dosyasına ait JSON Annotation
dosyasında da o kadar id
sayısında olması gerekiyor.
Bunun için Video’yu Frame’lerine bölerek çıkartan Python Kodu yazdım. Extractor.py
-
Bize verilen verisetini buradan indirmeliyiz.
-
Preprocess Klasöründe ki
extractor.py
ile bu verisetinde ki video dosyasını frame’lere ayırıyoruz. -
Ayrışmış frame klasörü içerisine bize verilen dataset buradan içerisinde hangi video frame’lere ayrıştırılmış ise ona ait JSON annotation dosyası da o klasöre kopyalanmalıdır.
-
Bu aşamalardan sonra görüntüsü buradaki gibi olmalı.
-
Ayırılmış Frameleri ROBOFLOW sitesine yüklüyoruz. Yükleme aşamalarında sadece test, train, valid bölme işlemini yapmanız yeterlidir. Adım Adım Yükleme aşamaları
-
Yükledikten sonra Roboflow üzerinde verisetini yolov7 formatında Export etmeliyiz.
-
Export aşamasında bilgisayarıma indirmeden download code ile Colab içerisine dahil edebiliriz.
Oluşan verisetine bu Link’ den ulaşabilirsiniz.
Eğitim Yolov7 kullanılarak yapılacaktır.
Yolov7
Training aşamasını Training
klasörü içerisinde ki notebook dosyasından yapıyoruz. Bu aşamayı Google Colab üzerinde yapacağız.
- Colab üzerinde belirtilen notebook dosyasını açın. Colab Training Notebook
- Colab içerisinde belirtilen adımları hücreleri çalıştırarak ilerleyin.
- Hiçbir değişiklik yapmadan (batch size, epoch sayısı) çalıştırarak eğitebilirsiniz. Overfit (Aşırı Öğrenme) durumunda
yolov7.yaml
dosyasında ki learning rate değerini değiştirerek ilerleyebilirsiniz. - Eğitim sonucunda model dosyalarınız Colab içerisindeki
runs/train/weights
‘de kaydedilmektedir. Biz en iyi sonucu olan model dosyasını yani best.pt dosyasını kullanacağız.. best.pt
dosyanızı Drive içerisine taşımayı unutmayın. Çünkü bu dosyayı predict aşamasında kullanmamız gerekmektedir.
!nvidia-smi
nvidia-smi
(NVIDIA System Management Interface) bir komut satırı aracıdır ve NVIDIA GPU'larının sistemle ilgili bilgilerini görüntülemek için kullanılır. Bu araç, GPU bellek kullanımını, işlemci kullanımını, sıcaklığı, saat hızını, güç tüketimini ve diğer çeşitli performans ölçümlerini görüntülemeyi sağlar.
!git clone https://github.com/SkalskiP/yolov7.git
%cd yolov7
!git checkout fix/problems_associated_with_the_latest_versions_of_pytorch_and_numpy
!pip install -r requirements.txt
Yolov7 reposu indirilir ve requirements.txt dosyasında ki kütüphaneler yüklenir.
!pip install roboflow
from roboflow import Roboflow
rf = Roboflow(api_key="x5tKxqHm8Of46UZ2y5eV")
project = rf.workspace("bilge-kaan-grgen-j9nkx").project("obj-2")
dataset = project.version(2).download("yolov7")
Roboflow API'sini kullanarak belirli bir Roboflow projesindeki veri kümesini indiriyor.
%cd /content/yolov7
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7_training.pt
Yolov7 modelinin eğitiminde kullanılabilecek önceden eğitilmiş bir ağırlık dosyasını indirir.
%cd /content/yolov7
!python train.py --batch 16 --epochs 55 --data {dataset.location}/data.yaml --weights 'yolov7_training.pt' --device 0
Bu kod, YOLOv7 modeli için eğitim yapmak üzere train.py
dosyasını çalıştırır.
-batch 16
parametresi, her bir eğitim adımında kullanılacak olan görüntü sayısını belirtir.-epochs 55
parametresi, toplamda kaç epoch (bir epoch, tüm eğitim verilerinin bir kez geçtiği durumu ifade eder) eğitim yapılacağını belirtir.-data {dataset.location}/data.yaml
parametresi, veri setinin konumunu belirten YAML dosyasının konumunu belirtir.-weights 'yolov7_training.pt'
parametresi, önceden eğitilmiş ağırlıkların konumunu belirtir.-device 0
parametresi, kullanılacak olan GPU numarasını belirtir.
Eğitim aşamasına ait görüntü.
.............
.............
Epoch gpu_mem box obj cls total labels img_size
53/54 12.7G 0.03008 0.004752 0.00143 0.03626 17 640: 100% 71/71 [01:03<00:00, 1.11it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 9/9 [00:05<00:00, 1.56it/s]
all 279 698 0.966 0.937 0.988 0.818
Epoch gpu_mem box obj cls total labels img_size
54/54 12.7G 0.01908 0.004578 0.0009224 0.02458 27 640: 100% 71/71 [01:03<00:00, 1.11it/s]
Class Images Labels P R mAP@.5 mAP@.5:.95: 100% 9/9 [00:07<00:00, 1.25it/s]
all 279 698 0.969 0.979 0.987 0.831
bolt 279 570 0.984 0.965 0.992 0.863
nut 279 128 0.955 0.992 0.982 0.8
55 epochs completed in 1.108 hours.
Optimizer stripped from runs/train/exp/weights/last.pt, 74.8MB
Optimizer stripped from runs/train/exp/weights/best.pt, 74.8MB
%load_ext tensorboard
%tensorboard --logdir /content/yolov7/runs/train
**load_ext
**Tensorboard'u Colab'da kullanmamıza olanak sağlar.
train klasörü altındaki log dosyalarına erişmek için logdir
parametresi kullanılmıştır. Bu sayede, modelin eğitimi sırasında kaydedilen metrikleri ve görselleştirmeleri gözlemleyebiliriz.
from google.colab import drive
drive.mount('/content/drive')
Google drive bağlantımızı yapıyoruz.
Tensorboard'daki "map" değeri, modelin ortalama hassasiyet değerini (mAP) ifade eder. Bu değer, modelin sınıflandırma doğruluğunu ölçmek için kullanılır. mAP, tüm sınıfların hassasiyet değerlerinin ortalamasıdır.
"map05:0.95" değeri, 0.5 ile 0.95 arasındaki tüm eşik değerleri için ortalama hassasiyet değerini ifade eder. Bu değer, modelin daha geniş bir aralıkta nasıl performans gösterdiğini gösterir.
Precision ve recall değerleri, modelin doğruluğunu daha ayrıntılı bir şekilde analiz etmek için kullanılan diğer ölçümlerdir. Precision, modelin doğru sınıflandırılan nesnelerin sayısının, toplam sınıflandırılan nesnelerin sayısına oranını ifade eder. Recall ise, modelin doğru sınıflandırılan nesnelerin sayısının, toplam gerçek nesne sayısına oranını ifade eder. Bu ölçümler, modelin hangi sınıfların daha iyi sınıflandırıldığını ve hangi sınıfların daha kötü performans gösterdiğini belirlemeye yardımcı olur.
best.pt
file drive link
Train komutunu çalıştırırken bazen RuntimeError: indices should be either on cpu or on the same device as the indexed tensor (cpu)
belirtilen runtime hatası alabiliyoruz. Bunun için çok güzel ve kolay bir çözüm yolu stackoverflow’da anlatılmış. Çözüm
Model çıktılarımız aldıktan sonra objelerin saydırılması, Bounding Box’lar içerisinde doğruluk değerleri ve hangi obje olduğunu göstereceğiz.
- Colab Prediction Notebook ‘ linkinden Colab Notebook’una ulaşıyoruz.
- Colab içerisinde ki hücrelere ait adımları takip ediyoruz.
- Adımlardan drive bağlama adımından sonra verilmiş drive linki üzerinden Drive yada Prediction/ObjectTracker/ Dosya yolu içerisinde ki
pred.py
,sort.py
,requirements.txt
verequirements_gpu.txt
4 adet dosyayı Colab içerisinde oluşan yolov7 klasörü içerisine atıyoruz. - Takip ettikten sonra linkler üzerinde’ki dosyaları kendi Colab dosya yollarınıza indirerek prediction işlemlerinizi yapabilirsiniz.
Colab ile Test notebook dosyası sonrası projede bizden istenen çıktısı verilmiştir.
Bildiğimiz bilgileri pekiştirerek araştırma seviyemizi daha da artırdığı için bu challange adına çok memnunum. Herkese iyi çalışmalar 🙂