caffe: Ошибка проверки: bottom[0]-›num_axes() == first_spatial_axis + num_spatial_axes_ (3 против 4) нижний num_axes не может измениться

Я модифицирую сеть FCN и разрабатываю новую сеть, в которой я использую два уровня ImageData в качестве входных параметров и надеюсь, что сеть создаст изображение на выходе. вот train_val.prototxt и deploy.prototxt

исходное изображение и этикетка представлены в оттенках серого, а размеры - 224 * 224. Я обучил caffemodel и использую infer.py, чтобы использовать caffemodel для сегментации, но столкнулся с ошибкой:

 Check failed: bottom[0]->num_axes() == first_spatial_axis + num_spatial_axes_ (3 vs. 4) bottom num_axes may not change.

вот файл infer.py:

import numpy as np
from PIL import Image
caffe_root = '/home/zhaimo/' 
import sys
sys.path.insert(0, caffe_root + 'caffe-master/python')

import caffe
im = Image.open('/home/zhaimo/fcn-master/data/vessel/test/13.png')
in_ = np.array(im, dtype=np.float32)
#in_ = in_[:,:,::-1]
#in_ -= np.array((104.00698793,116.66876762,122.67891434))
#in_ = in_.transpose((2,0,1))


net = caffe.Net('/home/zhaimo/fcn-master/mo/deploy.prototxt', '/home/zhaimo/fcn-master/mo/snapshot/train/_iter_200000.caffemodel', caffe.TEST)
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
net.forward()
out = net.blobs['score'].data[0].argmax(axis=0)

plt.axis('off')
plt.savefig('/home/zhaimo/fcn-master/mo/result/13.png')

Как решить эту проблему?


person StalkerMuse    schedule 09.05.2017    source источник
comment
Возможно ли, что ваше входное изображение im имеет 2D-форму, а не 3D (с одиночным тусклым цветом для канала)?   -  person Shai    schedule 09.05.2017
comment
Извините, я не могу вас понять, не могли бы вы объяснить это яснее?   -  person StalkerMuse    schedule 09.05.2017
comment
ваша сеть ожидает ввода 4D: 1x1xHxW я подозреваю, что вы предоставляете ей ввод 1xHxW (т. е. вы вообще опускаете измерение канала). Вы видите разницу между 1xHxW 3D-массивом и HxW 2D-массивом?   -  person Shai    schedule 09.05.2017
comment
Я предоставляю 8-битные изображения в градациях серого в качестве входных данных на этапе тестирования, потому что я думал, что изображения в градациях серого занимают 1 канал. Итак, как изменить ввод, чтобы решить эту проблему, пожалуйста?   -  person StalkerMuse    schedule 09.05.2017
comment
если вы измените на net.blobs['data'].reshape(1, 1, *in_.shape). это помогает?   -  person Shai    schedule 09.05.2017
comment
да, но я встречаю другую ошибку: out = net.blobs['score'].data[0].argmax(axis=0) KeyError: 'score' как это решить, пожалуйста?   -  person StalkerMuse    schedule 09.05.2017


Ответы (1)


Ваша сеть ожидает ввода 4D формы 1x1xHxW. Это пакет с одним изображением, имеющим только один канал с высотой и шириной HxW. Таким образом, вход имеет два одноэлементных начальных измерения. То, что вы предоставляете своей сети, представляет собой пакет с одним 2D-изображением, то есть shape вашего in_ есть только HxW — вам не хватает одноэлементного измерения для измерения канала.
Чтобы решить вашу проблему, вам нужно явно добавить одноэлементное измерение:

 net.blobs['data'].reshape(1, 1, *in_.shape)

Что касается полученного вами KeyError, то в вашей сети нет BLOB-объектов с именем 'score', у вас есть 'upscore1' и 'prob':

 out = net.blobs['prob'].data[0].argmax(axis=0)
person Shai    schedule 09.05.2017