Этот проект посвящен классификации по возрасту и полу с использованием OpenCV и глубокого обучения (в частности, сверточных нейронных сетей или CNN) на одноплатном компьютере Raspberry Pi 4.
С ростом социальных платформ автоматическое определение возраста и пола по изображениям становится все более важным. Однако точность текущих методов на реальных фотографиях не так хороша, как прогресс, который мы наблюдаем в распознавании лиц. В этом исследовании мы демонстрируем, что использование глубоких сверточных нейронных сетей (convolutional neural networks, CNN) может значительно повысить точность классификации возраста и пола. Модель основана на модели Gil Levi & Tal Hassner, опубликованной в 2015 году. Она представляет собой простую конструкцию CNN, которая эффективна даже при небольшом количестве данных для обучения.
В этом руководстве мы узнаем, как использовать OpenCV и Deep Learning (глубокое обучение), чтобы определить возраст и пол человека с помощью Raspberry Pi 4. OpenCV — это инструмент, который помогает компьютерам понимать изображения и видео. Deep Learning — это способ, которым компьютеры обучаются на основе данных, подобно тому, как мы учимся на опыте. Объединив эти два понятия, мы можем заставить компьютер угадывать возраст и пол человека, глядя на его фотографию. К концу этого урока у вас будет полное представление о проекте классификации возраста и пола с OpenCV и Deep Learning на Raspberry Pi.
Ранее на нашем сайте мы уже рассматривали аналогичный проект определения пола и возраста людей с помощью Raspberry Pi и OpenCV, но, возможно, кому то данный проект понравится больше.
Необходимые компоненты
- Плата Raspberry Pi 4 Model B (или другая) (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- SD-карта 16/32 ГБ.
- Адаптер постоянного тока 5 В, 3 А для RPi.
- ЖК-дисплей (опционально).
- Мышь и клавиатура (опционально).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Подключение камеры Raspberry Pi
Raspberry Pi Camera — периферийное устройство, разработанное Raspberry Pi Foundation для использования с серией одноплатных компьютеров Raspberry Pi. Модуль камеры позволяет добавлять возможности видео/фотосъемки в проекты Raspberry Pi.
Для этого проекта мы можем использовать 5-мегапиксельную камеру Raspberry Pi.
Просто подключите модуль камеры к плате Raspberry Pi 4 с помощью разъема камеры.
Чтобы использовать камеру, вам нужно сначала включить модуль камеры. Откройте Raspberry Pi Configuration Tool, введя sudo raspi-config
в терминале. Перейдите к Interfacing Options
> Camera
и включите его.
Метод классификации по возрасту и полу
Модель, предложенная Леви и Хасснером в 2015 году, представляет собой сверточную нейронную сеть (CNN). CNN — это категория нейронных сетей, которые доказали свою высокую эффективность в таких областях как распознавание и классификация изображений. Их модель была обучена на наборе данных Adience, который не отфильтрован и не выровнен, что делает его подходящим для реальных изображений без ограничений.
Процесс классификации делится на два основных этапа:
- Шаг 1: Распознавание лиц – первый шаг включает сканирование входного видеопотока для обнаружения лиц. Это имеет решающее значение, поскольку последующая классификация основана на чертах лица.
- Шаг 2: Прогнозирование возраста и пола – после обнаружения лица следующим шагом является извлечение области интереса (Region of Interest, ROI) лица. Затем эта ROI подается в алгоритм определения возраста и пола. Алгоритм анализирует черты лица и прогнозирует как возраст, так и пол человека.
Прогноз пола классифицирует индивидуума как «Мужчина» или «Женщина». Для прогноза возраста модель классифицирует индивидуума в одну из предопределенных возрастных групп: (0 – 2), (4 – 6), (8 – 12), (15 – 20), (25 – 32), (38 – 43), (48 – 53) или (60 – 100).
Настройка Raspberry Pi, установка библиотек и зависимостей
OpenCV требуется для классификации по возрасту и полу и других задач обработки изображений, присутствующих в коде. Поэтому сначала вам нужно установить OpenCV. Следуйте следующему руководству, чтобы установить OpenCV в вашей системе:
1 |
pip3 install picamera |
Создайте папку в домашнем каталоге вашего Raspberry Pi с любым именем, например «Age_Gender_Classfication».
Код ссылается на несколько файлов, используемых для классификации возраста и пола. Загрузите эти файлы по следующим ссылкам:
- opencv_face_detector.pbtxt
- opencv_face_detector_uint8.pb
- age_deploy.prototxt
- age_net.caffemodel
- gender_deploy.prototxt
- gender_net.caffemodel
Добавьте эти файлы в папку, которую вы создали выше.
Настройка завершена. Теперь мы можем перейти к проекту классификации по возрасту и полу с OpenCV и глубоким обучением на Raspberry Pi.
Код Python для Raspberry Pi для классификации по возрасту и полу
Теперь давайте разработаем код Python, который поможет в классификации возраста и пола, используя библиотеку OpenCV и камеру Raspberry Pi.
Код Python
Откройте Thonny IDE и вставьте следующий код в редактор Thonny. Сохраните этот файл с любым именем, например «classification.py» в папке, которую мы создали ранее. Убедитесь, что все загруженные файлы присутствуют в каталоге, указанном в коде (/home/mypi/Age_Gender_Classfication/
).
Вот полный код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import cv2 def highlightFace(net, frame, conf_threshold=0.7): frameOpencvDnn = frame.copy() frameHeight = frameOpencvDnn.shape[0] frameWidth = frameOpencvDnn.shape[1] blob = cv2.dnn.blobFromImage(frameOpencvDnn, 1.0, (300, 300), [104, 117, 123], True, False) net.setInput(blob) detections = net.forward() faceBoxes = [] for i in range(detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > conf_threshold: x1 = int(detections[0, 0, i, 3] * frameWidth) y1 = int(detections[0, 0, i, 4] * frameHeight) x2 = int(detections[0, 0, i, 5] * frameWidth) y2 = int(detections[0, 0, i, 6] * frameHeight) faceBoxes.append([x1, y1, x2, y2]) cv2.rectangle(frameOpencvDnn, (x1, y1), (x2, y2), (0, 255, 0), int(round(frameHeight/150)), 8) return frameOpencvDnn, faceBoxes faceProto = "/home/mypi/Age_Gender_Classfication/opencv_face_detector.pbtxt" faceModel = "/home/mypi/Age_Gender_Classfication/opencv_face_detector_uint8.pb" ageProto = "/home/mypi/Age_Gender_Classfication/age_deploy.prototxt" ageModel = "/home/mypi/Age_Gender_Classfication/age_net.caffemodel" genderProto = "/home/mypi/Age_Gender_Classfication/gender_deploy.prototxt" genderModel = "/home/mypi/Age_Gender_Classfication/gender_net.caffemodel" MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746) ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)'] genderList = ['Male', 'Female'] faceNet = cv2.dnn.readNet(faceModel, faceProto) ageNet = cv2.dnn.readNet(ageModel, ageProto) genderNet = cv2.dnn.readNet(genderModel, genderProto) video = cv2.VideoCapture(0) padding = 20 hasFrame, frame = video.read() if not hasFrame: print("Couldn't read a frame from the video.") exit() desired_window_width = 480 ratio = desired_window_width / frame.shape[1] height = int(frame.shape[0] * ratio) while True: hasFrame, frame = video.read() if not hasFrame: break frame = cv2.resize(frame, (desired_window_width, height)) resultImg, faceBoxes = highlightFace(faceNet, frame) for faceBox in faceBoxes: face = frame[ max(0, faceBox[1] - padding):min(faceBox[3] + padding, frame.shape[0] - 1), max(0, faceBox[0] - padding):min(faceBox[2] + padding, frame.shape[1] - 1) ] blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), MODEL_MEAN_VALUES, swapRB=False) genderNet.setInput(blob) genderPreds = genderNet.forward() gender = genderList[genderPreds[0].argmax()] ageNet.setInput(blob) agePreds = ageNet.forward() age = ageList[agePreds[0].argmax()] text = "{}:{}".format(gender, age) cv2.putText(resultImg, text, (faceBox[0], faceBox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA) cv2.imshow("Detecting age and gender", resultImg) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break cv2.destroyAllWindows() video.release() |
Объяснение работы кода
Давайте разберем код и объясним каждый раздел:
1 |
import cv2 |
Эта строка импортирует библиотеку OpenCV — популярную библиотеку для задач компьютерного зрения.
1 2 3 |
def highlightFace(net, frame, conf_threshold=0.7): ... return frameOpencvDnn, faceBoxes |
Эта функция, highlightFace
, предназначена для обнаружения и выделения лиц на заданном изображении (frame
). Она использует модель глубокого обучения (net
) и порог достоверности (conf_threshold
). Функция возвращает изображение с выделенными лицами и ограничивающими рамками обнаруженных лиц.
1 2 3 4 |
faceProto = ".../opencv_face_detector.pbtxt" faceModel = ".../opencv_face_detector_uint8.pb" ... genderNet = cv2.dnn.readNet(genderModel, genderProto) |
Здесь задаются пути к различным предварительно обученным моделям и их конфигурации. Эти модели предназначены для обнаружения лиц, классификации возраста и классификации пола. Затем модели загружаются в память с использованием соответствующих путей.
1 2 3 4 5 |
video = cv2.VideoCapture(0) padding = 20 hasFrame, frame = video.read() ... height = int(frame.shape[0] * ratio) |
Веб-камера используется для захвата видеокадров. Первый кадр считывается для определения разрешения видео, а желаемая высота кадра рассчитывается на основе фиксированной ширины.
1 2 3 |
while True: ... cv2.imshow("Detecting age and gender", resultImg) |
Это основной цикл, в котором обрабатывается каждый кадр с веб-камеры. Для каждого кадра:
- Размер кадра изменяется.
- С помощью этой функции распознаются лица
highlightFace
. - Для каждого обнаруженного лица извлекается область лица, а пол и возраст прогнозируются с использованием соответствующих моделей.
- Предполагаемый пол и возраст отображаются на рамке.
- Обработанный кадр отображается в окне.
1 2 3 |
key = cv2.waitKey(1) & 0xFF if key == ord("q"): break |
В этом разделе проверяется нажатие клавиши. Если нажата клавиша «q», происходит выход из цикла.
1 2 |
cv2.destroyAllWindows() video.release() |
После выхода из цикла все окна OpenCV закрываются, и видеозахват прекращается.
Тестирование работы проекта
Запустите код выше. Сразу же появится окно, в котором будет показано изображение с камеры.
Для определения возраста и пола вы можете представить себя или другого человека перед камерой или использовать изображение. Возраст и пол будут показаны на экране.
Модель одинаково хорошо подходит как для мужчин, так и для женщин и позволяет точно определить возрастную группу.
Некоторые возрастные категории пропущены или не определены в коде, в этом случае отображается ближайшая возрастная группа.
Вы можете попробовать эту модель с группами меньшего или большего возраста.
Заключение
В заключение следует отметить, что наш проект успешно использовал возможности OpenCV и глубокого обучения для классификации возраста и пола по изображениям с использованием Raspberry Pi 4. Черпая вдохновение из модели Джила Леви и Тала Хасснера, мы продемонстрировали, что глубокие сверточные нейронные сети могут значительно повысить точность классификации даже при ограниченных данных для обучения.
Сочетание обработки изображений OpenCV и передовых методов обучения Deep Learning позволило нам создать надежную систему. В результате любой, кто использует наше руководство, теперь может эффективно определять возраст и пол по фотографиям, демонстрируя практическое применение интеграции передовых технологий в реальных сценариях.
11 просмотров