Руководство по созданию модели YOLOv4-tiny TFLite для развертывания на Raspberry Pi.

Платы Raspberry Pi (RPi) — отличные игровые площадки для компьютерных энтузиастов, поскольку они позволяют материализовать идеи, которые в противном случае были бы скрыты в коде. Это руководство служит введением в использование плат RPi для приложений искусственного интеллекта (ИИ). Хотя они не являются лучшими для таких ресурсоемких вычислительных задач, которые лучше подходят для таких плат, как Jetson Nano, RPi предоставляет дешевую альтернативу для приложений, не требующих высокой степени точности.

Это руководство состоит из двух частей, скоро будет доступна вторая часть с информацией о том, как на самом деле запустить модель на вашем RPi. Этот учебник организован следующим образом:

  1. Загрузите существующую модель
  2. Найдите подходящий набор данных
  3. Настройте необходимые файлы
  4. Настройка даркнета
  5. Обучите модель на наборе данных
  6. Конвертируйте модель в .pb
  7. Конвертируйте модель в .tflite

В этом руководстве используется Google Colaboratory.

Примечание. Шаги 1–5 аналогичны шагам руководства https://medium.com/analytics-vidhya/train-a-custom-yolov4-tiny-object-detector-using-google-colab-b58be08c9593. ». Я предлагаю пройти этот урок, чтобы лучше понять начальные шаги, так как я опустил некоторые детали. Однако обратите внимание на следующие ключевые отличия:

  1. Мы не создаем собственный набор данных, вместо этого мы используем существующий набор данных.
  2. Мой файл process.py отличается от файла process.py, указанного в ссылке. Мы не выполняем разделение 90–10, так как наш набор данных уже разделен.

0. Дополнительное ускорение графического процессора

Все последующие шаги присутствуют в моем блокноте Colab. Нажмите Файл и выберите Сохранить копию на диске. Откроется копия записной книжки на вашем диске. Кроме того, вы можете начать с новой записной книжки, если хотите лучше понять шаги.

Графический процессор может значительно ускорить процесс обучения модели. Поэтому мы используем среду выполнения с ускорением на GPU в Google Colab. Чтобы изменить время выполнения, выполните следующие действия:

  • Среда выполнения > Изменить тип среды выполнения
  • Измените аппаратный ускоритель с «Нет» на «GPU».
  • Нажмите «Сохранить» и снова подключитесь.

1. Загрузка модели:

Начните с создания новой записной книжки в Google Colab. Затем смонтируйте диск для доступа к сохраненным файлам. Хотя это и не является обязательным шагом, это позволяет нам получить модель и файлы конфигурации, даже если среда выполнения отключится.

from google.colab import drive
drive.mount('/content/drive')

Далее мы загружаем предварительно обученную модель YOLOv4 из репозитория Darknet. Использование предварительно обученных моделей экономит много времени и усилий, поскольку для разных наборов данных требуется повторное обучение только нескольких последних слоев нейронной сети для обнаружения различных функций. Функции низкого уровня, которые сеть YOLO обнаруживает в начальных слоях сети, не меняются с набором данных.

!git clone https://github.com/AlexeyAB/darknet.git

2. Поиск и загрузка подходящего набора данных

Мы используем набор изображений выбоин с https://public.roboflow.com/object-detection/pothole/1. Нажмите скачать в правом верхнем углу и выберите формат YOLO Darknet в появившемся окне. Затем нажмите Продолжить.

Извлеките ZIP-файл в папку с именем Images. Удалите файлы README. Также удалите файлы .labels из test, train и validпапки . Содержимое папки Images должно быть следующим:

Заархивируйте папку Image в obj.zip.

3. Настройте файлы конфигурации:

Создайте на диске папку с именем yolov4-tiny. Внутри папки создайте еще одну папку training, которую мы будем использовать для хранения весов (файл .weights).

Загрузите файл obj.zip в папку yolov4-tiny.

Загрузите файл yolov4-tiny-custom.cfg из даркнет-репозитория AlexeyAB. Внесите следующие изменения в файл .cfg на локальном устройстве:

  • изменить строку «партия» на «партия = 64»
  • изменить строку «подразделения» на «подразделения = 16»
  • установить размер сети «ширина = 416» «высота = 416» или любое значение, кратное 32
  • изменить строку «max_batches» на (classes*2000, но не менее количества обучающих изображений и не менее 6000), т.е. ‘max_batches=6000’, если вы тренируетесь на 3 занятия
  • измените строку «шаги» на 80% и 90% от max_batches, т.е. «шаги = 4800,5400»
  • измените [filters=255] на filter=(classes + 5)x3 в 2 [convolutional] перед каждым [yolo] слоем, имейте в виду, что он должен быть только последним [convolutional] перед каждый из слоев [yolo].
    Итак, если классы = 1, то должны быть фильтры = 18. Если классы=2, то напишите фильтры=21.
  • измените line class=80 на ваше количество объектов в каждом из 2 [yolo]-слоев

Файл .cfg с изменениями доступен в моем репозитории github.

После внесения изменений загрузите файл yolov4-tiny-custom.cfg в папку yolov4-tiny.

Далее нам нужно создать файлы obj.names и obj.data.

obj.data:

Файл obj.data содержит:

  • Количество занятий.
  • Путь к файлам train.txt и test.txt, которые мы создадим позже.
  • Путь к файлу obj.names, содержащему имена классов.
  • Путь к папке training, в которой будут сохранены тренировочные веса.

obj.names:

obj.namesсодержитимена объектов — каждое в новой строке.

Загрузите как obj.data, так и obj.names в yolov4-tiny.

Затем загрузите файл process.py из моего репозитория github. process.py создает файлы test.txt и train.txt. файлы, которые требуются тренеру даркнета для доступа к данным обучения и тестирования. Загрузите process.py в yolov4-tiny.

Папка yolov4-tiny теперь должна выглядеть так:

4. Настройте даркнет

Создайте символическую ссылку для удобства

!ln -s /content/drive/My\ Drive/ /mydrive

/mydrive теперь эквивалентен /content/drive/My \Drive.

Внесите изменения в make-файл, чтобы включить OPENCV и GPU.

%cd darknet/
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile
!sed -i 's/LIBSO=0/LIBSO=1/' Makefile

Запустите команду для создания даркнета

!make

Далее нам нужно скопировать файлы из yolo4-tiny в папку darknet

Очистите папку data, кроме папки labels внутри папки data. папка, необходимая для написания имен меток на полях обнаружения. Очистите папку cfg, поскольку у нас есть собственная конфигурация в папке yolov4-tiny.

%cd data/
!find -maxdepth 1 -type f -exec rm -rf {} \;
%cd ..
%rm -rf cfg/
%mkdir cfg

Скопируйте файл obj.zip из папки yolov4-tiny в каталог даркнета и разархивируйте в папку данныепапка.

!cp /mydrive/yolov4-tiny/obj.zip ../
!unzip ../obj.zip -d data/

Скопируйте файл yolov4-tiny-custom.cfg, чтобы он теперь находился в папке /darknet/cfg/ .

!cp /mydrive/yolov4-tiny/yolov4-tiny-custom.cfg ./cfg

Скопируйте файлы obj.names и obj.data, чтобы они теперь находились в /darknet/data/ в виртуальной машине Colab.

!cp /mydrive/yolov4-tiny/obj.names ./data
!cp /mydrive/yolov4-tiny/obj.data  ./data

Скопируйте файл process.py в текущий каталог darknet.

!cp /mydrive/yolov4-tiny/process.py ./

Запустите process.py, чтобы создать файлы train.txt и test.txt в папке data.

!python process.py

train.txt и test.txt после создания содержат пути к обучающему и тестовому изображениям соответственно. train.txt должен выглядеть следующим образом:

test.txt похож на train.txt, но с путем data/Images/test вместо data/Images/train.

5. Обучение модели

Затем, чтобы использовать трансферное обучение, мы используем предварительно обученные веса YOLOv4-tiny, которые были обучены до 29 сверточных слоев. Чтобы загрузить предварительно обученные веса, выполните следующую команду.

!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29

Затем приступайте к обучению модели с помощью даркнета с нашим обучающим набором. Следующая команда обучает даркнет и создает набор файлов .weights.

!./darknet detector train data/obj.data cfg/yolov4-tiny-custom.cfg yolov4-tiny.conv.29 -dont_show -map

Обучение даркнету займет около 3 часов. Потянитесь, сядьте поудобнее и поиграйте в CoD.

После завершения обучения наша работа с даркнетом завершена. Чтобы убедиться, что все шаги выполнены правильно, запустите детектор даркнета на одном новом тестовом изображении. Загрузить тестовый образ из моего репозитория в папку yolov4-tiny.

%cd /mydrive/yolov4-tiny
!wget --no-check-certificate 'https://raw.githubusercontent.com/SanaulMalik/SherlockHoles/master/images/ph.jpg' -O 'ph.jpg'
%cd /content/darknet

Примечание. Имя файла «ph» означает выбоина. На всякий случай, если вам интересно ;)

Определите вспомогательную функцию imShow в блоке кода:

Затем запустите детектор даркнета на изображении:

