содержание
После завершения настройки среды даркнета вы можете выполнить обучение данным по обнаружению целей в рамках инфраструктуры даркнета. В этой статье в качестве примера используются данные VOC.
1. Подготовка данных
1.1 Загрузить данные о ЛОС
См. Введение на веб-сайт https://pjreddie.com/darknet/yolo/, чтобы загрузить данные о ЛОС.
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
1.2 Создание меток данных
Преобразуйте аннотации в xml-файле набора данных VOC в txt-файл, который может анализировать darknet. Формат каждого файла следующий:
<object-class> <x> <y> <width> <height>
Каждая строка соответствует целевой категории, центральным координатам абсциссы наземного блока истинности, центральным координатам ординаты, ширине наземного блока истинности и высоте наземного блока истинности.
Используйте scripts/
файлы в папке для voc_label.py
преобразования тегов VOC в теги YOLO, voc_label.py
скопируйте VOCdevkit/
файлы в папку и выполните следующую команду:
python voc_label.py
После завершения операции введите ls
, в терминале вы увидите следующее:
2007_test.txt VOCdevkit
2007_train.txt voc_label.py
2007_val.txt VOCtest_06-Nov-2007.tar
2012_train.txt VOCtrainval_06-Nov-2007.tar
2012_val.txt VOCtrainval_11-May-2012.tar
Для обучения VOC требуется четыре набора данных 2007_train, 2007_val, 2012_train и 2012_val для формирования обучающего набора и использования 2007_test в качестве проверочного набора. Введите следующую команду, чтобы объединить соответствующие наборы данных.
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
Наконец, измените cfg.data
файл, настройте путь к данным VOC, и количество классов должно быть правильным .
classes= 20
train = <path-to-voc>/train.txt
valid = <path-to-voc>2007_test.txt
names = data/voc.names
backup = backup
1.3 Скачать предварительно обученную модель
1. Начните обучение на основе модели предварительного
обучения ImageNet . Местоположение загрузки модели предварительного обучения: https://drive.google.com/open?id=1JKF-bdIklxOOVy-2Cr5qdvjgGpmGfcbp . После загрузки модели предварительного обучения , поместите yolov4.conv.137
файл в указанное место.
2. Начните обучение на основе модели предварительного обучения COCO.
Если вы начнете обучение на основе авторской модели предварительного обучения COCO с открытым исходным кодом yolov4.weights
, вам необходимо изменить то, что отображается в файле. После изменения вы можете тренироваться на основе предтренировочная модель Модифицированный код выглядит следующим образом.
import numpy as np
# Read weights file
with open('weights/yolov4.weights', 'rb') as f:
version = np.fromfile(f, dtype=np.int32, count=3) # (int32) version info: major, minor, revision
seen = np.fromfile(f, dtype=np.int64, count=1) # (int64) number of images seen during training
weights = np.fromfile(f, dtype=np.float32) # the rest are weights
seen = np.array([0])
# Write weights file
with open('darknet_yolov4.weights', 'wb') as f:
version.tofile(f) # (int32) version info: major, minor, revision
seen.tofile(f)
weights.tofile(f)
2. Данные обучения
2.1 Подготовьте файл cfg
Измените имя файла yolov4-custom.cfg в папке cfg, чтобы yolov4-voc.cfg
изменить количество шагов итерации обучения:
max_batches = 50500
policy=steps
steps=40000,45000
scales=.1,.1
Измените классы 3 слоев йоло на 20, количество фильтров в сверточном слое перед слоем йоло равно 75, (классы + 5) × 3 (классы + 5) \ раз 3( c l a s s e s+5 )×3。
[convolutional]
size=1
stride=1
pad=1
filters=75
activation=linear
[yolo]
mask = 6,7,8
anchors = 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401
classes=20
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1
scale_x_y = 1.05
iou_thresh=0.213
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
nms_kind=greedynms
beta_nms=0.6
2.2 Подготовить файл сценария обучения sh
Введите touch train.sh
и в терминале gedit train.sh
отредактируйте файл сценария обучения, введите ./darknet detector train data/voc.data cfg/yolov4-voc.cfg backup/yolov4.conv.137 -map
и выполните, ./train.sh
чтобы начать обучение. ./darknet
В скомпилированный исполняемый файл, detector
что реализация задачи обнаружения цели, train
что осуществление учебных миссий data/voc.data
, cfg/yolov4-voc.cfg
а также backup/yolov4.conv.137
расположение путь к файлу должен быть правильным, -map
представляет собой в то же время обучения, оценки точности определения, оценки один раз в четыре эпохи.
2.3 Кривая потерь и MAP
После завершения обучения вы можете получить следующие изображения в папке даркнета. Изображения показывают, что обучение имеет чрезмерную подгонку. Когда итерация достигает более 10 000 шагов, MAP в наборе данных VOC достигает самого высокого значения. После этого, хотя Loss снижается, но mAP больше не улучшается, а снижается.При обучении на наборе данных VOC требуется дополнительная настройка параметров. После оценки voice_all_map.py , YOLOv4 в наборе данных VOC 0,5: 0,95mAP 52,98; 0,5 может быть достигнуто может быть достигнуто 84,27,0.75mAP 58,64. Этот результат намного выше, чем MAP https://blog.csdn.net/linghu8812/article/details/105708001 Fast_rcnn_R_50_FPN, представленного в этой статье .
На приведенном ниже рисунке показан результат обучения на наборе данных VOC с использованием YOLOv3. Видно, что эффект обнаружения YOLOv4 на наборе данных VOC намного лучше, чем у YOLOv3.
3. Тестовое изображение
Введите следующую команду в терминале, ./darknet detector test cfg/voc.data cfg/yolov4-voc.cfg backup/yolov4-voc.weights -thresh 0.25 data/dog.jpg
чтобы протестировать отдельное изображение и просмотреть тренировочный эффект. Файл cfg и файл весов можно скачать здесь , код извлечения - ia4x. Результат вывода выглядит следующим образом:
вывод в терминале выглядит следующим образом:
data/dog.jpg: Predicted in 14.562000 milli-seconds.
bicycle: 97%
dog: 94%
car: 99%