Введение
Все мы знаем о катастрофическом начале 2020 года из-за пандемии коронавируса. Жизнь, какой мы ее знаем, остановилась. Исследования неизменно показывают, что элементарная гигиена, такая как мытье рук и прикрытие рта и носа во время чихания или кашля, имеет большое значение. В таких ситуациях необходимо носить маску в общественных местах.
В этом посте я расскажу о детекторе пользовательских объектов, который я обучил с помощью Darknet, который определяет, надели ли вы маску или нет. Darknet - это фреймворк нейронной сети с открытым исходным кодом, написанный на C и CUDA и поддерживающий вычисления CPU и GPU. Используя Darknet, я обучил детектор объектов YOLO (You Only Look Once).
Короче говоря, YOLO обнаруживает все объекты на изображении за один раз. В этом посте не будут обсуждаться детали YOLO. Подробности YOLO можно узнать в газетах здесь и здесь.
Предпосылки
Для начала вам понадобится система под управлением Linux, желательно с графическим процессором. Хотя вы можете настроить Darknet в Windows, используя реализацию AlexAB, я бы настоятельно рекомендовал придерживаться Linux, поскольку этот процесс намного проще. Хорошо, я понял, вы используете Windows и не хотите, чтобы у вас была двойная загрузка ноутбука. Независимо от вашего выбора, этот пост поможет настроить ваш детектор объектов! Помимо этого, я буду использовать OpenCV с Python 3.7. Не стесняйтесь использовать установленную вами версию Python. Убедитесь, что у вас также установлены библиотеки python numpy и argparse.
TL; DR; Если вы не хотите по какой-либо причине испытывать трудности с обучением модели, я вам помогу! Перейти к последнему разделу.
Установка даркнета
Для Linux
Установить Darknet в Linux очень просто. Предлагаю прочитать официальный гид здесь. Для начала откройте свой терминал и введите следующее:
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
Если у вас есть графический процессор, поддерживаемый NVIDIA, вам следует рассмотреть возможность установки CUDA, поскольку это значительно сокращает время обучения. Этот пост упростил процесс установки и сэкономит вам много времени. Чтобы скомпилировать Darknet с CUDA и OpenCV, просто откройте /darknet/Makefile
, отредактируйте GPU=1
, CUDNN=1
, OPENCV=1
и соберите программное обеспечение с помощью команды make
.
Для Windows
Для Windows процесс немного сложнее. Во-первых, клонируйте репозиторий AlexAB:
git clone https://github.com/AlexeyAB/darknet.git
Как только это будет сделано, перейдите на страницу требований репозитория:
Https://github.com/AlexeyAB/darknet#requirements
Прежде чем продолжить, убедитесь, что у вас соблюдены все требования, а затем перейдите в этот раздел:
Https://github.com/AlexeyAB/darknet#how-to-compile-on-windows-using-cmake
Выберите метод, с помощью которого вы хотите создать программное обеспечение. Я предлагаю использовать метод CMake (который также рекомендуется автором), так как работа с vcpkg может быть утомительной.
Модельное обучение
Идите и клонируйте мой репозиторий:
git clone https://github.com/rushad7/mask-detection.git
Структура папок должна выглядеть примерно так:
. ├── annotations ├── cfg ├── class_names ├── data │ ├── mask │ └── no-mask ├── misc ├── results ├── weights └── yolo
Папка data
содержит папки mask
и no-mask
, содержащие изображения людей в масках и без них. Папка annotations
содержит все изображения в папке data
, но с соответствующими файлами с аннотациями .txt
.
Скопируйте изображения и .txt
файлы из папки /mask-detection/annotations
в папку /darknet/obj/
. Если вы хотите добавить свои обучающие изображения, добавьте их тоже в папку выше. Чтобы аннотировать изображения, я использовал LabelImg, бесплатный и простой в использовании инструмент для маркировки, поддерживающий Linux, Windows и Mac. При его использовании просто убедитесь, что вы сохраняете файлы в формате YOLO (можно установить, нажав кнопку рядом с кнопкой сохранения). Кроме того, скопируйте файл /mask-detection/cfg/yolov3-custom.cfg
в папку /darknet/cfg/
и файл /mask-detection/yolo/voc.data
в папку /darknet/cfg/
.
Запустите сценарий /mask-detection/misc/test_train_split.py
python с терминала (проверьте, используется ли сценарий), он сгенерирует файлы train.txt
и test.txt
в папке /mask-detector/train_test/
. Откройте /mask-detection/yolo/voc.data
и отредактируйте переменные train
и test
, указав путь к файлам, указанным выше.
P.S. Вам может потребоваться изменить пути в зависимости от того, где в вашей системе вы используете Darknet и мой репозиторий. Если вы используете Windows, вам придется изменить пути на эквивалент Windows, т.е. C:/Users/...
Наконец, загрузите сверточные веса модели darknet53 отсюда и поместите их в свой каталог Darknet.
Теперь мы готовы к тренировкам! Чтобы начать обучение модели, перейдите в каталог даркнета и введите:
./darknet detector train /cfg/voc.data cfg/yolov3-custom.cfg darknet53.conv.74
В зависимости от того, сколько изображений вы обучаете, и от того, на CPU или GPU, время обучения будет варьироваться. Я обучил этот набор данных на NVIDIA GTX 1050, и это заняло у меня примерно 6 часов.
P.S. Если вы получаете сообщение об отсутствии памяти CUDA, попробуйте изменить размер пакета в файле yolov3-voc.cfg
.
Теперь вам остается только дождаться окончания тренировки! Darknet сохраняет веса каждые 100 итераций до 1000-й итерации, а затем каждые 10 000 итераций в папке /darknet/backup/
.
Тестирование детектора объектов
Перейдите к /darknet/backup
и скопируйте последний сгенерированный файл .weights
в мой репозиторий.
Для тех , кто не обучал модель, клонировал мой репозиторий GitHub, я включил туда веса, которые я тренировал.
Чтобы запустить определение маски в реальном времени, просто запустите сценарий yolo-live-cv2.py
из терминала, например:
python yolo-live-cv2.py --yolo yolo
Вуаля! , ваш детектор маски YOLO работает! Детектор работает неплохо, но с частотой от 10 до 15 кадров в секунду. Я обратил внимание на то, что точность модели можно повысить, увеличивая размер и качество данных. Я нашел этот набор данных на GitHub, который может помочь.