updates
This commit is contained in:
		
							parent
							
								
									ec308d605e
								
							
						
					
					
						commit
						af853f604c
					
				| 
						 | 
				
			
			@ -295,7 +295,7 @@ def load_darknet_weights(self, weights, cutoff=-1):
 | 
			
		|||
    if weights_file == 'darknet53.conv.74':
 | 
			
		||||
        cutoff = 75
 | 
			
		||||
    elif weights_file == 'yolov3-tiny.conv.15':
 | 
			
		||||
        cutoff = 16
 | 
			
		||||
        cutoff = 15
 | 
			
		||||
 | 
			
		||||
    # Open the weights file
 | 
			
		||||
    fp = open(weights, 'rb')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										42
									
								
								train.py
								
								
								
								
							
							
						
						
									
										42
									
								
								train.py
								
								
								
								
							| 
						 | 
				
			
			@ -15,11 +15,13 @@ def train(
 | 
			
		|||
        epochs=100,
 | 
			
		||||
        batch_size=16,
 | 
			
		||||
        accumulated_batches=1,
 | 
			
		||||
        weights='weights',
 | 
			
		||||
        multi_scale=False,
 | 
			
		||||
        freeze_backbone=True,
 | 
			
		||||
        var=0,
 | 
			
		||||
):
 | 
			
		||||
    weights = 'weights' + os.sep
 | 
			
		||||
    latest = weights + 'latest.pt'
 | 
			
		||||
    best = weights + 'best.pt'
 | 
			
		||||
    device = torch_utils.select_device()
 | 
			
		||||
 | 
			
		||||
    if multi_scale:  # pass maximum multi_scale size
 | 
			
		||||
| 
						 | 
				
			
			@ -27,9 +29,6 @@ def train(
 | 
			
		|||
    else:
 | 
			
		||||
        torch.backends.cudnn.benchmark = True  # unsuitable for multiscale
 | 
			
		||||
 | 
			
		||||
    latest = os.path.join(weights, 'latest.pt')
 | 
			
		||||
    best = os.path.join(weights, 'best.pt')
 | 
			
		||||
 | 
			
		||||
    # Configure run
 | 
			
		||||
    train_path = parse_data_cfg(data_cfg)['train']
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +39,7 @@ def train(
 | 
			
		|||
    dataloader = LoadImagesAndLabels(train_path, batch_size, img_size, multi_scale=multi_scale, augment=True)
 | 
			
		||||
 | 
			
		||||
    lr0 = 0.001
 | 
			
		||||
    cutoff = -1  # backbone reaches to cutoff layer
 | 
			
		||||
    if resume:
 | 
			
		||||
        checkpoint = torch.load(latest, map_location='cpu')
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -69,8 +69,13 @@ def train(
 | 
			
		|||
        start_epoch = 0
 | 
			
		||||
        best_loss = float('inf')
 | 
			
		||||
 | 
			
		||||
        # Initialize model with darknet53 weights (optional)
 | 
			
		||||
        load_darknet_weights(model, os.path.join(weights, 'darknet53.conv.74'))
 | 
			
		||||
        # Initialize model with backbone (optional)
 | 
			
		||||
        if cfg.endswith('yolov3.cfg'):
 | 
			
		||||
            load_darknet_weights(model, weights + 'darknet53.conv.74')
 | 
			
		||||
            cutoff = 75
 | 
			
		||||
        elif cfg.endswith('yolov3-tiny.cfg'):
 | 
			
		||||
            load_darknet_weights(model, weights + 'yolov3-tiny.conv.15')
 | 
			
		||||
            cutoff = 15
 | 
			
		||||
 | 
			
		||||
        # if torch.cuda.device_count() > 1:
 | 
			
		||||
        #     model = nn.DataParallel(model)
 | 
			
		||||
| 
						 | 
				
			
			@ -102,15 +107,10 @@ def train(
 | 
			
		|||
            g['lr'] = lr
 | 
			
		||||
 | 
			
		||||
        # Freeze darknet53.conv.74 for first epoch
 | 
			
		||||
        if freeze_backbone:
 | 
			
		||||
            if epoch == 0:
 | 
			
		||||
                for i, (name, p) in enumerate(model.named_parameters()):
 | 
			
		||||
                    if int(name.split('.')[1]) < 75:  # if layer < 75
 | 
			
		||||
                        p.requires_grad = False
 | 
			
		||||
            elif epoch == 1:
 | 
			
		||||
                for i, (name, p) in enumerate(model.named_parameters()):
 | 
			
		||||
                    if int(name.split('.')[1]) < 75:  # if layer < 75
 | 
			
		||||
                        p.requires_grad = True
 | 
			
		||||
        if freeze_backbone and (epoch < 2):
 | 
			
		||||
            for i, (name, p) in enumerate(model.named_parameters()):
 | 
			
		||||
                if int(name.split('.')[1]) < cutoff:  # if layer < 75
 | 
			
		||||
                    p.requires_grad = False if (epoch == 0) else True
 | 
			
		||||
 | 
			
		||||
        ui = -1
 | 
			
		||||
        rloss = defaultdict(float)  # running loss
 | 
			
		||||
| 
						 | 
				
			
			@ -140,9 +140,11 @@ def train(
 | 
			
		|||
                rloss[key] = (rloss[key] * ui + val) / (ui + 1)
 | 
			
		||||
 | 
			
		||||
            s = ('%8s%12s' + '%10.3g' * 7) % (
 | 
			
		||||
                '%g/%g' % (epoch, epochs - 1), '%g/%g' % (i, len(dataloader) - 1), rloss['xy'],
 | 
			
		||||
                rloss['wh'], rloss['conf'], rloss['cls'],
 | 
			
		||||
                rloss['loss'], model.losses['nT'], time.time() - t0)
 | 
			
		||||
                '%g/%g' % (epoch, epochs - 1),
 | 
			
		||||
                '%g/%g' % (i, len(dataloader) - 1),
 | 
			
		||||
                rloss['xy'], rloss['wh'], rloss['conf'],
 | 
			
		||||
                rloss['cls'], rloss['loss'],
 | 
			
		||||
                model.losses['nT'], time.time() - t0)
 | 
			
		||||
            t0 = time.time()
 | 
			
		||||
            print(s)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +166,7 @@ def train(
 | 
			
		|||
 | 
			
		||||
        # Save backup weights every 5 epochs (optional)
 | 
			
		||||
        # if (epoch > 0) & (epoch % 5 == 0):
 | 
			
		||||
        #     os.system('cp ' + latest + ' ' + os.path.join(weights, 'backup{}.pt'.format(epoch)))
 | 
			
		||||
        #     os.system('cp ' + latest + ' ' + weights + 'backup{}.pt'.format(epoch)))
 | 
			
		||||
 | 
			
		||||
        # Calculate mAP
 | 
			
		||||
        with torch.no_grad():
 | 
			
		||||
| 
						 | 
				
			
			@ -184,7 +186,6 @@ if __name__ == '__main__':
 | 
			
		|||
    parser.add_argument('--data-cfg', type=str, default='cfg/coco.data', help='coco.data file path')
 | 
			
		||||
    parser.add_argument('--multi-scale', action='store_true', help='random image sizes per batch 320 - 608')
 | 
			
		||||
    parser.add_argument('--img-size', type=int, default=32 * 13, help='pixels')
 | 
			
		||||
    parser.add_argument('--weights', type=str, default='weights', help='path to store weights')
 | 
			
		||||
    parser.add_argument('--resume', action='store_true', help='resume training flag')
 | 
			
		||||
    parser.add_argument('--var', type=float, default=0, help='test variable')
 | 
			
		||||
    opt = parser.parse_args()
 | 
			
		||||
| 
						 | 
				
			
			@ -200,7 +201,6 @@ if __name__ == '__main__':
 | 
			
		|||
        epochs=opt.epochs,
 | 
			
		||||
        batch_size=opt.batch_size,
 | 
			
		||||
        accumulated_batches=opt.accumulated_batches,
 | 
			
		||||
        weights=opt.weights,
 | 
			
		||||
        multi_scale=opt.multi_scale,
 | 
			
		||||
        var=opt.var,
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue