opencv — чтение файла yolo.cfg (из YOLO — вы смотрите только один раз) и связанных весов из OpenCV3.4 — переполнение стека

У меня есть собственный набор данных изображений, и я хочу классифицировать их по 4 различным категориям. В этот раз я не заинтересован в обнаружении объектов на изображении, а просто в том, чтобы классифицировать данное изображение в классе.
Обучение проводится на Ubuntu 16.04, где в качестве модели и веса читаются на Windows 10.

Я клонировал даркнет из gitbub как

git clone https://github.com/pjreddie/darknet
cd darknet
make

Эти команды были выполнены успешно.

Это yolo.cfg

    [net]
batch=2
subdivisions=8
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
max_batches = 12
policy=steps
steps=-1,100,80000,100000
scales=.1,10,.1,.1

[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

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

[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

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

[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

[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]
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

[maxpool]
size=2
stride=2

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

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

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

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

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

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

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

[route]
layers=-9

[reorg]
stride=2

[route]
layers=-1,-3

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

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

[region]
anchors = 0.738768,0.874946,  2.42204,2.65704,  4.30971,7.04493,  10.246,4.59428,  12.6868,11.8741
bias_match=1
classes=4
coords=4
num=5
softmax=1
jitter=.2
rescore=1

object_scale=5
noobject_scale=1
class_scale=1
coord_scale=1

absolute=1
thresh = .6
random=0

Я использовал yolo.cfg и соответствующие веса в OpenCV3.4-C ++. Я использую Visual studio 2017.
Это выделенные строки кода из моего кода, основанные на примере кода OpenCV, доступном по адресу https://github.com/opencv/opencv/blob/master/samples/dnn/yolo_object_detection.cpp

 String modelFile = "yolo.cfg";
String modelBinary = "yolo.weights";
dnn::Net net = readNetFromDarknet(modelFile,modelBinary);
Mat img=imread("test.png");
Mat inputBlob = blobFromImage(img, 1/255.0, Size(416,416), Scalar(), true, false); //Convert Mat to batch of images
net.setInput(inputBlob);
result =  net.forward();

Если я правильно понял, результатом должен был быть Cv :: Mat 4×1, который содержал бы вероятности отдельных классов. Вместо этого, это матрица 845×9. Мои вопросы:
1) Если yolo.cfg правильный? Как рассчитывается количество фильтров? Это

# of Filters=(# of classes+5)*5

2) Почему я получаю матрицу 845×9 вместо 4×1?

3) Какие модификации я должен сделать в будущем в yolo.cgf, чтобы получить координаты обнаруженных объектов из изображения. Обычный способ работы Йоло. то есть он обнаруживает объекты на изображениях, для которых он обучен.

4) Похоже, что yolo работает только на 416×416. Можем ли мы заставить это работать для других измерений? например 1000×200? Какие изменения мне потребуется внести в yolo.cfg?

5) Зависит ли время, необходимое для классификации изображения, от размера изображения?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]