!./darknet detector test data/obj.data cfg/yolov4-tiny-custom.cfg /mydrive/yolov4-tiny/training/yolov4-tiny-custom_best.weights /mydrive/yolov4-tiny/ph.jpg -thresh 0.3
imShow('predictions.jpg')

Ваш вывод должен выглядеть так:

6. Преобразование модели в формат .pb

После обучения в даркнете наша модель была сохранена в виде файла .weights. В папке /training сохранены файлы .weights с разных контрольных точек, из которых мы используем только yolov4-tiny-custom_best.weights модель. Однако для запуска этой модели на плате Raspberry Pi нам нужна модель TFLite. В качестве промежуточного шага нам нужно преобразовать файл .weights в формат .pb, используемый для сохраненных моделей в TensorFlow. Файлы .pb содержат как определение графика, так и веса сохраненной модели.

На этом этапе лучше изменить среду выполнения обратно на среду выполнения без ускорения, а не на время выполнения с ускорением на графическом процессоре. Это связано с тем, что часть кода с этого момента вызывает ошибки в среде на основе CUDA. После изменения среды выполнения вам нужно будет запустить блоки кода для связывания вашего диска и создания символической ссылки на mydrive. Остальные блоки не нужно запускать снова. Чтобы изменить время выполнения —

  • Среда выполнения -> Изменить тип среды выполнения
  • Измените аппаратный ускоритель с GPU на None
  • Нажмите Сохранить и снова подключиться.
  • Запустите первый и третий блоки кода

Теперь клонируйте следующий репозиторий с https://github.com/hunglc007/tensorflow-yolov4-tflite.

%cd /content
!git clone https://github.com/hunglc007/tensorflow-yolov4-tflite.git
%cd tensorflow-yolov4-tflite

Затем измените файл /core/config.py и замените файл coco.names нашим файлом obj.names.

Замените
__C.YOLO.CLASSES = «./data/classes/coco.names»
на
_C.YOLO.CLASSES = «mydrive/yolov-4 -tiny/obj.names”

Игнорируйте остальные данные в файле. Хотя других указанных файлов не существует, они не вызовут у нас никаких проблем, так как мы не используем трейнер в этом репозитории.

Затем, чтобы преобразовать модель в формат .pb, выполните следующую команду.

!python save_model.py --weights  /mydrive/yolov4-tiny/training/yolov4-tiny-custom_best.weights --output /mydrive/yolov4-tiny/yolov4-tiny-pb --input_size 416 --model yolov4 --framework tflite --tiny

Чтобы проверить, правильно ли преобразована модель, выполните следующую команду. Здесь мы импортируем модель с помощью TensorFlow и печатаем сводку модели. Сводка будет правильно выведена только в том случае, если преобразование в .pb прошло успешно.

import tensorflow as tf
model = tf.keras.models.load_model("/mydrive/yolov4-tiny/yolov4-tiny-pb")
model.summary()

Сводка должна содержать 5 882 634 общих параметра.

7. Преобразование модели в .tflite

Затем мы используем convert_tflite.py для преобразования файла .pb в формат .tflite. Это формат, который будет работать на Raspberry Pi.

Сначала мы должны включить экспериментальные переменные ресурсов. Для этого добавьте следующую строку в определение функции save_tflite() в программе convert_tflite.py.

converter.experimental_enable_resource_variables = True

Затем выполните следующую команду:

!python convert_tflite.py --weights /mydrive/yolov4-tiny/yolov4-tiny-pb --output /mydrive/yolov4-tiny/model.tflite --quantize_mode float16

Модель .tflite теперь сохраняется в папке yolov4-tiny как model.tflite. Чтобы протестировать файл .tflite, загрузите detect_tflite.py из моего репозитория github в yolov4-tiny. Или, альтернативно, выполните следующие команды.

%cd /content
!git clone https://github.com/SanaulMalik/SherlockHoles
%cd /mydrive/yolov4-tiny
%cp /content/SherlockHoles/executables/detect_tflite.py ./

Теперь запустите detect_tflite.py с новым изображением из моего репозитория, чтобы протестировать модель.

%cp /content/SherlockHoles/images/ph-2.jpg ./ph-2.jpg
!python detect_tflite.py --weights model.tflite --size 416 --model yolov4 --image "/content/darknet/ph.jpg" --framework tflite --tiny

Результат detect_tflite.py сохраняется как result.png в текущем рабочем каталоге. Если вы выполнили команды дословно, они должны быть сохранены в папке yolov4-tiny на вашем диске.

Вы успешно обучили модель TFLite обнаруживать выбоины. В следующей части этого руководства мы развернем нашу модель на плате RPi 4 для обнаружения выбоин из видеопотока в реальном времени. А пока удачного кодирования!