Я тренировался Cifar10
(кофейная) модель для классификации двух классов. Пешеход и не пешеход. Тренировка выглядит хорошо, я обновил вес в caffemodel
файл. Я использовал две метки 1 для пешеходов и 2 для не пешеходов, вместе с изображениями для пешеходов (64 x 160) и фоновыми изображениями (64 x 160).
После тренировки я делаю тестирование с положительным изображением (изображение пешехода) и отрицательным изображением (фоновое изображение). Мое тестирование prototxt
файл как показано ниже
name: "CIFAR10_quick_test"layers
{
name: "data"type: MEMORY_DATA
top: "data"top: "label"memory_data_param
{
batch_size: 1
channels: 3
height: 160
width: 64
}
transform_param
{
crop_size: 64
mirror: false
mean_file: "../../examples/cifar10/mean.binaryproto"}
}
layers {
name: "conv1"type: CONVOLUTION
bottom: "data"top: "conv1"blobs_lr: 1
blobs_lr: 2
convolution_param {
num_output: 32
pad: 2
kernel_size: 5
stride: 1
}
}
layers {
name: "pool1"type: POOLING
bottom: "conv1"top: "pool1"pooling_param {
pool: MAX
kernel_size: 3
stride: 2
}
}
layers {
name: "relu1"type: RELU
bottom: "pool1"top: "pool1"}
layers {
name: "conv2"type: CONVOLUTION
bottom: "pool1"top: "conv2"blobs_lr: 1
blobs_lr: 2
convolution_param {
num_output: 32
pad: 2
kernel_size: 5
stride: 1
}
}
layers {
name: "relu2"type: RELU
bottom: "conv2"top: "conv2"}
layers {
name: "pool2"type: POOLING
bottom: "conv2"top: "pool2"pooling_param {
pool: AVE
kernel_size: 3
stride: 2
}
}
layers {
name: "conv3"type: CONVOLUTION
bottom: "pool2"top: "conv3"blobs_lr: 1
blobs_lr: 2
convolution_param {
num_output: 64
pad: 2
kernel_size: 5
stride: 1
}
}
layers {
name: "relu3"type: RELU
bottom: "conv3"top: "conv3"}
layers {
name: "pool3"type: POOLING
bottom: "conv3"top: "pool3"pooling_param {
pool: AVE
kernel_size: 3
stride: 2
}
}
layers {
name: "ip1"type: INNER_PRODUCT
bottom: "pool3"top: "ip1"blobs_lr: 1
blobs_lr: 2
inner_product_param {
num_output: 64
}
}
layers {
name: "ip2"type: INNER_PRODUCT
bottom: "ip1"top: "ip2"blobs_lr: 1
blobs_lr: 2
inner_product_param {
num_output: 10
}
}
layers {
name: "prob"type: SOFTMAX
bottom: "ip2"top: "prob"}
Для тестирования я использовал test_predict_imagenet.cpp
и сделал некоторые изменения, особенно для путей и размера изображения.
Я не могу понять результаты теста. Когда я тестирую с положительным изображением, я получаю вывод как
I0813 01:55:30.378114 7668 test_predict_cifarnet.cpp:72] 1
I0813 01:55:30.379082 7668 test_predict_cifarnet.cpp:72] 3.90971e-007
I0813 01:55:30.381088 7668 test_predict_cifarnet.cpp:72] 0.00406029
I0813 01:55:30.383090 7668 test_predict_cifarnet.cpp:72] 0.995887
I0813 01:55:30.384119 7668 test_predict_cifarnet.cpp:72] 1.96203e-006
I0813 01:55:30.385095 7668 test_predict_cifarnet.cpp:72] 3.50333e-005
I0813 01:55:30.386119 7668 test_predict_cifarnet.cpp:72] 1.2796e-008
I0813 01:55:30.387097 7668 test_predict_cifarnet.cpp:72] 1.48836e-005
I0813 01:55:30.389093 7668 test_predict_cifarnet.cpp:72] 1.12237e-007
I0813 01:55:30.390100 7668 test_predict_cifarnet.cpp:72] 4.71238e-008
I0813 01:55:30.391101 7668 test_predict_cifarnet.cpp:72] 9.04134e-008
Когда я тестирую с отрицательным изображением, я получил вывод
I0813 01:53:40.896139 10856 test_predict_cifarnet.cpp:72] 1
I0813 01:53:40.897117 10856 test_predict_cifarnet.cpp:72] 6.20882e-006
I0813 01:53:40.898115 10856 test_predict_cifarnet.cpp:72] 7.10468e-005
I0813 01:53:40.900184 10856 test_predict_cifarnet.cpp:72] 0.999911
I0813 01:53:40.901185 10856 test_predict_cifarnet.cpp:72] 3.4275e-006
I0813 01:53:40.902189 10856 test_predict_cifarnet.cpp:72] 2.38526e-007
I0813 01:53:40.903192 10856 test_predict_cifarnet.cpp:72] 2.29073e-007
I0813 01:53:40.905187 10856 test_predict_cifarnet.cpp:72] 1.7243e-006
I0813 01:53:40.906188 10856 test_predict_cifarnet.cpp:72] 5.40765e-007
I0813 01:53:40.908195 10856 test_predict_cifarnet.cpp:72] 1.57534e-006
I0813 01:53:40.909195 10856 test_predict_cifarnet.cpp:72] 3.72312e-006
Как понять результаты тестирования?
Есть ли более эффективный алгоритм тестирования для тестирования модели из видеопотока (кадр за кадром из видеоклипа)?
Почему вы должны num_output: 10
для последнего слоя ip2
? вам нужен только двухсторонний классификатор? Почему вы используете метки 1 и 2 вместо 0 и 1?
Что ты получил: У вас есть 11 выходов: один "label"
выход из слоя данных, а остальные 10 выходов являются 10-векторным выходом слоя softmax. Неясно, каковы значения 10-вектора, так как вы тренировались только с использованием двух меток, поэтому 8 из 10 записей вообще не контролировались. Более того, судя по первому выводу, похоже, что оба теста были образцами с этикеткой 1
и не 2
,
Что ты должен делать:
1. Измените самый верхний полностью связанный слой, чтобы иметь только два выхода (я также изменил формат, чтобы соответствовать новой версии protobuff)
layer {
name: "ip2/pedestrains"type: "InnerProduct"bottom: "ip1"top: "ip2"param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 2 # This is what you need changing
}
}
2. Измените двоичные метки в ваших тренировочных данных на 0/1 вместо 1/2.
Теперь вы можете тренироваться снова и посмотреть, что вы получите.