文章目录

  • 一、图像识别流程
  • 二、深度学习算法流程
  • 三、人民币识别实现
    • 1、数据集拆分
    • 2、主文件
    • 3、数据集读取
    • 4、网络结构
    • 5、预测
    • 6、单张预测

一、图像识别流程

1. 准备数据集1)采集图像2)拆分数据集训练集、测试集  8:23)读图像和分批4)图像预处理(缩放、标准化处理)
2. 选择网络结构简单任务:lenet、Alexnet中等任务:vgg、googlenet复杂任务:resnet18、renset50
3. 选择损失函数衡量真实值和预测值之间的误差分类问题: 交叉熵损失函数回归问题:均方误差损失函数
4. 选择优化器(优化器作用:选择一种方法更新参数)优化器的一种为:随机梯度下降  w = w - lr*grad
5. 训练算法
for i in range(100):将训练集遍历N遍for 每批数据 in 所有训练数据:output = model(每批数据)  # 模型预测loss_val = loss_fn(output, target)根据loss进行反向传播利用优化器更新model中参数# 保存模型
save(model中参数)# -------------------------------------------------------------------------
数据集拆分
1元:100张
100元:100张
训练集:80张1元 + 80张100元
测试集:20张1元 + 20张100元

二、深度学习算法流程

三、人民币识别实现

1、数据集拆分

RMB_1数据拆分.py

import os
import random
import shutilrandom.seed(1)"""
数据集拆分
1元:100张
100元:100张
训练集:80张1元 + 80张100元
测试集:20张1元 + 20张100元拆分后RMB_split
>train
>> 1元 80张图像
>> 100元  80张图像
>test
>> 1元 20张图像
>> 100元  20张图像
"""# 根路径、子路径、文件名
for root, subs, files in os.walk("E:\pycharm\pythonProject\深度学习./RMB_data"):for sub in subs:sub_path = os.path.join(root, sub)# print(sub_path)all_images = os.listdir(sub_path)random.shuffle(all_images)  # 打乱列表中的元素for ind, i in enumerate(all_images):org_img_name = os.path.join(sub_path, i)print(ind, org_img_name)if ind < 80:save_img_name = org_img_name.replace("RMB_data", "RMB_split/train")else:save_img_name = org_img_name.replace("RMB_data", "RMB_split/test")# save_path = save_img_name.split("\\")[0]save_path = os.path.dirname(save_img_name)# print(save_path)# 创建目录# exist_ok=True 如果文件夹存在,不再次创建,也不报错os.makedirs(save_path, exist_ok=True)# 源路径、目的路径shutil.copy(org_img_name, save_img_name)

2、主文件

RMB_2主文件.py

