Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
doolisty opened this issue Feb 1, 2021 · 7 comments
Open

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

doolisty opened this issue Feb 1, 2021 · 7 comments

Comments

@doolisty
Copy link

doolisty commented Feb 1, 2021

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

@doolisty are you solve this problem?

@dungdo123
Copy link

hi, did you guys solve this problem? thanks

@kitten23
Copy link

kitten23 commented Dec 5, 2022

hi, did you guys solve this problem? thanks

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

@dungdo123
Copy link

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
Copy link

kitten23 commented Dec 5, 2022

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
Copy link

noiregot commented Mar 9, 2023

'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
Copy link

noiregot commented Mar 9, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants