• 基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码


     第一步:准备数据

    12种宠物猫类数据:self.class_indict = ["阿比西尼猫", "豹猫", "伯曼猫", "孟买猫", "英国短毛猫", "埃及猫", "缅因猫", "波斯猫", "布偶猫", "克拉特猫", "泰国暹罗猫", "加拿大无毛猫"]

    ,总共有2160张图片,每个文件夹单独放一种数据

    第二步:搭建模型

    本文选择一个ConvNext网络,其原理介绍如下:

    ConvNext (Convolutional Network Net Generation), 即下一代卷积神经网络, 是近些年来 CV 领域的一个重要发展. ConvNext 由 Facebook AI Research 提出, 仅仅通过卷积结构就达到了与 Transformer 结构相媲美的 ImageNet Top-1 准确率, 这在近年来以 Transformer 为主导的视觉问题解决趋势中显得尤为突出.

    第三步:训练代码

    1)损失函数为:交叉熵损失函数

    2)训练代码:

    1. import os
    2. import argparse
    3. import torch
    4. import torch.optim as optim
    5. from torch.utils.tensorboard import SummaryWriter
    6. from torchvision import transforms
    7. from my_dataset import MyDataSet
    8. from model import convnext_tiny as create_model
    9. from utils import read_split_data, create_lr_scheduler, get_params_groups, train_one_epoch, evaluate
    10. def main(args):
    11. device = torch.device(args.device if torch.cuda.is_available() else "cpu")
    12. print(f"using {device} device.")
    13. if os.path.exists("./weights") is False:
    14. os.makedirs("./weights")
    15. tb_writer = SummaryWriter()
    16. train_images_path, train_images_label, val_images_path, val_images_label = read_split_data(args.data_path)
    17. img_size = 224
    18. data_transform = {
    19. "train": transforms.Compose([transforms.RandomResizedCrop(img_size),
    20. transforms.RandomHorizontalFlip(),
    21. transforms.ToTensor(),
    22. transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),
    23. "val": transforms.Compose([transforms.Resize(int(img_size * 1.143)),
    24. transforms.CenterCrop(img_size),
    25. transforms.ToTensor(),
    26. transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])}
    27. # 实例化训练数据集
    28. train_dataset = MyDataSet(images_path=train_images_path,
    29. images_class=train_images_label,
    30. transform=data_transform["train"])
    31. # 实例化验证数据集
    32. val_dataset = MyDataSet(images_path=val_images_path,
    33. images_class=val_images_label,
    34. transform=data_transform["val"])
    35. batch_size = args.batch_size
    36. nw = min([os.cpu_count(), batch_size if batch_size > 1 else 0, 8]) # number of workers
    37. print('Using {} dataloader workers every process'.format(nw))
    38. train_loader = torch.utils.data.DataLoader(train_dataset,
    39. batch_size=batch_size,
    40. shuffle=True,
    41. pin_memory=True,
    42. num_workers=nw,
    43. collate_fn=train_dataset.collate_fn)
    44. val_loader = torch.utils.data.DataLoader(val_dataset,
    45. batch_size=batch_size,
    46. shuffle=False,
    47. pin_memory=True,
    48. num_workers=nw,
    49. collate_fn=val_dataset.collate_fn)
    50. model = create_model(num_classes=args.num_classes).to(device)
    51. if args.weights != "":
    52. assert os.path.exists(args.weights), "weights file: '{}' not exist.".format(args.weights)
    53. weights_dict = torch.load(args.weights, map_location=device)["model"]
    54. # 删除有关分类类别的权重
    55. for k in list(weights_dict.keys()):
    56. if "head" in k:
    57. del weights_dict[k]
    58. print(model.load_state_dict(weights_dict, strict=False))
    59. if args.freeze_layers:
    60. for name, para in model.named_parameters():
    61. # 除head外,其他权重全部冻结
    62. if "head" not in name:
    63. para.requires_grad_(False)
    64. else:
    65. print("training {}".format(name))
    66. # pg = [p for p in model.parameters() if p.requires_grad]
    67. pg = get_params_groups(model, weight_decay=args.wd)
    68. optimizer = optim.AdamW(pg, lr=args.lr, weight_decay=args.wd)
    69. lr_scheduler = create_lr_scheduler(optimizer, len(train_loader), args.epochs,
    70. warmup=True, warmup_epochs=1)
    71. best_acc = 0.
    72. for epoch in range(args.epochs):
    73. # train
    74. train_loss, train_acc = train_one_epoch(model=model,
    75. optimizer=optimizer,
    76. data_loader=train_loader,
    77. device=device,
    78. epoch=epoch,
    79. lr_scheduler=lr_scheduler)
    80. # validate
    81. val_loss, val_acc = evaluate(model=model,
    82. data_loader=val_loader,
    83. device=device,
    84. epoch=epoch)
    85. tags = ["train_loss", "train_acc", "val_loss", "val_acc", "learning_rate"]
    86. tb_writer.add_scalar(tags[0], train_loss, epoch)
    87. tb_writer.add_scalar(tags[1], train_acc, epoch)
    88. tb_writer.add_scalar(tags[2], val_loss, epoch)
    89. tb_writer.add_scalar(tags[3], val_acc, epoch)
    90. tb_writer.add_scalar(tags[4], optimizer.param_groups[0]["lr"], epoch)
    91. if best_acc < val_acc:
    92. torch.save(model.state_dict(), "./weights/best_model.pth")
    93. best_acc = val_acc
    94. if __name__ == '__main__':
    95. parser = argparse.ArgumentParser()
    96. parser.add_argument('--num_classes', type=int, default=12)
    97. parser.add_argument('--epochs', type=int, default=100)
    98. parser.add_argument('--batch-size', type=int, default=4)
    99. parser.add_argument('--lr', type=float, default=5e-4)
    100. parser.add_argument('--wd', type=float, default=5e-2)
    101. # 数据集所在根目录
    102. # https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
    103. parser.add_argument('--data-path', type=str,
    104. default=r"G:\demo\data\cat_data_sets_models\cat_12_train")
    105. # 预训练权重路径,如果不想载入就设置为空字符
    106. # 链接: https://pan.baidu.com/s/1aNqQW4n_RrUlWUBNlaJRHA 密码: i83t
    107. parser.add_argument('--weights', type=str, default='./convnext_tiny_1k_224_ema.pth',
    108. help='initial weights path')
    109. # 是否冻结head以外所有权重
    110. parser.add_argument('--freeze-layers', type=bool, default=False)
    111. parser.add_argument('--device', default='cuda:0', help='device id (i.e. 0 or 0,1 or cpu)')
    112. opt = parser.parse_args()
    113. main(opt)

    第四步:统计正确率

    第五步:搭建GUI界面

    第六步:整个工程的内容

    有训练代码和训练好的模型以及训练过程,提供数据,提供GUI界面代码

    代码的下载路径(新窗口打开链接):基于Pytorch框架的深度学习ConvNext神经网络宠物猫识别分类系统源码

    ​​

    有问题可以私信或者留言,有问必答

  • 相关阅读:
    Docker知识总结 (六) Docker网络
    69. UE5 RPG 使用Gameplay Cue 实现技能表现效果
    类似 MS Project 的项目管理工具有哪些
    分析训练速度慢
    kr 第三阶段(一)16 位汇编
    Go语言 包管理
    MyCat2搭建读写分离
    Mybatis面试题
    基于51单片机的停车场管理系统仿真电路设计
    费马小定理的两个证明
  • 原文地址:https://blog.csdn.net/m0_59023219/article/details/139976512