深度学习多任务分类小demo

今天突然好多人关注,也不知道是系统账号还是真粉丝,所以决定大晚上的发一个博客,嘿嘿嘿

项目代码地址:(1条消息) 这是一个demo实战的代码1-VR文档类资源-CSDN文库

有代码固然好,但最好还是自己手动敲一遍,增加理解

这是我的demo项目结构,nets文件夹里面是自己搭建的网络模型(用的是mobilnet网络模型)

代码里面训练图片可能需要自己改一下,这应该挺简单的:

训练代码:

import os, sys, glob, shutil, json
import numpy as np
import torch
import torchvision.transforms as transforms
import torch.nn as nn
from torch.utils.data.dataset import Dataset
from dataloader import M_Data
from nets.mobilenet_v1 import MobilenetV1


def train(data_loader, model, optim, criterion1, use_cuda=False):
    if use_cuda:
        model = model.cuda()
    model.train()
    train_loss = []

    for i, (img, target) in enumerate(data_loader):
        if use_cuda:
            img, target = img.cuda(), target.cuda()

        feat1, feat2 = model(img)
        # 因为label里面都是两位数字,它的shape是[1,2],所以分别取出来计算loss值
        loss = criterion1(feat1, target[:, 0]) + criterion1(feat2, target[:, 1])

        optim.zero_grad()       # 梯度清零
        loss.backward()         # 反向传播
        optim.step()            # 优化器更新

        train_loss.append(loss.item())
    return np.mean(train_loss)

def validate(val_loader, model, criterion2, use_cuda=False):
    model.eval()
    val_loss = []

    # 不记录模型的梯度信息
    with torch.no_grad():
        for _, (img, target) in enumerate(val_loader):
            if use_cuda:
                model = model.cuda()
                img, target = img.cuda(), target.cuda()
            feat1, feat2 = model(img)
            loss = criterion2, target(feat1, target[:, 0]) + criterion2(feat2, target[:, 1])
            val_loss.append(loss.item())
    return val_loss



if __name__ == '__main__':
    train_img_path = glob.glob(r"D:\Code\python\pytorch\street_stings_reganize\test_img\*.png")
    train_img_path.sort()
    with open(r"D:\Code\python\pytorch\street_stings_reganize\train.json") as f2:
        train_json = json.load(f2)
    train_label = [train_json[x]['label'] for x in train_json]

    # 2.读取数据集
    transform = transforms.Compose([
        transforms.Resize((416, 416)),  # 对图片大小进行resize
        # transforms.RandomCrop((60, 120)),  # 随机裁剪
        transforms.ColorJitter(0.3, 0.3, 0.2),  # 颜色调整
        transforms.RandomRotation(10),  # 随机旋转10°
        transforms.ToTensor(),  # 将图片转换成张量
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])  # 归一化
    train_loader = torch.utils.data.DataLoader(M_Data(train_img_path, train_label, transform), batch_size=8, shuffle=True, num_workers=0)

    # 3.加载模型,损失函数,优化器等等
    net = MobilenetV1(num_classes=10)
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(net.parameters(), lr=0.001)

    # 4.开始进行训练
    EPOCHES = 300
    BEST_LOSS = 100
    for epoch in range(EPOCHES):
        train_loss = train(train_loader, net, optimizer, criterion, use_cuda=True)
        print('Epoch: {0}, Train loss: {1} '.format(epoch, train_loss))

        if train_loss < BEST_LOSS:
            BEST_LOSS = train_loss
            if not os.path.exists("./models"):
                os.makedirs("./models")
            torch.save(net, "./models/best_mobilenet.pt")
            print("save best model success")
        torch.save(net, "./models/last_mobilenet.pt")



测试代码:

import os
import numpy as np
import torch
import torchvision.transforms as transforms
import cv2


def i2t(img):
    tn = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
    img = tn(img).unsqueeze(0)
    # print(img.shape)
    return img


def predict(test_loader, model, tta=10, use_cuda=True):
    if use_cuda:
        model = model.cuda()
    model.eval()
    test_pred_tta = None

    # TTA 次数
    for _ in range(tta):
        test_pred = []

        with torch.no_grad():
            for i, (img, target) in enumerate(test_loader):
                if use_cuda:
                    img = img.cuda()
                feat1, feat2 = model(img)
                if use_cuda:
                    output = np.concatenate([
                        feat1.data.cpu().numpy(),
                        feat2.data.cpu().numpy()], axis=1)
                else:
                    output = np.concatenate([
                        feat1.data.numpy(),
                        feat2.data.numpy()], axis=1)
                test_pred.append(output)

        test_pred = np.vstack(test_pred)
        if test_pred_tta is None:
            test_pred_tta = test_pred
        else:
            test_pred_tta += test_pred

    return test_pred_tta


