Bagian 4: SAHI

Home Forums Instance Segmentation and SAHI Bagian 4: SAHI

  • This topic is empty.
Viewing 1 post (of 1 total)
  • Author
    Posts
  • #12243
    mulkan syarif
    Keymaster

    Saya merujuk pengertian dari https://github.com/obss/sahi dan https://docs.ultralytics.com/guides/sahi-tiled-inference/

    Kita bahas SAHI secara mudah

    SAHI (Slicing Aided Hyper Inference)

    Sliced Inference = inference dengan cara membagi gambar besar menjadi beberapa tile (crop), lalu hasilnya digabung kembali.

    Setelah tiap tile diprediksi, hasilnya digabung.

    Istilah yang dipakai:

    • Prediction Merging

    • Post-processing

    • NMS (Non-Maximum Suppression)

    • Weighted Box Fusion (WBF) (kalau pakai alternatif NMS)

    Karena objek bisa muncul di 2 tile akibat overlap, merging ini krusial.

    Ilustrasinya adalah ketika kita sudah melakukan training untuk object detection seperti YOLO, Fast RCNN, atau model object detection lainnya. Tentu dataset image nya biasanya akan seragam misalkan ukuran 600 x600.

    nah ketika akan digunakan untuk inference menggunakan dimension yang sangat besar, misalkan ukuran lebar 1800 x 1200 seperti dibawah ini

    maka ukuran diatas harus di resize dari ukuran semula 1.800 x 1.200 menjadi 600 x 600, akan kehilangan pixel!

    Ada 3 solusi pendekatan

    Pertama

    Lakukan pelatihan kembali menggunakan dataset yang wide range

    Kedua

    Lakukan resize tapi akan menghilangkan detail objek sehingga hasilnya tidak akurat (objek kecil tidak akan ter capture)

    Ketiga

    Lakukan crop overlapping saja dengan ukuran window 600 x 600 sehingga tidak mengurangi ukuran objek kecil-kecil

    cara kerja diatas digunakan untuk inference!

    SAHI untuk tahap pelatihan

    SAHI pada konsep diatas untuk tahap inference, bagaimana kalau diterapkan sejak awal! yaitu proses pelatihan. Misalkan kita terapkan gambar yang wide range atau gambar yang sangat besar tapi objek yang akan dikenali sangat kecil-kecil yaitu tidak sampai 1% dari ukuran canvas!

    Bila diterapkan secara langsung tanpa ada croping, maka akan sangat sulit. Mari saya contohkan dengan real yang saya pernah alami. Gambar scan dibawah ini sangat besar yaitu 2.500 x 3.800

    proporsi objek beras dibandingkan dengan ukuran gambar seluruhnya sangat kecil tidak lebih dari 1% sehingga detection menjadi sangat sulit. Untuk itu saya crop overlapping (200×200)

    dengan cara tersebut akan menaikan proporsi objek menjadi diatas 10%.

    Contoh lain gambar dibawah ini mempunyai ukuran

    (3874, 2404, 3)
    
    

    maka luasannya adalah 3.874 x 2.404 = 9.313.096 pixel

    dengan bounding box

    saya akan ambil satu bounding box, dengan informasi sebagai berikut

    unicode                U+306F
    x                        1231
    y                        3465
    w                         133
    h                          53
    image_id    100241706_00004_2
    Name: 0, dtype: object
    
    

    luas objek: W x H = 133 x 53 = 7.049 pixel

    Bila kita bandingkan dengan ukuran gambar seluruhnya/canvas maka

    \(\frac{7.049}{9.313.096} = 0,07568\%\)
    tidak sampai 1%

    Itu artinya objek sangat sulit dideteksi karena terlalu kecil, jika kita ubah – ubah nilai parameter Conv2 maka terlalu beresiko pada model, maka solusinya yaitu bagaimana caranya agar objek menjadi relatif besar terhadap gambar seluruhnya tanpa me resize objek tersebut!

    Solusinya yaitu di crop. Crop nya pun harus yang overlapping karena semua objek jangan sampai tidak tercover hanya gara-gara ter crop sebagian!

    Misalkan saja ukuran crop –> disebut dengan window yaitu 200 x 200 = 40.000 pixel maka

    $$ \frac{7.049}{40.000} = 17.6625 \% $$

    Apa yang terjadi, akan ada kenaikan prosentase! menjadi 17 kali lipat!  sehingga sangat proper untuk dijadikan object detection

    Objek yang ter crop sebagian

    Apa yang terjadi dengan objek yang ter crop sebagian???

    Objek yang ter crop sebagian akan dibiarkan! tanpa bounding box sehingga dianggap bukan objek yang dideteksi!

    Semua objek yang akan di deteksi akan dikasih kotak warna biru, ada sebagian karakter tidak di kotak warna biru karena dianggap bukan objek (ter crop sebagian) tapi tenang saja dibagian tile yang lain akan terlihat utuh!

    kotak biru –> deteksi

    kotak hitam –> tidak dianggap objek

    kotak merah –> objek utuh perlu deteksi

    maka itulah gunanya overlapping! SAHI itu mewajibkan Overlapping dengan pengaturan ratio overlapp!

     

    Jawaban mengapa SAHI diperlukan ditahap awal

    Mengapa SAHI digunakan sejak persiapan dataset / training? ya karena objek sangat kecil sekali bahkan nyaris tidak sampai 1% dari luas keseluruhan gambar! daripada melakukan otak-atik parameter

    jika objek sangat kecil kurang dari 1% luas dimensi gambar, maka apa yang perlu diubah dari fasterrcnn_resnet50_fpn?

    Kalau objek sangat kecil (< 1% luas gambar), maka pada model
    Faster R-CNN dengan backbone ResNet-50 + Feature Pyramid Network
    masalahnya hampir selalu ada di:

    🔴 Anchor scale & feature map resolution
    🔴 RPN tidak menghasilkan proposal untuk objek kecil
    🔴 Downsampling backbone terlalu agresif


    🎯 Apa yang Perlu Diubah?

    1️⃣ Ubah Anchor Size (INI PALING PENTING)

    Default fasterrcnn_resnet50_fpn biasanya pakai anchor size relatif besar.

    Kalau objek <1% area, kemungkinan ukuran objek cuma 5–20 pixel.

    🔥 Solusi:

    Gunakan anchor lebih kecil:

    from torchvision.models.detection.anchor_utils import AnchorGenerator
    
    anchor_generator = AnchorGenerator(
        sizes=((8,), (16,), (32,), (64,), (128,)),  # tambahkan 8 & 16
        aspect_ratios=((0.5, 1.0, 2.0),) * 5
    )
    

    Default biasanya mulai dari 32.
    Untuk small object → tambahkan 8 dan 16.


    2️⃣ Tingkatkan Resolusi Input

    Kalau input terlalu kecil, objek makin hilang.

    Misalnya:

    • Gambar 1024×1024
    • Objek 10×10 pixel

    Kalau kamu resize ke 640 → objek makin kecil.

    🔥 Solusi:

    • Jangan resize terlalu kecil
    • Gunakan min_size=1024 saat training
    model = fasterrcnn_resnet50_fpn(min_size=1024)
    

    3️⃣ Gunakan FPN Level P2 Secara Optimal

    FPN sudah membantu small object, tapi pastikan level P2 dipakai.

    Kalau kamu custom backbone, jangan hilangkan layer awal.


    4️⃣ Ubah RPN NMS Threshold

    Kadang proposal kecil terbuang oleh NMS.

    Coba longgarkan:

    model.rpn.nms_thresh = 0.9
    

    5️⃣ Perbanyak Proposal

    model.rpn.pre_nms_top_n_train = 4000
    model.rpn.post_nms_top_n_train = 2000
    

    Karena small object butuh banyak candidate.


    6️⃣ Gunakan SAHI (Kalau Objek Sangat Kecil)

    Karena kamu sebelumnya pakai slicing:

    Kalau objek <1%, Sliced Inference jauh lebih efektif daripada hanya tuning anchor.

    Dengan slicing:

    • Objek jadi relatif lebih besar terhadap tile
    • Recall naik drastis

    📊 Ringkas Prioritas Perubahan

    Urutan Perubahan Dampak
    1 Anchor size kecil (8,16) 🔥🔥🔥🔥
    2 Resolusi input besar 🔥🔥🔥
    3 Tambah proposal RPN 🔥🔥
    4 Ubah NMS threshold 🔥
    5 Pakai slicing (SAHI) 🔥🔥🔥🔥🔥

    ⚠️ Catatan Penting

    Kalau objek <1% dan jumlahnya banyak (seperti butir beras yang pernah kamu bahas sebelumnya), maka:

    Faster R-CNN bukan pilihan paling optimal.

    Biasanya lebih cocok:

    • RetinaNet
    • YOLO dengan small anchor
    • atau DETR varian small object

    Kalau kamu mau, kirim:

    • Resolusi gambar
    • Rata-rata ukuran bounding box (pixel)
    • Berapa banyak objek per gambar

    Aku bisa hitungkan anchor size yang optimal secara matematis, bukan trial-error.

     

    terlalu ruwet dan belum terbukti berhasil karena harus uji coba berkali-kali , apalagi gambarnya sangat besar selain itu akan cocok untuk gambar yang kecil-kecil begitu ada objek yang ukuranya besar maka perlu diubah anchor nya

     

Viewing 1 post (of 1 total)
  • You must be logged in to reply to this topic.