计算机视觉CV期末总复习

1.计算机视觉基础

数字图像表示

二值图像

仅包含黑白两种颜色的图像,只使用1个比特为(0黑或1白)表示

彩色图像:分不同的颜色空间

gray灰度图像

每个像素只有一个采样颜色,取值范围0--255,为8比特位,0为黑,255为白

RGB颜色空间

(0,0,0)为黑,(255,255,255)为白,对机器友好的色彩模式,没那么人性化

CMY/CMYK颜色空间

C青、M洋红(品红)、Y黄色、K黑色

HSV颜色空间

H色调S饱和度V明度

YUV 颜色空间

Y明亮度、U色度、V浓度(饱和度)

储存格式:

  • 平面格式
  • 紧凑格式

2.opencv

通用开源功能强大的图像处理和计算机视觉库

主要功能及模块

  • 内置了基本数据结构和输入输出结构
  • 图像处理操作
  • 圆形界面操作
  • 视频分析
  • 3D重建

基本操作

读写显示图像

就是imread()将图片读入内存,支持jpg、png

img.shape(512,512,3)中图像三个数代表高、宽、通道数 ,分辨率为512x512,三个数代表彩色图像为三维数组。

img.dtype结果输出为uint8,说明每个数组用1个字节(8位)表示,每个数组元素为rgb通道值

img.size输出为shape中三个数的乘积

写就是imwrite,将数组转化为图像保存

显示图像imshow

waitkey

没有按键返回-1,有的话返回对应按键的ASCII码(A 65 Z90 a97 z122)。负数或零表示无限等待。设置数字参数等待时间结束返回-1,单位为毫秒,1秒 = 1000毫秒。

读写播放视频

把VideoCapture参数设置为0调用摄像头

写入文件:

图像平滑

概念:平滑也称作模糊。为抑制遥感图像因传感器和大气因素影响出现的噪声,使图像亮度趋于平缓的方法。目的是使图像亮度平缓渐变,减小突变梯度,改善图片质量。

图像滤波

均值滤波

dst = cv2.blur(src,ksize,anchor,borderType)

src原图形、ksize卷积核大小(高宽通常相同,为正奇数)、a锚点(可选参数)、b边界值处理方式 (可选参数)

python 复制代码
import cv2

img=cv2.imread('lena.jpg')

cv2.imshow('img',img)

img2=cv2.blur(img,(5,5))

cv2.imshow('imgBlur',img2)

cv2.waitKey(0)

方框滤波

dst=cv2.boxFilter(src,ddepth,ksize[,anchor[,normalize[,borderType]])

ddepth目标图像深度,一般用-1表示与原图像深度一致,n归一化

python 复制代码
import cv2

img=cv2.imread('lena2.jpg')

cv2.imshow('img',img)

img2=cv2.boxFilter(img,-1,(3,3),normalize=False)

cv2.imshow('imgBlur',img2)

cv2.waitKey(0)

高斯滤波

python 复制代码
import cv2

img=cv2.imread('lena2.jpg')

cv2.imshow('img',img)

img2=cv2.GaussianBlur(img,(5,5),0,0)

cv2.imshow('imgBlur',img2)

cv2.waitKey(0)

中值滤波

dst = cv2.medianBlur(src,ksize)

ksize为整形,>1的正奇数

python 复制代码
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.medianBlur(img,9)
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)

双边滤波

python 复制代码
import cv2
img=cv2.imread('lena2.jpg')
cv2.imshow('img',img)
img2=cv2.bilateralFilter(img,9,100,100)
cv2.imshow('imgBlur',img2)
cv2.waitKey(0)

卷积

上述五个滤波均通过参数设置卷积核,但2D卷积可自定义卷积核

图像分割

概念:把图像分为具有若干特性的、具有独特性质的区域,并提出感兴趣目标的技术和过程。

感兴趣的为前景或目标,其余为背景

主要方法:基于阈值的分割、基于边缘、基于区域、基于聚类、基于图论、基于深度学习

基于阈值的分割

即把前景和背景进行划分

  • 全局阈值分割
  • 自适应阈值处理
  • 迭代法阈值分割

边缘检测

检测出图像中所有灰度值变化较大的点,点连接成线条,即为图像边缘。

目的是标识数字图像中变化明显的点,减少数据量,剔除不相关信息,保留结构属性。

作用:提取物体重要特征

常见边缘检测方法:

soble边缘检测

边缘:像素值发生跃迁的地方(变化率、导数最大处)。

图像梯度:导数差分。图像是二维离散函数,导数为差分,该差分称为图像梯度。

求原图边缘信息可以将原图像和一阶导数算子进行卷积

sobel算子:又称一阶微分算子 。缺点:易受影响,用高斯滤波降噪

sobel边缘检测就是把高斯滤波和微分结合执行卷积,抗噪

python 复制代码
x = cv2.Sobel(img,cv2.CV_16S,1,0)
y = cv2.Sobel(img,cv2.CV_16S,0,1)
拉普拉斯边缘检测

使用图像矩阵和拉普拉斯核进行卷积。本质是计算该点水平垂直四个相邻点平均点的差值。和sobel一样通过卷积计算边缘。

求原图边缘信息利用二阶差分计算

python 复制代码
dst = cv2.Laplacian(img,cv2.CV_8U)
8位无符号整数,这是一种常见的数据类型,用于表示像素值。
canny边缘检测

多阶段检测方法,比较复杂

  • 高斯滤波去除噪声
  • sobel核进行滤波,计算梯度
  • 边缘使用非极大值预测
  • 双阈值筛选:检测边缘双阈值去除假阳性(误检)
  • 分析边缘连接性,保留真正的,消除不明显的边缘
python 复制代码
dst  = cv2.Canny(img,threshold1=50,threshold2=150)

当噪声很大时可通过高斯滤波提升效果:

几何变换

色彩空间

python 复制代码
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)灰度图

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)RGB色彩

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)HSV色彩空间

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2YCrCb)YUV/YCrCb色彩空间

图像变换

读图像:img = cv2.imread('1.png')显示:cv2.('img',img),注意这里的引号图像名必须有

缩放

通过cv2.resize(img,dsize,dx=x,dy=y)dsize代表转换后图像大小

  • 当为None时dxdy不能为0,且此时转换后图像宽度为:原图像宽度xdx,高度xdy
  • 不为None时转换后大小以dsize为准,其格式为元组,(width,height),代表宽高。

还有一个插值方式:interpolation :

  • 最近邻:cv2.INTERNEAREST
  • 双线性:cv2.LINEAR
翻转

cv2.flip(img,flipcode),flipcode有三种:

  • 0:x轴,垂直翻转
  • >0:y轴,水平翻转
  • <0:水平垂直翻转
仿射变换

包括了平移、旋转、缩放、映射。基本思想就是获得变换矩阵m

再通过cv2.warpAffine(img,m,dsize)仿射变换

  • 平移m:np.float32([[1,0,100],[0,1,50]]),右移100,下移50
  • 缩放:[[0.5,0,0],[0,0.5,0]]

旋转:通过cv2.getRoatation.Martix2D(center,angle,scale)获得m:

  • 中心:(width/2,heigh/2)
  • 旋转角度
  • 目标图与原图比例

三点映射:通过cv2.AffineTransform(src,dst)获得m:

  • src:原图三点坐标:np.float32([[0,0],[],[]])
  • dst:目标图三点坐标

透视:通过cv2.warpPerspective(img,m,dsize)

m通过cv2.getPerspectiveTransform(src,dst)获得m:

  • src:原图四点坐标:np.float32([[0,0],[],[]])
  • dst:目标图四点坐标

3.深度学习基础

基础

全连接:该层的某一个神经元与下一层的每一个神经元都连接

卷积:提取特征 过程:

无跨步strides=1 边界填充padding分:

  • arbitrary padding 任意填充
  • half padding 半填充
  • full padding 全填充

二维卷积:

卷积层nn.Conv2d(in_channels=1,out_channels=2,kernel_size=5,stride=2,padding=2)

激活函数:nn.ReLU()线性整流单元

池化层:nn.MaxPool2d(kernel_size=(2,2),stride=2,padding=0) 作用:降低维度,减小特征图尺寸

avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)  # 池化窗口大小为 2x2,步幅为 2

关于激活函数: 激活函数

分组卷积:通过一个参数 groups来确定分组

深度可分离卷积:DSC

两部分:逐通道depthwise卷积,逐行逐列卷积(逐点pointwise卷积)

逐通道卷积就是把输入的k个通道分别通过单个卷积得到k个输出

逐点卷积:

  • 通过1x1卷积和把逐通道卷积得到的k个特征图进行融合
  • 能够通过改变卷积核的数量改变最终输出通道数

转置卷积和反卷积:反卷积即转置卷积的另一种表达。本质就是上采样增加特征图尺寸。应用如:图像分割、对抗网络

3D卷积:即读视频,添加了一个时间维度。4,3,3分别代表时间维度,高,宽

训练可视化

python 复制代码
writer = SummaryWriter(log_dir="./log", 
        comment='test_tensorboard', 
        filename_suffix="test")

writer.add_scaler()标量数据可视化
writer.add_histogram()数据分布可视化
writer.add_image()特征图可视化
writer.add_graph()模型可视化

标量数据可视化,区别在于add_scalars的dict是字典,而不是常量

模型优化

数据增强:

python 复制代码
from torchvision import transforms
transforms.Compose([
    transforms.ToTensor(),
    transforms.Resize((224, 224)),
    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
])