from torch.utils.data import DataLoader  # 数据分批
from 深度学习.RMB_3数据集读取 import RMB_Dataset
from torchvision import transforms
import pdb
from 深度学习.RMB_4网络结构 import Lenet
import torch.nn as nn
import torch.optim as optim
import numpy as np
import torch# 随机种子
torch.manual_seed(1)# -----------------------超参数--------------------------------
LR = 0.05  # 学习率
max_epoch = 20  # 最大迭代次数
interval = 2  # 每训练两次 测试一次
test_batch_size = 4
best_acc = 0# ---------------------------1/5 数据模块-------------------------------------------------
train_data_path = "RMB_split/train"
test_data_path = "RMB_split/test"# 图像处理的均值和标准差
# ImageNet数据集 上图像的均值和标准差如下
norm_mean = [0.485, 0.456, 0.406]
norm_std = [0.229, 0.224, 0.225]
# 数据预处理的一些操作。
train_transform = transforms.Compose([transforms.Resize((32, 32)),  # 缩放到统一尺寸transforms.RandomCrop(32, padding=4),  # 图像四周补像素transforms.ToTensor(),  # 转换为tensor,会被归一化为0-1transforms.Normalize(norm_mean, norm_std),  # 数据标准化:减均值 除方法
])test_transform = transforms.Compose([transforms.Resize((32, 32)),  # 缩放到统一尺寸transforms.ToTensor(),  # 转换为tensor,会被归一化为0-1transforms.Normalize(norm_mean, norm_std),  # 数据标准化:减均值 除方法
])train_dataset = RMB_Dataset(data_path=train_data_path, transform=train_transform)
test_dataset = RMB_Dataset(data_path=test_data_path, transform=test_transform)# 参数 dataset: 对哪个数据集进行分批 (数值类型)
# 参数batch_size 每个批次的样本个数
# shuffle 是否对数据集进行打乱,再分批
# drop_last 是否删除最后一个; 在分批过程中如果不能整除,是否删除一个批次
# 总样本数 84  每个批次8个样本
# 如果drop_last=True,删除最后4个样本; 如果drop_last=False,使用4个样本+前80个随机选4个
# 分批处理
train_loader = DataLoader(dataset=train_dataset,batch_size=16,  # 设置为8个倍数 通常范围32 64 128shuffle=False,    #True--->Falae要不然报错drop_last=True  # 训练集160个样本
)# 测试数据集一共20个样本
test_loader = DataLoader(dataset=test_dataset,batch_size=test_batch_size,  # 设置为8个倍数 通常范围32 64 128shuffle=False,  #True--->Falae要不然报错drop_last=True  # 训练集160个样本
)
print(len(test_loader))"""
# 对分批后的对象进行遍历
for batch in train_loader:# pdb.set_trace()# batch 的值 由 __getitem__返回值决定print(batch)
"""# ---------------------------2/5 网络结构----------------------------------------------
model = Lenet(num_classes=2)# ---------------------------3/5 损失函数----------------------------------------------
# 对于分类任务----交叉熵损失函数
loss_fn = nn.CrossEntropyLoss()# ---------------------------4/5 优化器----------------------------------------------
# 随机梯度下降
optimizer = optim.SGD(model.parameters(), lr=LR)# ---------------------------5/5 训练算法----------------------------------------------
for epoch in range(max_epoch):acc_num = 0model.train()  # -----------接下来是训练for batch in train_loader:img, label, _ = batch# img 一个批次的数据; label 一个批次的标签# 预测output = model(img)  # 前向传播# 计算真实值和预测值预测loss_val = loss_fn(output, label)  # 计算损失值# 更新梯度optimizer.zero_grad()  # 梯度清零# 计算梯度loss_val.backward()  # 反向传播 计算梯度optimizer.step()  # 更新参数  w = w -lr* grad# y_pred = np.argmax(output.detach().numpy(), axis=1)_, y_pred = torch.max(output, dim=1)# pdb.set_trace()acc_num += int((y_pred == label).sum())print("第{}次训练 准确率{}".format(epoch, acc_num / 160))# 保留在测试集上 效果 最好的 一次模型if epoch % 2 == 0:# 训练N次,测试一次model.eval()  # 接下来进行模型测试acc_num = 0for batch in test_loader:img, label, _ = batchoutput = model(img)# 测试过程不需要计算损失_, y_pred = torch.max(output, dim=1)# pdb.set_trace()acc_num += int((y_pred == label).sum())test_accuracy = acc_num /((len(test_loader) * test_batch_size))print("第{}轮 测试 准确率{}".format(epoch, test_accuracy))# if test_accuracy > best_acc:#     best_acc = test_accuracy#     # 保存模型#     # 保存模型 通常只保存模型对应的状态字典#     # pdb.set_trace()#     torch.save(model.state_dict(), "rmb.pth")#     # model.state_dict()["conv1.weight"]if test_accuracy > best_acc:best_acc = test_accuracy# 保存模型# 保存模型 通常只保存模型对应的状态字典# pdb.set_trace()torch.save(model.state_dict(), "rmb_v2.pth")# model.state_dict()["conv1.weight"]

3、数据集读取

RMB_3数据集读取.py

from torch.utils.data import Dataset
import os
from PIL import Image# 所有自定义数据集的类 集成自torch.utils.data.Dataset
# 必须包含__getitem__、__len__
class RMB_Dataset(Dataset):def __init__(self, data_path="", transform=None):# 将数据集整理为# self.data = [[图像名称1,标签1], [图像名称2,标签2], [图像名称3,标签3].....]self.data = []dict1 = {"100": 0, "1": 1}for root, sub, files in os.walk(data_path):for file in files:img_name = os.path.join(root, file)  # 获取图像路径label = img_name.split("\\")[-2]  # 获取标签label = dict1[label]  # label转换为0 1self.data.append([img_name, label])self.transform = transform  # 数据转换处理def __getitem__(self, index):# 负责读取其中一个图像,再进行图像转换img_name, label = self.data[index]img = Image.open(img_name)# 图像转换处理if self.transform is not None:img = self.transform(img)return img, label, img_namedef __len__(self):# 数据集中有多少个样本,# 该函数必须有返回值return len(self.data)"""data_path = "dataset/RMB_split/train"
# 可以获取文件夹下 子文件夹下 的所有文件# self.data = [[图像名称1,标签1], [图像名称2,标签2], [图像名称3,标签3].....]data = []
dict1 = {"100元": 0, "1元": 1}
for root, sub, files in os.walk(data_path):for file in files:img_name = os.path.join(root, file)  # 获取图像路径label = img_name.split("\\")[-2]  # 获取标签label = dict1[label] # label转换为0 1data.append([img_name, label])"""

4、网络结构

RMB_4网络结构.py

