У меня есть собственный набор данных изображений, и я хочу классифицировать их по 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) Зависит ли время, необходимое для классификации изображения, от размера изображения?
Задача ещё не решена.
Других решений пока нет …