Datawhale 零基础入门CV赛事-Task3 字符识别模型

简介: Datawhale 零基础入门CV赛事-Task3 字符识别模型

3 字符识别模型


本章将会讲解卷积神经网络(Convolutional Neural Network, CNN)的常见层,并从头搭建一个字符识别模型。


3.1 学习目标


  • 学习CNN基础和原理
  • 使用Pytorch框架构建CNN模型,并完成训练


3.2 CNN介绍


卷积神经网络(简称CNN)是一类特殊的人工神经网络,是深度学习中重要的一个分支。CNN在很多领域都表现优异,精度和速度比传统计算学习算法高很多。特别是在计算机视觉领域,CNN是解决图像分类、图像检索、物体检测和语义分割的主流模型。

CNN每一层由众多的卷积核组成,每个卷积核对输入的像素进行卷积操作,得到下一次的输入。随着网络层的增加卷积核会逐渐扩大感受野,并缩减图像的尺寸。


[图片上传失败...(image-e33482-1590505808239)]


CNN是一种层次模型,输入的是原始的像素数据。CNN通过卷积(convolution)、池化(pooling)、非线性激活函数(non-linear activation function)和全连接层(fully connected layer)构成。


如下图所示为LeNet网络结构,是非常经典的字符识别模型。两个卷积层,两个池化层,两个全连接层组成。卷积核都是5×5,stride=1,池化层使用最大池化。


[图片上传失败...(image-65c3c5-1590505808239)]


通过多次卷积和池化,CNN的最后一层将输入的图像像素映射为具体的输出。如在分类任务中会转换为不同类别的概率输出,然后计算真实标签与CNN模型的预测结果的差异,并通过反向传播更新每层的参数,并在更新完成后再次前向传播,如此反复直到训练完成 。


与传统机器学习模型相比,CNN具有一种端到端(End to End)的思路。在CNN训练的过程中是直接从图像像素到最终的输出,并不涉及到具体的特征提取和构建模型的过程,也不需要人工的参与。


3.3 CNN发展


随着网络结构的发展,研究人员最初发现网络模型结构越深、网络参数越多模型的精度更优。比较典型的是AlexNet、VGG、InceptionV3和ResNet的发展脉络。


[图片上传失败...(image-ff0624-1590505808239)]

  • LeNet-5(1998)

[图片上传失败...(image-bd3cb-1590505808239)]

  • AlexNet(2012)

[图片上传失败...(image-41c585-1590505808239)]

  • VGG-16(2014)

[图片上传失败...(image-6d6138-1590505808239)]

  • Inception-v1 (2014)

[图片上传失败...(image-41ff14-1590505808239)]

  • ResNet-50 (2015)

[图片上传失败...(image-36ae86-1590505808239)]


3.4 Pytorch构建CNN模型


在上一章节我们讲解了如何使用Pytorch来读取赛题数据集,本节我们使用本章学习到的知识构件一个简单的CNN模型,完成字符识别功能。


在Pytorch中构建CNN模型非常简单,只需要定义好模型的参数和正向传播即可,Pytorch会根据正向传播自动计算反向传播。


在本章我们会构建一个非常简单的CNN,然后进行训练。这个CNN模型包括两个卷积层,最后并联6个全连接层进行分类。


import torch
torch.manual_seed(0)
torch.backends.cudnn.deterministic = False
torch.backends.cudnn.benchmark = True
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torch.autograd import Variable
from torch.utils.data.dataset import Dataset
# 定义模型
class SVHN_Model1(nn.Module):
    def __init__(self):
        super(SVHN_Model1, self).__init__()
        # CNN提取特征模块
        self.cnn = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(),  
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(), 
            nn.MaxPool2d(2),
        )
        # 
        self.fc1 = nn.Linear(32*3*7, 11)
        self.fc2 = nn.Linear(32*3*7, 11)
        self.fc3 = nn.Linear(32*3*7, 11)
        self.fc4 = nn.Linear(32*3*7, 11)
        self.fc5 = nn.Linear(32*3*7, 11)
        self.fc6 = nn.Linear(32*3*7, 11)
    def forward(self, img):        
        feat = self.cnn(img)
        feat = feat.view(feat.shape[0], -1)
        c1 = self.fc1(feat)
        c2 = self.fc2(feat)
        c3 = self.fc3(feat)
        c4 = self.fc4(feat)
        c5 = self.fc5(feat)
        c6 = self.fc6(feat)
        return c1, c2, c3, c4, c5, c6
model = SVHN_Model1()


接下来是训练代码:

# 损失函数
criterion = nn.CrossEntropyLoss()
# 优化器
optimizer = torch.optim.Adam(model.parameters(), 0.005)
loss_plot, c0_plot = [], []
# 迭代10个Epoch
for epoch in range(10):
    for data in train_loader:
        c0, c1, c2, c3, c4, c5 = model(data[0])
        loss = criterion(c0, data[1][:, 0]) + \
                criterion(c1, data[1][:, 1]) + \
                criterion(c2, data[1][:, 2]) + \
                criterion(c3, data[1][:, 3]) + \
                criterion(c4, data[1][:, 4]) + \
                criterion(c5, data[1][:, 5])
        loss /= 6
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        loss_plot.append(loss.item())
        c0_plot.append((c0.argmax(1) == data[1][:, 0]).sum().item()*1.0 / c0.shape[0])
    print(epoch)


