update expt name comment and folder parsing for training (#978)
* comment * fix parsing * fix evolve * folder * tqdm * Update train.py * Update train.py * reinstate anchors into meta dict anchor evolution is working correctly now * reinstate logger prefer the single line readout for concise logging, which helps simplify notebook and tutorials etc. Co-authored-by: Glenn Jocher <glenn.jocher@ultralytics.com>
This commit is contained in:
parent
0ada058f63
commit
00917a6225
13
train.py
13
train.py
|
|
@ -207,7 +207,8 @@ def train(hyp, opt, device, tb_writer=None):
|
||||||
results = (0, 0, 0, 0, 0, 0, 0) # P, R, mAP@.5, mAP@.5-.95, val_loss(box, obj, cls)
|
results = (0, 0, 0, 0, 0, 0, 0) # P, R, mAP@.5, mAP@.5-.95, val_loss(box, obj, cls)
|
||||||
scheduler.last_epoch = start_epoch - 1 # do not move
|
scheduler.last_epoch = start_epoch - 1 # do not move
|
||||||
scaler = amp.GradScaler(enabled=cuda)
|
scaler = amp.GradScaler(enabled=cuda)
|
||||||
logger.info('Image sizes %g train, %g test\nUsing %g dataloader workers\nLogging results to %s\n'
|
logger.info('Image sizes %g train, %g test\n'
|
||||||
|
'Using %g dataloader workers\nLogging results to %s\n'
|
||||||
'Starting training for %g epochs...' % (imgsz, imgsz_test, dataloader.num_workers, log_dir, epochs))
|
'Starting training for %g epochs...' % (imgsz, imgsz_test, dataloader.num_workers, log_dir, epochs))
|
||||||
for epoch in range(start_epoch, epochs): # epoch ------------------------------------------------------------------
|
for epoch in range(start_epoch, epochs): # epoch ------------------------------------------------------------------
|
||||||
model.train()
|
model.train()
|
||||||
|
|
@ -393,7 +394,7 @@ if __name__ == '__main__':
|
||||||
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
|
parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')
|
||||||
parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
|
parser.add_argument('--cache-images', action='store_true', help='cache images for faster training')
|
||||||
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
|
parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')
|
||||||
parser.add_argument('--name', default='', help='renames results.txt to results_name.txt if supplied')
|
parser.add_argument('--name', default='', help='renames experiment folder exp{N} to exp{N}_{name} if supplied')
|
||||||
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
|
parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
|
||||||
parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')
|
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')
|
parser.add_argument('--single-cls', action='store_true', help='train as single-class dataset')
|
||||||
|
|
@ -448,7 +449,7 @@ if __name__ == '__main__':
|
||||||
if not opt.evolve:
|
if not opt.evolve:
|
||||||
tb_writer = None
|
tb_writer = None
|
||||||
if opt.global_rank in [-1, 0]:
|
if opt.global_rank in [-1, 0]:
|
||||||
logger.info('Start Tensorboard with "tensorboard --logdir %s", view at http://localhost:6006/' % opt.logdir)
|
logger.info(f'Start Tensorboard with "tensorboard --logdir {opt.logdir}", view at http://localhost:6006/')
|
||||||
tb_writer = SummaryWriter(log_dir=log_dir) # runs/exp0
|
tb_writer = SummaryWriter(log_dir=log_dir) # runs/exp0
|
||||||
|
|
||||||
train(hyp, opt, device, tb_writer)
|
train(hyp, opt, device, tb_writer)
|
||||||
|
|
@ -488,7 +489,7 @@ if __name__ == '__main__':
|
||||||
assert opt.local_rank == -1, 'DDP mode not implemented for --evolve'
|
assert opt.local_rank == -1, 'DDP mode not implemented for --evolve'
|
||||||
opt.notest, opt.nosave = True, True # only test/save final epoch
|
opt.notest, opt.nosave = True, True # only test/save final epoch
|
||||||
# ei = [isinstance(x, (int, float)) for x in hyp.values()] # evolvable indices
|
# ei = [isinstance(x, (int, float)) for x in hyp.values()] # evolvable indices
|
||||||
yaml_file = Path('runs/evolve/hyp_evolved.yaml') # save best result here
|
yaml_file = Path(opt.logdir) / 'evolve' / 'hyp_evolved.yaml' # save best result here
|
||||||
if opt.bucket:
|
if opt.bucket:
|
||||||
os.system('gsutil cp gs://%s/evolve.txt .' % opt.bucket) # download evolve.txt if exists
|
os.system('gsutil cp gs://%s/evolve.txt .' % opt.bucket) # download evolve.txt if exists
|
||||||
|
|
||||||
|
|
@ -532,5 +533,5 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Plot results
|
# Plot results
|
||||||
plot_evolution(yaml_file)
|
plot_evolution(yaml_file)
|
||||||
print('Hyperparameter evolution complete. Best results saved as: %s\nCommand to train a new model with these '
|
print(f'Hyperparameter evolution complete. Best results saved as: {yaml_file}\n'
|
||||||
'hyperparameters: $ python train.py --hyp %s' % (yaml_file, yaml_file))
|
f'Command to train a new model with these hyperparameters: $ python train.py --hyp {yaml_file}')
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import random
|
||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
@ -952,9 +953,12 @@ def increment_dir(dir, comment=''):
|
||||||
# Increments a directory runs/exp1 --> runs/exp2_comment
|
# Increments a directory runs/exp1 --> runs/exp2_comment
|
||||||
n = 0 # number
|
n = 0 # number
|
||||||
dir = str(Path(dir)) # os-agnostic
|
dir = str(Path(dir)) # os-agnostic
|
||||||
d = sorted(glob.glob(dir + '*')) # directories
|
dirs = sorted(glob.glob(dir + '*')) # directories
|
||||||
if len(d):
|
if dirs:
|
||||||
n = max([int(x[len(dir):x.rfind('_') if '_' in Path(x).name else None]) for x in d]) + 1 # increment
|
matches = [re.search(r"exp(\d+)", d) for d in dirs]
|
||||||
|
idxs = [int(m.groups()[0]) for m in matches if m]
|
||||||
|
if idxs:
|
||||||
|
n = max(idxs) + 1 # increment
|
||||||
return dir + str(n) + ('_' + comment if comment else '')
|
return dir + str(n) + ('_' + comment if comment else '')
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue