Введение

Все мы знаем о катастрофическом начале 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, который может помочь.