在训练完成后我们可以将训练过程中的损失和准确率进行绘制,如下图所示。从图中可以看出模型的损失在迭代过程中逐渐减小,字符预测的准确率逐渐升高。


[图片上传失败...(image-60f468-1590505808239)]


当然为了追求精度,也可以使用在ImageNet数据集上的预训练模型,具体方法如下:

class SVHN_Model2(nn.Module):
    def __init__(self):
        super(SVHN_Model1, self).__init__()
        model_conv = models.resnet18(pretrained=True)
        model_conv.avgpool = nn.AdaptiveAvgPool2d(1)
        model_conv = nn.Sequential(*list(model_conv.children())[:-1])
        self.cnn = model_conv
        self.fc1 = nn.Linear(512, 11)
        self.fc2 = nn.Linear(512, 11)
        self.fc3 = nn.Linear(512, 11)
        self.fc4 = nn.Linear(512, 11)
        self.fc5 = nn.Linear(512, 11)
    def forward(self, img):        
        feat = self.cnn(img)
        # print(feat.shape)
        feat = feat.view(feat.shape[0], -1)
        c1 = self.fc1(feat)
        c2 = self.fc2(feat)
        c3 = self.fc3(feat)
        c4 = self.fc4(feat)
        c5 = self.fc5(feat)
        return c1, c2, c3, c4, c5


3.5 本章小节


在本章中我们介绍了CNN以及CNN的发展,并使用Pytorch构建构建了一个简易的CNN模型来完成字符分类任务。


相关文章
|
6月前
|
机器学习/深度学习 人工智能 数据可视化
社区供稿|语音情感基座模型emotion2vec
SOTA效果的通用语音情感表征模型emotion2vec,魔搭社区已开源,可下载体验!
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记
这段内容介绍了一个使用Stable Diffusion与LoRA技术创建定制化二次元图像生成模型的全流程。首先,通过安装必要的软件包如Data-Juicer和DiffSynth-Studio准备开发环境。接着,下载并处理二次元图像数据集,利用Data-Juicer进行数据清洗和筛选,确保图像质量和尺寸的一致性。随后,训练一个针对二次元风格优化的LoRA模型,并调整参数以控制模型复杂度。完成训练后,加载模型并通过精心设计的提示词(prompt)生成一系列高质量的二次元图像,展示模型对细节和艺术风格的理解与再现能力。整个过程展示了从数据准备到模型训练及结果生成的完整步骤,为定制化图像提供了方向。
|
9天前
|
机器学习/深度学习 人工智能 数据可视化
何恺明CV课程 | AI大咖说
麻省理工学院(MIT)电气工程与计算机科学系(EECS)副教授何恺明开设了两门精彩课程:“Advance in Computer Vision”和“Deep Generative Models”。何恺明是计算机视觉和深度学习领域的杰出科学家,曾提出深度残差网络(ResNet)等重要成果。这两门课程不仅涵盖了最新的研究前沿,还由何恺明亲自授课,内容涉及卷积神经网络、生成对抗网络、变分自编码器等,是学习计算机视觉和生成模型的宝贵资源。
46 8
|
3月前
|
人工智能
Datawhale X 魔搭 AI夏令营task 2笔记
Datawhale X 魔搭 AI夏令营task 2笔记
58 1
Datawhale X 魔搭 AI夏令营task 2笔记
|
3月前
|
数据采集 人工智能 物联网
Datawhale X 魔搭 AI夏令营task 3笔记
Datawhale X 魔搭 AI夏令营task 3笔记
78 2
|
3月前
|
人工智能
DataWhale夏令营第四期魔搭- AIGC方向task01笔记
DataWhale夏令营,AIGC方向task1笔记。从平台注册到程序调试,最终生成一组古风小故事图片,并对其进行总结分析。
199 0
DataWhale夏令营第四期魔搭- AIGC方向task01笔记
|
测试技术 计算机视觉
阿里 视觉cv实习一面
阿里 视觉cv实习一面
36 0
|
达摩院 并行计算 TensorFlow
|
机器学习/深度学习 人工智能 数据可视化
AAAI 2022 Oral | 无需人工标注,清华、快手提出基于参考图像的单张生成图像质量评价方法
AAAI 2022 Oral | 无需人工标注,清华、快手提出基于参考图像的单张生成图像质量评价方法
117 0
|
机器学习/深度学习 人工智能 数据可视化
【paddle深度学习高层API七日打卡营】三岁水课第一天—认识AI与手写数字识别的一天
大家好,这里是三岁,别的不会,擅长白话,今天就是我们的白话系列,内容是paddle2.0新出的高程API,在这里的七日打卡营0基础学习,emmm我这个负基础的也来凑凑热闹,那么就开始吧~~~~ 注:以下白话内容为个人理解,如有不同看法和观点及不对的地方欢迎大家批评指正!
230 0
【paddle深度学习高层API七日打卡营】三岁水课第一天—认识AI与手写数字识别的一天