Spaces:
Sleeping
Sleeping
| import argparse | |
| import os | |
| import torch | |
| from detector import * | |
| from backbone import * | |
| from loss import * | |
| from data import Therin | |
| import datetime | |
| from detector.fasterRCNN import FasterRCNN | |
| from backbone.densenet import DenseNet | |
| from utils.engine import * | |
| from torchvision.models.detection.backbone_utils import resnet_fpn_backbone, _resnet_fpn_extractor | |
| from torchvision.models.detection import fasterrcnn_resnet50_fpn, FasterRCNN_ResNet50_FPN_V2_Weights | |
| parser = argparse.ArgumentParser("Intruder_Thermal_Dataset") | |
| # Model Settings | |
| parser.add_argument('--detector', type=str, default='fasterRCNN', help='detector name') | |
| parser.add_argument('--backbone', type=str, default='densenet', help='backbone name') | |
| parser.add_argument('--loss', type=str, default='focalloss', help='loss name') | |
| parser.add_argument('--modelscale', type=float, default=1.0, help='model scale') | |
| # Training Settings | |
| parser.add_argument('--batch', type=int, default=4, help='batch size') | |
| parser.add_argument('--epoch', type=int, default=10, help='epochs number') | |
| parser.add_argument('--lr', type=float, default=1e-3, help='initial learning rate') | |
| parser.add_argument('--momentum', type=float, default=0.9, help='momentum') | |
| parser.add_argument('--decay', type=float, default=3e-4, help='weight decay') | |
| # Dataset Settings | |
| parser.add_argument('--data_dir', type=str, default='./dataset', help='dataset dir') | |
| args = parser.parse_args() | |
| def main(): | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| print("Using {} device training.".format(device.type)) | |
| timestr = datetime.datetime.now().strftime("%Y%m%d-%H%M%S%f") | |
| print(timestr) | |
| model_save_dir = timestr | |
| if not os.path.exists(model_save_dir): | |
| os.makedirs(model_save_dir) | |
| num_classes = 5 | |
| # Load data | |
| train_dataset = Therin(args.data_dir, 'train') | |
| train_dataloader = torch.utils.data.DataLoader(train_dataset, | |
| batch_size=args.batch, | |
| shuffle=True, | |
| num_workers=0, | |
| collate_fn=train_dataset.collate_fn) | |
| test_dataset = Therin(args.data_dir, 'test') | |
| test_dataloader = torch.utils.data.DataLoader(test_dataset, | |
| batch_size=args.batch, | |
| shuffle=True, | |
| num_workers=0, | |
| collate_fn=test_dataset.collate_fn) | |
| # Create model | |
| backbone = resnet_fpn_backbone('resnet18', False) | |
| model = FasterRCNN(backbone, num_classes) | |
| model.to(device) | |
| # Define optimizer | |
| params = [p for p in model.parameters() if p.requires_grad] | |
| optimizer = torch.optim.SGD(params, lr=args.lr, | |
| momentum=args.momentum, weight_decay=args.decay) | |
| lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, | |
| step_size=3, | |
| gamma=0.1) | |
| #Training | |
| for epoch in range(args.epoch): | |
| # train for one epoch | |
| loss_dict, total_loss = train_one_epoch(model, optimizer, train_dataloader, device, epoch, print_freq=1) | |
| # update the learning rate | |
| lr_scheduler.step() | |
| # evaluate on the test dataset | |
| _, mAP = evaluate(model, test_dataloader, device=device) | |
| print('validation mAp is {}'.format(mAP)) | |
| # save weights | |
| save_files = { | |
| 'model': model.state_dict(), | |
| 'optimizer': optimizer.state_dict(), | |
| 'lr_scheduler': lr_scheduler.state_dict(), | |
| 'epoch': epoch, | |
| 'loss_dict': loss_dict, | |
| 'total_loss': total_loss} | |
| torch.save(save_files, | |
| os.path.join(model_save_dir, "{}-model-{}-mAp-{}.pth".format(args.backbone, epoch, mAP))) | |
| if __name__ == '__main__': | |
| main() |