Working on a Computer Vision project? These code chunks will help… – Towards AI

Author(s): Chinmay Bhalerao

Awalnya diterbitkan di Towards AI the World’s Leading AI and Technology News and Media Company. Jika Anda membuat produk atau layanan terkait AI, kami mengundang Anda untuk mempertimbangkan menjadi sponsor AI. Di Towards AI, kami membantu menskalakan AI dan startup teknologi. Biarkan kami membantu Anda melepaskan teknologi Anda kepada massa.

Mengerjakan Proyek Computer Vision? Potongan Kode Ini Akan Membantu Anda !!!

Pengantar beberapa metode “terbiasa” dalam proyek visi komputer

proyek visi komputer [Source]

“VR dan AR pada akhirnya akan menyatu, dan kacamata pintar akan mengambil alih interaksi digital kita.”― Carlos López (Pendiri @ Oarsis)

Hal yang menakjubkan tentang bekerja dalam visi komputer dan pembelajaran mesin adalah bahwa setiap beberapa tahun sekali, seseorang menemukan sesuatu yang gila yang membuat Anda benar-benar mempertimbangkan kembali apa yang mungkin!!!

Dunia mendapat mata baru & cara berpikir baru serta melacak objek sejak munculnya algoritma Computer vision. Mulai dari Jaringan Saraf Konvolusional Berbasis Wilayah [RCNN] ke YOLO V7, detectron-2, segformer, dan arsitektur klasifikasi, visi komputer berubah secara drastis untuk efisiensi deteksi yang lebih tinggi dan latensi yang lebih tinggi dengan kebutuhan waktu yang lebih sedikit dan biaya komputasi yang mahal.

Proyek visi komputer adalah kombinasi dari banyak hal, mulai dari pengumpulan data hingga penerapan yang berhasil. Memahami data dan pengolahan serta pelatihan yang tepat adalah kunci keberhasilan. Di bawah ini adalah beberapa potongan kode dengan deskripsi pekerjaan mereka yang akan memudahkan Anda mengerjakan proyek.

1. Ketahui instance dataset Anda

untuk proyek deteksi objek atau segmentasi, kami membubuhi keterangan kumpulan data kami dengan bantuan alat anotasi eksternal seperti makesense.ai, annotator VGG, LableIMG, dll.

Contoh dataset ketidakseimbangan dalam deteksi objek [Image Source]

Kami mengetahui jumlah persis gambar, tetapi sulit untuk mengetahui berapa banyak instance dari setiap kelas yang kami miliki. Mengetahui contoh kelas akan memberi tahu Anda apakah kumpulan data Anda tidak seimbang atau tidak. Ini akan berdampak besar pada model pembelajaran jika instans Anda tidak seimbang. Jadi setelah mengunduh kumpulan data beranotasi dan file anotasinya, Anda dapat menggunakan potongan kode berikut untuk melihat status keseimbangan kelas.

impor kami
#Berikan jalur folder tempat Anda menyimpan gambar dan anotasi
path = r”Dataset Anda *folder* lokasi”
# Ubah direktori ke jalur
os.chdir(jalur)
x=[]
# Memutar semua file
untuk file di os.listdir():
# Memeriksa file anotasi teks
jika file.berakhir dengan(“.txt”):
file_path = f”{path}{file}”
dengan open(file_path, ‘r’) sebagai f:
untuk baris di f:
a=garis[0]
x.tambahkan(a)
cetak(x)
#untuk menghitung contoh
dari koleksi import Counter
Penghitung (x)
Gambar oleh Penulis

Anda dapat melihat, akhirnya, penghitung memberikan nilai instance untuk setiap kelas, dan kemudian pada kriteria model Anda, Anda dapat memutuskan apakah kumpulan data memerlukan penyeimbangan lebih lanjut atau tidak.

2. Preprocessing gambar