def each_predict(img_path, model, use_cuda=True):
    with torch.no_grad():
        if use_cuda:
            model = model.cuda()
        model.eval()
        img = cv2.imread(img_path)
        img = cv2.resize(img, (416, 416))
        img2 = img
        img = i2t(img).cuda()
        out1, out2 = model(img)

        out1,out2 = out1.cpu().numpy().argmax(-1), out2.cpu().numpy().argmax(-1)
        # print(out1, type(out1))
        output1, output2 = classes_name[int(out1)], classes_name[int(out2)]
        print("%s预测结果是:"% img_name, output1+output2)
        # cv2.putText(img2, output1+output2)
        cv2.putText(img2, output1+output2, (20,20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        if not os.path.exists("./output_img"):
            os.makedirs("./output_img")
        cv2.imwrite("./output_img/%s"%img_name, img2)

if __name__ == '__main__':
    # train_img_path = glob.glob(r"E:\tianchi_learning\demo_project\test_img\*.png")
    # train_img_path.sort()
    # with open(r"E:\tianchi_learning\demo_project\train.json") as f2:
    #     train_json = json.load(f2)
    # train_label = [train_json[x]['label'] for x in train_json]
    #
    # # 2.读取数据集
    # transform = transforms.Compose([
    #     transforms.Resize((64, 128)),  # 对图片大小进行resize
    #     transforms.RandomCrop((60, 120)),  # 随机裁剪
    #     transforms.ColorJitter(0.3, 0.3, 0.2),  # 颜色调整
    #     transforms.RandomRotation(10),  # 随机旋转10°
    #     transforms.ToTensor(),  # 将图片转换成张量
    #     transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])  # 归一化
    # train_loader = torch.utils.data.DataLoader(M_Data(train_img_path, train_label, transform), batch_size=30, shuffle=True, num_workers=0)
    #
    # # 3.加载模型,损失函数,优化器等等
    # net = torch.load(r"E:\tianchi_learning\demo_project\models\best.pt")
    # predict_label = predict(train_loader, net)
    #
    # predict_label = np.vstack([predict_label[:, :10].argmax(1),predict_label[:, 10:20].argmax(1)]).T
    # val_label_pred = []
    # train_label = [''.join(map(str, x)) for x in train_loader.dataset.label]
    # for x in predict_label:
    #     val_label_pred.append(''.join(map(str, x)))
    # print(val_label_pred, len(val_label_pred))
    # print(train_label)

    # val_char_acc = np.mean(np.array(val_label_pred) == np.array(train_label))
    # print("acc", val_char_acc)
    # 2.读取数据集

    classes_name = [str(i) for i in range(10)]
    net = torch.load(r"./models/best_mobilenet.pt")
    train_path = r"D:\Code\python\pytorch\street_stings_reganize\test_img"
    for img_name in os.listdir(train_path):
        img_path = os.path.join(train_path, img_name)
        each_predict(img_path, net)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
深度学习demo平台是针对深度学习技术的应用而设计的一个在线演示平台。它提供了一种方便快捷的方式,让用户能够直接体验和了解深度学习的相关应用。 首先,深度学习demo平台为用户提供了丰富多样的深度学习应用演示。无论是图像分类、目标检测、人脸识别还是自然语言处理等,平台都能展示出先进的深度学习模型和算法的应用效果。用户可以通过这些演示来更好地了解深度学习技术在不同领域的应用场景和效果。 其次,深度学习demo平台还具有交互性和实时性。用户可以通过上传自己的数据或者使用平台提供的示例数据进行实时演示。他们可以根据自己的需求,调整模型参数、修改网络结构等,并即时查看结果。这种交互式的体验使得用户能够更深入地理解深度学习模型的工作原理和优化方法。 此外,深度学习demo平台还具有教育和学习的功能。它提供了丰富的教程、文档和学习资源,帮助用户理解深度学习的基础知识和算法原理。用户可以通过平台上的学习资料,逐步提升自己的技能和知识水平。同时,平台上还提供了一个交流社区,用户可以与其他用户分享经验、讨论问题,促进学习和技术的交流。 总的来说,深度学习demo平台是一个在线的、实时的、交互式的学习和演示工具,为用户提供了直观的深度学习应用体验。它不仅能够帮助用户了解深度学习技术的应用前景和效果,还可以提供学习和交流的平台,促进用户的技术成长和提升。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值