☰
AI-For-Beginners 计算机视觉课程全指南:从 OpenCV 图像处理到 CNN、迁移学习与生成模型
2026/10/2 15:55:55 网站建设 项目流程
  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

本指南系统梳理 AI-For-Beginners 课程第 4 模块"计算机视觉(Computer Vision)"的完整知识脉络。你将掌握计算机视觉任务的定义与分类、OpenCV 图像预处理工具箱、卷积神经网络(CNN)的原理与经典架构、迁移学习实战方法,以及自编码器、GAN、目标检测与语义分割等进阶技术,并了解如何通过仓库中的 Notebook 练习逐一动手验证。阅读本文后,你可以按章节顺序走通一条从像素级处理到图像级理解、再到像素级重建与生成的学习路线。

注:本模块在仓库中同时维护英文原版(lessons/4-ComputerVision/README.md)与保加利亚语翻译版(translations/bg/lessons/4-ComputerVision/README.md),下文链接以翻译版路径为主,练习 Notebook 与扩展文档同时给出英文原版路径。

模块总览:本模块的七个核心主题

计算机视觉模块共包含 7 个渐进式课程,每节课均配有课前/课后测验、Notebook 练习、挑战任务与实验作业:

  1. 计算机视觉与 OpenCV 入门——图像读取、预处理与运动检测;
  2. 卷积神经网络——可学习的卷积滤波器与金字塔式特征提取;
  3. 预训练网络与迁移学习——用 ImageNet 预训练模型快速构建分类器;
  4. 自编码器——无监督特征学习、去噪与变分自编码器(VAE);
  5. 生成对抗网络——生成器与判别器的对抗训练;
  6. 目标检测——从 R-CNN 到 YOLO 的定位技术;
  7. 语义分割——像素级分类与医学影像应用。

第一课:计算机视觉与 OpenCV 入门

什么是计算机视觉

计算机视觉是一门让计算机对数字图像获得高层理解的学科。"理解"一词含义很广,包括在图像中寻找物体(目标检测)、理解正在发生的事件(事件检测)、用文本描述图像,乃至在三维空间重建场景。与人像相关的特殊任务还包括年龄与情绪估计、人脸检测与识别、3D 姿态估计等。本模块中,最简单的入门任务是图像分类,而现代计算机视觉任务大多由神经网络求解,本模块后续将深入讲解专用于视觉任务的卷积神经网络。

在把图像送入神经网络之前,多数场景下值得先用算法技术对图像做增强与预处理,因此掌握图像处理库是打好基础的第一步。

Python 图像处理库选型

课程推荐了四个常用 Python 图像处理库,各有侧重:

  • imageio:用于读写多种图像格式,并支持 ffmpeg,可方便地把视频帧批量转换为图像;
  • Pillow(PIL):功能更强,支持变形(morphing)、调色板调整等操作;
  • OpenCV:用 C++ 编写的高性能图像处理库,已成为图像处理的事实标准,提供便捷的 Python 接口;
  • dlib:C++ 机器学习库,实现了若干计算机视觉算法(含人脸与人脸关键点检测),同样有 Python 接口。

用 OpenCV 加载图像:NumPy 数组与 BGR/RGB

在 Python 中,图像天然可以用 NumPy 数组表示:320×200 像素的灰度图像对应 200×320 的数组;同尺寸彩色图像对应 200×320×3(三个颜色通道)。加载图像的基本代码如下:

import cv2 import matplotlib.pyplot as plt im = cv2.imread('image.jpeg') plt.imshow(im)

一个必须注意的坑是:OpenCV 传统上使用BGR(蓝-绿-红)编码,而 Python 生态其他工具使用RGB(红-绿-蓝)。若直接显示,颜色会偏蓝/偏红,需要通过 NumPy 维度交换或调用 OpenCV 函数转换到 RGB 色彩空间:

im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)

同一个cvtColor函数还可以执行其他色彩空间变换,例如转灰度图或 HSV(色调-饱和度-明度)空间。此外,OpenCV 还支持逐帧加载视频,对应示例见练习 Notebook OpenCV.ipynb(英文原版)。

图像预处理操作清单

