В этом небольшом проекте я буду классифицировать фотографий лиц людей (с любого ракуска: селфи, портретное фото и т.д.) на два класса: с очками на лице и без.
Задача классификаций будет решаться следуещим образом: запускается детектор лиц, который опредляет лица на картинке и вырезает их. Далее вырезанные части картинки подаются в классфикатор, который уже выдает конечный ответ для каждого лица на картинке (есть ли очки или нет). В качестве алгоритма определения лиц использован MTCNN, а код позаимстван с репозитория: https://github.com/kuaikuaikim/DFace . Остальные части проекта напсаны мною.
В качестве классификатора будут использоваться нексолько архитектур, такие как ResNet, MobileNetV2. Реализации этих архитектур взяты с офицального сайта PyTorch. Ниже в таблице приведены результаты по точности классификации (accuracy, F1) и скорости обработки одной картинки (в ms) каждой архитектуры и ее размеры (в MB).
Pytorch 0.4.1, Sklearn, Numpy, OpenCV, Augmentor, argparse
Картинки людей в очках собраны с сайта Google. Для парсинга была использована библиотка google_images_download по нескольким поисковым запросам: "faces_with_glasses", "man_with_glasses", "people with glasses", "selfie with glasses female", "selfie with glasses male", "women with glasses". Далее я вручную отчистил картинки от мусора и в итоге получил около 3194 картинок. После аугментации количество картинок увеличелось до 7423. В качестве способов аугментции я использовал рандомное вырезание, поворот и горизонтальный поворот по реккомендациям авторов следуещего пейпера: Data augmentation for face recognition (Jiang-JingLv et al).
Для парсинга:
$ python ImageCrawler.py [Arguments ...]
Картиник лиц без очков скачаны со следующего истчника: Selfie Data Set, http://crcv.ucf.edu/data/Selfie/
Данные для тренировки и валидации можно скачать со облака: https://drive.google.com/open?id=1XQSmfp4Fmi_IjqEtL7gXoPVYvwY_XxyW
Скачаннай данные поместите в проект в папку под названием Dataset и запустите следующий скрипт чтобы сгенерировать аннотационный файл:
$ python GenAnnoFile.py --dataset_dir <your_path>
Для тренировки ResNet запустите:
$ python Train.py --lr 0.005 --model_name ResNet --pretrained None
Оценка алгоритма В качастве метрики на валидационном датасете были использованы Accuracy, Precision, Recall, F1. Последняя метрика были использована по причине того, что картинок одного класса (людей в очках) было гораздо меньше. Эта метрика позваоляет оценить баланс между полнотой и точностью нашей модели.
Натренированный модели нахадятся в папке weights. Для визуализации работы алгоритма и вывода результов запустите:
$ python Predict.py --model_name <Название модели: ResNet, MobileNet> --model_path <Путь к натренированной модели>
--test_dir <Путь к папке с тестовыми картинками> --vis <визуализация результатов: True, False>
Модель | Accuracy | F1 | Скорость | Вес |
---|---|---|---|---|
ResNet18 | 94 | 85 | 6 | 44.7 |
MobileNetV2 | 94 | 83 | 16 | 9.1 |