in mmdnn/conversion/coreml/coreml_parser.py [0:0]
def _convert_padding(source_node, IR_node):
source_node_layer = source_node.layer
if source_node_layer.HasField('convolution'):
# padding in conv
source_node_conv = source_node_layer.convolution
if source_node_conv.HasField('valid'):
# pad in IR is [x1_b, x2_b, ..., x1_e, x2_e, ...]
dim = []
for i in source_node_conv.valid.paddingAmounts.borderAmounts:
dim.extend([i.startEdgeSize, i.endEdgeSize])
if dim == []:
assign_IRnode_values(IR_node, { 'auto_pad': 'VALID'})
pad_dim = [0] * 8
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
else:
# padding
pad_dim = [0, 0]
pad_dim.extend(dim)
pad_dim += [0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
elif source_node_conv.HasField('same'):
# compute padding for 'same'
assign_IRnode_values(IR_node, {'auto_pad': "SAME"})
kernel = list(source_node_conv.kernelSize)
dilation = list(source_node_conv.dilationFactor)
if dilation == []:
dilation = [1,1]
stride = list(source_node_conv.stride)
if stride == []:
stride = [1,1]
kernel[0] = dilation[0] * ( kernel[0] -1 ) + 1
kernel[1] = dilation[1] * ( kernel[1] -1 ) + 1
if stride == [1,1]:
# https://discuss.mxnet.io/t/pooling-and-convolution-with-same-mode/528/3
p0 = ( kernel[0] -1 ) // 2
p1 = ( kernel[1] -1 ) // 2
if kernel[0] % 2 == 0:
p00 = p0
p01 = p0 + 1
else:
p00 = p0
p01 = p0
if kernel[1] % 2 == 0:
p10 = p1
p11 = p1 + 1
else:
p10 = p1
p11 = p1
pad_dim = [0, 0, p00, p01, p10, p11, 0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
else:
# https://www.jianshu.com/p/05c4f1621c7e
pad_dim = [0, 0, 0, 0, 0, 0, 0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
else:
assert False
elif source_node_layer.HasField('pooling'):
# padding in pooling
source_node_pool = source_node_layer.pooling
if source_node_pool.HasField('valid'):
dim = []
for i in source_node_pool.valid.paddingAmounts.borderAmounts:
dim.extend([i.startEdgeSize, i.endEdgeSize])
if dim == []:
assign_IRnode_values(IR_node, { 'auto_pad': 'VALID'})
pad_dim = [0] * 8
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
else:
# padding
pad_dim = [0, 0]
pad_dim.extend(dim)
pad_dim += [0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
elif source_node_pool.HasField('same'):
assign_IRnode_values(IR_node, { 'auto_pad': 'SAME'})
kernel = list(source_node_pool.kernelSize)
stride = list(source_node_pool.stride)
if stride == []:
stride = [1,1]
if stride == [1,1]:
# https://discuss.mxnet.io/t/pooling-and-convolution-with-same-mode/528/3
p0 = ( kernel[0] -1 ) // 2
p1 = ( kernel[1] -1 ) // 2
if kernel[0] % 2 == 0:
p00 = p0
p01 = p0 + 1
else:
p00 = p0
p01 = p0
if kernel[1] % 2 == 0:
p10 = p1
p11 = p1 + 1
else:
p10 = p1
p11 = p1
pad_dim = [0, 0, p00, p01, p10, p11, 0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
else:
# TODO
pad_dim = [0, 0, 0, 0, 0, 0, 0, 0]
pad_dim = convert_tf_pad_to_onnx(pad_dim)
assign_IRnode_values(IR_node, { 'pads': pad_dim})
elif source_node_pool.HasField('includeLastPixel'):
# symmetric padding
h, w = source_node_pool.includeLastPixel.paddingAmounts
assign_IRnode_values(IR_node, { 'pads': [ 0,h, h,0,0, w, w,0]})
else:
assert False
else:
assert False