将图像喂给神经网络前,常用的 OpenCV 预处理手段包括:

  • 缩放:im = cv2.resize(im, (320,200), interpolation=cv2.INTER_LANCZOS);
  • 模糊/降噪:im = cv2.medianBlur(im,3)或im = cv2.GaussianBlur(im,(3,3),0);
  • 亮度与对比度调整:直接通过 NumPy 数组运算完成;
  • 阈值化:调用cv2.threshold/cv2.adaptiveThreshold,通常比直接调亮度/对比度更有效;
  • 几何变换:
    • 仿射变换(Affine):当已知图像中三个点的源位置与目标位置时,可组合旋转、缩放与倾斜,且保持平行线平行;
    • 透视变换(Perspective):当已知图像中四个点的源与目标位置时适用。典型场景是用手机斜拍矩形文档后,矫正为矩形文档图;
  • 光流(Optical Flow):用于理解图像内部物体的运动。

三个实战案例

在 OpenCV.ipynb 中,课程演示了三个"仅靠传统视觉技术"即可完成的任务:

  1. 盲文书籍照片的预处理:通过阈值化、特征检测、透视变换与 NumPy 操作,把单个盲文符号分离出来,供后续神经网络分类,是"图像处理 + 深度学习"流水线的经典范例;
  2. 基于帧差的视频运动检测:固定摄像机下相邻帧应高度相似,帧本身即数组,将相邻两帧相减即得像素差——静态画面差值低,画面中出现明显运动时差值升高;
  3. 基于光流的运动检测:光流可以解释视频帧中每个像素如何移动。稠密光流为每个像素计算运动矢量场;稀疏光流则选取图像中的显著特征(如边缘),逐帧构建其运动轨迹。

课程总结指出:运动检测、指尖检测这类看似复杂的任务,有时可以纯粹由计算机视觉技术解决,因此熟悉 OpenCV 的基础能力非常重要。本课配套实验作业(lab/README.md)要求你录制一段简单手势视频,利用光流提取上/下/左/右移动方向。

第二课:卷积神经网络

为什么要用卷积滤波器

MNIST 手写数字集相对特殊——所有数字都居中显示,使分类任务偏简单。真实场景要求我们能在图像任意位置识别物体。计算机视觉的做法是扫描图像、寻找特定的模式(pattern)及其组合:例如找猫时先找可能构成胡须的水平线条,再由胡须组合判断这是猫的照片。关键点在于模式的相对位置与有无是重要的,而绝对位置不重要。

为此引入卷积滤波器概念。图像是 2D 矩阵或带色彩深度的 3D 张量,应用滤波器即用一小块矩阵(滤波核)滑过整幅图像,对每个像素及其邻域计算加权平均。例如 3×3 的垂直/水平边缘滤波器作用于 MNIST 数字时,会高亮图像中的垂直/水平边缘位置,相当于在"搜索"边缘。同理可以设计各种滤波器搜索其他低级模式(如 Leung-Malik 滤波器组)。

CNN 的三大核心思想

  1. 卷积滤波器可以提取模式;
  2. 可以设计网络让滤波器自动学习(而不必手工设计);
  3. 同样的思路可以用于在高层特征中寻找模式,而不限于原始图像——因此 CNN 的特征提取建立在特征层级之上:从低级的像素组合,逐层上升到图像局部的高级组合。这与自编码器的分层思想一脉相承。

金字塔式架构与 VGG-16

用于图像处理的大多数 CNN 遵循金字塔式架构:作用于原始图像的第一个卷积层通常只有 8~16 个滤波器,对应水平/垂直线条、笔画等像素组合;随着层级加深,空间维度逐步缩小、滤波器数量逐步增加,对应更多简单特征的组合方式。

课程以 VGG-16 为例:该网络 2014 年在 ImageNet 分类任务(Top-5)上达到 92.7% 的准确率。VGG-16 直观展示了"空间变小、通道变多"的金字塔结构(架构插图见7-ConvNets 课程目录内的vgg-16-arch系列图片)。更完整的经典架构梳理见扩展文档 CNN_Architectures.md。配套练习 Notebook 覆盖 PyTorch 与 TensorFlow 两个生态(ConvNetsPyTorch.ipynb、ConvNetsTF.ipynb),用于亲手验证可学习滤波器与 CNN 的训练过程。

第三课:预训练网络与迁移学习

迁移学习:复用已学到的低级特征

训练 CNN 耗时且需要海量数据,但其中大量时间花在学习提取图像模式的低级滤波器上。自然的问题是:能否复用在一个数据集上训练好的网络,不经完整训练就适配另一类图像的分类任务?这就是迁移学习——把知识从一个模型"迁移"到另一个模型。

典型做法是以在ImageNet等大规模数据集上预训练的模型为起点。这类模型已经能提取通用图像的多种特征,很多场景下仅在提取出的特征之上构建分类器即可取得不错效果。

预训练模型作为特征提取器

卷积网络包含多层结构,每一层提取特定层级的特征——从低级像素组合到眼睛、鼻子之类的高层特征组合。只要 CNN 在足够大且多样的图像集上训练,就能学会提取这些通用特征。

Keras 与 PyTorch 都内置了常见架构预训练权重的加载接口(多数在 ImageNet 上训练)。课程推荐的三类模型(详见 CNN_Architectures.md):

  • VGG-16 / VGG-19:相对简单的模型,准确率良好,适合作为迁移学习初体验;
  • ResNet:微软研究院 2015 年提出的模型家族,层数更多、资源消耗更大;
  • MobileNet:为移动设备优化的轻量模型家族,资源受限时可牺牲少量精度换取速度。

课程以微软 Cats and Dogs(猫狗)数据集为实例,该场景非常接近真实图像分类任务。配套练习见 TransferLearningPyTorch.ipynb 与 TransferLearningTF.ipynb。

可视化"理想猫"与对抗攻击

预训练网络内部保存着各种模式,包括"理想猫""理想狗""理想斑马"的表示。直接可视化并不容易——模式散布在网络权重中且呈层次化组织。

一种思路是从随机图像出发,用梯度下降优化不断调整图像,直至网络认为它是猫。但直接优化会得到类似随机噪声的结果:让网络判定为猫的方式太多,其中不少在视觉上毫无意义。为改善结果,可在损失函数中加入变分损失(variation loss)——度量相邻像素相似度的指标,最小化它会让图像更平滑、去除噪声,从而露出更符合视觉的模式(结果示例见课程中的"理想猫/理想斑马"对比图)。

同样的思路反向使用,就得到针对神经网络的对抗攻击:取一张被网络正确识别为狗的照片,通过梯度下降做微小扰动,直到网络将其分类为猫(对照示例见课程中的 original-dog 与 adversarial-dog 对比图)。完整可复现代码在 AdversarialCat_TF.ipynb。

课程强调:迁移学习能快速构建高准确率分类器,但更复杂的任务需要更大算力,难以在 CPU 上轻松完成。进一步的训练技巧见 TrainingTricks.md。本课实验作业(lab/README.md)使用 Oxford-IIIT Pets 真实数据集(35 种猫狗品种),用迁移学习构建分类器。

第四课:自编码器

用无标签数据做自监督学习

CNN 训练常受困于需要大量标注数据——图像分类需要人工把图片分成各类别。而自监督学习允许使用原始(无标签)数据训练特征提取器:不依赖标签,而是把训练图像同时作为网络的输入与输出。自编码器的核心思想即由编码器网络把输入图像映射到某个潜空间(通常是维度更小的向量),再由解码器网络重建出原始图像。因为训练目标是尽可能多地捕捉原始信息以精确重建,网络会努力学到能表达输入图像含义的最佳嵌入。

自编码器的四类应用场景

  • 降维与图像嵌入:通常优于 PCA,因为它考虑了图像的空间性质与层级特征,可用于可视化;
  • 去噪:噪声含大量冗余信息,无法被挤进较小的潜空间,因此自编码器只保留图像的关键部分。训练时以原始图像为输出、人工加噪图像为输入;
  • 超分辨率:以高分辨率图像为输出、低分辨率版本为输入,提升图像分辨率;
  • 生成模型:训练完成后,解码器部分可从随机潜向量出发生成新对象。

变分自编码器(VAE)