Dalam kumpulan data gambar kami, selain instance kelas, kami memiliki banyak objek/benda lain. Jika kita mengambilnya untuk tujuan pembelajaran model, maka item lain ini dapat diklasifikasikan sebagai noise. Ada banyak kasus penggunaan yang mengklaim bahwa menghilangkan noise ini dan mengirimkannya ke model untuk pelatihan akan meningkatkan performa model. Jadi bagaimana preprocess gambar? Lihat kode di bawah ini.

#Menulis fungsi untuk membuat masking mouse
#Kami menggunakan acara klik mouse di sini
impor numpy sebagai np
impor cv2 sebagai cv
drawing = False # true jika mouse ditekan
mode = True # jika True, gambar persegi panjang. Tekan ‘m’ untuk beralih ke kurva
ix,iy = -1,-1
# fungsi panggilan balik mouse
def draw_circle(event,x,y,flags,param):
global ix,iy,menggambar,mode
jika acara == cv.EVENT_LBUTTONDOWN:
menggambar = Benar
ix,iy = x,y
acara elif == cv.EVENT_MOUSEMOVE:
jika menggambar == Benar:
jika modus == Benar:
cv.persegi panjang(img,(ix,iy),(x,y),(255,255,255),-1)
#(255.255.255) mewakili warna putih tetapi Anda dapat memberikan warna apa saja.
# -1 mewakili kotak yang terisi dan 1 mewakili kotak kosong
kalau tidak:
cv.circle(img,(x,y),5,(0,0,255),-1)
acara elif == cv.EVENT_LBUTTONUP:
menggambar = Salah
jika modus == Benar:
cv.persegi panjang(img,(ix,iy),(x,y),(255,255,255),-1)
kalau tidak:
cv.circle(img,(x,y),5,(0,0,255),-1)

#menyimpan hasil akhir

cv2.imwrite(“new_img.jpg”,img)

Fungsi #Calling dan menggunakannya pada gambar masukan
impor cv2
img = cv2.imread(r”Jalur gambar Anda”,1)
#mengubah ukuran agar muat di layar
img = cv2.resize(img,(1200,800))
cv.namedWindow(‘gambar’)
cv.setMouseCallback(‘gambar’, gambar_lingkaran)
sementara(1):
cv.imshow(‘gambar’,img)
k = cv.waitKey(1) & 0xFF
jika k == ord(‘m’):
modus = bukan modus
elif k == 27:
merusak
cv.hancurkanSemuaWindows()

Jika Anda menjalankan kode di atas, maka Anda akan memiliki gambar pelatihan di depan Anda, dan mouse Anda akan bertindak sebagai pembuat topeng. Setelah mengklik dan mengarahkan mouse pada objek yang tidak perlu akan langsung membuat topeng pada objek tersebut. Saya mengambil warna putih untuk keperluan kasus penggunaan, tetapi Anda dapat mengambilnya sesuai dengan masalah Anda. Anda dapat melatih model deteksi objek terpisah untuk noise, dan di bawahnya, Anda dapat melampirkan kode ini. Pada awalnya, model akan mendeteksi noise, lalu kode ini akan menutupi kotak pembatas itu dengan warna yang Anda inginkan.

Masking objek kebisingan [Image by Author]

Ada banyak hal yang dapat Anda lakukan untuk preprocessing gambar, seperti memotong, membuat blur/kontras, dll. Anda dapat membaca blog saya untuk teknik preprocessing gambar lainnya.

Apakah Anda tahu operasi pemrosesan gambar dasar ini?

3. Augmentasi Data

Di setiap proyek visi komputer, Anda ingin menambah kumpulan data agar lebih besar agar pekerjaan model lebih mudah. Ada banyak perangkat lunak sumber terbuka yang melakukan Augmentasi untuk Anda, seperti Roboflow. Namun seringkali, ada masalah dengan keamanan dan kerahasiaan data. Jadi, Anda dapat melakukan augmentasi kumpulan data Anda sendiri di editor python Anda. Ada perpustakaan oleh TensorFlow yang dikenal sebagai “ImageDataGenerator” yang membantu Anda melakukan ini. Lihat kode di bawah ini.

# UNTUK PENJELASAN FOLDER LENGKAP
#impor
impor tensorflow
impor keras
impor numpy sebagai np
impor kami
dari PIL impor Gambar
dari impor skimage io
UKURAN = 128
kumpulan data = []
image_directory = ‘Alamat folder gambar/’
dari keras.preprocessing.image impor ImageDataGenerator, array_to_img, img_to_array, load_img
# Berikan augmentasi yang diperlukan untuk gambar
#ImageDataGenerator memiliki banyak Augmentasi, pilih yang sesuai dengan kondisi Anda
datagen = ImageDataGenerator(
rentang_putaran=40,
rentang_pergeseran_lebar=0,2,
tinggi_pergeseran_rentang=0,2,
rentang_geser=0,2,
zoom_range=0,2,
horizontal_flip=Benar,
fill_mode=’terdekat’)

my_images = os.listdir(direktori_gambar)
untuk saya, image_name di enumerate(my_images):
jika (nama_gambar.split(‘.’)[1] == ‘jpg’):
gambar = io.imread(direktori_gambar + nama_gambar)
image = Gambar.fromarray(gambar,’RGB’)
gambar = gambar.ubah ukuran((UKURAN,UKURAN))
dataset.append(np.array(gambar))
x = np.array(kumpulan data)
saya = 0
untuk batch di datagen.flow(x, batch_size=20,
save_to_dir=’preview’, save_prefix=’Hard_Hat’, save_format=’jpeg’):
saya += 1
jika saya > 200:
merusak

#UNTUK Anotasi GAMBAR TUNGGAL

impor tensorflow
impor keras
dari keras.preprocessing.image impor ImageDataGenerator, array_to_img, img_to_array, load_img
#Alamat gambar
img = load_img(‘Alamat gambar [should end with .jpg or .png]’)
#Diperlukan augmentasi
datagen = ImageDataGenerator(
rentang_putaran=40,
rentang_pergeseran_lebar=0,2,
tinggi_pergeseran_rentang=0,2,
rentang_geser=0,2,
zoom_range=0,2,
horizontal_flip=Benar,
fill_mode=’terdekat’)

x = img_ke_array(img)
x = x.bentuk ulang((1,) + x.bentuk)

saya = 0
untuk batch di datagen.flow(x, batch_size=1,
save_to_dir=’preview/green_Aug’, save_prefix=’Hard_Hat_orange_Aug’, save_format=’jpeg’):
saya += 1
if i > 20: #20 adalah gambar keluaran yang akan kita dapatkan. Anda dapat menetapkan batas apa pun sesuai dengan proyek
merusak

Potongan kode pertama adalah untuk folder gambar. Anda dapat melakukan pembesaran massal dari itu. Potongan kedua adalah untuk gambar tunggal. Anda dapat menggunakan salah satu dari yang di atas sesuai dengan kasus penggunaan Anda. “i” terakhir adalah jumlah gambar sintetik yang ingin Anda buat. Pilih nomor yang sesuai dan Tambahkan.

Gambar yang diperbesar dengan kode [Image by author]

4. Pembuatan set data

Sering kali, Anda memerlukan gambar dari webcam. tetapi sulit untuk mengkliknya dan menyimpannya di folder berlabel untuk klasifikasi atau deteksi objek. Ini juga melibatkan banyak tugas manual. kode di bawah ini adalah dengan mengklik gambar untuk label tertentu, dan langsung akan menyimpannya di lokasi yang tepat.

Sebutkan label Anda dan sebutkan berapa banyak gambar yang Anda inginkan untuk setiap kelas. Kemudian tentukan jalur Anda untuk penyimpanan. Setelah setiap time.sleep(5), itu akan mengklik gambar hingga pembuatan data.

