Даркнет обучает YOLO под Ubuntu, чтобы быстро приступить к работе

глубокое обучение

ОС: Убунту 16.04
Фреймворк: даркнет
Формат набора данных: ЛОС

Зеро, взгляните на введение официального сайта

Официальный сайт даркнета
Darknet: Open Source Neural Networks in C.
Darknet is an open source neural network framework written in C and CUDA. It is fast, easy to install, and supports CPU and GPU computation. You can find the source on GitHub .

1. Установите даркнет

  1. Скачать библиотеку даркнета
git clone https://github.com/pjreddie/darknet.git

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

  1. Измените файл компиляции Makefile

Makefile в корневом каталоге даркнета在这里插入图片描述Изменить описание:

GPU=0	# 是否使用GPU,0则使用CPU
CUDNN=0	# 是否使用CUDNN
OPENCV=0 # 是否使用OpenCV
OPENMP=1 # 是否开启OPENMP
DEBUG=0
  1. компилировать

Перекомпилируйте каждый раз, когда вы вносите изменения

cd darknet # 进入到darknet根目录
make

Сборка заканчивается在这里插入图片描述На этом установка даркнета завершена.

2. Подготовьте предтренировочные веса

  1. Скачать вес

ссылка для скачивания
2. Поместите файл с весами и запишите местоположение
Найдите каталог для хранения файла и запишите путь.
На официальном сайте видно, что он хранится в корневом каталоге даркнета, мне кажется, лучше найти папку, я создал новый вес под даркнетом.

3. Подготовьте набор данных

Наш собственный набор данных должен быть стандартизирован, прежде чем его можно будет ввести в нейронную сеть, например, размер изображения и т. д. Для выполнения этого шага мы используем скрипты Python. Darknet подготовил для нас скрипты Python. В скриптах voc_label.py просто тот.
Ниже приведено начальное состояние voc_label.py, которое мы изменим позже.

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")

Вы можете видеть, что voc_label.py имеет операторы для файловых операций.Мы создаем папки в соответствии с этим каталогом.Эта структура каталогов также является стандартной структурой VOC2007.

  1. Используйте набор данных формата VOC, чтобы установить структуру каталогов набора данных VOC.

Обратите внимание, что структура каталогов должна находиться в том же каталоге, что и voc_label.py, то есть под скриптами! ! !
Структура каталогов следующая:
在这里插入图片描述
Его можно быстро создать с помощью следующей команды:

# 注意此命令是在scripts目录下执行的,位于其他目录自行修改
mkdir -p VOCdevkit/VOC2007/{Annotations,ImageSets/Main,JPEGImages,labels}

Роль нескольких папок:
Аннотации: XML-файл, в котором хранится набор данных VOC.
ImageSets/Main: храните обучающий набор train.txt, проверочный набор val.txt и тестовый набор test.txt.
JPEGImages: храните изображения, соответствующие тренировочному набору, проверочному набору и тестовому набору.
метки: после запуска voc_label.py в будущем информация о метках каждого образца сгенерированного обучающего набора, набора проверки и набора тестов будет автоматически сохраняться здесь.

  1. Поместите файл в указанное место, как описано выше.

Каталог аннотаций:在这里插入图片描述ImageSets/Основной каталог:在这里插入图片描述Содержимое файла train.txt: Имя файла изображения (без учета расширения), одна строка соответствует одному изображению在这里插入图片描述Содержимое val.txt:在这里插入图片描述Содержимое test.txt:在这里插入图片描述Директория JPEGImages (здесь размещаются все изображения):在这里插入图片描述

  1. Измените voc_label.py (находится в даркнете/скриптах)

Инструкции по модификации (см. комментарии к коду):

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

# 数据集名称,对应darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main中的文件名,数字是VOC版本
sets = [('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

# 类别名称
classes = ["l"]


def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x, y, w, h)


def convert_annotation(year, image_id):
    # 数据集在这个目录,以下有4处目录需要检查是否正确
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml' %
                   (year, image_id))  # .xml文件
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt' %
                    (year, image_id), 'w')  # 检查是否有labels
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(
            xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " +
                       " ".join([str(a) for a in bb]) + '\n')


wd = getcwd()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/VOC%s/labels/' % (year)):
        os.makedirs('VOCdevkit/VOC%s/labels/' % (year))  # 此处不用修改,会自动创建
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt' %
                     (year, image_set)).read().strip().split()  # .txt文件
    list_file = open('%s_%s.txt' % (year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n' %
                        (wd, year, image_id))  # 图片文件
        convert_annotation(year, image_id)
    list_file.close()

# 与前面第9行的sets对应,但只有训练集和验证集
os.system("cat 2007_train.txt 2007_val.txt > train.txt")
os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")  # 所有的数据集

  1. Запустите voc_label.py (в том же каталоге, что и VOCdevkit)
python voc_label.py

После успешного выполнения есть еще несколько вещей:
А. Под даркнетом/скриптами在这里插入图片描述2007_test.txt, 2007_train.txt и 2007_val.txt соответственно хранят пути к изображениям соответствующих наборов данных следующим образом:在这里插入图片描述б) в каталоге darknet/scripts/VOCdevkit/VOC2007/labels在这里插入图片描述Есть еще текстовые файлы, это информация о метках каждого образца обучающего набора, проверочного набора и тестового набора, упомянутого выше, откройте его и посмотрите在这里插入图片描述В каждой строке есть 5 чисел: номер категории (то есть значение индекса элемента списка классов в файле voc_label.py), координата центра метки, а также ширина и высота метки. height являются нормализованными значениями.Подробнее см. voc_label Функция convert() в файле .py.

В-четвертых, изменить файл cfg

Измените yolov3-voc.cfg в разделе darknet/cfg.

  1. Изменить пакет и подразделения

在这里插入图片描述Пакет указывает, сколько изображений загружается в память за один раз, а подразделения указывают, сколько раз необходимо выполнить прямое распространение.

  1. Изменить классы и фильтры

在这里插入图片描述классы представляют количество идентифицированных категорий, фильтры = (классы + 5) * 3 Есть три места, все из которых должны быть изменены

5. Создайте свои собственные имена голосов

Создайте файл voc.names в разделе darknet/cfg и напишите свои собственные названия категорий, по одной категории в строке.在这里插入图片描述

6. Изменить voc.data

В разделе darknet/cfg измените его на:

classes = 1 # 类别数
train = scripts/2007_train.txt # 运行voc_label.py生成的文件,存放训练集图片路径
valid = scripts/2007_val.txt # 运行voc_label.py生成的文件,存放验证集图片路径
names = voc.names # 上一步修改的文件,存放类别名
backup = backup # 训练结束时,存放权重的位置

7. Начать обучение

Откройте терминал в корневом каталоге даркнета и введите;

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg weights/darknet53.conv.74

инструкция:
./darknet — исполняемый файл, сгенерированный во время компиляции
детектор - модель, чтобы выполнить задачу на
поезд - задача, которую нужно выполнить
cfg/voc.data — файл, измененный на шаге 6.
cfg/yolov3-voc.cfg — файл, измененный на четвертом шаге
weights/darknet53.conv.74 - веса, загруженные на втором шаге

Ссылаться на:
pjreddie.com/darknet/
Блог Woohoo.cn на.com/PP RP/afraid/9525…
сегмент fault.com/ah/119000001…
blog.CSDN.net/QQ_38451119…