def __init__(self): super().__init__() self.conv1 = Conv_Bn_Activation(128, 256, 3, 1, 'leaky') self.conv2 = Conv_Bn_Activation(256, 255, 1, 1, 'linear', bn=False) self.yolo1 = YoloLayer(anchor_mask=[0, 1, 2], num_classes=80, anchors=[ 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 ], num_anchors=9, stride=8) # R -4 self.conv3 = Conv_Bn_Activation(128, 256, 3, 2, 'leaky') # R -1 -16 self.conv4 = Conv_Bn_Activation(256, 256, 1, 1, 'leaky') self.conv5 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv6 = Conv_Bn_Activation(512, 256, 1, 1, 'leaky') self.conv7 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv8 = Conv_Bn_Activation(512, 256, 1, 1, 'leaky') self.conv9 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv10 = Conv_Bn_Activation(512, 255, 1, 1, 'liner', bn=False) self.yolo2 = YoloLayer(anchor_mask=[3, 4, 5], num_classes=80, anchors=[ 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 ], num_anchors=9, stride=16) # R -4 self.conv11 = Conv_Bn_Activation(256, 512, 3, 2, 'leaky') # R -1 -37 self.conv12 = Conv_Bn_Activation(512, 512, 1, 1, 'leaky') self.conv13 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv14 = Conv_Bn_Activation(1024, 512, 1, 1, 'leaky') self.conv15 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv16 = Conv_Bn_Activation(1024, 512, 1, 1, 'leaky') self.conv17 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv18 = Conv_Bn_Activation(1024, 255, 1, 1, 'liner', bn=False) self.yolo3 = YoloLayer(anchor_mask=[6, 7, 8], num_classes=80, anchors=[ 12, 16, 19, 36, 40, 28, 36, 75, 76, 55, 72, 146, 142, 110, 192, 243, 459, 401 ], num_anchors=9, stride=32)
def create_network(self, blocks): models = nn.ModuleList() prev_filters = 3 out_filters = [] prev_stride = 1 out_strides = [] conv_id = 0 for block in blocks: if block['type'] == 'net': prev_filters = int(block['channels']) continue elif block['type'] == 'convolutional': conv_id = conv_id + 1 batch_normalize = int(block['batch_normalize']) filters = int(block['filters']) kernel_size = int(block['size']) stride = int(block['stride']) is_pad = int(block['pad']) pad = (kernel_size - 1) // 2 if is_pad else 0 activation = block['activation'] model = nn.Sequential() if batch_normalize: model.add_module('conv{0}'.format(conv_id), nn.Conv2d(prev_filters, filters, kernel_size, stride, pad, bias=False)) model.add_module('bn{0}'.format(conv_id), nn.BatchNorm2d(filters)) # model.add_module('bn{0}'.format(conv_id), BN2d(filters)) else: model.add_module('conv{0}'.format(conv_id), nn.Conv2d(prev_filters, filters, kernel_size, stride, pad)) if activation == 'leaky': model.add_module('leaky{0}'.format(conv_id), nn.LeakyReLU(0.1, inplace=True)) elif activation == 'relu': model.add_module('relu{0}'.format(conv_id), nn.ReLU(inplace=True)) elif activation == 'mish': model.add_module('mish{0}'.format(conv_id), Mish()) else: print("convalution havn't activate {}".format(activation)) prev_filters = filters out_filters.append(prev_filters) prev_stride = stride * prev_stride out_strides.append(prev_stride) models.append(model) elif block['type'] == 'maxpool': pool_size = int(block['size']) stride = int(block['stride']) if stride > 1: model = nn.MaxPool2d(pool_size, stride) else: model = MaxPoolStride1(pool_size) out_filters.append(prev_filters) prev_stride = stride * prev_stride out_strides.append(prev_stride) models.append(model) elif block['type'] == 'avgpool': model = GlobalAvgPool2d() out_filters.append(prev_filters) models.append(model) elif block['type'] == 'softmax': model = nn.Softmax() out_strides.append(prev_stride) out_filters.append(prev_filters) models.append(model) elif block['type'] == 'cost': if block['_type'] == 'sse': model = nn.MSELoss(size_average=True) elif block['_type'] == 'L1': model = nn.L1Loss(size_average=True) elif block['_type'] == 'smooth': model = nn.SmoothL1Loss(size_average=True) out_filters.append(1) out_strides.append(prev_stride) models.append(model) elif block['type'] == 'reorg': stride = int(block['stride']) prev_filters = stride * stride * prev_filters out_filters.append(prev_filters) prev_stride = prev_stride * stride out_strides.append(prev_stride) models.append(Reorg(stride)) elif block['type'] == 'upsample': stride = int(block['stride']) out_filters.append(prev_filters) prev_stride = prev_stride // stride out_strides.append(prev_stride) # models.append(nn.Upsample(scale_factor=stride, mode='nearest')) models.append(Upsample(stride)) elif block['type'] == 'route': layers = block['layers'].split(',') ind = len(models) layers = [int(i) if int(i) > 0 else int(i) + ind for i in layers] if len(layers) == 1: prev_filters = out_filters[layers[0]] prev_stride = out_strides[layers[0]] elif len(layers) == 2: assert (layers[0] == ind - 1) prev_filters = out_filters[layers[0]] + out_filters[layers[1]] prev_stride = out_strides[layers[0]] elif len(layers) == 4: assert (layers[0] == ind - 1) prev_filters = out_filters[layers[0]] + out_filters[layers[1]] + out_filters[layers[2]] + \ out_filters[layers[3]] prev_stride = out_strides[layers[0]] else: print("route error!!!") out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(EmptyModule()) elif block['type'] == 'shortcut': ind = len(models) prev_filters = out_filters[ind - 1] out_filters.append(prev_filters) prev_stride = out_strides[ind - 1] out_strides.append(prev_stride) models.append(EmptyModule()) elif block['type'] == 'connected': filters = int(block['output']) if block['activation'] == 'linear': model = nn.Linear(prev_filters, filters) elif block['activation'] == 'leaky': model = nn.Sequential( nn.Linear(prev_filters, filters), nn.LeakyReLU(0.1, inplace=True)) elif block['activation'] == 'relu': model = nn.Sequential( nn.Linear(prev_filters, filters), nn.ReLU(inplace=True)) prev_filters = filters out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(model) elif block['type'] == 'region': loss = RegionLoss() anchors = block['anchors'].split(',') loss.anchors = [float(i) for i in anchors] loss.num_classes = int(block['classes']) loss.num_anchors = int(block['num']) loss.anchor_step = len(loss.anchors) // loss.num_anchors loss.object_scale = float(block['object_scale']) loss.noobject_scale = float(block['noobject_scale']) loss.class_scale = float(block['class_scale']) loss.coord_scale = float(block['coord_scale']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(loss) elif block['type'] == 'yolo': yolo_layer = YoloLayer() anchors = block['anchors'].split(',') anchor_mask = block['mask'].split(',') yolo_layer.anchor_mask = [int(i) for i in anchor_mask] yolo_layer.anchors = [float(i) for i in anchors] yolo_layer.num_classes = int(block['classes']) yolo_layer.num_anchors = int(block['num']) yolo_layer.anchor_step = len(yolo_layer.anchors) // yolo_layer.num_anchors yolo_layer.stride = prev_stride # yolo_layer.object_scale = float(block['object_scale']) # yolo_layer.noobject_scale = float(block['noobject_scale']) # yolo_layer.class_scale = float(block['class_scale']) # yolo_layer.coord_scale = float(block['coord_scale']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(yolo_layer) else: print('unknown type %s' % (block['type'])) return models
def __init__(self, output_ch, n_classes, anchors, inference=False): super().__init__() self.inference = inference self.conv1 = Conv_Bn_Activation(128, 256, 3, 1, 'leaky') self.conv2 = Conv_Bn_Activation(256, output_ch, 1, 1, 'linear', bn=False, bias=True) self.yolo1 = YoloLayer(anchor_mask=[0, 1, 2], num_classes=n_classes, anchors=anchors, num_anchors=9, stride=8) # R -4 self.conv3 = Conv_Bn_Activation(128, 256, 3, 2, 'leaky') # R -1 -16 self.conv4 = Conv_Bn_Activation(512, 256, 1, 1, 'leaky') self.conv5 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv6 = Conv_Bn_Activation(512, 256, 1, 1, 'leaky') self.conv7 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv8 = Conv_Bn_Activation(512, 256, 1, 1, 'leaky') self.conv9 = Conv_Bn_Activation(256, 512, 3, 1, 'leaky') self.conv10 = Conv_Bn_Activation(512, output_ch, 1, 1, 'linear', bn=False, bias=True) self.yolo2 = YoloLayer(anchor_mask=[3, 4, 5], num_classes=n_classes, anchors=anchors, num_anchors=9, stride=16) # R -4 self.conv11 = Conv_Bn_Activation(256, 512, 3, 2, 'leaky') # R -1 -37 self.conv12 = Conv_Bn_Activation(1024, 512, 1, 1, 'leaky') self.conv13 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv14 = Conv_Bn_Activation(1024, 512, 1, 1, 'leaky') self.conv15 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv16 = Conv_Bn_Activation(1024, 512, 1, 1, 'leaky') self.conv17 = Conv_Bn_Activation(512, 1024, 3, 1, 'leaky') self.conv18 = Conv_Bn_Activation(1024, output_ch, 1, 1, 'linear', bn=False, bias=True) self.yolo3 = YoloLayer(anchor_mask=[6, 7, 8], num_classes=n_classes, anchors=anchors, num_anchors=9, stride=32)
def create_network(self, blocks): ''' 根据解析结果List 构建pytorch模型 ''' # 新建个 模型List models = nn.ModuleList() prev_filters = 3 out_filters = [] # 某模块的输出通道数 prev_stride = 1 out_strides = [] conv_id = 0 for block in blocks: # if block['type'] == 'net': prev_filters = int(block['channels']) # 输入图像的通道数 continue elif block['type'] == 'convolutional': ''' 每个卷积层后都会跟一个BN层和一个 激活函数,算作list中的一行 ''' conv_id = conv_id + 1 batch_normalize = int(block['batch_normalize']) filters = int(block['filters']) kernel_size = int(block['size']) stride = int(block['stride']) # pad = 1 表示 使用pad,但是具体pad值时按照kernel_size计算的 is_pad = int(block['pad']) pad = (kernel_size - 1) // 2 if is_pad else 0 activation = block['activation'] model = nn.Sequential() # bn=1 表示 使用bn,具体值为 输出通道数 if batch_normalize: model.add_module( 'conv{0}'.format(conv_id), nn.Conv2d(prev_filters, filters, kernel_size, stride, pad, bias=False)) model.add_module('bn{0}'.format(conv_id), nn.BatchNorm2d(filters)) # model.add_module('bn{0}'.format(conv_id), BN2d(filters)) else: model.add_module( 'conv{0}'.format(conv_id), nn.Conv2d(prev_filters, filters, kernel_size, stride, pad)) # activation是 具体激活函数 if activation == 'leaky': model.add_module('leaky{0}'.format(conv_id), nn.LeakyReLU(0.1, inplace=True)) elif activation == 'relu': model.add_module('relu{0}'.format(conv_id), nn.ReLU(inplace=True)) elif activation == 'mish': model.add_module('mish{0}'.format(conv_id), Mish()) else: print("convalution havn't activate {}".format(activation)) prev_filters = filters out_filters.append(prev_filters) prev_stride = stride * prev_stride out_strides.append(prev_stride) models.append(model) elif block['type'] == 'maxpool': pool_size = int(block['size']) stride = int(block['stride']) model = nn.MaxPool2d(kernel_size=pool_size, stride=stride, padding=pool_size // 2) out_filters.append(prev_filters) prev_stride = stride * prev_stride out_strides.append(prev_stride) models.append(model) elif block['type'] == 'avgpool': model = GlobalAvgPool2d() out_filters.append(prev_filters) models.append(model) elif block['type'] == 'softmax': model = nn.Softmax() out_strides.append(prev_stride) out_filters.append(prev_filters) models.append(model) elif block['type'] == 'cost': ''' 构建 损失函数 ''' if block['_type'] == 'sse': model = nn.MSELoss(size_average=True) elif block['_type'] == 'L1': model = nn.L1Loss(size_average=True) elif block['_type'] == 'smooth': model = nn.SmoothL1Loss(size_average=True) out_filters.append(1) out_strides.append(prev_stride) models.append(model) elif block['type'] == 'reorg': ''' ??? ''' stride = int(block['stride']) prev_filters = stride * stride * prev_filters out_filters.append(prev_filters) prev_stride = prev_stride * stride out_strides.append(prev_stride) models.append(Reorg(stride)) elif block['type'] == 'upsample': ''' 上采样与rount搭配使用 上采样将feature map变大,然后与 之前的较大feature map在深度上合并 ''' stride = int(block['stride']) out_filters.append(prev_filters) prev_stride = prev_stride // stride out_strides.append(prev_stride) # models.append(nn.Upsample(scale_factor=stride, mode='nearest')) models.append(Upsample(stride)) elif block['type'] == 'route': ''' route 指 按照列来合并tensor,即扩展深度 ''' layers = block['layers'].split(',') ind = len(models) layers = [ int(i) if int(i) > 0 else int(i) + ind for i in layers ] if len(layers) == 1: prev_filters = out_filters[layers[0]] prev_stride = out_strides[layers[0]] elif len(layers) == 2: assert (layers[0] == ind - 1) prev_filters = out_filters[layers[0]] + out_filters[ layers[1]] prev_stride = out_strides[layers[0]] elif len(layers) == 4: assert (layers[0] == ind - 1) prev_filters = out_filters[layers[0]] + out_filters[layers[1]] + out_filters[layers[2]] + \ out_filters[layers[3]] prev_stride = out_strides[layers[0]] else: print("route error!!!") out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(EmptyModule()) elif block['type'] == 'shortcut': ''' shortcut 指 残差结构,卷积的跨层连接,即 将不同两层输出(即输出+残差块)逐元素相加 为 最后结果 ''' ind = len(models) prev_filters = out_filters[ind - 1] out_filters.append(prev_filters) prev_stride = out_strides[ind - 1] out_strides.append(prev_stride) models.append(EmptyModule()) elif block['type'] == 'connected': filters = int(block['output']) if block['activation'] == 'linear': model = nn.Linear(prev_filters, filters) elif block['activation'] == 'leaky': model = nn.Sequential(nn.Linear(prev_filters, filters), nn.LeakyReLU(0.1, inplace=True)) elif block['activation'] == 'relu': model = nn.Sequential(nn.Linear(prev_filters, filters), nn.ReLU(inplace=True)) prev_filters = filters out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(model) elif block['type'] == 'region': loss = RegionLoss() anchors = block['anchors'].split(',') loss.anchors = [float(i) for i in anchors] loss.num_classes = int(block['classes']) loss.num_anchors = int(block['num']) loss.anchor_step = len(loss.anchors) // loss.num_anchors loss.object_scale = float(block['object_scale']) loss.noobject_scale = float(block['noobject_scale']) loss.class_scale = float(block['class_scale']) loss.coord_scale = float(block['coord_scale']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(loss) elif block['type'] == 'yolo': yolo_layer = YoloLayer() anchors = block['anchors'].split(',') anchor_mask = block['mask'].split(',') yolo_layer.anchor_mask = [int(i) for i in anchor_mask] yolo_layer.anchors = [float(i) for i in anchors] yolo_layer.num_classes = int(block['classes']) yolo_layer.num_anchors = int(block['num']) yolo_layer.anchor_step = len( yolo_layer.anchors) // yolo_layer.num_anchors yolo_layer.stride = prev_stride # yolo_layer.object_scale = float(block['object_scale']) # yolo_layer.noobject_scale = float(block['noobject_scale']) # yolo_layer.class_scale = float(block['class_scale']) # yolo_layer.coord_scale = float(block['coord_scale']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(yolo_layer) else: print('unknown type %s' % (block['type'])) return models