DarkNet — для пользовательских данных обучения ничего не обнаружено

Я создал свой собственный набор данных, который представляет собой набор изображений футбольного мяча. Поскольку у меня есть только 1 класс, я изменил ball-yolov3-tiny.cfg, установив filters на 18, а classes на 1.

Затем я прокомментировал изображения и поместил созданные файлы .txt в тот же каталог, что и изображения. Наконец, я начал обучение, используя модель darknet53.conv.74, выполнив команду darknet detector train custom/ball-obj.data custom/ball-yolov3-tiny.cfg darknet53.conv.74.

У меня есть 134 изображения для обучения и 15 изображений для теста. Вот примерный результат тренировочного процесса:

95: 670.797241, 597.741333 avg, 0.000000 rate, 313.254830 seconds, 6080 images
Loaded: 0.000302 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499381, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.496005, No Obj: 0.496541, .5R: 0.000000, .75R: 0.000000,  count: 32
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499381, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.496005, No Obj: 0.496541, .5R: 0.000000, .75R: 0.000000,  count: 32
96: 670.557190, 605.022949 avg, 0.000000 rate, 312.962750 seconds, 6144 images
Loaded: 0.000272 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499360, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.495868, No Obj: 0.496454, .5R: 0.000000, .75R: 0.000000,  count: 32
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499360, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.495868, No Obj: 0.496454, .5R: 0.000000, .75R: 0.000000,  count: 32
97: 670.165161, 611.537170 avg, 0.000000 rate, 312.681998 seconds, 6208 images
Loaded: 0.000282 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499331, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.495722, No Obj: 0.496397, .5R: 0.000000, .75R: 0.000000,  count: 32
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499331, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344946, Class: 0.498204, Obj: 0.495722, No Obj: 0.496397, .5R: 0.000000, .75R: 0.000000,  count: 32
98: 669.815918, 617.365051 avg, 0.000000 rate, 319.203044 seconds, 6272 images
Loaded: 0.000244 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499294, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344947, Class: 0.498204, Obj: 0.495569, No Obj: 0.496253, .5R: 0.000000, .75R: 0.000000,  count: 32
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499294, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344947, Class: 0.498204, Obj: 0.495569, No Obj: 0.496253, .5R: 0.000000, .75R: 0.000000,  count: 32
99: 669.555664, 622.584106 avg, 0.000000 rate, 320.330266 seconds, 6336 images
Loaded: 0.000244 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499246, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344948, Class: 0.498204, Obj: 0.495409, No Obj: 0.496197, .5R: 0.000000, .75R: 0.000000,  count: 32
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499246, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.344948, Class: 0.498204, Obj: 0.495409, No Obj: 0.496197, .5R: 0.000000, .75R: 0.000000,  count: 32
100: 669.132629, 627.238953 avg, 0.000000 rate, 329.954091 seconds, 6400 images
Saving weights to backup//ball-yolov3-tiny.backup
Saving weights to backup//ball-yolov3-tiny_100.weights
Resizing
576
Loaded: 1.764142 seconds
Region 16 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.499216, .5R: -nan, .75R: -nan,  count: 0
Region 23 Avg IOU: 0.430712, Class: 0.498203, Obj: 0.495251, No Obj: 0.496154, .5R: 0.000000, .75R: 0.000000,  count: 32

Вот другие файлы конфигурации:

ball-obj.data

classes= 1
train  = custom/ball-train.txt
valid  = custom/ball-test.txt
names = custom/ball-obj.names
backup = backup/

ball-obj.names

ball

Когда я использую созданные веса для тестирования одного изображения, он просто не может найти футбольные мячи на изображениях. Нужно ли мне для этого намного больше (например, 10K) изображений? Или мне нужно тренировать модель в течение долгих часов? Я просто хочу быть уверен, что все, что касается моей установки, в порядке.

Пожалуйста, не стесняйтесь задавать любые вопросы относительно моего эксперимента. Ваша помощь очень ценится. Заранее спасибо.

p.s. Вот все содержимое моего ball-yolov3-tiny.cnf:

[net]
# Testing
batch=1
subdivisions=1
# Training
#batch=64
#subdivisions=2
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1

[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=1

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

###########

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear



[yolo]
mask = 3,4,5
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=1
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

[route]
layers = -4

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 8

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=1
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

Команда, которую я выполняю:

darknet detector train custom/ball-obj.data custom/ball-yolov3-tiny.cfg darknet53.conv.74

person talha06    schedule 20.05.2019    source источник


Ответы (3)


Увеличьте размер пакета до 64 и используйте как можно меньше подразделений, сколько может поместиться в памяти графического процессора: начните с 1, 2, 4, 8, 16, 32 и, наконец, 64, если вы продолжаете получать CUDA из памяти.

Вы должны обучать свою сеть, пока ваш средний уровень потерь не станет ‹ 1.

Вы используете оригинальную версию даркнета из репозитория Джозефа Редмонса или используете форк? Существует ряд рекомендаций по улучшению обнаружения объектов здесь Однако я не уверен, работают ли они на всех других версиях.

person Jonas    schedule 21.05.2019
comment
Я использую оригинальную версию. batch_size уже установлен на 64 для обучения. - person talha06; 21.05.2019
comment
Тогда я бы еще порекомендовал пересчитать ахоры, особенно если на картинках мяч часто одного размера. В противном случае, чтобы компенсировать ваш небольшой набор данных, может быть хорошей идеей установить параметр угла на [30-45] в строке 13, а также увеличить дрожание на 137 и 179. Угол определяет максимальное значение, на которое йоло поворачивает ваше изображение с некоторым интервалы, а дрожание означает более высокую степень изменения размера и соотношения сторон. - person Jonas; 21.05.2019

  1. У вас небольшой набор данных, и я думаю, что 15 изображений для тестирования слишком мало.
  2. batch=1 subdivisions=1 означает, что вы обучаете только 1 изображение за 1 итерацию. Если у вас достаточно графического процессора, вы можете попытаться увеличить число, чтобы ваша модель лучше сходилась.
  3. Самая очевидная причина, по которой ваша модель не годится, это 100: 669.132629, 627.238953 avg. Вы можете видеть, что средний убыток составляет 627,238953, что слишком велико. Хорошая модель YOLO имеет потери около 0,06 ~ 1.

Итак, что вы можете сделать в соответствии с моими вышеприведенными пунктами, это продолжить обучение (100 итераций недостаточно, особенно для Tiny YOLO), увеличить пакет и подразделение, а также увеличить набор данных.

Дополнение. Пересчет полей привязки с использованием вашего набора данных также является хорошим вариантом. В Интернете можно найти множество отличных примеров и кода.

person gameon67    schedule 21.05.2019
comment
что вы подразумеваете под пересчетом ограничивающей рамки? @gameon67 - person Ankit Sachan; 12.05.2020
comment
@AnkitSachan извините, я имею в виду якорную рамку, а не ограничивающую рамку. Значение поля привязки по умолчанию не оптимизировано для конкретного набора данных, поэтому вам необходимо пересчитать его в соответствии с вашим шаблоном набора данных. - person gameon67; 12.05.2020

max_batches= (# of classes)* 2000

max_batches = 6000

При обучении на 1,2,3 занятиях будет 6000

А также

Steps=(80% of max_batches),(90% of max_batches) i.e,

steps=4800,5400
person user15981461    schedule 20.05.2021