Open doolisty opened 3 years ago
@doolisty are you solve this problem?
hi, did you guys solve this problem? thanks
hi, did you guys solve this problem? thanks
yolo4有mish应该转不了caffe吧,v4tiny可以转
hi, did you guys solve this problem? thanks
yolo4有mish应该转不了caffe吧,v4tiny可以转
Chen has provided the 'mish' layer for caffe, just remake the caffe with new source and convert yolov4! about the yolov4-tiny, 'groups' and 'group_id' not available yet
hi, did you guys solve this problem? thanks
yolo4有mish应该转不了caffe吧,v4tiny可以转
Chen has provided the 'mish' layer for caffe, just remake the caffe with new source and convert yolov4! about the yolov4-tiny, 'groups' and 'group_id' not available yet
'groups'可以用caffe的slice实现
'groups'可以用caffe的slice实现,参考https://blog.csdn.net/qq_37532213/article/details/114642626。具体可以修改darknet2caffe.py里边的函数cfg2prototxt(cfgfile),将下边的内容粘贴覆盖进去就行。
def cfg2prototxt(cfgfile):
blocks = parse_cfg(cfgfile)
prev_filters = 3
layers = []
props = OrderedDict()
bottom = 'data'
layer_id = 1
topnames = dict()
for block in blocks:
if block['type'] == 'net':
props['name'] = 'Darkent2Caffe'
props['input'] = 'data'
props['input_dim'] = ['1']
props['input_dim'].append(block['channels'])
props['input_dim'].append(block['height'])
props['input_dim'].append(block['width'])
continue
elif block['type'] == 'convolutional':
conv_layer = OrderedDict()
conv_layer['bottom'] = bottom
if block.has_key('name'):
conv_layer['top'] = block['name']
conv_layer['name'] = block['name']
else:
conv_layer['top'] = 'layer%d-conv' % layer_id
conv_layer['name'] = 'layer%d-conv' % layer_id
conv_layer['type'] = 'Convolution'
convolution_param = OrderedDict()
convolution_param['num_output'] = block['filters']
prev_filters = block['filters']
convolution_param['kernel_size'] = block['size']
if block['pad'] == '1':
convolution_param['pad'] = str(int(convolution_param['kernel_size']) // 2)
convolution_param['stride'] = block['stride']
if block['batch_normalize'] == '1':
convolution_param['bias_term'] = 'false'
else:
convolution_param['bias_term'] = 'true'
conv_layer['convolution_param'] = convolution_param
layers.append(conv_layer)
bottom = conv_layer['top']
if block['batch_normalize'] == '1':
bn_layer = OrderedDict()
bn_layer['bottom'] = bottom
bn_layer['top'] = bottom
if block.has_key('name'):
bn_layer['name'] = '%s-bn' % block['name']
else:
bn_layer['name'] = 'layer%d-bn' % layer_id
bn_layer['type'] = 'BatchNorm'
batch_norm_param = OrderedDict()
batch_norm_param['use_global_stats'] = 'true'
bn_layer['batch_norm_param'] = batch_norm_param
layers.append(bn_layer)
scale_layer = OrderedDict()
scale_layer['bottom'] = bottom
scale_layer['top'] = bottom
if block.has_key('name'):
scale_layer['name'] = '%s-scale' % block['name']
else:
scale_layer['name'] = 'layer%d-scale' % layer_id
scale_layer['type'] = 'Scale'
scale_param = OrderedDict()
scale_param['bias_term'] = 'true'
scale_layer['scale_param'] = scale_param
layers.append(scale_layer)
if block['activation'] != 'linear':
activate_layer = OrderedDict()
activate_layer['bottom'] = bottom
activate_layer['top'] = bottom
if block.has_key('name'):
activate_layer['name'] = '%s-act' % block['name']
else:
activate_layer['name'] = 'layer%d-act' % layer_id
if block['activation'] == 'leaky':
activate_layer['type'] = 'ReLU'
relu_param = OrderedDict()
relu_param['negative_slope'] = '0.1'
activate_layer['relu_param'] = relu_param
elif block['activation'] == 'mish':
activate_layer['type'] = 'Mish'
layers.append(activate_layer)
topnames[layer_id] = bottom
layer_id = layer_id+1
elif block['type'] == 'depthwise_convolutional':
conv_layer = OrderedDict()
conv_layer['bottom'] = bottom
if block.has_key('name'):
conv_layer['top'] = block['name']
conv_layer['name'] = block['name']
else:
conv_layer['top'] = 'layer%d-dwconv' % layer_id
conv_layer['name'] = 'layer%d-dwconv' % layer_id
conv_layer['type'] = 'ConvolutionDepthwise'
convolution_param = OrderedDict()
convolution_param['num_output'] = prev_filters
convolution_param['kernel_size'] = block['size']
if block['pad'] == '1':
convolution_param['pad'] = str(int(convolution_param['kernel_size']) // 2)
convolution_param['stride'] = block['stride']
if block['batch_normalize'] == '1':
convolution_param['bias_term'] = 'false'
else:
convolution_param['bias_term'] = 'true'
conv_layer['convolution_param'] = convolution_param
layers.append(conv_layer)
bottom = conv_layer['top']
if block['batch_normalize'] == '1':
bn_layer = OrderedDict()
bn_layer['bottom'] = bottom
bn_layer['top'] = bottom
if block.has_key('name'):
bn_layer['name'] = '%s-bn' % block['name']
else:
bn_layer['name'] = 'layer%d-bn' % layer_id
bn_layer['type'] = 'BatchNorm'
batch_norm_param = OrderedDict()
batch_norm_param['use_global_stats'] = 'true'
bn_layer['batch_norm_param'] = batch_norm_param
layers.append(bn_layer)
scale_layer = OrderedDict()
scale_layer['bottom'] = bottom
scale_layer['top'] = bottom
if block.has_key('name'):
scale_layer['name'] = '%s-scale' % block['name']
else:
scale_layer['name'] = 'layer%d-scale' % layer_id
scale_layer['type'] = 'Scale'
scale_param = OrderedDict()
scale_param['bias_term'] = 'true'
scale_layer['scale_param'] = scale_param
layers.append(scale_layer)
if block['activation'] != 'linear':
relu_layer = OrderedDict()
relu_layer['bottom'] = bottom
relu_layer['top'] = bottom
if block.has_key('name'):
relu_layer['name'] = '%s-act' % block['name']
else:
relu_layer['name'] = 'layer%d-act' % layer_id
relu_layer['type'] = 'ReLU'
if block['activation'] == 'leaky':
relu_param = OrderedDict()
relu_param['negative_slope'] = '0.1'
relu_layer['relu_param'] = relu_param
layers.append(relu_layer)
topnames[layer_id] = bottom
layer_id = layer_id+1
elif block['type'] == 'maxpool':
max_layer = OrderedDict()
max_layer['bottom'] = bottom
if block.has_key('name'):
max_layer['top'] = block['name']
max_layer['name'] = block['name']
else:
max_layer['top'] = 'layer%d-maxpool' % layer_id
max_layer['name'] = 'layer%d-maxpool' % layer_id
max_layer['type'] = 'Pooling'
pooling_param = OrderedDict()
pooling_param['stride'] = block['stride']
pooling_param['pool'] = 'MAX'
# pooling_param['kernel_size'] = block['size']
# pooling_param['pad'] = str((int(block['size'])-1) // 2)
if (int(block['size']) - int(block['stride'])) % 2 == 0:
pooling_param['kernel_size'] = block['size']
pooling_param['pad'] = str((int(block['size'])-1) // 2)
if (int(block['size']) - int(block['stride'])) % 2 == 1:
pooling_param['kernel_size'] = str(int(block['size']) + 1)
pooling_param['pad'] = str((int(block['size']) + 1) // 2)
max_layer['pooling_param'] = pooling_param
layers.append(max_layer)
bottom = max_layer['top']
topnames[layer_id] = bottom
layer_id = layer_id+1
elif block['type'] == 'avgpool':
avg_layer = OrderedDict()
avg_layer['bottom'] = bottom
if block.has_key('name'):
avg_layer['top'] = block['name']
avg_layer['name'] = block['name']
else:
avg_layer['top'] = 'layer%d-avgpool' % layer_id
avg_layer['name'] = 'layer%d-avgpool' % layer_id
avg_layer['type'] = 'Pooling'
pooling_param = OrderedDict()
pooling_param['kernel_size'] = 7
pooling_param['stride'] = 1
pooling_param['pool'] = 'AVE'
avg_layer['pooling_param'] = pooling_param
layers.append(avg_layer)
bottom = avg_layer['top']
topnames[layer_id] = bottom
layer_id = layer_id+1
elif block['type'] == 'region':
if True:
region_layer = OrderedDict()
region_layer['bottom'] = bottom
if block.has_key('name'):
region_layer['top'] = block['name']
region_layer['name'] = block['name']
else:
region_layer['top'] = 'layer%d-region' % layer_id
region_layer['name'] = 'layer%d-region' % layer_id
region_layer['type'] = 'Region'
region_param = OrderedDict()
region_param['anchors'] = block['anchors'].strip()
region_param['classes'] = block['classes']
region_param['num'] = block['num']
region_layer['region_param'] = region_param
layers.append(region_layer)
bottom = region_layer['top']
topnames[layer_id] = bottom
layer_id = layer_id + 1
elif block['type'] == 'route':
if block.has_key('groups'):
route_layer = OrderedDict()
layer_name = str(block['layers']).split(',')
bottom_layer_size = len(str(block['layers']).split(','))
bottoms = []
for i in range(bottom_layer_size):
if int(layer_name[i]) < 0:
prev_layer_id = layer_id + int(layer_name[i])
else:
prev_layer_id = int(layer_name[i]) + 1
bottom = topnames[prev_layer_id]
bottoms.append(bottom)
route_layer['bottom'] = bottoms
if block.has_key('name'):
route_layer['top'] = block['name']
route_layer['name'] = block['name']
else:
top = ['layer%d-unuse'%layer_id]
top.append('layer%d-route'%layer_id)
route_layer['top'] = top
route_layer['name'] = 'layer%d-route' % layer_id
slice_param = OrderedDict()
slice_param['slice_point'] = str(int(int(convolution_param['num_output'])/2))
route_layer['type'] = 'Slice'
route_layer['slice_param'] = slice_param
layers.append(route_layer)
if len(route_layer['top']) > 1:
bottom = route_layer['top'][1]
else:
bottom = route_layer['top']
topnames[layer_id] = bottom
layer_id = layer_id + 1
else:
route_layer = OrderedDict()
layer_name = str(block['layers']).split(',')
bottom_layer_size = len(str(block['layers']).split(','))
bottoms = []
for i in range(bottom_layer_size):
if int(layer_name[i]) < 0:
prev_layer_id = layer_id + int(layer_name[i])
else:
prev_layer_id = int(layer_name[i]) + 1
bottom = topnames[prev_layer_id]
bottoms.append(bottom)
route_layer['bottom'] = bottoms
if block.has_key('name'):
route_layer['top'] = block['name']
route_layer['name'] = block['name']
else:
route_layer['top'] = 'layer%d-route' % layer_id
route_layer['name'] = 'layer%d-route' % layer_id
route_layer['type'] = 'Concat'
layers.append(route_layer)
bottom = route_layer['top']
topnames[layer_id] = bottom
layer_id = layer_id + 1
elif block['type'] == 'upsample':
upsample_layer = OrderedDict()
upsample_layer['bottom'] = bottom
if block.has_key('name'):
upsample_layer['top'] = block['name']
upsample_layer['name'] = block['name']
else:
upsample_layer['top'] = 'layer%d-upsample' % layer_id
upsample_layer['name'] = 'layer%d-upsample' % layer_id
upsample_layer['type'] = 'Upsample'
upsample_param = OrderedDict()
upsample_param['scale'] = block['stride']
upsample_layer['upsample_param'] = upsample_param
layers.append(upsample_layer)
bottom = upsample_layer['top']
print('upsample:',layer_id)
topnames[layer_id] = bottom
layer_id = layer_id + 1
elif block['type'] == 'shortcut':
prev_layer_id1 = layer_id + int(block['from'])
prev_layer_id2 = layer_id - 1
bottom1 = topnames[prev_layer_id1]
bottom2= topnames[prev_layer_id2]
shortcut_layer = OrderedDict()
shortcut_layer['bottom'] = [bottom1, bottom2]
if block.has_key('name'):
shortcut_layer['top'] = block['name']
shortcut_layer['name'] = block['name']
else:
shortcut_layer['top'] = 'layer%d-shortcut' % layer_id
shortcut_layer['name'] = 'layer%d-shortcut' % layer_id
shortcut_layer['type'] = 'Eltwise'
eltwise_param = OrderedDict()
eltwise_param['operation'] = 'SUM'
shortcut_layer['eltwise_param'] = eltwise_param
layers.append(shortcut_layer)
bottom = shortcut_layer['top']
if block['activation'] != 'linear':
relu_layer = OrderedDict()
relu_layer['bottom'] = bottom
relu_layer['top'] = bottom
if block.has_key('name'):
relu_layer['name'] = '%s-act' % block['name']
else:
relu_layer['name'] = 'layer%d-act' % layer_id
relu_layer['type'] = 'ReLU'
if block['activation'] == 'leaky':
relu_param = OrderedDict()
relu_param['negative_slope'] = '0.1'
relu_layer['relu_param'] = relu_param
layers.append(relu_layer)
topnames[layer_id] = bottom
layer_id = layer_id + 1
elif block['type'] == 'connected':
fc_layer = OrderedDict()
fc_layer['bottom'] = bottom
if block.has_key('name'):
fc_layer['top'] = block['name']
fc_layer['name'] = block['name']
else:
fc_layer['top'] = 'layer%d-fc' % layer_id
fc_layer['name'] = 'layer%d-fc' % layer_id
fc_layer['type'] = 'InnerProduct'
fc_param = OrderedDict()
fc_param['num_output'] = int(block['output'])
fc_layer['inner_product_param'] = fc_param
layers.append(fc_layer)
bottom = fc_layer['top']
if block['activation'] != 'linear':
relu_layer = OrderedDict()
relu_layer['bottom'] = bottom
relu_layer['top'] = bottom
if block.has_key('name'):
relu_layer['name'] = '%s-act' % block['name']
else:
relu_layer['name'] = 'layer%d-act' % layer_id
relu_layer['type'] = 'ReLU'
if block['activation'] == 'leaky':
relu_param = OrderedDict()
relu_param['negative_slope'] = '0.1'
relu_layer['relu_param'] = relu_param
layers.append(relu_layer)
topnames[layer_id] = bottom
layer_id = layer_id+1
else:
print('unknow layer type %s ' % block['type'])
topnames[layer_id] = bottom
layer_id = layer_id + 1
net_info = OrderedDict()
net_info['props'] = props
net_info['layers'] = layers
return net_info
anchor: 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 caffe文件会输出五个层,按顺序分别为:layer37-conv,layer20-unuse,layer12-unuse,layer4-unuse,layer30-conv 其中有三个层unuse是不需要的,后续处理只需要对两个conv层做就行。 layer37-conv的anchor是10,14, 23,27, 37,58 layer30-conv的anchor是81,82, 135,169, 344,319
看错误提示,是不是读取config的时候参数读太多了,到后面加载的.weight文件里面的参数量不够分配的 还没时间详细找原因,希望作者review下代码 顺便贴一下错误日志,其中包含我的调试信息(我的是重新训练的单类检测):
layer1-conv start: 128, conv_weight.size: 864, conv_weight.shape: (32, 3, 3, 3), conv_param[0].data[...]: (32, 3, 3, 3), buf[start:start+conv_weight.size]: (864,), buf: (5880324,) layer2-conv start: 1248, conv_weight.size: 18432, conv_weight.shape: (64, 32, 3, 3), conv_param[0].data[...]: (64, 32, 3, 3), buf[start:start+conv_weight.size]: (18432,), buf: (5880324,) layer3-conv start: 19936, conv_weight.size: 36864, conv_weight.shape: (64, 64, 3, 3), conv_param[0].data[...]: (64, 64, 3, 3), buf[start:start+conv_weight.size]: (36864,), buf: (5880324,) layer5-conv start: 56928, conv_weight.size: 18432, conv_weight.shape: (32, 64, 3, 3), conv_param[0].data[...]: (32, 64, 3, 3), buf[start:start+conv_weight.size]: (18432,), buf: (5880324,) layer6-conv start: 75488, conv_weight.size: 9216, conv_weight.shape: (32, 32, 3, 3), conv_param[0].data[...]: (32, 32, 3, 3), buf[start:start+conv_weight.size]: (9216,), buf: (5880324,) layer8-conv start: 84960, conv_weight.size: 4096, conv_weight.shape: (64, 64, 1, 1), conv_param[0].data[...]: (64, 64, 1, 1), buf[start:start+conv_weight.size]: (4096,), buf: (5880324,) layer11-conv start: 89568, conv_weight.size: 147456, conv_weight.shape: (128, 128, 3, 3), conv_param[0].data[...]: (128, 128, 3, 3), buf[start:start+conv_weight.size]: (147456,), buf: (5880324,) layer13-conv start: 237280, conv_weight.size: 73728, conv_weight.shape: (64, 128, 3, 3), conv_param[0].data[...]: (64, 128, 3, 3), buf[start:start+conv_weight.size]: (73728,), buf: (5880324,) layer14-conv start: 311264, conv_weight.size: 36864, conv_weight.shape: (64, 64, 3, 3), conv_param[0].data[...]: (64, 64, 3, 3), buf[start:start+conv_weight.size]: (36864,), buf: (5880324,) layer16-conv start: 348640, conv_weight.size: 16384, conv_weight.shape: (128, 128, 1, 1), conv_param[0].data[...]: (128, 128, 1, 1), buf[start:start+conv_weight.size]: (16384,), buf: (5880324,) layer19-conv start: 366048, conv_weight.size: 589824, conv_weight.shape: (256, 256, 3, 3), conv_param[0].data[...]: (256, 256, 3, 3), buf[start:start+conv_weight.size]: (589824,), buf: (5880324,) layer21-conv start: 956384, conv_weight.size: 294912, conv_weight.shape: (128, 256, 3, 3), conv_param[0].data[...]: (128, 256, 3, 3), buf[start:start+conv_weight.size]: (294912,), buf: (5880324,) layer22-conv start: 1251808, conv_weight.size: 147456, conv_weight.shape: (128, 128, 3, 3), conv_param[0].data[...]: (128, 128, 3, 3), buf[start:start+conv_weight.size]: (147456,), buf: (5880324,) layer24-conv start: 1400288, conv_weight.size: 65536, conv_weight.shape: (256, 256, 1, 1), conv_param[0].data[...]: (256, 256, 1, 1), buf[start:start+conv_weight.size]: (65536,), buf: (5880324,) layer27-conv start: 1467872, conv_weight.size: 2359296, conv_weight.shape: (512, 512, 3, 3), conv_param[0].data[...]: (512, 512, 3, 3), buf[start:start+conv_weight.size]: (2359296,), buf: (5880324,) layer28-conv start: 3828192, conv_weight.size: 131072, conv_weight.shape: (256, 512, 1, 1), conv_param[0].data[...]: (256, 512, 1, 1), buf[start:start+conv_weight.size]: (131072,), buf: (5880324,) layer29-conv start: 3961312, conv_weight.size: 1179648, conv_weight.shape: (512, 256, 3, 3), conv_param[0].data[...]: (512, 256, 3, 3), buf[start:start+conv_weight.size]: (1179648,), buf: (5880324,) unknow layer type yolo layer33-conv start: 5150706, conv_weight.size: 32768, conv_weight.shape: (128, 256, 1, 1), conv_param[0].data[...]: (128, 256, 1, 1), buf[start:start+conv_weight.size]: (32768,), buf: (5880324,) layer36-conv start: 5184498, conv_weight.size: 884736, conv_weight.shape: (256, 384, 3, 3), conv_param[0].data[...]: (256, 384, 3, 3), buf[start:start+conv_weight.size]: (695826,), buf: (5880324,) Traceback (most recent call last): File "darknet2caffe.py", line 534, in
darknet2caffe(cfgfile, weightfile, protofile, caffemodel)
File "darknet2caffe.py", line 69, in darknet2caffe
start = load_conv_bn2caffe(buf, start, params[conv_layer_name], params[bn_layer_name], params[scale_layer_name])
File "darknet2caffe.py", line 164, in load_conv_bn2caffe
conv_param[0].data[...] = np.reshape(buf[start:start+conv_weight.size], conv_weight.shape); start = start + conv_weight.size
File "/home/**/.local/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 292, in reshape
return _wrapfunc(a, 'reshape', newshape, order=order)
File "/home/**/.local/lib/python3.6/site-packages/numpy/core/fromnumeric.py", line 56, in _wrapfunc
return getattr(obj, method)(*args, **kwds)
ValueError: cannot reshape array of size 695826 into shape (256,384,3,3)