Python 为什么net.blob[';fc7';]数据[0]都是零

Python 为什么net.blob[';fc7';]数据[0]都是零,python,opencv,neural-network,deep-learning,caffe,Python,Opencv,Neural Network,Deep Learning,Caffe,我想从人们的照片中提取面部描述符。这就是我到目前为止所做的: 首先使用python中的opencv库从照片中检测人脸 将这些面保存在另一个图像中 接下来我要从人脸图像中提取描述符 为此,我从这里下载了vgg face caffemodelCNN: 要提取描述符,首先我执行以下操作: net = caffe.Net('CAFFE_FACE_deploy.prototxt','CAFFE_FACE.caffemodel',caffe.TEST) img = caffe.io.load_image

我想从人们的照片中提取面部描述符。这就是我到目前为止所做的:

  • 首先使用python中的opencv库从照片中检测人脸
  • 将这些面保存在另一个图像中
  • 接下来我要从人脸图像中提取描述符
  • 为此,我从这里下载了
    vgg face caffemodel
    CNN:

    要提取描述符,首先我执行以下操作:

     net = caffe.Net('CAFFE_FACE_deploy.prototxt','CAFFE_FACE.caffemodel',caffe.TEST)
     img = caffe.io.load_image( "detectedface.jpg" )
     img = img[:,:,::-1]*255.0 
     avg = np.array([129.1863,104.7624,93.5940])
     img = img - avg 
     img = img.transpose((2,0,1)) 
     img = img[None,:]
     out = net.forward_all( data = img )
    
    但它给出了维度不匹配错误,即数据应该是维度
    (50,3224224)
    ,而不是
    (50,3490490)

    然后我试了一下:

      # input preprocessing: 'data' is the name of the input blob ==  net.inputs[0]
      transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
      transformer.set_transpose('data', (2,0,1))
      transformer.set_mean('data', np.load(caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)) # mean pixel
      transformer.set_raw_scale('data', 255)  # the reference model operates on   images in [0,255] range instead of [0,1]
      transformer.set_channel_swap('data', (2,1,0))  # the reference model has channels in BGR order instead of RGB
    
      net.blobs['data'].reshape(50,3,224,224)
    
      net.blobs['data'].data[...] = transformer.preprocess('data', caffe.io.load_image('detectedface.jpg'))
      out = net.forward()
    
      feats = net.blobs['fc7'].data[0]
    

    在这里,当我打印专长时,它显示所有零。为什么会这样?

    您是否检查过任何层是否都具有零权重?当prototxt中的图层名称与权重文件不同时,会发生这种情况。否,因为它是一个预训练的网络,并且经过测试。请帮助。对于net.params.keys()中的k:print(net.params[k][0].data),这将迭代层并打印权重。如果你得到一个所有权重都为零的层,那么在加载预先训练好的权重的过程中出现了一些问题。网络定义中的图层名称与培训期间使用的prototxt中使用的名称之间经常不匹配。您是否检查了任何图层是否都具有零权重?当prototxt中的图层名称与权重文件不同时,会发生这种情况。否,因为它是一个预训练的网络,并且经过测试。请帮助。对于net.params.keys()中的k:print(net.params[k][0].data),这将迭代层并打印权重。如果你得到一个所有权重都为零的层,那么在加载预先训练好的权重的过程中出现了一些问题。网络定义中的图层名称与培训期间使用的prototxt中使用的名称之间通常不匹配。