Mempersiapkan dataset Pascal VOC ke Format YOLO

By | December 20, 2023
Print Friendly, PDF & Email
314 Views

Mempersiapkan dataset Pascal VOC Dataset ke Format Yolo – YOLO, singkatan dari “You Only Look Once,” adalah sistem deteksi objek waktu-nyata yang populer dalam komunitas visi komputer dan pembelajaran mendalam. Inovasi utama dari YOLO adalah kemampuannya untuk melakukan deteksi objek dalam satu kali lintas melalui jaringan saraf, membuatnya lebih cepat dan efisien dibandingkan dengan sistem deteksi dua tahap tradisional.

YOLO telah mengalami beberapa versi, termasuk YOLOv1, YOLOv2 (juga dikenal sebagai YOLO9000), YOLOv3, dan YOLOv4, masing-masing membawa perbaikan dalam hal akurasi dan kecepatan. YOLO umumnya digunakan untuk berbagai tugas visi komputer, termasuk deteksi objek dalam gambar dan video, deteksi pejalan kaki, kendaraan otonom, dan lainnya. YOLO banyak diadopsi karena kinerja waktu-nyatanya dan akurasi yang kompetitif, menjadikannya pilihan populer untuk aplikasi di mana deteksi objek yang cepat dan efisien sangat penting.

Kebanyakan format dataset untuk detection object menggunakan Dataset Pascal VOC, kalian bisa download di https://pjreddie.com/projects/pascal-voc-dataset-mirror/#google_vignette

Dataset Pascal VOC

Dataset Pascal VOC (Visual Object Classes) adalah kumpulan data yang sering digunakan dalam tugas deteksi objek dan segmentasi. Dataset ini populer dalam komunitas visi komputer dan machine learning. Berikut adalah penjelasan mengenai format Pascal VOC dataset:

  1. Struktur Dataset:
    • Pascal VOC terdiri dari dua bagian utama: data pelatihan (training) dan data pengujian (testing).
    • Setiap bagian terdiri dari subdirektori untuk setiap kelas objek yang ingin dideteksi.
  2. Anotasi (Annotations):
    • Setiap gambar dalam dataset dilengkapi dengan file anotasi XML yang menyimpan informasi tentang objek-objek yang terdapat dalam gambar.
    • Informasi ini mencakup koordinat kotak pembatas (bounding box), label kelas objek, dan apakah objek tersebut terdapat dalam area terpotong (truncated) atau tersembunyi (occluded).
  3. Label Kelas:
    • Pascal VOC mendefinisikan sejumlah kelas objek yang umum, seperti orang, mobil, pesawat, sepeda, dan lain-lain.
    • Setiap label kelas direpresentasikan oleh sebuah bilangan bulat yang sesuai dengan indeks kelas.
  4. File XML Anotasi:
    • Setiap file XML anotasi mengandung informasi terkait satu gambar, seperti nama gambar, dimensi gambar, dan daftar objek beserta informasi anotasi untuk masing-masing objek.
    • Informasi objek termasuk label kelas, koordinat kotak pembatas, dan atribut lainnya.
See also  StarDist a deep learning based 2D and 3D object detection

Contoh berikut file XML anotasi

<annotation>
    <filename>image001.jpg</filename>
    <size>
        <width>500</width>
        <height>375</height>
        <depth>3</depth>
    </size>
    <object>
        <name>person</name>
        <pose>Frontal</pose>
        <truncated>0</truncated>
        <occluded>0</occluded>
        <bndbox>
            <xmin>96</xmin>
            <ymin>97</ymin>
            <xmax>220</xmax>
            <ymax>352</ymax>
        </bndbox>
    </object>
    <!-- Informasi objek lainnya -->
</annotation>

Format YOLO

Sedangkan dalam format YOLO menggunakan seperti berikut

<object-class> <x> <y> <width> <height>

nilai  <x> <y> bukanlah nilai koordinat pojok dari sebuah kotak namun nilai center object

Jadi isi nilai *.csv seperti berikut

Mengapa format YOLO menggunakan nilai relatif?

Format YOLO sebenarnya menggunakan nilai relatif alih-alih nilai absolut karena untuk mengantisipasi jikalau ada dalam menggunakan dataset mau menggunakan transform seperti mengubah dimensi/resize gambar sehingga lokasi objek tidak terpengaruh!

Tools untuk mengubah Pascal VOC menjadi format YOLO

Sebenarnya untuk mengubah nya cukup mudah kok, kalian bisa menggunakan tools

Namun saya tidak mau menggunakan cara tersebut!

Kita akan coba dengan cara lain, tahap pertama kita akan download file http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar lalu kita akan extract

Tahap kedua kita akan menggunakan script voc_label.py yaitu di https://pjreddie.com/media/files/voc_label.py isinya yaitu

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2007', 'train'),('2007','val')]#, ('2007', 'val'), ('2007', 'test')]

classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]


def convert(size, box):
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

kita tempatkan seperti berikut

See also  Belajar RNN untuk kasus Sederhana

lalu kita run saja file tersebut, nanti akan ada VOC2007/labels/*.txt

Bisa kita lihat hasilnya semula

<annotation>
   <folder>VOC2007</folder>
   <filename>000005.jpg</filename>
   <source>
      <database>The VOC2007 Database</database>
      <annotation>PASCAL VOC2007</annotation>
      <image>flickr</image>
      <flickrid>325991873</flickrid>
   </source>
   <owner>
      <flickrid>archintent louisville</flickrid>
      <name>?</name>
   </owner>
   <size>
      <width>500</width>
      <height>375</height>
      <depth>3</depth>
   </size>
   <segmented>0</segmented>
   <object>
      <name>chair</name>
      <pose>Rear</pose>
      <truncated>0</truncated>
      <difficult>0</difficult>
      <bndbox>
         <xmin>263</xmin>
         <ymin>211</ymin>
         <xmax>324</xmax>
         <ymax>339</ymax>
      </bndbox>
   </object>
   <object>
      <name>chair</name>
      <pose>Unspecified</pose>
      <truncated>0</truncated>
      <difficult>0</difficult>
      <bndbox>
         <xmin>165</xmin>
         <ymin>264</ymin>
         <xmax>253</xmax>
         <ymax>372</ymax>
      </bndbox>
   </object>
   <object>
      <name>chair</name>
      <pose>Unspecified</pose>
      <truncated>1</truncated>
      <difficult>1</difficult>
      <bndbox>
         <xmin>5</xmin>
         <ymin>244</ymin>
         <xmax>67</xmax>
         <ymax>374</ymax>
      </bndbox>
   </object>
   <object>
      <name>chair</name>
      <pose>Unspecified</pose>
      <truncated>0</truncated>
      <difficult>0</difficult>
      <bndbox>
         <xmin>241</xmin>
         <ymin>194</ymin>
         <xmax>295</xmax>
         <ymax>299</ymax>
      </bndbox>
   </object>
   <object>
      <name>chair</name>
      <pose>Unspecified</pose>
      <truncated>1</truncated>
      <difficult>1</difficult>
      <bndbox>
         <xmin>277</xmin>
         <ymin>186</ymin>
         <xmax>312</xmax>
         <ymax>220</ymax>
      </bndbox>
   </object>
</annotation>

menjadi

8 0.587 0.7333333333333333 0.122 0.3413333333333333
8 0.418 0.848 0.176 0.288
8 0.536 0.6573333333333333 0.108 0.27999999999999997

 

serta nanti ada file

2007_val.txt dan 2007_train.txt

saran saya kalau mau melatih Yolo bisa belajar

 

 

Leave a Reply