ChenYingpeng / darknet2caffe

Convert darknet weights to caffemodel
183 stars 88 forks source link

YOLOv3-tiny、YOLOv4可以转,YOLOv4-tiny转不了 #31

Open doolisty opened 3 years ago

doolisty commented 3 years ago

看错误提示,是不是读取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)

Ardang666 commented 3 years ago

@doolisty are you solve this problem?

dungdo123 commented 1 year ago

hi, did you guys solve this problem? thanks

kitten23 commented 1 year ago

hi, did you guys solve this problem? thanks

yolo4有mish应该转不了caffe吧,v4tiny可以转

dungdo123 commented 1 year ago

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

kitten23 commented 1 year ago

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实现

noiregot commented 1 year ago

'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
noiregot commented 1 year ago

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