diff --git a/test.py b/test.py index 1638a5e..ef97d26 100644 --- a/test.py +++ b/test.py @@ -19,7 +19,6 @@ def test(data, dataloader=None, save_dir='', merge=False): - # Initialize/load model and set device training = model is not None if training: # called by train.py diff --git a/train.py b/train.py index c4d4db0..f543da2 100644 --- a/train.py +++ b/train.py @@ -20,9 +20,8 @@ except: print('Apex recommended for faster mixed precision training: https://github.com/NVIDIA/apex') mixed_precision = False # not installed - # Hyperparameters -hyp = {'optimizer': 'SGD', # ['adam', 'SGD', None] if none, default is SGD +hyp = {'optimizer': 'SGD', # ['adam', 'SGD', None] if none, default is SGD 'lr0': 0.01, # initial learning rate (SGD=1E-2, Adam=1E-3) 'momentum': 0.937, # SGD momentum/Adam beta1 'weight_decay': 5e-4, # optimizer weight decay @@ -44,6 +43,7 @@ hyp = {'optimizer': 'SGD', # ['adam', 'SGD', None] if none, default is SGD def train(hyp): + print(f'Hyperparameters {hyp}') log_dir = tb_writer.log_dir # run directory wdir = str(Path(log_dir) / 'weights') + os.sep # weights directory @@ -90,7 +90,7 @@ def train(hyp): pg0.append(v) # all else if hyp['optimizer'] == 'adam': # https://pytorch.org/docs/stable/_modules/torch/optim/lr_scheduler.html#OneCycleLR - optimizer = optim.Adam(pg0, lr=hyp['lr0'], betas=(hyp['momentum'], 0.999)) # adjust beta1 to momentum + optimizer = optim.Adam(pg0, lr=hyp['lr0'], betas=(hyp['momentum'], 0.999)) # adjust beta1 to momentum else: optimizer = optim.SGD(pg0, lr=hyp['lr0'], momentum=hyp['momentum'], nesterov=True) @@ -176,7 +176,7 @@ def train(hyp): yaml.dump(hyp, f, sort_keys=False) with open(Path(log_dir) / 'opt.yaml', 'w') as f: yaml.dump(vars(opt), f, sort_keys=False) - + # Class frequency labels = np.concatenate(dataset.labels, 0) c = torch.tensor(labels[:, 0]) # classes @@ -365,7 +365,8 @@ if __name__ == '__main__': parser.add_argument('--batch-size', type=int, default=16) parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='train,test sizes') parser.add_argument('--rect', action='store_true', help='rectangular training') - parser.add_argument('--resume', nargs='?', const = 'get_last', default=False, help='resume from given path/to/last.pt, or most recent run if blank.') + parser.add_argument('--resume', nargs='?', const='get_last', default=False, + help='resume from given path/to/last.pt, or most recent run if blank.') parser.add_argument('--nosave', action='store_true', help='only save final checkpoint') parser.add_argument('--notest', action='store_true', help='only test final epoch') parser.add_argument('--noautoanchor', action='store_true', help='disable autoanchor check') @@ -378,14 +379,14 @@ if __name__ == '__main__': parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%') parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset') opt = parser.parse_args() - + last = get_latest_run() if opt.resume == 'get_last' else opt.resume # resume from most recent run if last and not opt.weights: print(f'Resuming training from {last}') opt.weights = last if opt.resume and not opt.weights else opt.weights opt.cfg = check_file(opt.cfg) # check file opt.data = check_file(opt.data) # check file - opt.hyp = check_file(opt.hyp) if opt.hyp else '' # check file + opt.hyp = check_file(opt.hyp) if opt.hyp else '' # check file print(opt) opt.img_size.extend([opt.img_size[-1]] * (2 - len(opt.img_size))) # extend to 2 sizes (train, test) device = torch_utils.select_device(opt.device, apex=mixed_precision, batch_size=opt.batch_size) @@ -394,14 +395,12 @@ if __name__ == '__main__': # Train if not opt.evolve: + print('Start Tensorboard with "tensorboard --logdir=runs", view at http://localhost:6006/') tb_writer = SummaryWriter(comment=opt.name) if opt.hyp: # update hyps with open(opt.hyp) as f: hyp.update(yaml.load(f, Loader=yaml.FullLoader)) - print(f'Beginning training with {hyp}\n\n') - print('Start Tensorboard with "tensorboard --logdir=runs", view at http://localhost:6006/') - train(hyp) # Evolve hyperparameters (optional) diff --git a/utils/utils.py b/utils/utils.py index 4776794..2de2917 100755 --- a/utils/utils.py +++ b/utils/utils.py @@ -37,10 +37,10 @@ def init_seeds(seed=0): torch_utils.init_seeds(seed=seed) -def get_latest_run(search_dir = './runs'): +def get_latest_run(search_dir='./runs'): # Return path to most recent 'last.pt' in /runs (i.e. to --resume from) - last_list = glob.glob(f'{search_dir}/**/last*.pt', recursive=True) - return max(last_list, key = os.path.getctime) + last_list = glob.glob(f'{search_dir}/**/last*.pt', recursive=True) + return max(last_list, key=os.path.getctime) def check_git_status(): @@ -1113,7 +1113,7 @@ def plot_study_txt(f='study.txt', x=None): # from utils.utils import *; plot_st plt.savefig(f.replace('.txt', '.png'), dpi=200) -def plot_labels(labels, save_dir= ''): +def plot_labels(labels, save_dir=''): # plot dataset labels c, b = labels[:, 0], labels[:, 1:].transpose() # classees, boxes @@ -1180,7 +1180,8 @@ def plot_results_overlay(start=0, stop=0): # from utils.utils import *; plot_re fig.savefig(f.replace('.txt', '.png'), dpi=200) -def plot_results(start=0, stop=0, bucket='', id=(), labels=(), save_dir= ''): # from utils.utils import *; plot_results() +def plot_results(start=0, stop=0, bucket='', id=(), labels=(), + save_dir=''): # from utils.utils import *; plot_results() # Plot training 'results*.txt' as seen in https://github.com/ultralytics/yolov5#reproduce-our-training fig, ax = plt.subplots(2, 5, figsize=(12, 6)) ax = ax.ravel()