import torchvision.models as models
from torchvision import transforms as transform
from nets.yolo4 import YoloBody
import torch
import cv2
import numpy as np
import os

model = YoloBody(num_anchors=3, num_classes=2)
model.load_state_dict(
    torch.load(r"logs/Epoch60.pth", map_location=torch.device('cuda')))
model.eval()
model.to(device='cuda')
sample = torch.ones(1, 3, 608, 608).to(device='cuda')
traced_script_module = torch.jit.trace(model, sample)
traced_script_module.save("/home/curious/code/yolo4-cpp/111.pt")
Exemplo n.º 2
0
def train():
    num_classes = 3

    # 建立loss函数
    yolo_losses = []
    for i in range(3):
        yolo_losses.append(
            YOLOLoss(np.reshape(anchors, [-1, 2]), num_classes,
                     (args.input_shape, args.input_shape), 0.3, args.gpu))

    train_data = MyDataset(train_root,
                           input_shape=(args.input_shape, args.input_shape))
    test_data = MyDataset(test_root,
                          input_shape=(args.input_shape, args.input_shape))

    train_loader = DataLoader(train_data,
                              batch_size=args.batch_size,
                              shuffle=True,
                              num_workers=args.num_workers,
                              collate_fn=my_collate)
    test_loader = DataLoader(test_data,
                             batch_size=args.batch_size,
                             shuffle=True,
                             num_workers=args.num_workers,
                             collate_fn=my_collate)

    # 使用GPU
    if args.gpu:
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    else:
        device = torch.device("cpu")

    # 创建模型
    model = YoloBody(len(anchors[0]), num_classes)
    model_path = "weights/yolov4_coco_pretrained_weights.pth"
    # model_path = "model_data/yolov4_maskdetect_weights0.pth"
    # 加快模型训练的效率
    print('Loading pretrained model weights.')
    model_dict = model.state_dict()
    pretrained_dict = torch.load(model_path)
    pretrained_dict = {
        k: v
        for k, v in pretrained_dict.items()
        if np.shape(model_dict[k]) == np.shape(v)
    }
    model_dict.update(pretrained_dict)
    model.load_state_dict(model_dict)
    print('Finished!')

    net = model.to(device)

    optimizer = optim.Adam(net.parameters(), lr=1e-3, weight_decay=5e-4)
    lr_scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer,
                                                        T_max=5,
                                                        eta_min=1e-5)

    # 冻结backbone
    for param in model.backbone.parameters():
        param.requires_grad = False

    # 开始训练
    train_losses = []
    test_losses = []
    min_loss = 1e10
    for epoch in range(args.nepoch):
        train_loss = 0
        for i, data in enumerate(train_loader):
            net.train()
            inputs, labels = data[0].to(device), data[1]
            optimizer.zero_grad()
            outputs = net(inputs)
            losses = []
            for j in range(3):
                loss_item = yolo_losses[j](outputs[j], labels)
                losses.append(loss_item[0])
            loss = sum(losses)
            loss.backward()
            optimizer.step()
            lr_scheduler.step()

            train_loss += loss.item()
            train_losses.append(loss.item())
            print("epoch:%d/%d, batch:%d/%d, train_loss:%f" %
                  (epoch, args.nepoch, i, len(train_loader), loss.item()))
        train_loss /= len(train_loader)

        # test
        test_loss = 0
        net.eval()
        for i_test, data_test in enumerate(test_loader):
            with torch.no_grad():
                inputs, labels = data_test[0].to(device), data_test[1]
                optimizer.zero_grad()
                outputs = net(inputs)
                losses = []
                for j in range(3):
                    loss_item = yolo_losses[j](outputs[j], labels)
                    losses.append(loss_item[0])
                loss = sum(losses)
                test_loss += loss.item()
                # print("epoch:%d/%d, batch:%d/%d, test_loss:%f" % (epoch, args.nepoch, i_test, len(test_loader), loss.item()))

        test_loss /= len(test_loader)
        test_losses.append(test_loss)

        if test_loss < min_loss:
            torch.save(net.state_dict(), 'weights/face_mask_weights0.pth')
        print("epoch:%d/%d, train_loss:%f, test_loss:%f" %
              (epoch, args.nepoch, train_loss, test_loss))
    plot_loss_curve(train_losses, test_losses, len(train_loader))