- Deteksi objek menggunakan SIFT
- Deteksi objek menggunakan ORB
- Histogram Gradien Berorientasi (HOG's)
- Histogram Gradien Berorientasi (HOG's), Langkah demi Langkah:
- Pengklasifikasi kaskade HAAR
- Deteksi Wajah & Mata
- Deteksi Wajah dan Mata Langsung
- Tuning Pengklasifikasi Kaskade
- Deteksi Mobil dan Pejalan Kaki dalam video
Kami mulai dengan menginstal python OpenCV di windows dan sejauh ini melakukan beberapa pemrosesan gambar dasar, segmentasi gambar dan deteksi objek menggunakan Python, yang dibahas dalam tutorial di bawah ini:
- Memulai dengan Python OpenCV: Instalasi dan Pemrosesan Gambar Dasar
- Manipulasi Gambar dengan Python OpenCV (Bagian 1)
- Manipulasi Gambar di OpenCV (Part-2)
- Segmentasi Gambar menggunakan OpenCV - Mengekstrak Area tertentu dari suatu gambar
Kami juga belajar tentang berbagai metode dan algoritme untuk Deteksi Objek di mana beberapa poin penting diidentifikasi untuk setiap objek menggunakan algoritme yang berbeda. Dalam tutorial ini kita akan menggunakan algoritma tersebut untuk mendeteksi objek kehidupan nyata, di sini kita akan menggunakan SIFT dan ORB untuk pendeteksiannya.
Deteksi objek menggunakan SIFT
Disini pendeteksian objek akan dilakukan dengan menggunakan live webcam stream, sehingga jika mengenali objek maka akan disebutkan objek yang ditemukan. Dalam kode, bagian utama dimainkan oleh fungsi yang disebut sebagai detektor SIFT, sebagian besar pemrosesan dilakukan oleh fungsi ini.
Dan di bagian lain kode, kita mulai dengan membuka aliran webcam, lalu memuat template gambar, yaitu gambar referensi, yaitu program yang benar-benar melihat melalui aliran webcam.
Selanjutnya, kami terus mengambil gambar dari aliran webcam dengan bantuan loop sementara tak terbatas, dan kemudian menangkap tinggi dan lebar yang sesuai dari bingkai webcam, dan kemudian menentukan parameter kotak wilayah minat (ROI) di mana objek kita dapat masuk dengan mengambil tinggi dan lebar yang sesuai dari bingkai webcam. Dan kemudian kami menggambar persegi panjang dari parameter ROI yang telah kami tentukan di atas. Kemudian akhirnya pangkas persegi panjang dan masukkan ke bagian kode detektor SWIFT.
Sekarang detektor SIFT pada dasarnya memiliki dua masukan, satu adalah gambar yang dipotong dan yang lainnya adalah templat gambar yang kita tentukan sebelumnya dan kemudian memberi kita beberapa kecocokan, jadi kecocokan pada dasarnya adalah jumlah objek atau titik kunci yang serupa pada gambar yang dipotong dan gambar target. Kemudian kami menentukan nilai ambang untuk pertandingan, jika nilai pertandingan lebih besar dari ambang batas, kami menempatkan gambar yang ditemukan di layar kami dengan warna hijau persegi panjang ROI.
Sekarang mari kita kembali ke bagian utama kode, fungsi yang disebut sebagai detektor SIFT, ini mengambil input sebagai dua gambar, satu adalah gambar tempat mencari objek dan lainnya adalah objek yang kita coba cocokkan ke (template gambar). Kemudian skala abu-abu gambar pertama dan tentukan template gambar sebagai gambar kedua. Kemudian kami membuat objek detektor SIFT dan menjalankan fungsi deteksi dan komputasi OpenCV SIFT, sehingga dapat mendeteksi titik kunci dan menghitung deskriptor, deskriptor pada dasarnya adalah vektor yang menyimpan informasi tentang titik kunci, dan ini sangat penting saat kami melakukan pencocokan antara deskriptor gambar.
Dan kemudian tentukan pencocokan berbasis FLANN, kita tidak akan membahas teori matematika tentang pencocokan di belakangnya, tetapi Anda dapat dengan mudah mencari di Google tentang itu. Pertama, definisikan index kdtree ke nol kemudian kita setel index dan parameter pencarian dalam format kamus, kita tinggal tentukan algoritma yang akan kita gunakan yaitu KDTREE, dan jumlah pohon yang akan kita gunakan, semakin banyak pohon kami menggunakan semakin rumit dan lambat. Dan dalam parameter pencarian tentukan jumlah pemeriksaan, yang pada dasarnya adalah jumlah kecocokan yang akan diselesaikan.
Dan kemudian buat objek pencocok berbasis FLANN kami dengan memuat parameter yang kami tentukan sebelumnya yang merupakan parameter indeks dan parameter pencarian dan berdasarkan ini buat pencocok berbasis FLANN kami, yang merupakan pencocok KNN di mana KNN adalah tetangga terdekat K, pada dasarnya itu adalah cara di mana kami mencari pencocokan terdekat dan deskriptor dan kami melakukan pencocokan dengan konstanta inisialisasi k. Sekarang pencocok berbasis FLANN ini mengembalikan jumlah pertandingan yang kita dapatkan.
Pencocokan berbasis FLANN hanyalah perkiraan, sehingga untuk meningkatkan akurasi pencocok berbasis FLANN kami melakukan tes rasio Lowe dan apa yang dilakukannya adalah mencari kecocokan dari pencocok berbasis knn flann dan menentukan beberapa parameter matriks yang jarak di sini, yang jaraknya merupakan fungsi numpy, dan setelah memenuhi kriteria, tambahkan kecocokan ke kecocokan bagus dan kembalikan kecocokan bagus yang ditemukan, sehingga streaming video langsung memberi tahu jumlah kecocokan yang ditemukan di sudut layar.
Sekarang mari kita lihat kode untuk deskripsi di atas:
import cv2 import numpy as np def sift_detector (new_image, image_template): # Fungsi yang membandingkan gambar input dengan template # Kemudian mengembalikan jumlah SIFT yang cocok di antara mereka image1 = cv2.cvtColor (new_image, cv2.COLOR_BGR2GRAY) image2 = image_template # Buat Objek detektor SIFT #sift = cv2.SIFT () sift = cv2.xfeatures2d.SIFT_create () # Dapatkan titik kunci dan deskriptor menggunakan SIFT keypoints_1, descriptors_1 = sift.detectAndCompute (image1, None) keypoints_2, descriptors_2 = sift.detect Tidak ada) # Tentukan parameter untuk Flann Matcher kami FLANN_INDEX_KDTREE = 0 index_params = dict (algoritme = FLANN_INDEX_KDTREE, pohon = 3) search_params = dict (checks = 100) # Buat objek Flann Matcher flann = cv2.FlannBasedMatcher (index_params, search_params) # Dapatkan kecocokan menggunakan Metode K-Nearest Neighbor # hasil 'kecocokan' adalah jumlah kecocokan serupa yang ditemukan di kedua gambar yang cocok = flann.knnMatch (descriptors_1, descriptors_2, k = 2) # Simpan kecocokan bagus menggunakan uji rasio Lowe good_matches = untuk m, n dalam kecocokan: jika m.distance <0.7 * n.distance: good_matches.append (m) return len (good_matches) cap = cv2.VideoCapture (0) # Muat template gambar kita, ini gambar referensi kita image_template = cv2.imread ('phone.jpg', 0) sedangkan True: # Get webcam images ret, frame = cap.read () # Dapatkan tinggi dan lebar tinggi frame webcam , lebar = frame.shape # Tentukan Dimensi ROI Box top_left_x = int (width / 3) top_left_y = int ((height / 2) + (height / 4)) bottom_right_x = int ((width / 3) * 2) bottom_right_y = int ((height / 2) - (height / 4)) # Gambar jendela persegi panjang untuk wilayah yang kita minati cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), 255, 3) # Pangkas jendela observasi yang kita definisikan di atas cropped = frame # Balik orientasi frame secara horizontal frame = cv2.flip (frame, 1) # Dapatkan jumlah kecocokan SIFT = sift_detector (dipotong, image_template) # Tampilkan status string yang menunjukkan no saat ini. dari kecocokan cv2.putText (frame, str (kecocokan), (450.450), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 1) # Ambang batas kami untuk menunjukkan deteksi objek # Kami menggunakan 10 karena detektor SIFT mengembalikan sedikit kesalahan positif threshold = 10 # Jika kecocokan melebihi ambang kita maka objek telah terdeteksi jika cocok> threshold: cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), (0,255,0), 3) cv2.putText (frame, 'Object Found', (50,50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 2) cv2.imshow ('Object Detector using SIFT', frame) jika cv2.waitKey (1) == 13: # 13 adalah Enter Key break cap.release () cv2.destroyAllWindows ()
Deteksi objek menggunakan ORB
Deteksi objek menggunakan SIFT cukup keren dan akurat, karena menghasilkan jumlah kecocokan yang lebih akurat berdasarkan keypoints, namun dipatenkan dan membuatnya sulit untuk digunakan untuk aplikasi komersial, jalan keluar lain untuk itu adalah algoritma ORB untuk deteksi objek.
Mirip dengan metode deteksi objek dengan SIFT di mana kami membagi program menjadi dua bagian, hal yang sama akan diikuti di sini.
Pertama, kita mendefinisikan fungsi ORB_detector yang mengambil dua input satu adalah gambar streaming langsung yang berasal dari webcam dan lainnya adalah template gambar yang akan kita cocokkan dengan gambar kita. Kemudian kami membuat skala abu-abu gambar webcam kami dan kemudian menginisialisasi detektor ORB kami, dan kami menyetelnya di sini pada 1000 poin kunci dan parameter skala 1,2. Anda dapat dengan mudah bermain-main dengan parameter ini, kemudian mendeteksi keypoints (kp) dan deskriptor (des) untuk gambar dan parameter kedua yang kami definisikan dalam fungsi detectANDCompute adalah TIDAK ADA, itu meminta penggunaan topeng gambar atau tidak dan kami menyangkalnya di sini.
Kemudian pindah ke detektor yang sebelumnya kita telah menggunakan pencocokan berbasis FLANN, tetapi di sini kita akan menggunakan BFMatcher dan di dalam BFMatcher kita mendefinisikan dua parameter satu adalah NORM_HAMMING dan lainnya adalah crossCheck yang nilainya BENAR.
Kemudian hitung kecocokan kecocokan antara dua gambar menggunakan deskriptor yang ditentukan di atas, yang secara keseluruhan mengembalikan jumlah kecocokan karena kecocokan ini bukan perkiraan dan karenanya tidak perlu melakukan uji rasio Lowe, sebagai gantinya kita mengurutkan kecocokan berdasarkan jarak, setidaknya jarak lebih banyak pertandingan lebih baik (di sini jarak berarti jarak antar titik), dan pada akhirnya kami mengembalikan jumlah pertandingan menggunakan fungsi panjang.
Dan dalam fungsi utama kami menetapkan ambang ke nilai yang jauh lebih tinggi, karena detektor orb menghasilkan banyak kebisingan.
Sekarang mari kita lihat kode untuk deteksi berbasis ORB
import cv2 import numpy sebagai np def ORB_detector (new_image, image_template): # Fungsi yang membandingkan gambar input dengan template # Kemudian mengembalikan jumlah ORB yang cocok di antara mereka image1 = cv2.cvtColor (new_image, cv2.COLOR_BGR2GRAY) # Buat detektor ORB dengan 1000 titik kunci dengan faktor piramida skala 1.2 orb = cv2.ORB_create (1000, 1.2) # Deteksi titik kunci gambar asli (kp1, des1) = orb.detectAndCompute (image1, None) # Detect keypoints dari gambar yang diputar (kp2, des2) = orb.detectAndCompute (image_template, None) # Buat matcher # Perhatikan bahwa kita tidak lagi menggunakan pencocokan berbasis Flann bf = cv2.BFMatcher (cv2.NORM_HAMMING, crossCheck = True) # Lakukan pencocokan pencocokan = bf.match (des1, des2) # Urutkan pertandingan berdasarkan jarak. Jarak terkecil # lebih baik cocok = diurutkan (cocok, key = lambda val: val.distance) return len (cocok) cap = cv2.VideoCapture (0) # Muat template gambar kami, ini adalah gambar referensi kami image_template = cv2.imread ('phone.jpg', 0) # image_template = cv2.imread ('images / kitkat.jpg', 0) sedangkan True: # Get webcam images ret, frame = cap.read () # Dapatkan tinggi dan lebar tinggi frame webcam , width = frame.shape # Tentukan Dimensi Kotak ROI (Perhatikan beberapa hal ini harus berada di luar loop) top_left_x = int (width / 3) top_left_y = int ((height / 2) + (height / 4)) bottom_right_x = int ((width / 3) * 2) bottom_right_y = int ((height / 2) - (height / 4)) # Gambar jendela persegi panjang untuk region of interest cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), 255, 3) # Crop window observasi yang kita definisikan di atas cropped = frame # Flip orientasi frame horizontal frame = cv2.flip (frame, 1) # Dapatkan jumlah pertandingan ORB cocok = ORB_detector (dipotong, image_template) # Tampilkan status string yang menunjukkan no saat ini. dari kecocokan output_string = "Matches =" + str (kecocokan) cv2.putText (frame, output_string, (50.450), cv2.FONT_HERSHEY_COMPLEX, 2, (250,0.150), 2) # Ambang batas kami untuk menunjukkan deteksi objek # Untuk gambar baru atau kondisi keringanan Anda mungkin perlu sedikit bereksperimen # Catatan: Detektor ORB untuk mendapatkan 1000 pertandingan teratas, 350 pada dasarnya adalah min 35% ambang kecocokan = 250 # Jika kecocokan melebihi threshold maka objek telah terdeteksi jika cocok> threshold: cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), (0,255,0), 3) cv2.putText (frame, 'Object Found', (50, 50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 2) cv2.imshow ('Object Detector menggunakan ORB', frame) jika cv2.waitKey (1) == 13: # 13 adalah Enter istirahat topi.release () cv2.destroyAllWindows ()
Histogram Gradien Berorientasi (HOG's)
Sekarang mari kita bicara tentang deskriptor berbeda yaitu Histogram of Oriented Gradients (HOG's).
HOG adalah deskriptor yang cukup keren dan berguna dan secara luas dan berhasil digunakan untuk deteksi objek, seperti yang terlihat sebelumnya, deskriptor gambar seperti SIFT dan ORB di mana kita harus menghitung titik tombol dan kemudian harus menghitung deskriptor dari titik kunci tersebut, HOG melakukan proses itu berbeda. Ini mewakili objek sebagai vektor fitur tunggal sebagai lawan dari serangkaian vektor fitur di mana masing-masing mewakili segmen gambar. Artinya kita memiliki fitur vektor tunggal untuk keseluruhan gambar.
Ini dihitung oleh detektor jendela geser di atas gambar, di mana deskriptor HOG dihitung untuk setiap posisi. Dan kemudian setiap posisi digabungkan untuk satu vektor fitur.
Seperti SIFT, skala gambar disesuaikan dengan pyramiding.
Sebelumnya kami telah menggunakan pencocokan seperti FLANN dan BFMatcher, tetapi HOG melakukannya secara berbeda dengan bantuan pengklasifikasi SVM (mesin vektor dukungan), di mana setiap deskriptor HOG yang dihitung diumpankan ke pengklasifikasi SVM untuk menentukan apakah objek tersebut ditemukan atau tidak.
Berikut tautan ke Makalah Hebat oleh Dalal & Triggs tentang penggunaan HOG untuk Deteksi Manusia:
Histogram Gradien Berorientasi (HOG's), Langkah demi Langkah:
Memahami HOG bisa jadi cukup rumit, tapi di sini kita hanya akan membahas teori HOG saja tanpa mendalami matematika yang terkait dengannya.
Jadi mari kita ambil gambar ini sedikit pixelated, dan di sudut atas adalah kotak 8x8 piksel di sini, jadi di kotak ini kami menghitung vektor gradien atau orientasi tepi pada setiap piksel. Jadi artinya dalam kotak ini kita menghitung vektor gradien gambar dari piksel di dalam kotak (mereka semacam arah atau aliran intensitas gambar itu sendiri), dan ini menghasilkan vektor gradien 64 (8 x 8) yang kemudian direpresentasikan sebagai histogram. Jadi bayangkan histogram yang mewakili setiap vektor gradien. Jadi jika semua titik atau intensitas terletak pada satu arah, histogram untuk arah tersebut katakanlah 45 derajat, histogram akan memuncak pada 45 derajat.
Jadi apa yang kita lakukan sekarang adalah kita membagi setiap sel menjadi nampan sudut, di mana setiap nampan sesuai dengan arah gradien (misalnya x, y). Dalam makalah Dalal dan Triggs, mereka menggunakan 9 nampan0-180 ° (masing-masing nampan 20 °). Ini secara efektif mengurangi 64 vektor menjadi hanya 9 nilai. Jadi apa yang telah kami lakukan adalah memperkecil ukurannya tetapi tetap menyimpan semua informasi penting yang diperlukan.
Langkah selanjutnya dalam menghitung babi adalah normalisasi, kita menormalkan gradien untuk memastikan invariansi terhadap perubahan iluminasi yaitu Brightness dan Contrast.
Pada gambar ini, nilai intensitas ditampilkan dalam persegi sesuai dengan arah masing-masing dan semuanya memiliki selisih 50 antara satu sama lain
∆ H = 50, ∆ v = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707
Kami membagi vektor dengan besaran gradien yang kami dapatkan 0,707 untuk semua, ini adalah normalisasi.
Demikian pula, jika kita mengubah intensitas atau kontras kita mendapatkan nilai di bawah ini.
∆ H = 50, ∆ v = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707; ∆ H = 100, ∆ v = 100; │∆│ = √100 2 +100 = 141,42, 141,42 / 100 = 1,41
Normalisasi tidak terjadi pada level sel, melainkan terjadi di level blok, jadi di sini blok pada dasarnya adalah sekelompok 4 sel, ini memperhitungkan blok tetangga sehingga menormalkan sambil mempertimbangkan segmen gambar yang lebih besar.
Sekarang mari kita lihat kodenya
import numpy as np import cv2 import matplotlib.pyplot as plt # Load image then grayscale image = cv2.imread ('elephant.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # Tampilkan Gambar asli cv2.imshow (' Input Image ', image) cv2.waitKey (0) #menentukan parameter, ukuran sel dan ukuran blok # hxw dalam piksel cell_size = (8, 8) # hxw dalam sel block_size = (2, 2) # jumlah nbins orientasi bin = 9 # Menggunakan OpenCV's HOG Descriptor # winSize adalah ukuran gambar yang dipangkas menjadi kelipatan ukuran sel hog = cv2.HOGDescriptor (_winSize = (gray.shape // cell_size * cell_size, grey.shape // cell_size * cell_size), _blockSize = (block_size * cell_size, block_size * cell_size), _blockStride = (cell_size, cell_size), _cellSize = (cell_size, cell_size), _nbins = nbins) # Buat bentuk numpy array yang kita gunakan untuk membuat hog_features n_cells = (grey.shape // cell_size, grey.shape // cell_size) # Kita mengindeks blok demi baris terlebih dahulu. # hog_feats sekarang berisi amplitudo gradien untuk setiap arah, # untuk setiap sel dari grupnya untuk setiap grup. Pengindeksan adalah dengan baris kemudian kolom. hog_feats = hog.compute (abu-abu).reshape (n_cells - block_size + 1, n_cells - block_size + 1, block_size, block_size, nbins).transpose ((1, 0, 2, 3, 4)) # Buat array gradien kami dengan dimensi nbin untuk menyimpan gradien orientasi gradien = np.zeros ((n_cells, n_cells, nbins)) # Buat array dimensi cell_count = np.full ((n_cells, n_cells, 1), 0, dtype = int) # Blokir Normalisasi untuk off_y dalam kisaran (block_size): untuk off_x dalam kisaran (block_size): gradien - blok_ukuran + off_y + 1, off_x: n_cells - block_size + off_x + 1] + = \ hog_feats cell_count - block_size + off_y + 1, off_x: n_cells - block_size + off_x + 1] + = 1 # Gradien gradien rata-rata / = jumlah_sel # Plot HOG menggunakan Matplotlib # sudut 360 / nbins * arah color_bins = 5 plt.pcolor (gradien) plt.gca (). invert_yaxis () plt.gca (). set_aspect ('equal', adjustable = 'box') plt.colorbar () plt.show () cv2.destroyAllWindows ()
Gambar menunjukkan bagaimana gambar masukan direpresentasikan sebagai representasi HOG.
Pengklasifikasi kaskade HAAR
Seperti yang telah dibahas sebelumnya, kita dapat mengekstrak fitur dari sebuah gambar dan menggunakan fitur tersebut untuk mengklasifikasikan atau mendeteksi objek.
Apa itu Pengklasifikasi Kaskade HAAR?
Metode deteksi objek yang memasukkan fitur Haar ke dalam serangkaian pengklasifikasi (kaskade) untuk mengidentifikasi objek dalam gambar. Mereka dilatih untuk mengidentifikasi satu jenis objek, namun kita dapat menggunakan beberapa di antaranya secara paralel, misalnya mendeteksi mata dan wajah secara bersamaan.
Klasifikasi HAAR Dijelaskan:
Pengklasifikasi HAAR dilatih menggunakan banyak gambar positif (yaitu gambar dengan objek yang ada) dan
gambar negatif (yaitu gambar tanpa objek yang ada).
Setelah kami memiliki gambar tersebut, kami kemudian mengekstrak fitur menggunakan jendela geser dari blok persegi panjang. Fitur ini (fitur HAAR) memiliki nilai tunggal dan dihitung dengan mengurangi jumlah intensitas piksel di bawah persegi panjang putih dari persegi panjang hitam.
Namun, ini adalah jumlah kalkulasi yang konyol, bahkan untuk jendela dasar 24 x 24 piksel (180.000 fitur dihasilkan).
Jadi para peneliti menemukan metode yang disebut Gambar Integral yang menghitung ini dengan empat referensi larik. Namun, mereka masih memiliki 180.000 fitur dan sebagian besar tidak menambah nilai nyata.
Boosting kemudian digunakan untuk menentukan fitur yang paling informatif, dengan Freund & Schapire's AdaBoost dan menemukan fitur paling informatif dalam gambar. Meningkatkan adalah proses di mana kami menggunakan pengklasifikasi lemah untuk membangun pengklasifikasi yang kuat, hanya dengan menetapkan penalti yang lebih berat pada klasifikasi yang salah. Mengurangi 180.000 fitur menjadi 6000, yang merupakan fitur yang masih cukup banyak.
Dalam 6000 fitur tersebut, beberapa akan lebih informatif daripada yang lain. Jadi, jika kami menggunakan fitur paling informatif untuk terlebih dahulu memeriksa apakah wilayah tersebut berpotensi memiliki wajah (positif palsu bukanlah masalah besar). Melakukannya menghilangkan kebutuhan untuk menghitung semua 6000 fitur sekaligus. Konsep ini disebut Cascade of Classifiers - untuk deteksi wajah, metode Viola Jones menggunakan 38 tahapan.
Deteksi Wajah & Mata
Jadi setelah mendapatkan beberapa pengetahuan teoritis tentang kaskade HAAR kita akhirnya akan menerapkannya, sehingga untuk memperjelas kita akan memecah pelajaran menjadi beberapa bagian, pertama kita akan mendeteksi wajah frontal setelah itu kita akan bergerak untuk mendeteksi wajah frontal dengan mata dan akhirnya kami akan melakukan deteksi langsung pada wajah dan mata melalui webcam.
Jadi untuk ini kita akan menggunakan pengklasifikasi terlatih yang telah disediakan oleh OpenCV sebagai file.xml, xml adalah singkatan dari bahasa markup yang dapat diperluas, bahasa ini digunakan untuk menyimpan sejumlah besar data, Anda bahkan dapat membangun database di atasnya.
Anda dapat memiliki akses pengklasifikasi ini di tautan ini .
Deteksi wajah
Mari kita coba untuk deteksi wajah frontal, Anda dapat memiliki akses untuk rangkaian detektor wajah frontal di sini. Ekstrak saja file zip untuk mendapatkan file xml.
import numpy as np import cv2 # Kami mengarahkan fungsi CascadeClassifier OpenCV ke tempat # classifier (format file XML) kami disimpan, ingatlah untuk menyimpan kode dan classifier dalam folder yang sama face_cascade = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') # Muat gambar kami kemudian mengubahnya menjadi grayscale image = cv2.imread ('Trump.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # Pengklasifikasi kami mengembalikan ROI dari wajah yang terdeteksi sebagai tupel # Ini menyimpan kiri atas koordinat dan koordinat kanan bawah # mengembalikan daftar daftar, yang merupakan lokasi berbagai wajah yang terdeteksi. face = face_cascade.detectMultiScale (abu-abu, 1.3, 5) # Ketika tidak ada wajah yang terdeteksi, face_classifier kembali dan kosongkan tupel jika wajah adalah (): print ("Tidak ada wajah yang ditemukan") # Kami mengulang melalui array wajah kami dan menggambar persegi panjang # di atas setiap wajah di wajah untuk (x, y, w, h) di wajah: cv2. rectangle (gambar, (x, y), (x + w, y + h), (127,0.255), 2) cv2.imshow ('Face Detection', image) cv2.waitKey (0) cv2.destroyAllWindows ()
Sekarang mari kita gabungkan deteksi wajah dan mata, Anda dapat memiliki akses untuk rangkaian detektor mata dalam file zip yang sama.
impor numpy sebagai np import cv2 face_classifier = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier ('haarcascade_eye.xml') img = cv2.imread ('Trump.jpg') abu-abu = cv2.cvtColor cv2.COLOR_BGR2GRAY) face = face_classifier.detectMultiScale (abu-abu, 1.3, 5) # Saat tidak ada wajah yang terdeteksi, face_classifier kembali dan kosongkan tuple jika wajah adalah (): print ("Tidak Ada Wajah Ditemukan") untuk (x, y, w, h) di wajah: cv2.rektangle (img, (x, y), (x + w, y + h), (127,0,255), 2) cv2.imshow ('img', img) roi_gray = abu-abu roi_color = img eyes = eye_classifier.detectMultiScale (roi_gray) cv2.waitKey (0) untuk (ex, ey, ew, eh) di mata: cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (255,255,0), 2) cv2.imshow ('img', img) cv2.waitKey (0) cv2.destroyAllWindows () cv2.waitKey (0)
Jadi kode ini sama dengan kode untuk deteksi wajah, tetapi di sini kami telah menambahkan kaskade mata dan metode untuk mendeteksinya, seperti yang Anda lihat, kami telah memilih versi skala Abu-abu dari wajah sebagai parameter untuk detectMultiScale untuk mata, yang membawa kita pada pengurangan komputasi karena kita hanya akan mendeteksi mata hanya di area itu saja.
Deteksi Wajah dan Mata Langsung
Jadi sampai sekarang kita telah melakukan deteksi wajah dan mata, sekarang mari kita terapkan hal yang sama dengan streaming video langsung dari webcam. Dalam hal ini kita akan melakukan pendeteksian wajah dan mata yang sama tetapi kali ini kita akan melakukannya untuk live streaming dari webcam. Di sebagian besar aplikasi, Anda akan menemukan wajah Anda disorot dengan kotak di sekitarnya, tetapi di sini kami telah melakukan sesuatu yang berbeda sehingga Anda akan menemukan wajah Anda terpotong dan mata hanya akan mengidentifikasi.
Jadi di sini kita mengimpor pengklasifikasi wajah dan mata, dan menetapkan fungsi untuk melakukan semua pemrosesan untuk deteksi wajah dan mata. Dan setelah itu memulai streaming webcam dan memanggil fungsi pendeteksi wajah untuk mendeteksi wajah dan mata. Parameter yang kami tentukan di dalam fungsi detektor wajah adalah gambar berkelanjutan dari streaming kamera web langsung
impor cv2 impor numpy sebagai np face_classifier = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier ('haarcascade_eye.xml') def face_detector (img, size = 0.5): # Konversikan gambar ke grayscolor2 (img, cv2.COLOR_BGR2GRAY) wajah = face_classifier.detectMultiScale (abu-abu, 1.3, 5) jika wajah adalah (): kembalikan img untuk (x, y, w, h) di wajah: x = x - 50 w = w + 50 y = y - 50 h = h + 50 cv2. rectangle (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = abu-abu roi_color = img mata = eye_classifier.detectMultiScale (roi_gray) untuk (ex, ey, ew, eh) di mata: cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (0,0,255), 2) roi_color = cv2.flip (roi_color, 1) return roi_color cap = cv2.VideoCapture (0) sementara True: ret, frame = cap.read () cv2.imshow ('Our Face Extractor', face_detector (frame)) jika cv2.waitKey (1) == 13: # 13 adalah Enter Key break cap.release () cv2.destroyAllWindows ()
Tuning Pengklasifikasi Kaskade
Parameter yang ditentukan di dalam detectMultiScale selain gambar masukan memiliki signifikansi berikut
ourClassifier. detectMultiScale (gambar masukan, Faktor Skala, Min Neighbours)
- Scale Factor Menentukan seberapa banyak kita mengurangi ukuran gambar setiap kali kita mengatur skala. Misalnya dalam deteksi wajah biasanya kami menggunakan 1.3. Ini berarti kami mengurangi gambar sebesar 30% setiap kali diskalakan. Nilai yang lebih kecil, seperti 1,05 akan membutuhkan waktu lebih lama untuk dihitung, tetapi akan meningkatkan laju deteksi.
- Min Neighbours Menentukan jumlah tetangga yang harus dimiliki setiap jendela potensial untuk menganggapnya sebagai deteksi positif. Biasanya diatur antara 3-6. Ini berfungsi sebagai pengaturan sensitivitas, nilai rendah terkadang akan mendeteksi beberapa wajah di satu wajah. Nilai tinggi akan memastikan lebih sedikit positif palsu, tetapi Anda mungkin kehilangan beberapa wajah.
Deteksi Mobil dan Pejalan Kaki dalam video
Sekarang kami akan mendeteksi pejalan kaki dan mobil dalam video menggunakan kaskade HAAR, tetapi jika tidak ada video yang memuat dan kode dikompilasi tanpa kesalahan, Anda perlu mengikuti langkah-langkah berikut:
Jika tidak ada video yang dimuat setelah menjalankan kode, Anda mungkin perlu menyalin opencv_ffmpeg.dl kami dari : opencv \ sources \ 3rdparty \ ffmpeg untuk menempelkannya di tempat python Anda diinstal misalnya C: \ Anaconda2
Setelah disalin, Anda harus mengganti nama file sesuai dengan versi OpenCV yang Anda gunakan.eg jika Anda menggunakan OpenCV 2.4.13 kemudian ganti nama file sebagai: opencv_ffmpeg2413_64.dll atau opencv_ffmpeg2413.dll (jika Anda menggunakan mesin X86) opencv_ffmpeg310_64.dll atau opencv_ffmpeg310.dll (jika Anda menggunakan mesin X86)
Untuk mengetahui di mana Anda python.exe diinstal, cukup jalankan dua baris kode ini, itu akan mencetak lokasi tempat python diinstal.
impor sys print (sys.executable)
Sekarang jika Anda telah berhasil melakukan langkah-langkah ini, mari beralih ke kode untuk deteksi pejalan kaki, Anda dapat memiliki kaskade untuk deteksi pejalan kaki dan dari file zip yang dilampirkan di sini.
import cv2 import numpy as np # Buat pengklasifikasi tubuh kita body_classifier = cv2.CascadeClassifier ('haarcascade_fullbody.xml') # Mulai pengambilan video untuk file video, di sini kita menggunakan file video di mana pejalan kaki akan terdeteksi cap = cv2.VideoCapture ('walking.avi') # Loop setelah video berhasil dimuat sementara cap.isOpened (): # Membaca setiap frame ret ret, frame = cap.read () # di sini kami mengubah ukuran frame, menjadi setengah dari ukurannya, kami melakukan untuk mempercepat klasifikasi # karena gambar yang lebih besar memiliki lebih banyak jendela untuk digeser, jadi secara keseluruhan kami mengurangi resolusi # dari video setengahnya itulah yang ditunjukkan 0,5, dan kami juga menggunakan metode interpolasi yang lebih cepat yaitu #interlinear frame = cv2.resize (frame, None, fx = 0.5, fy = 0.5, interpolation = cv2.INTER_LINEAR) grey = cv2. cvtColor (frame, cv2.COLOR_BGR2GRAY) # Lewati frame ke body classifier kami body = body_classifier.detectMultiScale (abu-abu, 1.2, 3) # Ekstrak kotak pembatas untuk setiap benda yang diidentifikasi untuk (x, y, w, h) dalam tubuh: cv2. persegi panjang (bingkai, (x, y), (x + w, y + h), (0, 255, 255), 2) cv2.imshow ('Pejalan kaki', bingkai) jika cv2.waitKey (1) == 13: # 13 adalah Enter Key break cap.release () cv2.destroyAllWindows ()
Setelah berhasil mendeteksi pejalan kaki dalam video, mari pindah ke kode untuk Deteksi mobil, Anda dapat memiliki kaskade untuk deteksi pejalan kaki dari sini.
impor cv2 waktu impor impor numpy sebagai np # Buat pengklasifikasi tubuh kita car_classifier = cv2.CascadeClassifier ('haarcascade_car.xml') # Mulai pengambilan video untuk file video cap = cv2.VideoCapture ('cars.avi') # Ulangi setelah video berhasil dimuat saat cap.isOpened (): time.sleep (.05) # Baca ret frame pertama , frame = cap.read () grey = cv2.cvtColor (frame, cv2.COLOR_BGR2GRAY) # Lewati frame ke car classifier kami cars = car_classifier.detectMultiScale (abu-abu, 1.4, 2) # Ekstrak kotak pembatas untuk setiap benda yang diidentifikasi untuk (x, y, w, h) di mobil: cv2.rectangle (frame, (x, y), (x + w, y + h)), (0, 255, 255), 2) cv2.imshow ('Cars', frame) jika cv2.waitKey (1) == 13: # 13 adalah Enter Key break cap.release () cv2.destroyAllWindows ()
Anda telah memperhatikan bahwa kami telah menambahkan time.sleep (.05) , itu hanya penundaan dalam frekuensi gambar sehingga Anda dapat mengonfirmasi bahwa semua mobil diidentifikasi dengan benar, atau Anda dapat dengan mudah menghapusnya hanya dengan menambahkan label komentar padanya.
Artikel ini dirujuk dari Master Computer Vision ™ OpenCV4 dengan kursus Deep Learning di Udemy, dibuat oleh Rajeev Ratan, berlanggananlah untuk mempelajari lebih lanjut tentang Computer Vision dan Python.