深度学习之视觉处理

CNN

  • 视觉处理三大任务:分类、目标检测、图像分割
  • 上游:提取特征,CNN
  • 下游:分类、目标、分割等,具体的任务

概述

  • 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域, 往往我们输入的图像都很大,使用全连接网络的话,计算的代价较高。另外图像也很难保留原有的特征,导致图像处理的准确率不高
  • 卷积神经网络(Convolutional Neural Network,CNN)是一种专门用于处理具有网格状结构数据的深度学习模型。最初,CNN主要应用于计算机视觉任务,但它的成功启发了在其他领域应用,如自然语言处理等。
  • 卷积神经网络(Convolutional Neural Network)是含有卷积层的神经网络. 卷积层的作用就是用来自动学习、提取图像的特征。

CNN网络主要有三部分构成:卷积层、池化层和全连接层构成,其中卷积层负责提取图像中的局部特征;池化层用来大幅降低运算量并特征增强;全连接层类似神经网络的部分,用来输出想要的结果。

全连接的局限性

  • 全连接神经网络并不太适合处理图像数据

参数量巨大

  • 全连接结构计算量非常大,假设我们有1000×1000的输入,如果隐藏层也是1000×1000大小的神经元,由于神经元和图像每一个像素连接,则参数量会达到惊人的1000×1000×1000×1000,仅仅一层网络就已经有$10^{12}$个参数。

表达能力太有限

  • 全连接神经网络的角色只是一个分类器,如果将整个图片直接输入网络,不仅参数量大,也没有利用好图片中像素的空间特性,增加了学习难度,降低了学习效果。

卷积思想

  • 卷:从左往右,从上往下
  • 积:乘积,求和

概念

局部连接
  • 局部连接可以更好地利用图像中的结构信息,空间距离越相近的像素其相互影响越大。
  • 根据局部特征完成目标的可辨识性
权重共享
  • 图像从一个局部区域学习到的信息应用到其他区域。
  • 减少参数,降低学习难度。

卷积层

卷积核

1.卷积核是卷积运算过程中必不可少的一个“工具”,在卷积神经网络中,卷积核是非常重要的,它们被用来提取图像中的特征。

2.卷积核其实是一个小矩阵,在定义时需要考虑以下几方面的内容:

  • 卷积核的个数:卷积核(过滤器)的个数决定了其输出特征矩阵的通道数
  • 卷积核的值:卷积核的值是自定义的,根据想要提取的特征来进行设置,后续进行更新。
  • 卷积核的大小:常见的卷积核有1×1、3×3、5×5等,一般都是奇数 × 奇数。

3.下图就是一个3×3的卷积核:

卷积计算

卷积计算过程

1.卷积的过程是将卷积核在图像上进行滑动计算,每次滑动到一个新的位置时,卷积核和图像进行点对点的计算,并将其求和得到一个新的值,然后将这个新的值加入到特征图中,最终得到一个新的特征图。

  • input 表示输入的图像
  • filter 表示卷积核, 也叫做滤波器
  • input 经过 filter 的得到输出为最右侧的图像,该图叫做特征图
  • 左上角的点计算方法:

  • 按照上面的计算方法可以得到最终的特征图为:

2.卷积的重要性在于它可以将图像中的特征与卷积核进行卷积操作,从而提取出图像中的特征

3.可以通过不断调整卷积核的大小、卷积核的值和卷积操作的步长,可以提取出不同尺度和位置的特征。

# 面相对象的模块化编程
from matplotlib import pyplot as plt
import os
import torch.nn as nn
import torch


def test001():
    # __file__当前文件
    current_path = os.path.dirname(__file__)
    print(current_path)
    img_path = os.path.join(current_path, '..\data','1.png')
    print("img_path:",img_path)
    # 转换为相对路径
    img_path = os.path.realpath(img_path)
    print("img_realpath:",img_path)

    # 使用plt读取图片
    img = plt.imread(img_path)
    print(img.shape)
    # 转换为张量:HWC-->CHW-->NCHW 链式调用
    # 深拷贝原图在进行链式操作,返回一个新值
    img = torch.Tensor(img).permute(2,0,1).unsqueeze(0)

    # 创建卷积核
    conv = nn.Conv2d(
        in_channels=4,# 输入通道数
        out_channels=1,# 输出通道数
        # 如果要产出32个特征图,那么就需要32个卷积核,每个卷积核的通道数为这个卷积核的通道数为4
        # out_channels=32,# 输出通道数
        kernel_size=3,# 卷积核大小
        # kernel_size=(5,3),# 卷积核大小
        stride=1,# 步长
        padding=0 # 填充
        # bias=True
)
    # 使用卷积核,对图像进行卷积操作
    out = conv(img)
    # 把图片显示出来
    print(out.shape)
    # out[0][0]: 806, 574
    # out[0][0]:其中含有梯度等元素
    # detach叶子结点,数据的引用,只指向源数据,不包含梯度等其他元素
    plt.imshow(out[0][0].detach().numpy(), cmap='gray')
    # 取第32个卷积核的输出显示
    # plt.imshow(out[0][31].detach().numpy(), cmap='gray')

    plt.show()

# 作为主机模块执行
if __name__ == '__main__':
    test001()
# 面相对象的模块化编程
from matplotlib import pyplot a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值