CCTV sering digunakan untuk mengawasi ruangan baik terbuka atau tertutup dari kejadian yang tidak diinginkan seperti pencurian atau barang tertinggal. Namun, kerap kali kejadian yang tak diinginkan tersebut hanya terekam oleh CCTV dan sulit untuk ditindak lanjut. Kami menggunakan algortima pendeteksi identitas manusia untuk memperingatkan penjaga keamanan apabila terjadi kejadian tak diinginkan yang terekam oleh CCTV.
Algoritma dibuat menggunakan python. Jadi, segala penjelasan terkait modul yang diperlukan, kode yang diupload dan hal-hal lain terkait penggunaan algoritma yang kami buat disajikan dalam format yang digunakan python.
untuk dapat menjalankan seluruh algoritma yang kami buat, terdapat beberapa modul yang harus diinstall di python anda terlebih dahulu, yaitu :
- OpenCV (note : Harap menginstall modul opencv-contrib-python dikarenakan modul ini memuat modul utama sekaligus modul contrib yang bakal diperlukan selama proses pengerjaan)
- numpy
- imutils
- playsound
- time
Selain itu, dalam pengerjaan dan pengetesan kami menggunakan PyCharm Community Version dan juga Python Development Software sebagai IDE-nya. Anda dapat mendownload PyCharm secara gratis di sini dan Python Software disini. Apabila anda menggunakan IDE lain, harap diperhatikan bagaimana IDE tersebut bekerja. Karena bisa saja ada sedikit perbedaan dengan penjelasan yang kami berikan nantinya terkait menjalankan program
Untuk memahami bagaimana algoritma bekerja, mari kita definisikan kejadian tak diinginkan terlebih dahulu. Kami mendefinisikan kejadian tak diinginkan sebagai adanya orang tak dikenal saja pada CCTV yang terekam selama waktu tertentu. Ada 3 poin utama, yaitu :
- Hanya terdapat orang tak dikenal
- Orang tak dikenal terlihat oleh CCTV
- Orang tak dikenal terekam selama waktu tertentu
dari ketiga poin tersebut, maka kami membuat sebuah algoritma yang mampu :
- Mengetahui identitas orang melalui wajah yang terekam
- Mendeteksi orang tersebut
- Menentukan apakah orang tersebut terekam selama durasi waktu tertentu
Untuk mendeteksi wajah menggunaakan kamera, kami menggunakan algoritma Viola Jones. Prosedur deteksi wajah Viola-Jones mengklasifikasikan gambar berdasarkan pada nilai fitur sederhana. Sehingga metode algoritma Viola Jones merupakan salah satu metode deteksi wajah dengan tingkat akurasi yang tinggi dan komputasi yang cepat. Algoritma Viola Jones menggunakan fitur Haar sebagai deskriptor kemudian menggabungkan Integral Image dan AdaBoost Classifier untuk mencari dan melakukan seleksi nilai fitur dan membentuk Cascade Classifier. Classifier tersebut yang akan digunakan untuk mendeteksi wajah pada gambar. Jika tertarik untuk membaca lebih mendalam mengenai Algoritma Viola Jones dapat mengakses di sini atau untuk yang berbasis project bisa diakses disini
Untuk mendeteksi wajah, digunakan fungsi cv2.cascadeClassifier yang berfungsi untuk menetapkan objek yang ingin di deteksi berdasarkan pilihan classifier yang kita gunakan, anda bisa mendownload beberapa classifier yang telah disediakan oleh openCV disini. Anda bisa membuat classifier sendiri apabila ingin membuat dan melatih classifier untuk objek lainnya anda bisa mengaksesnya disini dan fungsi lainnya yaitu cascadeClassifier.detectMultiscale dengan beberapa parameter yang dapat diubah apabila menginginkan hasil yang berbeda dari hasil yang kami dapatkan. Untuk memahami lebih lanjut mengenai fungsi ini bisa diakses disini.
Berikut ini contoh deteksi wajah manusia yang kami lakukan
Untuk mengenali wajah, kami menggunakan sistem training terhadap classifier dengan menggunakan data training. Lalu hasil training akan dijadikan untuk penentu identitas wajah yang dideteksi dengan menggunakan fungsi faceRecognizer.predict yang merupakan fungsi bawaan dari openCV untuk mendeteksi kemiripan gambar dengan array input. Untuk memahami lebih dalam terkait fungsi ini bisa diakses disini.
Berikut ini contoh pengenalan id wajah manusia yang kami lakukan
Untuk uji coba bisa dilakukan dengan melakukan run pada code yang disediakan. Harap disesuaikan beberapa nama folder, directory dan parameter sesuai yang digunakan.
Untuk mendeteksi keberadaan manusia yang terekam kamera, kami menggunakan algoritma HOG-SVM. HOG(Histogram Oriented Gradients) merupakan fitur yang kami ekstraksi untuk membedakan mana manusia dan mana yang bukan. Jika anda tertarik lebih dalam mengenai HOG, anda dapat membacanya di sini. Kami menggunakan fungsi bawaan dari openCV untuk mengekstraksi fitur HOG, yang kemudian diklasifikasi oleh SVM.
SVM (Support Vector Machine) merupakan salah satu metode supervised machine learning. Metode ini sering dipakai untuk klasifikasi dua jenis benda. Sehingga cocok untuk tujuan kami yaitu mendeteksi manusia yang ada di rekaman CCTV. Apabila anda tertarik lebih jauh, anda dapar mempelajarinya di sini. Sama seperti HOG, kami mneggunakan fungsi yang ada dalam openCV untuk melakukan klasifikasi menggunakan SVM.
Berikut ini contoh deteksi manusia yang kami lakukan
Anda dapat melakukan deteksi manusia saja menggunakan Human_Recog.py. Parameter-parameter yang kami gunakan bertujuan untuk mendeteksi manusia dalam ruangan. Bila anda menginginkan deteksi di tempat lain atau merasa hasilnya kurang akurat, kami sarankan anda mengubah parameter fungsi hog.DetectMultiscale(). Penjelasan setiap parameter yang ada dalam fungsi tersebut dapat anda baca di sini
Selebihnya, anda hanya tinggal me-run saja kodenya. Jangan lupa untuk mengganti nama dan directory video dengan nama dan directory video yang anda ingin gunakan.
Untuk menentukan durasi deteksi, kami memanfaatkan fungsi hog.DetectMultiScale(). Fungsi tersebut mengembalikan lokasi manusia berbentuk koordinat. Sehingga dapat dijadikan acuan apakah dalam video terdeteksi manusia atau tidak. Durasi dapat dihitung dengan menggunakan array timestamp berisi tiga nilai, waktu pertama terdeteksi, waktu terakhir terdeteksi dan status. Kira-kira array akan terlihat seperti berikut.
timestamp [waktu awal,waktu akhir, durasi, status]
varaiabel status digunakan untuk menentukan apakah deteksi awal sudah dilakukan. Pada kode yang kami buat, nilai diset False ketika deteksi pertama belum dilakukan. Sehingga timestamp waktu awal akan diupdate. Kemudian status berubah menjadi True apabila deteksi pertama sudah dilakukan. Sehingga waktu akhir bisa diambil dan durasi bisa dihitung. Apabila durasi melebihi threshold, maka alarm akan menyala menggunakan fungsi playsound(). Anda bisa menggunakan suara alarm yang anda suka. Anda dapat melakukan pengetesan deteksi manusia sekaligus durasi dan alarm menggunakan HumanRecAndAlarm.py.
Beberapa hal yang perlu diperhatikan sebelum menggunakan program Face Recognition adalah sebagai berikut :
Dalam program terdapat fungsi untuk input gambar ataupun video pada line berikut
test_img = cv2.imread('FileName.jpg') #untuk input berupa gambar
dan
cap = cv2.VideoCapture('FileName.mp4') #untuk input berupa video
Anda dapat menggunakan nama file dan directory yang anda inginkan, misalnya
test_img=cv2.VideoCapture('D:\Test\FileName.mp4')
atau, anda juga dapat menggunakan stream online melalui rtsp atau sejenisnya, misalnya
cap = cv2.VideoCapture('rtsp://root:[email protected]:554/axis-media/media.amp')
dan
cap = cv2.VideoCapture('https://www.dropbox.com/s/39f9fo9ch4gqoig/sample_video.mp4')
Namun, untuk penggunaan stream online perlu diperhatikan beberapa hal yaitu versi openCV haruslah pada versi 3.4.1. Sehingga anda perlu melalukan beberapa update terhadap openCV yang anda gunakan.
- Fungsi .detectMultiscale merupakan fungsi bawaan openCV untuk mendeteksi objek yag ditetapkan classifier disini adalah wajah dan mengembalikan output berupa kotak pada objek yang teridentifikasi sebagai wajah yang untuk penggunaan Haarscasde Classifier maka dituliskan dalam program sebagai berikut
faces=face_haar_cascade.detectMultiScale(gray_img,scaleFactor=1.35,minNeighbors=5)
Terdapat 2 parameter utama pada fungsi ini yaitu scaleFactor dan minNeighbors. Untuk lebih lengkapnya bisa dilihat pada penjelasan fungsi .detectMultiscale dibagian atas. Untuk menggambarkan kotak kami menggunakan implementasi fungsi sebagai berikut
cv2.rectangle(test_img,(x,y),(x+w,y+h),(0,0,255),thickness=4)
dengan 2 parameter yang terdapat pada fungsi adalah warna kotak dan ketebalan garis tepi kotak yang dapat anda tukar sesuai keinginan.
- Fungsi .predict merupakan fungsi bawaan dari openCV yang merupakan bagian dari kelas fungsi faceRecognizer, dengan input berupa gambar atau frame video dan fungsi akan memberikan prediksi kemiripan terdekat dari gambar input dengan array data yang disediakan lalu akan diberikan output berupa nilai confidence atau nilai kemiripan gambar. Implementasinya pada program adalah sebagai berikut
label,confidence=face_recognizer.predict(roi_gray)
Parameter yang mempengaruhi hasil prediksi adalah data training yang telah kita latih sebelumnya. Semakin bagus kualitas dan kuantitas data training maka hasil prediksi akan semakin baik. Jadi harap anda memastikan data training yang anda gunakan adalah data yang cukup bagus. Lalu untuk penulisan ID wajah digunakan implementasi pada program sebagai berikut
cv2.putText(test_img,text,(x,y),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
Parameter yang digunakan pada implementasi diatas adalah jenis font, font scale, warna font dan ketebalan font. Parameter ini bisa ditukar sesuai keinginan anda.
Untuk mengenali wajah pada program, kita memerlukan data yang menjadi acuan dalam pengenalan wajah seseorang, dari data ini kita bisa memberikan identitas atau ID kepada wajah pada gambar apabila program memprediksi wajah pada gambar memiliki kecocokan dan kemiripan terhadap data wajah yang kita gunakan. Untuk mendapatkan data wajah ini, kita perlu melatih sistem untuk mempelajari gambar yang akan kita jadikan acuan.
Untuk melakukan training atau latihan terhadap sistem dapat anda lakukan dengan fungsi bawaan dari openCV yang merupakan bagian dari kelas fungsi faceRecognizer yaitu fungsi .train, dengan implementasi pada program sebagai berikut
face_recognizer.train(faces,np.array(faceID))
Parameter yang perlu diperhatikan sebagai inputan adalah gambar yang ingin dipelajari, dengan output nantinya berupa array data dan label. Nantinya, data ID wajah akan disimpan di file trainingData.yml, apabila file masih kosong maka harap dilaksanakan training terlebih dahulu, namun jika sudah berisi anda bisa langsung menggunakan data dengan cara load data di file tersebut.
Face Recognition menggunakan 3 program Python, yaitu
- faceRecognition.py yang berisi kumpulan fungsi untuk pengenalan wajah diantaranya fungsi untuk training, fungsi untuk memberi kotak pada wajah dan menulis id
- forImage.py untuk mencoba program mengenali wajah pada foto atau gambar
- forVideo.py untuk mencoba program mengenali wajah pada video
Untuk bisa menggunakan program anda perlu memperhatikan langkah berikut :
- Silahkan download program untuk face recognition di folder faceRecognition, anda akan menemukan 3 buah file Python seperti yang telah dijelaskan diatas.
- Letakkan gambar yang akan anda uji di folder testImages.
- Pada folder trainingImages, terdapat gambar yang akan dijadikan data training untuk melatih classifier mengenali beberapa orang yang diinginkan. Apabila ingin menambahkan jumlah orang yang dikenali bisa menambah folder dengan nama folder yang berbeda dari folder lainnya. (Bisa berupa angka seperti 0,1 dan 2)
- Tambahkan id atau label mereka pada file forImage.py dan forVideo.py, contohnya seperti implementasi dibawah
name={0:"Taylor",1:"Ronaldo",2:"Faruq",3:"Fadhil",4:"Unknown"}
- Buka file faceRecognition.py dan sesuaikan parameter fungsi .detectMultiscale sesuai kebutuhan anda dalam mendeteksi wajah.
- Untuk menggunakan program untuk deteksi wajah pada gambar bisa menggunakan program forImage.py, dengan memberikan path gambar pada variabel test_img.
- Untuk menggunakan program untuk deteksi wajah pada gambar bisa menggunakan program forVideo.py, dengan memberikan path gambar pada variabel cap.
- Sesuaikan confidence dengan hasil prediksi sistem untuk menampilkan id dari wajah yang diprediksi oleh sistem.
Terdapat 2 porgram yang dapat anda gunakan, yaitu :
- Human_Recog.py Program ini berisi algoritma deteksi manusia saja
- HumanRecAndAlarm.py Program ini berisi algoritma deteksi,durasi serta alarm
Beberapa hal yang perlu diperhatikan sebelum menggunakan program human detection (Human_Recognition.py dan HumanRecAndAlarm.py) adalah sebagai berikut :
dalam program yang dibuat, inisiallisasi video input terdapat pada line berikut
cap = cv2.VideoCapture('FileName.mp4')
anda dapat menggunakan nama file dan direktori yang anda inginkan, misalnya
cap = cv2.VideoCapture('D:\Video\FileName.mp4')
atau, anda juga dapat menggunakan stream online melalui rtsp atau sejenisnya, misalnya
cap = cv2.VideoCapture('rtsp://root:[email protected]:554/axis-media/media.amp')
Namun, perlu diperhatikan bahwa penggunaan url rtsp pada openCV dapat dilakukan pada versi 3.4.1. Apabila anda tidak memilikinya, anda perlu menginstall versi terbarunya atau menggunakan cara lain yang tersebar di internet.
Untuk video output, terdapat pada line berikut
out = cv2.VideoWriter('outputfilename.avi',cv2.VideoWriter_fourcc(*'MJPG'),fps,(640,480))
Kami tidak menyarankan anda mengubah parameter tersebut, kecuali nama outputfilename. apabila anda ingin mengubahnya, tolong dicari terlebih dahulu format videowriternya. Sama seperti video input, anda dapat mengganti nama video output dengan nama dan direktori yang diinginkan serta menggunakan video stream seperti rtsp.
Fungsi hog.DetectMultiScale mengembalikan lokasi manusia yang terdeteksi dalam bentuk koordinat. Dalam program, penggunaannya adalah sebagai berikut
(regions, _) = hog.detectMultiScale(frame, winStride=(4,4),padding=(4,4),scale=1.2)
Harap diingat, parameter yang digunakan dioptimalkan untuk penggunaan dalam ruangan. Apabila anda ingin menggunakannya di tempat yang berbeda, atau kurang puas dengan hasil akhir yang kami buat, anda dapat mengubah parameter sesuai yang diinginkan. Namun, jangan lupa untuk membaca arti dari parameter dalam fungsi tersebut di sini
Sebelum membuat kotak pembatas, kami menggunakan non-maximum suppression untuk menghindari overlap kotak yang memiliki objek deteksi yang sama.
Gambar di atas merupakan salah satu contoh penggunaan non-maximum suppression. Implementasi dalam program adalah sebagai berikut
regions = np.array([[x, y, x + w, y + h] for (x, y, w, h) in regions])
pick = non_max_suppression(regions, probs=None, overlapThresh=0.65)
Anda dapat membaca non-maximum suppression lebih jauh di sini Setelah melakukan non-maximum suppression, barulah kami menggambar kotak pembatasnya. Implementasinya adalah sebagai berikut
for (xA, yA, xB, yB) in pick:
cv2.rectangle(frame, (xA, yA), (xB, yB), (0, 255, 0), 2)
Dua parameter terakhir merupakan warna kotak dan ketebalan garis kotak. Anda dapat menggantinya sesuka hati.
Untuk menentukan durasi deteksi, kami memanfaatkan keluaran fungsi hog.DetectMultiScale berupa koordinat manusia yang terdeteksi. Apabila koordinat tersebut tidak kosong, maka artinya ada manusia yang terdeteksi. Sebaliknya, apabila kosong, maka manusia tidak terdeteksi dalam video. Implementasinya adalah sebagai berikut
if len(regions) == 0:
print('Human Not Detected')
else:
print('Human Detected')
if tsd[3] == False:
# Pertama kali deteksi, waktu awal diambil
tsd[0] = time.time()
tsd[3] = True
elif tsd[3] == True:
# Sudah pernah deteksi, waktu akhir diambil
tsd[1] = time.time()
tsd[2] = tsd[1] - tsd[0]
print("Waktu terdeteksi : ")
print(tsd, '\n')
dengan tsd merupakan variabel timestamp. Perlu diperhatikan bahwa elemen ke-4 dari tsd merupakan status yang menunjukkan apakah objek yang dideteksi baru pertama kali dideteksi atau tidak. Pengambilan waktu dan durasi diambil dalam satua detik.
Alarm akan menyala ketika durasi melebihi threshold yang ditentukan. Contoh implementasi dalam program adalah sebagai berikut
# Menyalakan Alarm bila durasi deteksi melebihi threshold
if (tsd[2] >= 10):
print("Alarm Triggerred!!!")
playsound("Industrial Alarm.wav")
break
Pada contoh, alarm akan menyala apabila durasi melebihi 10 detik. Kemudian keluar program setelah menyalakan alarm. Anda dapat mengubah suara alarm sesuai keinginan anda dengan mengubah input dari fungsi playsound().
Pada bagian ini, kami akan menjelaskan bagaimana anda menggunakan program hasil integrasi antara deteksi wajah dan deteksi manusia untuk mendeteksi tindak pencurian dalam ruangan. Source code yang anda gunakan seluruhnya terdapat pada folder FullProgram pada repo ini. Sebelum mencobanya, anda disarankan untuk membuat dataset dan men-train classifier deteksi wajah anda terlebih dahulu. Karena yang diupload hanyalah contoh saja. Dalam folder source code, terdapat beberapa file, yakni
file ini berisi program utama yang digunakan untuk deteksi tindak pencurian dalam ruangan.
file ini berisi fungsi-fungsi yang digunakan dalam deteksi manusia. Nantinya akan dipanggil oleh program utama
file ini berisi fungsi-fungsi yang digunakan dalam deteksi wajah sekaligus untuk train classifier yang digunakan untuk identifikasi wajah
file ini merupakan suara yang diputar ketika alarm menyala. Anda dapat mengubahnya sesuai selera. Cara mengubah suara alarm sudah dijelaskan sebelumnya
Untuk menjelaskan bagaimana keseluruhan program bekerja, anda dapat melihat flowchart berikut
Dari diagram di atas, bagian Face Detection, Human Detection dan Duration sudah dijelaskan di bagian sebelumnya. Kami akan menjelaskan terkait Room Status dan IsEmpty
Room Status merupakan variabel yang mendeskripsikan keadaan ruangan yang sedang dipantau. Pada program yang kami buat, nilai yang digunakan adalah
- 0 : ruangan kosong
- 1 : ruangan ditempati orang tak dikenali sistem
- 3 : ruangan ditempati orang yang dikenali sistem
fungsi adanya variabel ini adalah untuk memberikan keputusan akhir dalam menyalakan alarm. Alarm hanya akan menyala ketika orang tak dikenali sistem masuk (Room Status = 1) dan durasi deteksi melebihi threshold
Merujuk pada flowchart, IseEmpty digunakan saat Room Status = 2, atau orang yang ada di dalam ruangan dikenali oleh sistem. Fungsi IsEmpty berguna untuk mengembalikan Room Status menjadi 0 dengan memanfaatkan deteksi manusia dan durasi. Idenya adalah pada ruangan kosong, seharusnya tidak terdeteksi manusia sama sekali. Apabila sistem tidak mendeteksi manusia dalam jangka waktu tertentu, maka ruangan dapat dikatakan sudah kosong. Sehingga Room Status dapat diganti menjadi 0 kembali dan sistem kembali ke state awal. implementasi pada program adalah sebagai berikut
if status == 2 :
tsu =[0,0,0,False] #reset
regions = hd.detect(hog, resized_img, (4,4), (4, 4), 1.2)
hd.boxes(resized_img, regions)
if len(regions) == 0:
print('Human Not Detected')
if tsk[3] == False:
tsk[0] = time.time()
tsk[3] = True
elif tsk[3] == True:
tsk[1] = time.time()
tsk[2] = tsk[1] - tsk[0]
if status == 2:
print("Waktu tidak terdeteksi : ")
print(tsk, '\n')
if tsk[2] >= 2: # misal tidak terdeteksi (kosong) selama 5 detik
print("Reset Status menjadi 0")
status = 0 # ubah status jadi empty
Jadi, ketika fungsi deteksi manusia tidak mengembalikan lokasi keberadaan manusia, bisa diasumsikan tidak ada manusia dalam ruangan. Lalu durasi "tak terdeteksi" dihitung. apabila durasi mencapai threshold (dalam contoh diatur menjadi 5 detik) maka Room Status dikembalikan menjadi 0
Untuk mencoba sistem yang sudah terintegrasi, anda hanya perlu melakkukan :
- Download semua file di folder FullProgram/Source Code
- Train classifier wajah anda menggunakan dataset anda
- Gunakan forVideo.py sebagai main program. Atur parameter yang anda inginkan
- Jalankan program di IDE yang anda gunakan
Selesai. Selamat mencoba!