基于Pytorch的猫狗分类

无偿分享~
猫狗二分类文件下载地址
在下一章说

       猫狗分类这个真是困扰我好几天,找了好多资料都是以TensorFlow的猫狗分类,但我们要求的是以pytorch的猫狗分类。刚开始我找到了也运行成功了觉得可以了,最后看了一眼实践要求傻眼了,老师要pytorch,我却弄了TensorFlow,主要是当时不懂觉得这俩一样,之后的寻找中慢慢发现这俩都是环境,不一样。之后就又找,找了好几天,可辛苦了,网上大部分以都是TensorFlow的猫狗分类,很少有pytorch。不过,之后的之后弄出来了。这个过程学到了很多东西,写个文章记录一下。

     我的用了GPU,你们都试试安装GPU吧,很简单,我以前以为很难,其实不是。安装GPU你要记住,先安装cuda,用cuda的版本去安装pytorch,之后~~~So easy!不懂得也可以问我。

     好了,正题:

     我的软件:pycharm专业版,原来是社区版,但是他创建文件那里选项太少,直接转战专业版yyds,我这个是网上找的破解版(这几天探索过程我发现Visual Studio Code也可以运行python,当时觉得挺好,就弄了弄那个,可是之后运行不了好像什么tensboard版本不对,我索性放弃直接用pycharm这个专业版的)

     pytorch有两个,一个CPU,一个GPU(原来一个电脑可以有两个pytorch,命名不一样就行)

     pytorch中的python:3.7,torch:1.2.0。

     cuda:10.0(有点低,但起码我版本都匹配,能用)

下面上代码,代码里面有讲解,自己去悟悟吧,加油,发现问题解决问题确实是学习的好方法(因为哥哥我受益匪浅)

        先上目录

     

      其中data-predict是存放预测图片的,我就放了两张~

 一:数据准备

     网上用的都是当年猫狗大战比赛的数据集,解压之后如下图所示

    我们都是用train里面的图片,有25000张,我觉得有点多,就创建了一个小点的数据集,就是上面目录中的Smalldata。你们去网上找这个25000的数据集都有百度网盘下载,(别去原网站下载,麻烦,还不一定成功,连我这么一个坚持为王的人都放弃了~)

    data.py

