ОС: Убунту 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. Установите даркнет
- Скачать библиотеку даркнета
git clone https://github.com/pjreddie/darknet.git
Эта команда загружается в текущий каталог, поэтому перед загрузкой выберите подходящий каталог.
- Измените файл компиляции Makefile
Makefile в корневом каталоге даркнетаИзменить описание:
GPU=0 # 是否使用GPU,0则使用CPU
CUDNN=0 # 是否使用CUDNN
OPENCV=0 # 是否使用OpenCV
OPENMP=1 # 是否开启OPENMP
DEBUG=0
- компилировать
Перекомпилируйте каждый раз, когда вы вносите изменения
cd darknet # 进入到darknet根目录
make
Сборка заканчиваетсяНа этом установка даркнета завершена.
2. Подготовьте предтренировочные веса
- Скачать вес
ссылка для скачивания
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.
- Используйте набор данных формата 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 в будущем информация о метках каждого образца сгенерированного обучающего набора, набора проверки и набора тестов будет автоматически сохраняться здесь.
- Поместите файл в указанное место, как описано выше.
Каталог аннотаций:ImageSets/Основной каталог:
Содержимое файла train.txt:
Имя файла изображения (без учета расширения), одна строка соответствует одному изображению
Содержимое val.txt:
Содержимое test.txt:
Директория JPEGImages (здесь размещаются все изображения):
- Измените 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") # 所有的数据集
- Запустите 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.
- Изменить пакет и подразделения
Пакет указывает, сколько изображений загружается в память за один раз, а подразделения указывают, сколько раз необходимо выполнить прямое распространение.
- Изменить классы и фильтры
классы представляют количество идентифицированных категорий, фильтры = (классы + 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…