vlfeat / matconvnet

MatConvNet: CNNs for MATLAB
Other
1.4k stars 753 forks source link

dilate is no supported in caffe importer #816

Closed jiuerbujie closed 7 years ago

jiuerbujie commented 7 years ago

Hi, all

When I tried to import deeplab to Matconvnet, I found that dilate attribute is not save to mat file, even though it is already read from prototxt.

You can see display function of class CaffeConv in file utils/layers.py , that dilation is already read.

    def display(self):
        super(CaffeConv, self).display()
        print "  +- filter dimension:", self.filter_depth
        print "  c- num_output (num filters): %s" % self.num_output
        print "  c- bias_term: %s" % self.bias_term
        print "  c- pad: %s" % (self.pad,)
        print "  c- kernel_size: %s" % self.kernel_size
        print "  c- stride: %s" % (self.stride,)
        print "  c- dilation: %s" % (self.dilation,)
        print "  c- group: %s" % (self.group,)

However, it is not save to mat, see toMatlab function of CaffeConv

    def toMatlab(self):
        size = self.kernel_size + [self.filter_depth, self.num_output]
        mlayer = super(CaffeConv, self).toMatlab()
        mlayer['type'][0] = u'dagnn.Conv'
        mlayer['block'][0] = dictToMatlabStruct(
            {'hasBias': self.bias_term,
             'size': row(size),
             'pad': row(self.pad),
             'stride': row(self.stride)})
        return mlayer

Can I just add a line to toMatlab to write dilate attribute, or more modification must be made?

albanie commented 7 years ago

Hi @jiuerbujie, yep, that should do it! The last two functions of CaffeConv should look like this:

def toMatlab(self):
    size = self.kernel_size + [self.filter_depth, self.num_output]
    mlayer = super(CaffeConv, self).toMatlab()
    mlayer['type'][0] = u'dagnn.Conv'
    mlayer['block'][0] = dictToMatlabStruct(
        {'hasBias': self.bias_term,
         'size': row(size),
         'pad': row(self.pad),
         'stride': row(self.stride),
         'dilate': row(self.dilation)})
    return mlayer

def toMatlabSimpleNN(self):
    size = self.kernel_size + [self.filter_depth, self.num_output]
    mlayer = super(CaffeConv, self).toMatlabSimpleNN()
    mlayer['type'] = u'conv'
    mlayer['weights'] = np.empty([1,len(self.params)], dtype=np.object)
    mlayer['size'] = row(size)
    mlayer['pad'] = row(self.pad)
    mlayer['stride'] = row(self.stride)
    mlayer['dilate'] = row(self.dilation)
    for p, name in enumerate(self.params):
        mlayer['weights'][0,p] = self.model.params[name].toMatlabSimpleNN()
    return mlayer