Чтение yolo.cfg (из YOLO- Вы смотрите только один раз) и связанных весов из OpenCV3.4 -C++
У меня есть собственный набор данных изображений, и я хочу классифицировать их по 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 4x1, который содержал бы вероятности отдельных классов. Вместо этого, это матрица 845x9. Мои вопросы: 1) Если yolo.cfg правильный? Как рассчитывается количество фильтров? Это
# of Filters=(# of classes+5)*5
2) Почему я получаю матрицу 845x9 вместо 4x1?
3) Какие модификации я должен сделать в будущем в yolo.cgf, чтобы получить координаты обнаруженных объектов из изображения. Обычный способ работы Йоло. т.е. он обнаруживает объекты по изображениям, для которых он обучен.
4) Похоже, что yolo работает только на 416x416. Можем ли мы заставить это работать для других измерений? например 1000x200? Какие изменения мне потребуется внести в yolo.cfg?
5) Зависит ли время, необходимое для классификации изображения, от размера изображения?