import os, shutil
# 下载的kaggle数据集路径
original_dataset_dir = '/pythonProject3/猫狗分类/Bigdata'
# 新的小数据集放置路径
base_dir = '/pythonProject3/猫狗分类/Smalldata'
os.mkdir(base_dir)
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)train_cats_dir = os.path.join(train_dir, 'cats')
os.mkdir(train_cats_dir)
train_dogs_dir = os.path.join(train_dir, 'dogs')
os.mkdir(train_dogs_dir)
test_cats_dir = os.path.join(test_dir, 'cats')
os.mkdir(test_cats_dir)
test_dogs_dir = os.path.join(test_dir, 'dogs')
os.mkdir(test_dogs_dir)fnames = ['cat.{}.jpg'.format(i) for i in range(200)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['cat.{}.jpg'.format(i) for i in range(300, 400)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_cats_dir, fname)shutil.copyfile(src, dst)fnames = ['dog.{}.jpg'.format(i) for i in range(200)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(train_dogs_dir, fname)shutil.copyfile(src, dst)fnames = ['dog.{}.jpg'.format(i) for i in range(300, 400)]
for fname in fnames:src = os.path.join(original_dataset_dir, fname)dst = os.path.join(test_dogs_dir, fname)shutil.copyfile(src, dst)print('total training cat images:', len(os.listdir(train_cats_dir)))
print('total training dog images:', len(os.listdir(train_dogs_dir)))
print('total test cat images:', len(os.listdir(test_cats_dir)))
print('total test dog images:', len(os.listdir(test_dogs_dir)))
演示一下:言多必失,接着来~

二:训练和模型创建,对了里面还有读取数据

   train.py

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms, models
from torch.utils.data import DataLoader
device=torch.device("cuda" if torch.cuda.is_available() else "cpu")  #判断GPU是否可用
# 数据预处理 数据增强
transform = transforms.Compose([# 对图像进行随机的裁剪crop以后再resize成固定大小(224*224)transforms.RandomResizedCrop(224),# 随机旋转20度(顺时针和逆时针)transforms.RandomRotation(20),# 随机水平翻转transforms.RandomHorizontalFlip(p=0.5),# 将数据转换为tensortransforms.ToTensor()
])# 读取数据
root = 'Smalldata'   #root是数据集目录
# 获取数据的路径,使用transform增强变化
train_dataset = datasets.ImageFolder(root + '/train', transform)
test_dataset = datasets.ImageFolder(root + '/test', transform)
# 导入数据
# 每个批次8个数据,打乱
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=8, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=8, shuffle=True)
# 类别名称
classes = train_dataset.classes
# 类别编号
classes_index = train_dataset.class_to_idx
print("类别名称",classes)
print("类别编号",classes_index)
# models.下有很多pytorch提供的训练好的模型
model = models.vgg16(pretrained=True)
# 我们主要是想调用vgg16的卷积层,全连接层自己定义,覆盖掉原来的
# 如果想只训练模型的全连接层(不想则注释掉这个for)
for param in model.parameters():param.requires_grad = False
# 构建新的全连接层
# 25088:卷阶层输入的是25088个神经元,中间100是自己定义的,输出类别数量2
model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(100, 2)# 这里可以加softmax也可以不加)
model=model.to(device)      #将模型发送到GPU上
print("使用GPU:",next(model.parameters()).device)  # 输出:cuda:0
LR = 0.0001
# 定义代价函数
entropy_loss = nn.CrossEntropyLoss()   #损失函数
# 定义优化器
optimizer = optim.SGD(model.parameters(), LR, momentum=0.9)
print("开始训练~")
def train():model.train()for i, data in enumerate(train_loader):# 获得数据和对应的标签inputs, labels = datainputs,labels=inputs.to(device),labels.to(device)  #将数据发送到GPU上# 获得模型预测结果,(64,10)out = model(inputs)# 交叉熵代价函数out(batch,C),labels(batch)loss = entropy_loss(out, labels).to(device)  #别忘了损失函数也要发到GPU# 梯度清0optimizer.zero_grad()# 计算梯度loss.backward()# 修改权值optimizer.step()
def test():model.eval()correct = 0for i, data in enumerate(test_loader):# 获得数据和对应的标签inputs, labels = datainputs,labels=inputs.to(device),labels.to(device)# 获得模型预测结果out = model(inputs)# 获得最大值,以及最大值所在的位置_, predicted = torch.max(out, 1)# 预测正确的数量correct += (predicted == labels).sum()print("Test acc: {:.2f}".format(correct.item() / len(test_dataset)))print("Test loss:{:.2f}".format(1-correct.item() / len(test_dataset)))    #损失率+准确率为1correct = 0for i, data in enumerate(train_loader):# 获得数据和对应的标签inputs, labels = datainputs,labels=inputs.to(device),labels.to(device)# 获得模型预测结果out = model(inputs)# 获得最大值,以及最大值所在的位置_, predicted = torch.max(out, 1)# 预测正确的数量correct += (predicted == labels).sum()print("Train acc: {:.2f}".format(correct.item() / len(train_dataset)))print("Train loss:{:.2f}".format(1-correct.item() / len(train_dataset)))
for epoch in range(0,10):print('epoch:', epoch)train()test()
torch.save(model.state_dict(), 'model.pth')
print("~结束训练")
演示一下:

        

      因为刚开始这个我弄得CPU没GPU,这个我改了很多次,用了一点Vgg16,属于CNN,就那个放到GPU上跑的代码我弄了一天才弄好,原来是这个 :model=model.to(device)  弄错了,第二个model不是VGG16,可是当时就是不行,哎,浪费了哥一天时间。

三:预测(随便取一张猫狗图片可以识别出来是cat还是dog)

  predict.py

import torch
import numpy as np
from PIL import Image
from torchvision import transforms, modelsmodel = models.vgg16(pretrained=True)
# 构建新的全连接层
model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(100, 2))# 载入训练好的模型,里面保存的是模型的参数
model.load_state_dict(torch.load('model.pth'))# 预测模式
model.eval()label = np.array(['cat', 'dog'])# 数据预处理
transform = transforms.Compose([transforms.Resize(224),transforms.ToTensor()
])def predict(image_path):# 打开图片img = Image.open(image_path)# 数据处理,再增加一个维度,在第0维度增加1维,变成一个4维的数据(原先是3维,宽高和维度3)img = transform(img).unsqueeze(0)# 预测得到结果outputs = model(img)# 1表示第1个维度(有2种可能的值,猫0狗1),获得最大值所在位置(猫和苟哪一个可能性更大),第0个维度是每个批次的图片数量(1)_, predicted = torch.max(outputs, 1)# 转化为类别名称print(label[predicted.item()])predict('data-predict/cat.jpg')
predict('data-predict/dog.jpg')
演示一下:没图片,那我那个matplotlib不是白学了,绝对不行,整上~(可能我有一点点强迫症吧)
   我始终觉得这个不够完美验证出来不显示图片,所以就查找资料升级了一下。

四:升级版预测

 升级版predict.py

import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
import time
import json
import torch
import torchvision.transforms as transforms
from PIL import Image
from matplotlib import pyplot as plt
import torchvision.models as models
import   torchsummary
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")def img_transform(img_rgb, transform=None):"""将数据转换为模型读取的形式:param img_rgb: PIL Image:param transform: torchvision.transform:return: tensor"""if transform is None:raise ValueError("找不到transform!必须有transform对img进行处理")img_t = transform(img_rgb)return img_tdef load_class_names(p_clsnames, p_clsnames_cn):"""加载标签名:param p_clsnames::param p_clsnames_cn::return:"""with open(p_clsnames, "r") as f:class_names = json.load(f)with open(p_clsnames_cn, encoding='UTF-8') as f:  # 设置文件对象class_names_cn = f.readlines()return class_names, class_names_cndef get_model(path_state_dict, num_classes, vis_model=False):"""创建模型,加载参数:param path_state_dict::return:"""model = models.vgg16(num_classes=num_classes)model.classifier = torch.nn.Sequential(torch.nn.Linear(25088, 100),torch.nn.ReLU(),torch.nn.Dropout(p=0.5),torch.nn.Linear(100, 2))pretrained_state_dict = torch.load(path_state_dict)model.load_state_dict(pretrained_state_dict)model.eval()if vis_model:from torchsummary import summarysummary(model, input_size=(3, 224, 224), device="cpu")model.to(device)return modeldef process_img(path_img):# hard codenorm_mean = [0.485, 0.456, 0.406]norm_std = [0.229, 0.224, 0.225]inference_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop((224, 224)),transforms.ToTensor(),transforms.Normalize(norm_mean, norm_std),])# path --> imgimg_rgb = Image.open(path_img).convert('RGB')# img --> tensorimg_tensor = img_transform(img_rgb, inference_transform)img_tensor.unsqueeze_(0)        # chw --> bchwimg_tensor = img_tensor.to(device)return img_tensor, img_rgbif __name__ == "__main__":num_classes=2# configpath_state_dict = os.path.join(BASE_DIR, "model.pth")path_img = os.path.join(BASE_DIR,  "data-predict", "dog.jpg")# 1/5 load imgimg_tensor, img_rgb = process_img(path_img)# 2/5 load modelmodel = get_model(path_state_dict,num_classes, True)with torch.no_grad():time_tic = time.time()outputs = model(img_tensor)time_toc = time.time()# 4/5 index to class names_, pred_int = torch.max(outputs.data, 1)_, top1_idx = torch.topk(outputs.data, 1, dim=1)#pred_idx = int(pred_int.cpu().numpy())if pred_idx == 0:pred_str= str("cat")print("img: {} is: {}".format(os.path.basename(path_img), pred_str))else:pred_str = str("dog")print("img: {} is: {}".format(os.path.basename(path_img), pred_str))print("time consuming:{:.2f}s".format(time_toc - time_tic))# 5/5 visualizationplt.imshow(img_rgb)plt.title("predict:{}".format(pred_str))plt.text(5, 45, "top {}:{}".format(1, pred_str), bbox=dict(fc='yellow'))plt.show()

    演示一下:

     

     多形象,OK,完美。 

最后,今天是2022年的最后一天,2022.12.31 21:00,祝亲们2023年健康、富有、开心!

结束~

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43243.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫舍 靶场

目标url:http://117.41.229.122:8003/?id1 第一步,判断是否存在sql注入漏洞 构造 ?id1 and 11 ,回车 页面返回正常 构造 ?id1 and 12 ,回车 页面不正常,初步判断这里 可能 存在一个注入漏洞 第二步:判断字段数 构造 ?id1 and 11 order…

Olaparib 有望治疗 UBQLN4 过表达型肿瘤

基因组的不稳定性是人类遗传病和癌症的一大特点。在这篇文章当中,研究人员在常染色体隐性遗传病家族中发现了有害的 UBQLN4 突变。蛋白酶体穿梭因子UBQLN4 被 ATM 磷酸化并与泛素化的 MRE11 相互作用,从而介导早期的同源重组修复 (HRR)。在体外和体内实验…

神经内分泌肿瘤治疗新进展,神经内分泌肿瘤进展

脑肿瘤复发 。 颅内及椎管内肿瘤【概述】1.原发性肿瘤:起源于头颅、椎管内各种组织结构,如颅骨、脑膜、脑组织、颅神经、脑血管、脑垂体、松果体、脉络丛、颅内结缔组织、胚胎残余组织、脊膜、脊神经、脊髓、脊髓血管及脂肪组织等&#xff…

Nature Cancer | 发现非肿瘤药物的抗癌潜力

今天给大家介绍美国Broad Institute of MIT and Harvard的 Todd R. Golub团队发表在Nature cancer上的一篇文章:“Discovering the anticancer potential of nononcology drugs by systematic viability profiling“。在这个研究中,作者试图创建一个公共…

文献分享:定义的肿瘤抗原特异性T细胞增强了个性化的TCR-T细胞治疗和免疫治疗反应的预测

《Defifined tumor antigen-specifific T cells potentiate personalized TCR-T cell therapy and prediction of immunotherapy response》 简介 从患者体内自然发生的肿瘤抗原特异性T(Tas)细胞中提取的T细胞受体(TCRs)设计的T细胞将靶向其肿瘤中的个人TSAs。为了建立这种个性…

Irinotecan和vandetanib在治疗胰腺癌患者时产生协同效应(Irinotecan and vandetanib create synergies for t)

1. 摘要 背景:在胰腺癌(PAAD)中最常突变的基因对是KRAS和TP53,文章的目标是阐明KRAS/TP53突变的多组学和分子动力学图景,并为KRAS和TP53突变的PAAD患者获得有前景的新药物。此外,文章根据多组学数据尝试发现KRAS与TP53之间可能的联系。    …

癌症/肿瘤免疫治疗最新研究进展(2022年4月)

近年来,免疫治疗一直都是国内外肿瘤治疗研究领域的火爆热点,可以称之为革命性的突破。 除了大家熟知的PD-1/PD-L1已经先后斩获了包括肺癌、胃肠道肿瘤、乳腺癌、泌尿系统肿瘤、皮肤癌、淋巴瘤等在内的近20大实体肿瘤,成为免疫治疗的第一张王牌…

MCE | 癌症诊断和靶向治疗的“遍地开花”

据研究报道,很多癌细胞分泌的外泌体 (Exosome) 比正常细胞分泌的多 10 倍以上。外泌体参与了癌症的发生、进展、转移和耐药性,并通过转运蛋白和核酸,建立与肿瘤微环境的联系。例如,外泌体可导致免疫逃逸,癌细胞的免疫逃…

泛癌分析·找出各个癌症的预后相关基因

泛癌分析找出各个癌症的预后相关基因 ` 其他相关文章: 万物皆可pan分析高分文章登山梯for循环的熟练操作 前言 pan分析的第二篇我想写一下如何在TCGA整个基因集内实现COX单因素分析,将所有的预后相关基因筛选出来,同时得到这些基因的基本参数、统计量等信息。这样的分析的…

饮食干预减轻癌症治疗相关症状和毒性

现代化疗,放射疗法在摧毁癌细胞的同时,对健康细胞也造成了伤害,引发相关毒性,反应例如便秘,腹泻,疲劳,恶心,呕吐等。 癌症患者的营养状况可能是癌症治疗相关毒性的核心决定因素&…

边缘计算,是在炒概念吗?

导读:边缘计算概念刚出来的时候,很多人的第一反应是“这是哪个行业组织或者公司为了拉动市场需求而创造出来的新词汇吧?” 边缘计算究竟是什么?为什么会有边缘计算?它是一个全新的概念吗?谁在担任边缘计算的…

移动边缘计算笔记

该篇文章是阅读《移动边缘计算综述》所整理的笔记和心得,仅供参考,欢迎指正。 移动边缘计算(MEC),mobile edgecomputing,后来慢慢过渡为“多接入边缘计算”(multi-access edge computing&#x…

关于边缘计算和边云协同,看这一篇就够了~

几年前,大多数人都期望将物联网部署至云端,这的确可以给个人用户带来便捷的使用体验,但构建企业级的物联网解决方案,仍然需要采用云计算和边缘计算的结合方案。与纯粹的云端解决方案相比,包含边缘侧的混合方案可以减少…

边缘计算简介以及几款边缘计算开源平台

边缘计算中的边缘(edge)指的是网络边缘上的计算和存储资源,这里的网络边缘与数据中心相对,无论是从地理距离还是网络距离上来看都更贴近用户。作为一种新的计算范式,边缘计算将计算任务部署于接近数据产生源的网络边缘…

什么是边缘计算?

注:本篇翻译自施巍松教授的论文《Edge Computing : Vision and Challenges》 目录 文章目录 摘要简介什么是边缘计算什么是边缘计算边缘计算的优点 案例研究云卸载视频分析智能家居智慧城市 机遇和挑战编程可行性命名数据抽象服务管理私密性最优化指标 小结 摘要 …

中国电信边缘计算最佳实践

大数据、云计算、AI 等新一代信息技术的高速发展,在为新兴互联网行业提供强劲驱动之外,也在引领传统行业实施数字化、智能能化转型,并催生出智能制造、智慧金融等一系列全新智能产业生态。在中国电信 MEC 平台中,中国电信正依托自…

为什么需要边缘计算?哪些场景需要边缘计算?

为什么需要边缘计算? 边缘计算(Edge Computing)是一种将数据处理和计算功能移到接近数据源头的边缘设备上进行的计算模式。相比传统的云计算模式,边缘计算能够在接近数据源头的地方进行实时的数据处理,这为计算机视觉…

边缘计算是啥?

边缘计算,指的是在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供服务。与云计算作对比有助于更好地理解其特性,如果说云计算是集中化、规模化的,那么边缘计算就是分布式的、去…

边缘计算(三)——边缘计算的解决方案

点击篮字关注我们 目前,市场上存在的边缘计算相关概念包括雾计算、边缘计算、多接入边缘计算/移动边缘计算、移动云计算等概念。这是边缘计算的第三篇,主要讲的内容是边缘计算的解决方案。 Cloud Foundry平台 Cloud Foundry是一款使用Ruby开发的开源Paas…

边缘计算:一文理解云边端协同架构中的高性能云计算、边缘计算、云边协同

一、引言 1、云计算与物联网 通俗来说,在近几十年物联网的飞速发展过程中,经历了从云计算中心与终端物联设备直接交互———物联网通过数量惊人的传感器采集到难以计数的数据量,而云计算可以对这些海量数据进行智能处理。 云计算是物联网发…