OpenCV cv :: dnn :: Net :: getBlob return dnn :: Blob :: matRefConst имеет строки == -1 и столбцы == -1

Снимок экрана: возвращен неверный результат getBlob:

изображение здесь

вот код дополнения:

resize(img, img, Size(224, 224));

dnn::Blob inputBlob = dnn::Blob::fromImages(img);
net.setBlob(".data", inputBlob);
net.forward();
dnn::Blob prob = net.getBlob( "loss1"/*"prob"*/);

и файл prototxt:
# name: «nin_imagenet» # следующие пять строк изменены по сравнению с прототипом caffe
# Я удаляю слои, у которых есть верх: «данные»
input: «data» # имя входа
input_dim: 1 # размер пакета
input_dim: 3 # количество каналов
input_dim: 224 # ширина
input_dim: 224 # высота

# unchaged text
# ...

# another changed compared to caffe's prototxt
# i delete layers who has **bottom: "label"**
layers {
name: "loss1"type: SOFTMAX
bottom: "fc81"top: "loss1"}
# changed below

1

Решение

Я думаю, потому что вы имеете дело с 4D-блобом, а не матрицей, размер хранится в массиве размеров (см. Пример ниже).
Попробуйте извлечь самолеты, используя этот фрагмент кода:

//-------------------------------------------------------
// Extract plane with defined n and c from nchw blob
//-------------------------------------------------------
void mtcnn::extractPlane(Mat &src, int n, int ch, Mat &dst)
{
const int rows = src.size[2];
const int cols = src.size[3];
dst = cv::Mat::zeros(rows, cols, CV_32FC1);

for (int row = 0; row < rows; row++)
{
const float *ptrsrc = src.ptr<float>(n, ch, row);
float *ptrdst = dst.ptr<float>(row);
for (int col = 0; col < cols; col++)
{
ptrdst[col] = ptrsrc[col];
}
}
}

Надеюсь, вы используете что-то вроде этого для установки входных данных:

        inputBlob = blobFromImage(img, 0.0078125, Size(ws, hs), Scalar(127.5, 127.5, 127.5)); //Convert Mat to batch of images
p_net.setInput(inputBlob, "data"); //set the network input
1

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

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

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