Centering object yaitu meletakan objek ditengah canvas dengan margin tertentu. Centering object mempunyai kegunaan yang sangat penting pada proses object recognition yaitu untuk meningkatkan akurasi hasil. Contoh kasusnya yaitu centering object terutama untuk object yang bentuk nya tiny seperti huruf i, I, dan angka 1 yang bila seragamkan ukurannya akan jadi aneh.
Apalagi pada algoritma deep learning tertentu mensyaratkan untuk ukuran object berbentuk square sehingga center object menjadi sangat krusial. Mari kita coba dengan contoh angka 1
Operasi bounding box atau disebut blob akan menghasilkan posisi x,y, width dan height seperti berikut
Mengakibatkan menjadi persegi panjang, lalu kita lakukan operasi centering objek akan terlihat angka 1 ditengah sebagai objek yang utuh. Berikut hasil dari centering object
Nah kalian bisa membedakan hasil antara
- tanpa centering object dengan
- centering object
Centering Object
Ketika sudah didapatkan object hasil bounding box dilanjutkan dengan centering object, maka kalian bisa melakukan resize sesuai kebutuhan tanpa perlu takut hasil akurasi model berkurang karena jika tanpa centering object dilanjutkan dengan operasi resize maka hasilnya akan ambigu. Pada proses training pada umum nya pun dataset yang kita gunakan menggunakan centering object juga
Algoritma Centering Object
Algoritma centering object sebenarnya mudah kok
- hitung nilai max dari panjang lebar object, misalkan object front nya berukuran lebar: 100, tinggi; 80
- kita sebut dengan sebagai lebar front dan sebagai tinggi front
- maka background nya akan dibuat 100 karena bentuk nya nanti adalah square maka diambil yang paling besar nilainya.
- kita sebut dengan sebagai lebar back dan sebagai tinggi back masing-masing dengan nilai 100
- untuk centering nya dengan rumus sebagai berikut yang merupakan lokasi move terbaru dari objeck front agar ditengah background
- dan
Daripada bingung2, saya akan berikan kode nya yang sudah dilengkapi dengan margin
import cv2 import numpy as np def ToCenter(front, background = 255, margin = 0): dim = 1 if front.ndim==3: dim = 3 tinggi_front = front.shape[0] lebar_front = front.shape[1] # agar lokasi ditengah2 tinggi_back = np.max(front.shape)+margin lebar_back = np.max(front.shape)+margin back = np.ones([tinggi_back,lebar_back,dim])*background # dimensi back tinggi1 = back.shape[0] lebar1 = back.shape[1] # dimensi front tinggi2 = front.shape[0] lebar2 = front.shape[1] tinggi = (tinggi1-tinggi2)//2 lebar = (lebar1-lebar2)//2 # move ke center back[tinggi:tinggi+tinggi_front,lebar:lebar+lebar_front,:] = front return np.uint8(back) image = cv2.imread('crop.jpeg',1) image2 = ToCenter(image,background=0, margin = 1) plt.figure() plt.subplot(1,2,1),plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) plt.subplot(1,2,2),plt.imshow(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)) plt.show() # cv2.imwrite('centering object.jpeg',image2)