Memperoleh informasi tentang usia dan jenis kelamin seseorang terjadi secara eksklusif dari foto wajahnya. Berdasarkan ini, kita dapat membagi tugas kita menjadi dua tahap utama:
- Mendeteksi wajah di gambar input.
- Ekstraksi wilayah minat (ROI - Wilayah Minat) dan penerapan algoritme detektor usia dan jenis kelamin orang tersebut.
Untuk tahap 1, ada banyak solusi yang siap pakai, misalnya: Haar cascades , HOG ((Histogram of Oriented Gradients), model deep learning, dll. Mari kita pertimbangkan ciri khas utama masing-masing:
- Haar cascade akan sangat cepat dan dapat berjalan dalam waktu nyata pada perangkat yang disematkan - masalahnya adalah perangkat tersebut kurang akurat dan sangat rentan terhadap kesalahan positif
- Model HOG lebih akurat daripada kaskade Haar, tetapi lebih lambat. Mereka juga tidak terlalu toleran terhadap oklusi (yaitu ketika bagian wajah disembunyikan)
- Detektor wajah pembelajaran mendalam adalah yang paling andal dan akan memberi Anda akurasi terbaik, tetapi membutuhkan lebih banyak sumber daya komputasi daripada kaskade Haar dan HOG
Untuk memilih metode yang cocok untuk tugas kami, kami melakukan analisis komparatif dari dua algoritme: Haar cascades dan jaringan neural konvolusional MTCNN (Multi-Task Cascaded Convolutional Neural Network). Dalam kasus pertama, pustaka OpenCV sudah berisi banyak pengklasifikasi yang telah disiapkan sebelumnya untuk wajah, mata, senyum, dll. (File XML disimpan di folder opencv / data / haarcascades /), dalam kasus kedua, Anda perlu menginstal pustaka menggunakan perintah pip install mtcnn ...
Mengimpor perpustakaan yang diperlukan
import cv2
from mtcnn import MTCNN
import matplotlib.pyplot as plt
image = cv2.cvtColor(cv2.imread('f.jpg'), cv2.COLOR_BGR2RGB) #
Di bawah ini adalah kode untuk menguji pengoperasian algoritma
MTCNN:
detector = MTCNN() #
result = detector.detect_faces(image) #
for i in range(len(result)):
bounding_box = result[i]['box'] #
cv2.rectangle(image, (bounding_box[0], bounding_box[1]),
(bounding_box[0]+bounding_box[2], bounding_box[1] + bounding_box[3]),
(0,155,255), 2) #
plt.imshow(image) #
haar cascade:
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # XML-
faces = face_cascade.detectMultiScale(image, 1.3, 5) #
for (x,y,w,h) in faces: #
cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2) #
plt.imshow(image) #
Mari kita jalankan serangkaian eksperimen untuk memeriksa kualitas algoritme.
- foto tunggal seseorang

- Beberapa orang di foto

- Beberapa orang di foto, jika pandangan tidak diarahkan ke bingkai

- Beberapa orang di foto saat sebagian wajahnya disembunyikan, misalnya dengan topeng

Kita dapat menyimpulkan bahwa dalam kondisi ideal (foto definisi tinggi, wajah diarahkan secara ketat ke dalam bingkai), kedua algoritme bekerja dengan sempurna, tetapi pada penyimpangan sekecil apa pun dari kondisi ini, kaskade Haar mulai gagal. Oleh karena itu, pilihan difokuskan pada penggunaan model MTCNN.
Sekarang kita telah menemukan pilihan metode untuk mendeteksi wajah di foto, mari kita lanjutkan ke tugas itu sendiri. Untuk menentukan usia dan jenis kelamin, dua model berbeda digunakan, dilatih pada sejumlah besar data. Kedua model tersebut dilatih oleh Levy dan Hassner, karya pertama mereka diterbitkan pada tahun 2015 dengan judul Klasifikasi Usia dan Gender Menggunakan Jaringan Saraf Konvolusional". Dalam pekerjaan mereka, mereka menunjukkan bahwa pelatihan menggunakan jaringan saraf konvolusional dalam (CNN) dapat mencapai peningkatan kinerja yang signifikan dalam tugas prediksi usia dan jenis kelamin.
Model yang dilatih pada kumpulan data Adience untuk prediksi usia dapat diunduh dari tautan 1 (* .caffemodel) dan tautan 2 (* .prototxt). Model ini memecahkan masalah klasifikasi, bukan regresi. Rentang usia dibagi menjadi beberapa interval tertentu ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)", "(38 -43) "," (48-53) "," (60-100) "], yang masing-masing merupakan kelas terpisah yang dapat diprediksi oleh model.
Untuk menentukan jenis kelamin, model diambil dari repositoriuntuk artikel " Memahami dan Membandingkan Jaringan Neural Dalam untuk Klasifikasi Usia dan Gender ". Model dapat diunduh dari tautan 1 (* .caffemodel) dan dari tautan 2 (* .prototxt). Model ini menggunakan arsitektur GoogleNet dan dilatih sebelumnya pada set data ImageNet .
Seperti yang Anda lihat, setiap model diwakili oleh dua file, yang berarti model tersebut dilatih menggunakan Caffe (kerangka kerja pembelajaran mesin yang dalam yang ditujukan untuk kemudahan penggunaan, kecepatan tinggi, dan modularitas). File dengan ekstensi prototxt bertanggung jawab atas arsitektur jaringan, dan file dengan ekstensi model caffemodel untuk bobot model.
Kode utama secara singkat disajikan di bawah ini, sebagai argumen untuk model yang kami berikan kepada orang yang didefinisikan di atas.
AGE_BUCKETS = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)","(38-43)", "(48-53)", "(60-100)"]
gender_list=['Male','Female']
faceBlob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), (78.4, 87.7, 114.8), swapRB=False)
ageNet.setInput(faceBlob)
age_preds = ageNet.forward()
age_i = age_preds[0].argmax()
age = AGE_BUCKETS[age_i]
ageConfidence = age_preds[0][age_i]
age_text = "{}: {:.2f}%".format(age, ageConfidence * 100) #
genderNet.setInput(faceBlob)
gender_preds = genderNet.forward()
gender_i = gender_preds[0].argmax()
gender=gender_list[gender_i]
genderConfidence = gender_preds[0][gender_i]
gender_text = "{}: {:.2f}%".format(gender, genderConfidence * 100) #
y = y1 - 10 if y1 - 10 > 10 else y1 + 10
cv2.rectangle(image, (x1, y1), (x1+width, y1 + height), (0,155,255),2)
v2.putText(image, display_text, (x1, y),
cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)
Hasil yang diperoleh selama pengembangan algoritma


Seperti yang Anda lihat, model tidak selalu menunjukkan hasil dengan benar, terkadang menetapkan jenis kelamin laki-laki pada foto yang menampilkan perempuan. Mungkin hal ini disebabkan oleh set tanggal yang tidak seimbang tempat model dilatih. Asalkan Anda memiliki sumber daya komputasi yang diperlukan, Anda dapat mencoba melatih model sendiri, ini akan memakan waktu, tetapi dengan set data yang seimbang dan arsitektur jaringan yang dipilih dengan benar serta parameter pelatihan, keakuratannya dapat meningkat.