# Mengimpor modul
impor cv2
impor uuid
impor kami
waktu impor

#Kelas yang ingin Anda gunakan
label = [‘happyface’, ‘sadface’, ‘angryface’, ‘excitedface’]
# Berapa banyak gambar yang Anda inginkan untuk setiap kelas
angka_imgs = 5
#Jalur gambar
IMAGES_PATH = os.path.join(‘Tensorflow’, ‘workspace’, ‘images’, ‘collectedimages’)

jika bukan os.path.exists(IMAGES_PATH):
jika os.nama == ‘posix’:
!mkdir -p {IMAGES_PATH}
jika os.nama == ‘nt’:
!mkdir {IMAGES_PATH}
untuk label dalam label:
path = os.path.join(IMAGES_PATH, label)
jika bukan os.path.exists(path):
!mkdir {path} # Ini akan membuka Webcam Anda dan mulai mengklik gambar dan menyimpannya dalam format .jpg
untuk label dalam label:
tutup = cv2.VideoCapture(0)
print(‘Mengumpulkan gambar untuk {}’.format(label))
waktu.tidur(5)
untuk imgnum dalam rentang (angka_imgs):
print(‘Mengumpulkan gambar {}’.format(imgnum))
ret, bingkai = cap.baca()
imgname = os.path.join(IMAGES_PATH,label,label+’.’+'{}.jpg’.format(str(uuid.uuid1())))
cv2.imwrite(namagambar, bingkai)
cv2.imshow(‘bingkai’, bingkai)
waktu.tidur(2)
jika cv2.waitKey(1) & 0xFF == ord(‘q’):
merusak
tutup.rilis()
cv2.hancurkanSemuaWindows()

Anda akan mendapatkan hasil di bawah ini setelah menjalankan potongan kode. dan gambar akan disimpan di lokasi yang ditentukan.

Gambar oleh Penulis

5. Mengekstraksi area dari gambar

Ini adalah hal yang paling berguna tidak hanya untuk mendeteksi atau mengelompokkan objek tetapi juga untuk mengekstrak area mereka. Kami menggunakan banyak teknik seperti pengukuran piksel dan lainnya. Tetapi masalahnya, Anda harus melakukan kalibrasi sebelum mengekstraksi area agar sesuai dengan dimensi asli dan representasinya dalam gambar dan rasionya. Jadi untuk kalibrasi, orang menggunakan rasio bawaan dan skema objek referensi, tetapi saya mencoba cara baru untuk menghitung faktor kalibrasi. Anda hanya perlu menggambar garis untuk melakukan kalibrasi. Saya menyebutkan bagaimana melakukannya di blog di bawah ini.

Kalibrasi dalam Pemrosesan Gambar

Ini adalah beberapa potongan yang akan membantu Anda membangun dan berkontribusi pada proyek Anda. Ada banyak hal yang ingin saya bahas, tapi tetap saja, ini sudah cukup untuk bagian blog ini.

Jika Anda menemukan artikel ini berwawasan

Jika Anda menemukan artikel ini berwawasan, ikuti saya di Linkedin dan medium. Anda juga dapat berlangganan untuk mendapatkan pemberitahuan ketika saya menerbitkan artikel. Ayo buat komunitas! Terima kasih atas dukunganmu!

Jika Anda ingin mendukung saya:

Mengikuti dan bertepuk tangan Anda adalah hal yang paling penting, tetapi Anda juga dapat mendukung saya dengan membeli kopi. KOPI.

Anda dapat membaca blog saya yang lain yang berhubungan dengan :

Tanda tangan,

Chinmay Bhalerao

Bekerja pada proyek Computer Vision? Potongan kode ini akan membantu Anda !!! awalnya diterbitkan di Menuju AI di Medium, di mana orang melanjutkan percakapan dengan menyoroti dan menanggapi cerita ini.

Diterbitkan melalui Menuju AI

Author: Jonathan Kelly