正则化:

L1正则化:权值向量w中各个元素的绝对值之和 。比如 向量A=[1,-1,3], 那么A的L1范数为 |1|+|-1|+|3|。L = L+λ |W|

L2正则化:权值向量中各个元素的平方和然后再求平方根 ,对参数进行二次约束,参数w变小,但不为零,不会形成稀疏解 。它会使优化求解稳定快速,使权重平滑。所以L2适用于特征之间没有关联的情况。L(w) = Loss(y, y_pred) + λ * ||w||^2

python 复制代码
通过weight_decay参数实现L2正则化。

optimizer = torch.optim.Adam(model.parameters(), 
                            lr=0.001, 
                            weight_decay=0.01)
这里的weight_decay参数就是L2正则化中的λ参数。

过拟合:解决方法:数据增强、正则化、早停、增加数据集大小

DenseNet

经典卷积

AlexNet,共8层,ReLu

VGG16,13层卷积3层全连接。通过增加网络层数能提高模型性能,且多个小卷积核替换大卷积核,softmax

GoogleNet 22层 softmax

ResNet 输入输出间引入恒等映射,解决网络退化问题

DenseNet

共121层,分4个DenseBlock,且每个DenseBlock(下左图)内部都采用稠密连接。可理解为:

更激进的残差连接,创新点每层的输出都有前面所有层在channel维度上连接在一起,作为下一层的输入。

DenseNet121共四个DenseBlock,每个block间使用Transition Layer进行特征降维。

ResAttentionNet

ResNet

网络深度增加时,网络的表现先是逐渐增加至饱和,然后迅速下降,出现网络退化问题

两种残差结构:

ResNet18, 34(浅层网络)的残差块的基本单元是BasicBlock 3、ResNet50, 101, 152 (深层网络)的残差块的基本单元是Bottleneck。原因是bottleneck计算量是basicBlock的1/16,常用于更深的网络,目的是减少计算和参数量

ResAttentionNet

残差注意力网络,是一种结合了注意力机制和ResNet的卷积神经网络,旨在提升图像分类任务的性能。 该网络由多个注意力模块堆叠而成,每个模块包含:

  • 软掩膜分支( soft mask branch)
  • 主干分支(trunk branch)

软掩膜分支采用自底向上(bottom-up)和自顶向下(top-down)的结构,学习生成一个掩膜(mask),该掩膜作为权重的形式与主干分支的输出特征图相乘,从而生成最终的注意力感知特征图‌。 Mix Attention对每个通道和每个空间位置使用Sigmoid激活函数。

YOLO

目标检测:找出图像中所有感兴趣的目标,确定他们的位置和类别。图像识别的四大任务:

  • 分类、定位、检测、分割

目标检测学习算法可分两类:单阶段onestage和双阶段twostage

twostage:

  • 先进行区域生成RP(包含待检测目标物体的预选框),在进行卷积分类
  • 任务流程:特征提取、生成RP、分类/定位回归
  • 常见算法:R-CNN、Fast R-CNN、Faster R-CNN、R-FCN、SPP-Net

onestage:

  • 无RP,直接在网络中提取特征预测物体类别和位置
  • 流程:特征提取、分类/定位回归
  • 常见算法:YOLO v1-YOLOv3、OverFeat、SSD、RetinaNet

onestage核心理念:

端到端的目标检测,经过一个CNN即可得到最终的检测结果(创新点)

端到端指的是整个系统的输入和输出通过一个统一的模型直接连接,无需中间步骤

核心:通过在原图密集抽样产生大量boundingbox(边界框),在进行分类和回归

YOLOv1

如何使用卷积进行目标检测的呢?三步

  • 卷积提取特征
  • 对特征图分类预测得到分类信息
  • 使用特征图进行物体位置检测得到bbox边界框坐标

模块1

在经过卷积后得到7x7x30的矩阵,7x7代表划分的网格数,30为2x5+20,2个框、5个结果、20个类别

卷积最后一层会输出SXS的特征图,映射到原始图像,原始图像就会被分成SXS的网格gridcell。如果样本的真实标签GroundTruth落在某个网格,该网格负责预测该物体,网格预测出B个边界框,最终使用和真实标签的IOU较大的框。

IOU:预测框和真实框的交叠率,二者交集/并集,结果为1最佳,

  • 缺点是无交集时永远为0,于是引入GIOU

模块二

NMS非极大值抑制:选取邻域分类数值最高的,抑制低的窗口

置信度:指的是模型对于检测到的目标属于特定类别的确定程度。即模型预测的边界框(bounding box)中确实存在目标的概率。

回归坐标

指的是bbox(预测边界框)的坐标

计算过程

col,row指的是中心坐标的框相对于原坐标的偏移量

训练过程