import torch.nn as nn
import torch
import pdb
import numpy as np# 自定义的网络结构 都必须继承 nn.Module
class Lenet(nn.Module):def __init__(self, num_classes=10):super(Lenet, self).__init__()# 初始化的信息# 定义各个卷积运算、池化运算、激活、全连接self.conv1 = nn.Conv2d(in_channels=3,out_channels=6,kernel_size=(5, 5),stride=1,padding=0)self.pool = nn.MaxPool2d(kernel_size=(2, 2), stride=2)self.conv2 = nn.Conv2d(in_channels=6,out_channels=16,kernel_size=(5, 5),stride=1,padding=0)self.fc1 = nn.Linear(in_features=400,out_features=120)self.fc2 = nn.Linear(in_features=120,out_features=84)self.fc3 = nn.Linear(in_features=84,out_features=num_classes)self.relu = nn.ReLU(inplace=True)passdef forward(self, X):# 前向传播  执行顺序# X 是输入数据 N*C*H*W  (样本数*通道数*H*W)# pdb.set_trace()out = self.conv1(X)out = self.relu(out)out = self.pool(out)out = self.conv2(out)out = self.relu(out)out = self.pool(out)out = out.reshape(out.shape[0], -1)  # 展平out = self.fc1(out)out = self.fc2(out)out = self.fc3(out)return outpass

5、预测

RMB_5预测.py

import torch
from 深度学习.RMB_4网络结构 import Lenet
from torchvision import transforms
from 深度学习.RMB_3数据集读取 import RMB_Dataset
from torch.utils.data import DataLoader  # 数据分批
import matplotlib.pyplot as plt
from PIL import Image
import pdb
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams['axes.unicode_minus'] = Falseimport os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'model = Lenet(num_classes=2)
# 加载模型
checkpoint = torch.load("rmb.pth")
model.load_state_dict(checkpoint)test_data_path = "dataset/RMB_split/test"
norm_mean = [0.485, 0.456, 0.406]
norm_std = [0.229, 0.224, 0.225]test_transform = transforms.Compose([transforms.Resize((32, 32)),  # 缩放到统一尺寸transforms.ToTensor(),  # 转换为tensor,会被归一化为0-1transforms.Normalize(norm_mean, norm_std),  # 数据标准化:减均值 除方法
])test_dataset = RMB_Dataset(data_path=test_data_path, transform=test_transform)# 测试数据集一共20个样本
test_loader = DataLoader(dataset=test_dataset,batch_size=1,shuffle=False,drop_last=True  # 训练集160个样本
)dict1 = {0: "100元", 1: "1元"}plt.ion()for batch in test_loader:plt.cla()img, label, img_name = batchoutput = model(img)# 测试过程不需要计算损失_, y_pred = torch.max(output, dim=1)# pdb.set_trace()img2 = Image.open(img_name[0])plt.imshow(img2)y_pred = dict1[int(y_pred[0])]label = dict1[int(label[0])]plt.title("预测结果是{}, 真实结果{}".format(y_pred, label))plt.pause(3)plt.ioff()
plt.show()

6、单张预测

RMB_6单张预测.py

import torch
from PIL import Image
from 深度学习.RMB_4网络结构 import Lenet
import os
from torchvision.transforms import functional as F
import pdbimport matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = "SimHei"
plt.rcParams['axes.unicode_minus'] = Falseimport os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'model = Lenet(num_classes=2)
# 加载模型
checkpoint = torch.load("rmb_v2.pth")
model.load_state_dict(checkpoint)dict1 = {0: "100元", 1: "1元"}plt.ion()for root, sub, files in os.walk("images/"):for file in files:img_name = os.path.join(root, file)  # 获取图像路径img = Image.open(img_name).convert('RGB')img_org = img.copy()# 缩放处理img = F.resize(img, (32, 32))# 图像转Tensorimg = F.to_tensor(img)# pdb.set_trace()# 标准化处理norm_mean = [0.485, 0.456, 0.406]norm_std = [0.229, 0.224, 0.225]img = F.normalize(img, norm_mean, norm_std)# 将图像扩展为四维张量img = img.expand(1, 3, 32, 32)output = model(img)_, y_pred = torch.max(output, dim=1)y_pred = int(y_pred[0])y_pred = dict1[y_pred]print("预测结果", y_pred)plt.cla()plt.title("预测结果{}".format(y_pred))plt.imshow(img_org)plt.pause(3)plt.ioff()
plt.show()