传统自编码器的潜向量往往缺乏语义:以 MNIST 为例,很难说清哪个潜向量对应哪个数字,相邻潜向量未必对应同类数字。为训练生成式模型,最好对潜空间有结构化的理解,由此引入VAE。

VAE 学习预测潜参数的统计分布(潜分布)。例如希望潜向量服从均值 z_mean、标准差 z_sigma 的正态分布(两者都是 d 维向量)。VAE 训练要点:

  1. 从输入向量预测z_mean与z_log_sigma(预测对数标准差而非标准差本身);
  2. 从分布 N(z_mean, exp(z_log_sigma)) 中采样得到sample;
  3. 解码器用sample作为输入向量重建原始图像。

VAE 的损失函数由两部分构成:

  • 重建损失:衡量重建图像与目标的接近程度(如均方误差 MSE),与普通自编码器相同;
  • KL 损失:基于 KL 散度(衡量两个统计分布相似度的指标),保证潜变量分布始终接近正态分布。

VAE 的一大优势是容易生成新图像,因为已知该从哪个分布采样潜向量。若在 MNIST 上训练 2D 潜向量的 VAE,通过改变潜向量分量可得到不同数字,且潜空间中的图像会平滑过渡——课程提供vaemnist与vaemnist-diag两张示例图直观展示这一性质。

自编码器的三条性质

  • 数据特异性:只在训练过的图像类型上表现良好(如用花训练的超分辨率网络不适用于人像);
  • 有损:重建图像不等于原始图像,损失程度由训练所用损失函数决定;
  • 可用无标签数据训练。

配套练习见 AutoencodersTF.ipynb(TensorFlow)与 AutoEncodersPyTorch.ipynb(PyTorch);TensorFlow 版 Notebook 末尾还附有家庭作业式挑战任务。有趣的是,自编码器同样可用于音乐领域(如 Magenta 的 MusicVAE 项目,本课挑战环节提及)。

第五课:生成对抗网络

GAN 的基本架构

上一课的 VAE 是生成模型的好例子,但若用它生成真正有意义的、分辨率合理的画作,训练往往难以收敛。为此需要专为生成任务设计的另一类架构——生成对抗网络(GAN),其核心是让两个神经网络互相博弈地训练:

  • 生成器(Generator):接收随机向量,输出一张图像;
  • 判别器(Discriminator):接收图像,判定它是训练集中的真实图像还是生成器伪造的图像——本质是一个图像分类器。

判别器的架构与普通图像分类网络无异,最简单可退化为全连接分类器,通常则是卷积网络(基于卷积网络的 GAN 即DCGAN)。卷积判别器由若干"卷积+池化"层(空间尺寸逐层缩小)、一个或多个全连接层(得到特征向量)以及最终二分类器组成。

生成器则类似"倒置的判别器":从潜向量出发,经全连接层变换到所需尺寸/形状,再经反卷积与上采样逐步放大——与自编码器的解码部分如出一辙。由于卷积层本质是滑过图像的线性滤波器,反卷积在实现上可复用卷积层的逻辑。

对抗训练的两阶段流程

GAN 之所以叫"对抗",是因为生成器与判别器持续竞争、彼此促进,网络由此逐步学会生成更好的图像。训练分两个阶段:

  1. 训练判别器:用生成器产出一批图像并标记为 0(假图),从输入数据集取一批图像标记为 1(真图),计算判别器损失并反向传播;
  2. 训练生成器:由于生成器没有直接的期望输出,需将整个 GAN 网络(生成器后接判别器)作为整体,输入随机向量并期望输出为 1(真图),此时冻结判别器参数(此阶段不希望更新它),再进行反向传播。

训练过程中生成器与判别器的损失不会持续下降,理想情况下应呈振荡状态——这正是双方能力同步提升的标志。

GAN 训练的常见难题

GAN 以难以训练著称,课程列举了四类典型问题:

  • 模式崩塌(Mode Collapse):生成器学会了产出一种能骗过判别器的"成功图像",而放弃了多样化的输出;
  • 对超参数敏感:常常出现 GAN 完全不收敛、而将学习率略微调低后突然收敛的现象;
  • 生成器/判别器失衡:判别器损失可能很快降到 0,使生成器无法继续学习;对策是为两者设置不同的学习率,或在判别器损失已过低时跳过对它的训练;
  • 高分辨率训练困难:与自编码器问题相似,反卷积重建太多层会产生伪影,通常用渐进式增长解决(先在低分辨率图像上训练少量层,再逐步"解锁"或添加层);另一方案是给层间增加额外连接、同时训练多个分辨率(如 Multi-Scale Gradient GANs 的思路)。

