def create_network(self, blocks): models = nn.ModuleList() for i, block in enumerate(blocks): if block['type'] == 'net': self.width = int(block['width']) self.height = int(block['height']) continue elif block['type'] == 'yolo': yololayer = YoloLayer(use_cuda=self.use_cuda) anchors = block['anchors'].split(',') anchor_mask = block['mask'].split(',') yololayer.anchor_mask = [int(i) for i in anchor_mask] yololayer.anchors = [float(i) for i in anchors] yololayer.num_classes = int(block['classes']) yololayer.num_anchors = int(block['num']) yololayer.anchor_step = len(yololayer.anchors)//yololayer.num_anchors try: yololayer.rescore = int(block['rescore']) except: pass yololayer.nth_layer = i yololayer.ignore_thresh = float(block['ignore_thresh']) yololayer.truth_thresh = float(block['truth_thresh']) yololayer.net_width = self.width yololayer.net_height = self.height models.append(yololayer) return models
def create_network(self, blocks): models = nn.ModuleList() prev_filters = 3 out_filters = [] prev_stride = 1 out_strides = [] conv_id = 0 ind = -2 for block in blocks: ind += 1 if block['type'] == 'net': prev_filters = int(block['channels']) self.width = int(block['width']) self.height = int(block['height']) 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)) 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() 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]] 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': region_layer = RegionLayer(use_cuda=self.use_cuda) anchors = block['anchors'].split(',') region_layer.anchors = [float(i) for i in anchors] region_layer.num_classes = int(block['classes']) region_layer.num_anchors = int(block['num']) region_layer.anchor_step = len( region_layer.anchors) // region_layer.num_anchors region_layer.rescore = int(block['rescore']) region_layer.object_scale = float(block['object_scale']) region_layer.noobject_scale = float(block['noobject_scale']) region_layer.class_scale = float(block['class_scale']) region_layer.coord_scale = float(block['coord_scale']) region_layer.thresh = float(block['thresh']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(region_layer) elif block['type'] == 'yolo': yolo_layer = YoloLayer(use_cuda=self.use_cuda) 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 try: yolo_layer.rescore = int(block['rescore']) except: pass yolo_layer.ignore_thresh = float(block['ignore_thresh']) yolo_layer.truth_thresh = float(block['truth_thresh']) yolo_layer.stride = prev_stride yolo_layer.nth_layer = ind yolo_layer.net_width = self.width yolo_layer.net_height = self.height out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(yolo_layer) else: print('unknown type %s' % (block['type'])) return models
def create_network(self, blocks): models = nn.ModuleList() prev_filters = 3 out_filters = [] prev_stride = 1 out_strides = [] conv_id = 0 ind = -2 for block in blocks: ind += 1 if block['type'] == 'net': prev_filters = int(block['channels']) self.width = int(block['width']) self.height = int(block['height']) continue elif block['type'] == 'densenet': class FeatureDenseNet121(nn.Module): def __init__(self): super(FeatureDenseNet121, self).__init__() self.densenet121 = torchvision.models.densenet121() def forward(self, x): x = self.densenet121.features(x) return x def load_my_state_dict(net, state_dict): own_state = net.state_dict() for name, param in state_dict.items(): if name not in own_state: continue if isinstance(param, nn.Parameter): # backwards compatibility for serialized parameters param = param.data own_state[name].copy_(param) return net def dfs_freeze(model): for name, child in model.named_children(): for param in child.parameters(): param.requires_grad = False dfs_freeze(child) def dfs_unfreeze(model): for name, child in model.named_children(): for param in child.parameters(): param.requires_grad = True dfs_unfreeze(child) model = FeatureDenseNet121() dfs_unfreeze(model) self.pretrained_path = block['pretrained_path'] gpu = None if torch.cuda.is_available() else 'cpu' checkpoint = torch.load(self.pretrained_path, map_location=gpu) load_my_state_dict(model, checkpoint) print("=> loaded chexnet weights") prev_filters = int(block['filters']) stride = int(block['stride']) out_filters.append(prev_filters) prev_stride = stride * prev_stride out_strides.append(prev_stride) models.append(model) 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)) 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() 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]] 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': region_layer = RegionLayer(use_cuda=self.use_cuda) anchors = block['anchors'].split(',') region_layer.anchors = [float(i) for i in anchors] region_layer.num_classes = int(block['classes']) region_layer.num_anchors = int(block['num']) region_layer.anchor_step = len( region_layer.anchors) // region_layer.num_anchors region_layer.rescore = int(block['rescore']) region_layer.object_scale = float(block['object_scale']) region_layer.noobject_scale = float(block['noobject_scale']) region_layer.class_scale = float(block['class_scale']) region_layer.coord_scale = float(block['coord_scale']) region_layer.thresh = float(block['thresh']) out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(region_layer) elif block['type'] == 'yolo': yolo_layer = YoloLayer(use_cuda=self.use_cuda) 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 try: yolo_layer.rescore = int(block['rescore']) except: pass yolo_layer.ignore_thresh = float(block['ignore_thresh']) yolo_layer.truth_thresh = float(block['truth_thresh']) yolo_layer.stride = prev_stride yolo_layer.nth_layer = ind yolo_layer.net_width = self.width yolo_layer.net_height = self.height out_filters.append(prev_filters) out_strides.append(prev_stride) models.append(yolo_layer) else: print('unknown type %s' % (block['type'])) return models