深度学习6---案例:人民币识别实现相关推荐

  1. 【第 07 章 基于主成分分析的人脸二维码识别MATLAB深度学习实战案例】

    基于主成分分析的人脸二维码识别MATLAB深度学习实战案例 人脸库 全套文件资料目录下载链接–>传送门 本文全文源码下载[链接–>传送门] 如下分析: 主文件 function varar ...

  2. 利用深度学习进行交通灯识别_通过深度学习识别交通信号灯

    利用深度学习进行交通灯识别 by David Brailovsky 戴维·布雷洛夫斯基(David Brailovsky) 通过深度学习识别交通信号灯 (Recognizing Traffic Lig ...

  3. 基于深度学习的轴承故障识别-总结及常见问题

    新年快乐. 把猪年的事结束在猪年,这篇写一下最后的总结展望,顺便归纳一下常被问到的问题. 总结 前面做的简单概括就是:选择神经网络模型→测试CNN和LSTM→选择CNN→优化. 我认为的几个主要的缺陷 ...

  4. 深度学习实现案例(Tensorflow、PaddlePaddle)

    深度学习实验案例 文章目录 深度学习实验案例 一.基础理论 实验一:自定义感知机 实验二:验证图像卷积运算效果 二.Tensorflow 实验一:查看Tensorflow版本 实验二:Hellowor ...

  5. 中科院DeepMind联手,用深度学习揭示大脑如何识别人脸|Nature子刊

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI Deep ...

  6. 浙江大学《深度学习与行人重识别》课程课件

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要3分钟 Follow小博主,每天更新前沿干货 课程介绍 该课程为浙江大学罗浩博士于2018年10月录制的<基于深度学习和行人重识别> ...

  7. 【深度学习】DIY 人脸识别技术的探索(一)

    [深度学习]DIY 人脸识别技术的探索(一) 文章目录 摘要 问题重述 模型假设 定义与符号说明 问题分析 模型的建立与求解 参考 摘要 伴随着人工智能技术的发展,人们对信息安全有了更高的要求,传统的 ...

  8. 【深度学习】DIY 人脸识别技术的探索(二)

    [深度学习]DIY 人脸识别技术的探索(二) 文章目录 训练模型 工具 结果展示 问题二的模型建立与求解 基于 KNN 的人脸识别模型 训练模型 MTCNN 可以并行训练(3 个网络同时训练,前提是内 ...

  9. 蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘-1

    蚂蚁金服张洁:基于深度学习的支付宝人脸识别技术解秘(1) 2015-08-13 10:22 于雪 51CTO 字号:T | T 用户身份认证是互联网金融发展的基石.今年三月,在德国汉诺威举办的IT展览 ...

  10. Nature论文解读:深度学习助力毫秒之间识别癌细胞

    论文动机 流式细胞仪作为一种生物医学诊断技术,可以准确测量细胞特性.当前仪器已经实现了细胞的分类识别,但由于数据处理耗时的问题,尚不能对细胞进行实时分选. 基于之前的工作,本文作者提出采用深度学习来解 ...

最新文章

  1. 使用Python,机器学习和深度学习的5个很棒的计算机视觉项目创意!
  2. 杭州中国移动java待遇_【中国移动杭州研发中心Java面试】移动杭研社招java中级面试-看准网...
  3. BOOST_PROTO_EXTENDS_MEMBERS宏相关的测试程序
  4. 数百万台车联网设备同时在线 0 故障,中瑞集团的云原生探索之路
  5. Linux入门(10)——Ubuntu16.04使用pip3和pip安装numpy,scipy,matplotlib等第三方库
  6. php+node+redis,redis,nodejs,php,pub/sub 实战: 微信语音识别
  7. ios越狱系统UIGestureRecognizer事件截获问题
  8. Elasticsearch学习笔记-04.3批处理
  9. 机器学习——文件的读取
  10. 清空计算机网络缓存,【缓存清理工具】缓存清理软件_电脑缓存清理软件【最新】-太平洋电脑网...
  11. 【小结】背知识点的小技巧
  12. 告别后端!阿里云小程序 Serverless 教你如何 30 分钟开发小程序!
  13. UIView动画小问题。
  14. Django 创建model的一些注意事项
  15. VS2019+OpenCV3.4.1_vc14vc15配置简介(防忘记)
  16. java jdom_Java JDOM解析器
  17. postgresql数据库字符串转日期
  18. 编译一个java源程序文件,会产生多少个字节码文件
  19. SequoiaDB 巨杉数据库-隔离级别
  20. Python入门笔记3

热门文章

  1. moment.js 的方法总结
  2. because it is included into a circular dependency循环依赖的解决办法
  3. 入侵检测系统IDS工作原理笔记
  4. 想忘又忘不了--易买网项目总结
  5. android l 论坛,同步更新魔趣源码Android-L编译
  6. java第二课——IDEA介绍
  7. 排烟管道过长怎么处理_太原排烟管道过长怎么处理?参数及原理,厨房排烟管道设计规范哪里靠谱...
  8. 牛客网 J-闯关的lulu
  9. Kali Linux - 嗅探和欺骗及密码破解工具
  10. Android Smart Linkify 支持机器学习