过程:根据图像的标注框(GroundTruth)与模型输出的7X7X30的预测结果进行比较,计算loss和梯度,反向调整参数

训练样本:一个网格会使用2个bbox回归预测,最终使用IOU(预测框和真实框的交叠率)较大的框检测物体

损失函数 3个:

关于坐标损失中根号作用:用于改善回归中相同距离,小框产生误差更大的问题,即对小框惩罚更重。

缺点

YOLOv5

模型结构

输入端

mosaic数据增强:四张图片进行随机缩放、裁剪、排布之后再拼接

letterbox自适应图片缩放:确保图片缩放时保持长宽比,同时填充空白部分适应模型输入要求

自适应锚框anchor box计算:anchor,用于预测框计算时的参考框,基于此预测只需再参考框上进行精修即可,好处:收敛更快、效果更好

Backbone结构

Focus结构

切片操作。举例演示如将4×4×3的图像切片后变成2×2×12的特征图。如下图左:

CSP

该结构将基础层的特征映射划分为两部分,然后通过跨阶段层次结构将它们合并,在减少了计算量的同时可以保证准确率。在Yolov5s中设计了两种CSP结构,以CSP1_X结构应用于Backbone主干网络,另一种CSP2_X结构则应用于Neck中。

Neck

Prediction

GIOU损失函数

优点

  • 模型推理速度快
  • 可进行实时检测,准确率高
  • 促进了目标检测领域技术更新
  • 促进卷积网络工业化应用的发展

U-Net

图像分割概述

概念:根据灰度、色彩、空间纹理、几何形状等图像将空间分成若干互不相交的区域。这些特征在同一区域表现相似性,不同区域表现明显不同。

方法主要分两种:语义分割、实例分割

图像分割广泛应用于医疗、自动驾驶、地质检测、人像美妆

UNET图像分割

主要成就

核心思想

模型结构

编码-解码,也称作下采样-上采样。可以总结为:收缩路径提取特征,扩张路径恢复像素。 总体上就是**同层跳跃连接的U型结构,**能融合更多的空间和几何信息

编码就是典型的重复结构:卷积--ReLU激活--池化,且每次**下采样都把通道的数量加倍。**这里的下采样由卷积和最大池化实现。

  • 蓝色箭头:卷积,编码的卷积是无填充的3x3,尺寸减2,通道数不变,用于特征提取。解码层的卷积是无填充的3x3,尺寸减2,但通道数减半,用于信息解析。
  • 红色:2x2最大池化操作,步长为2,尺寸减半,用于降低维度
  • 灰色:复制裁剪,裁剪同层压缩路径的特征尺寸使其与当前扩展路径特征尺寸一致,合并,用于信息补充
  • 绿色:2x2转置卷积,尺寸加倍,通道数量减半,用于上采样
  • 青色:无填充的1x1卷积,尺寸不变,通道数为分类数,用于分类

解码是上采样的过程,可以看到,每次卷积通道减小一半(128--64),两次卷积变成原来的1/4,但合并为1/2 :

数据增强方式:

弹性形变,以获得形变不变性。通过模拟图像中可能出现的形变,如拉伸和压缩,来增强训练数据的多样性,从而使模型能够更好地泛化到未见过的形变。

Overlip-tile

处理需要保持输出尺寸与输入尺寸一致,以及需要为边界区域提供上下文信息的场景中。

优势

相关推荐
鳄鱼的眼药水1 小时前
TT100K数据集, YOLO格式, COCO格式
人工智能·python·yolo·yolov5·yolov8
台风天赋1 小时前
Large-Vision-Language-Models-LVLMs--info:deepseek-vl模型
人工智能·深度学习·机器学习·多模态大模型·deepseek
三掌柜6666 小时前
2025三掌柜赠书活动第一期:动手学深度学习(PyTorch版)
人工智能·pytorch·深度学习
唯创知音7 小时前
基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活
人工智能·单片机·物联网·生活·智能家居·语音识别
说私域7 小时前
数字化供应链创新解决方案在零售行业的应用研究——以开源AI智能名片S2B2C商城小程序为例
人工智能·开源·零售
yvestine8 小时前
数据挖掘——支持向量机分类器
人工智能·算法·机器学习·支持向量机·分类·数据挖掘·svm
阿正的梦工坊8 小时前
PyTorch到C++再到 CUDA 的调用链(C++ ATen 层) :以torch._amp_update_scale_调用为例
c++·人工智能·pytorch
三万棵雪松8 小时前
5.系统学习-PyTorch与多层感知机
人工智能·pytorch·学习
AIGC大时代8 小时前
不只是工具:ChatGPT写作在学术中的创新思维与深度思考
人工智能·chatgpt·prompt·aigc·ai写作
陈序缘9 小时前
PyTorch快速入门
人工智能·pytorch·python·深度学习·算法·机器学习