配套练习见 GANTF.ipynb(TensorFlow/Keras)与 GANPyTorch.ipynb(PyTorch)。

风格迁移(Style Transfer)

除 GAN 外,另一种生成艺术图像的技术是风格迁移:取一张内容图像,用风格图像的滤镜为其"重绘"。实现要点:

  1. 从随机噪声图像(或内容图像)出发;
  2. 目标图像同时接近内容图与风格图,由两个损失函数定义:内容损失基于 CNN 在若干层从当前图像与内容图提取的特征计算;风格损失用 Gram 矩阵在当前图与风格图之间计算;
  3. 加入变分损失让图像更平滑、去噪(计算相邻像素的平均距离);
  4. 主优化循环用梯度下降(或其他优化算法)最小化三者加权和的总损失。

完整示例见 StyleTransfer.ipynb,本课挑战环节要求用它处理自己的图片。

第六课:目标检测

从分类到定位:朴素方法及其局限

此前的图像分类模型输出的是类别结果(如 MNIST 的"数字类别"),而很多时候我们不仅要知道图中有物体,还要确定物体的精确位置——这就是目标检测。

最朴素的想法:把图片切成许多小块 → 对每块做图像分类 → 激活足够高的块视为包含目标。该方法的局限是定位边界框很不精确;要精确定位必须引入回归来预测边界框坐标,这需要专门的数据集支持。

目标检测数据集与评估指标

常用数据集包括:

  • PASCAL VOC:20 个类别;
  • COCO(Common Objects in Context):80 个类别,提供边界框与分割掩码。

评估需要同时衡量类别正确性与边界框定位精度,核心指标有:

  • IoU(Intersection over Union,交并比):两框(或两任意区域)的交集面积除以并集面积。完全相同为 1,完全不相交为 0,否则介于 0~1。通常只考虑 IoU 超过阈值的检测框;
  • 平均精度(Average Precision, AP):考察某类别 C 的检测质量,计算 Precision-Recall 曲线下的面积。更精确地说,把召回轴等分为 10 段,对全部采样点平均精度:

$$ AP = \frac{1}{11}\sum_{i=0}^{10}\mbox{Precision}(\mbox{Recall}=\frac{i}{10}) $$

  • AP 与 IoU 的组合:只统计 IoU 超过阈值的检测。PASCAL VOC 惯例取 IoU 阈值 0.5,而 COCO 的 AP 会对多个 IoU 阈值分别测量;
  • mAP(Mean Average Precision,平均平均精度):目标检测的主指标,即对所有类别(有时还包括 IoU 阈值)求 AP 的平均值。

两大算法流派

目标检测算法分为两类:

  1. 基于区域提议(Region Proposal)的系列:R-CNN、Fast R-CNN、Faster R-CNN。核心是生成 ROI(感兴趣区域),再对其执行 CNN 搜索最大激活——思路类似朴素方法,但 ROI 的生成更巧妙。主要缺点是慢,因为需要分类器在图像上做多次前向推断;
  2. 单次(One-Shot)方法:YOLO、SSD、RetinaNet。网络设计为单次前向即同时预测类别与 ROI。

具体算法演进如下:

  • R-CNN:用 Selective Search 生成层级化的 ROI 结构,经 CNN 特征提取器与 SVM 分类器判定物体类别,再用线性回归确定边界框坐标;
  • Fast R-CNN:与 R-CNN 类似,但区域是在卷积层之后确定的,显著减少重复计算;
  • Faster R-CNN:用神经网络(区域提议网络,RPN)直接预测 ROI,取代 Selective Search;
  • R-FCN(全卷积区域网络):比 Faster R-CNN 更快。先用 ResNet-101 提取特征,再用 Position-Sensitive Score Map 处理:把 C 类每个物体分成 k×k 区域,训练网络预测物体各部分,最终由所有 k×k 区域子网投票选出得分最高的类别;
  • YOLO(You Only Look Once):实时单次检测算法。将图像分成 S×S 网格,每个区域由 CNN 预测 n 个候选物体、边界框坐标与置信度(confidence = probability × IoU);
  • 其他:RetinaNet(重点处理类别不平衡)与SSD(Single Shot Detector)同属单次方法。

课程配套练习 Notebook 为 ObjectDetection.ipynb(含 TensorFlow 版 ObjectDetection-TF.ipynb),实验作业(lab/README.md)供进一步实践。

第七课:语义分割

像素级分类:语义分割与实例分割

目标检测用边界框定位物体,但某些任务需要更精细的定位,即分割。分割可视为像素级分类:为图像的每一个像素预测其类别(背景也是类别之一)。两类主流算法:

  • 语义分割:只判定像素类别,不区分同一类别中的不同物体(如画面中所有羊都是同一个"羊"类);
  • 实例分割:把同一类别再拆分为独立实例(每只羊各是一个对象)。

编码器-解码器结构

各种分割网络虽架构不同,但总体结构与自编码器类似——差别在于解码器重建的不是原始图像,而是掩码(mask)。因此分割网络由两部分组成:

  • 编码器:从输入图像提取特征;
  • 解码器:把特征转换为与输入同尺寸、通道数等于类别数的掩码图像。

分割的损失函数选择

这一点尤为关键:经典自编码器用均方误差(MSE)衡量两图相似度,而分割中目标掩码的每个像素是类别编号(沿第三维 one-hot 编码),必须改用分类专用的损失——对所有像素平均的交叉熵;若是二值掩码,则用二值交叉熵(BCE)。

医学影像实战:皮肤痣分割

本课将分割应用于医学影像:训练网络识别皮肤镜图像中的人类痣(nevus)。数据来自 PH² 数据库,含 200 张图像、三个类别(典型痣、非典型痣、黑色素瘤),每张图还配有勾勒痣轮廓的掩码。训练目标即把每个痣从背景中分割出来——这类技术对医学影像特别适用。

配套练习覆盖两个生态:SemanticSegmentationPytorch.ipynb 与 SemanticSegmentationTF.ipynb。本课实验作业(lab/README.md)进一步扩展到人体分割任务。分割的延伸方向还包括骨架检测与姿态检测(挑战环节建议尝试 OpenPose 类工具)。

学习路线与仓库资源导航

建议按课程顺序推进:先以 OpenCV 打牢图像处理基础,再理解 CNN 如何把"手动设计滤波器"升级为"自动学习滤波器",随后借助迁移学习快速获得实用分类器,最后依次掌握自编码器、GAN、目标检测与分割这些生成式与定位式技术。

核心仓库资源一览:

  • 模块总览:lessons/4-ComputerVision/README.md(英文原版)、translations/bg/lessons/4-ComputerVision/README.md(保加利亚语版);
  • 每课练习 Notebook 位于各自课程目录(如 06-IntroCV 的OpenCV.ipynb、07-ConvNets 的 PyTorch/TensorFlow 双版本、08-TransferLearning 的迁移学习与对抗攻击 Notebook、10-GANs 的 GAN 与风格迁移 Notebook 等);
  • 扩展阅读:CNN_Architectures.md(经典架构梳理)、TrainingTricks.md(训练技巧);
  • 实验作业:各课程的lab/README.md均给出独立的动手项目。

本模块的最终结论非常明确:从像素处理到图像理解,再到像素级重建与生成,计算机视觉的技术栈层次分明;而每层能力都可以通过本仓库提供的 Notebook 一步步亲手验证——这正是 AI-For-Beginners"24 节课、AI for All"设计理念在视觉方向上的完整落地。

  • 教程
  • 人工智能
  • 机器学习
  • 深度学习

【免费下载链接】AI-For-Beginners

12 Weeks, 24 Lessons, AI for All!

项目地址:https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners
点击查看免费下载

相关推荐

上一篇:一条命令把整个网站完整搬回本地:WebSite-Downloader 整站下载指南
下一篇:免费整站下载:如何用 WebSite-Downloader 把整个网站完整装进本地

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询