AI-For-Beginners 计算机视觉模块全解:从 OpenCV 图像处理到卷积网络、迁移学习与目标检测

原创2026-10-09 22:33:361,657 阅读
文章标签:教程人工智能机器学习深度学习计算机视觉NLP

AI-For-Beginners 计算机视觉模块全解:从 OpenCV 图像处理到卷积网络、迁移学习与目标检测

本篇文章系统梳理开源课程 AI-For-Beginners 中第 4 部分「Computer Vision」模块(lessons/4-ComputerVision/)的完整学习路线。该模块由 7 个递进式单元组成,覆盖图像处理的工程基础、卷积神经网络原理、迁移学习实战、自监督与生成模型,以及目标检测与语义分割两大核心任务。读完本文,你将掌握这套课程中每一个单元的定位、核心概念、可运行的 Notebook 与代码位置,并理解各技术点背后的数学与工程动机,可以直接按章节顺序在本地复现全部实验。

模块总览:7 个单元构成的计算机视觉主干

计算机视觉(Computer Vision)是让计算机获得对数字图像高层理解的一门学科,其应用覆盖目标检测、事件检测、图像文字描述、3D 场景重建等任务。在 AI-For-Beginners 课程中,这一章节被组织为 7 个循序渐进的单元,正好对应仓库 lessons/4-ComputerVision/ 下的 7 个目录:

单元 目录 主题
1 06-IntroCV 计算机视觉与 OpenCV 入门
2 07-ConvNets 卷积神经网络
3 08-TransferLearning 预训练网络与迁移学习
4 09-Autoencoders 自编码器
5 10-GANs 生成对抗网络
6 11-ObjectDetection 目标检测
7 12-Segmentation 语义分割

整个模块的教学逻辑非常清晰:先掌握传统图像处理工具(OpenCV),再进入 CNN 这一视觉任务的基础架构,随后用迁移学习降低训练成本,用自编码器与 GAN 探索无监督与生成式方向,最后在检测与分割两大任务上完成从"分类整图"到"定位像素"的能力跃迁。课程同时为 PyTorch 与 TensorFlow 两套框架提供了平行 Notebook,适合按偏好选择技术栈学习。

单元一:OpenCV 与图像处理基础(06-IntroCV)

为什么先学 OpenCV

在把图像送入神经网络之前,通常值得先用算法技术对图像做增强与预处理。课程指出,图像分类是计算机视觉最简单的任务之一,而很多分类前的问题——如降噪、透视矫正、运动检测——用传统图像处理手段解决反而更高效。Python 生态中有多个图像处理库:imageio 负责读写多种格式并支持 ffmpeg 帧转换;Pillow(PIL) 支持图像变形、调色板调整等操作;OpenCV 是用 C++ 编写的事实标准图像处理库,提供了便捷的 Python 接口;dlib 则实现了包括人脸与面部关键点检测在内的多种机器学习算法。

用 NumPy 数组加载与显示图像

在 Python 中图像天然可以用 NumPy 数组表示:320×200 像素的灰度图存储为 200×320 的二维数组,彩色图则为 200×320×3(对应 RGB 三个通道)。课程给出了最基础的加载与展示代码:

import cv2
import matplotlib.pyplot as plt

im = cv2.imread('image.jpeg')
plt.imshow(im)

这里有一个极易踩坑的细节:OpenCV 传统上使用 BGR(蓝-绿-红) 编码,而 Python 其他工具普遍使用 RGB,因此直接显示会颜色错乱。需要通过交换数组维度或调用 OpenCV 函数完成转换:

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

同一个 cvtColor 函数还能完成灰度、HSV(色相-饱和度-明度)等其他色彩空间变换。此外 OpenCV 支持逐帧加载视频,课程在 OpenCV.ipynb 中给出了完整示例。

送入神经网络前的预处理手段

在将图像交给神经网络之前,通常需要若干预处理步骤,课程总结了 OpenCV 中最常用的几类操作:

  • 缩放:im = cv2.resize(im, (320, 200), interpolation=cv2.INTER_LANCZOS),其中 INTER_LANCZOS 是高质量插值算法,适合缩小场景;
  • 模糊:cv2.medianBlur(im, 3)(中值模糊,去椒盐噪声效果好)或 cv2.GaussianBlur(im, (3, 3), 0)(高斯模糊,平滑过渡更自然);
  • 亮度与对比度调整:可直接通过 NumPy 数组运算实现;
  • 阈值化:调用 cv2.threshold / cv2.adaptiveThreshold,通常比直接调亮度对比度更有效;
  • 几何变换:仿射变换(已知图中 3 个点的源/目标位置,可组合旋转、缩放、倾斜,保持平行线平行);透视变换(已知 4 个点的位置,典型场景是用手机斜拍长方形文档后矫正为规整矩形图像);
  • 光流(Optical Flow):理解图像内部的运动,用于运动检测等任务。

三个实战示例:盲文、帧差与光流

课程用三个贴近真实场景的例子展示 OpenCV 的价值,全部可以在 OpenCV.ipynb 中复现:

  1. 盲文书照片预处理:综合运用阈值化、特征检测、透视变换与 NumPy 操作,把单个盲文符号分离出来,供后续神经网络分类。过程前后对比见 braille-result.png 与 braille-symbols.png。
  2. 基于帧差的视频运动检测:固定摄像头拍摄时,相邻帧几乎相同;由于帧是数组,直接相减得到像素差,静止画面差值低,一旦出现明显运动差值就升高。效果见 frame-difference.png。
  3. 基于光流的运动检测:光流用于理解视频帧上每个像素的移动方式,分两种——稠密光流为每个像素计算运动向量场;稀疏光流则先取图像中的显著特征(如边缘),再逐帧追踪其轨迹,见 optical.png。

课程在文末还布置了挑战任务:用光流从一段包含简单手势的视频中提取上/下/左/右运动方向,参考图像见 palm-movement.png。这个单元传达的核心观点是:像运动检测、指尖检测这类"看似复杂"的任务,有时仅靠纯计算机视觉技术就能解决,因此掌握 OpenCV 的基础能力非常值得。

单元二:卷积神经网络(07-ConvNets)

从全连接到卷积:模式与位置解耦

之前的课程已经证明,即使是单层感知机也能以不错的精度识别 MNIST 手写数字,但这源于 MNIST 数据集非常"特殊"——所有数字都居中摆放。真实场景中我们希望无论目标位于图像何处都能识别它。课程点出关键差异:寻找目标时我们是在扫描图像、寻找特定的模式及其组合。例如找猫时先找构成胡须的水平线,再通过胡须的组合判断"这是猫",重要的是这些模式的相对位置与存在性,而非精确坐标。

卷积滤波器与可学习特征

为了提取模式,课程引入卷积滤波器概念。图像本质是二维矩阵或带颜色深度的三维张量,应用滤波器就是用较小的**滤波器核(kernel)**矩阵,对原图每个像素与邻域点做加权平均——如同一个小窗口滑过整幅图像。以 3×3 垂直边缘滤波器与水平边缘滤波器作用于 MNIST 数字,原始图像的竖直/水平边缘处会得到高响应,filter-vert.png 与 filter-horiz.png 直观展示了这一效果。Leung-Malik 滤波器组(见 lmfilters.jpg)展示了如何手工设计一组滤波器去查找纹理等底层模式。

CNN 的核心思想是:不必手工设计滤波器,而是把网络结构设计成滤波器在训练中自动学习,并且把同样的模式提取方法应用到高层特征上,形成从底层像素组合到高层部件组合的特征层级。课程引用 Hislop-Lynch 的论文图 FeatureExtractionCNN.png 说明这种层级化特征提取结构。

金字塔架构与经典网络

用于图像处理的 CNN 大多遵循金字塔架构:首层卷积层通常只有较少数量的滤波器(8–16 个),对应水平/垂直线条等像素组合;越往深层,空间维度下降、滤波器数量上升,对应更丰富的特征组合。以 VGG-16 为例,它在 2014 年 ImageNet top-5 分类上达到 92.7% 准确率,其层结构见 vgg-16-arch1.jpg 与 vgg-16-arch.jpg。

在 CNN_Architectures.md 中,课程还深入介绍了其他经典架构:

  • ResNet:微软研究院 2015 年提出,核心是残差块(resnet-block.png),让网络层预测"上一层结果与残差块输出的差值",这种恒等直通设计大幅降低了深层网络的训练难度,常见变体有 ResNet-50/101/152;
  • Google Inception:把每一层构建成多条不同路径的组合(inception.png),其中 1×1 卷积的作用是把输入通道用可训练权重混合起来,可视为在通道维上的降采样;
  • MobileNet:面向移动设备的轻量模型,基于深度可分离卷积,把卷积分解为空间卷积与通道维 1×1 卷积的组合,大幅减少参数。

配套代码:PyTorch 与 TensorFlow 的辅助模块

课程为两个框架分别提供了隐藏实现细节的辅助脚本,方便学习者在 Notebook 中直接调用:

  • pytorchcv.py:提供 load_mnist(batch_size=64) 加载 MNIST 并构造 DataLoader;train_epoch / validate / train / train_long 完成训练与验证循环(默认采用 torch.optim.Adam 优化器与 nn.NLLLoss 损失);plot_convolution 用 3×3 卷积核可视化滤波效果;common_transform() 封装了 ImageNet 标准的 256 缩放 + 224 中心裁剪 + Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 预处理管线;load_cats_dogs_dataset() 解压并清洗猫狗数据集(自动剔除损坏图片,划分为 2 万训练样本);
  • tfcv.py:提供等价的 plot_convolution(内部用 tf.nn.conv2d 做卷积演示)、plot_results、display_dataset,以及基于 keras.preprocessing.image_dataset_from_directory 的 load_cats_dogs_dataset(batch_size=64),采用 0.2 验证集划分、224×224 图像尺寸。

配套练习 Notebook 为 ConvNetsPyTorch.ipynb 与 ConvNetsTF.ipynb,练习目标是在比 MNIST 更复杂的猫狗品种数据集上(高维、10 余个类别)实现分类。

单元三:预训练网络与迁移学习(08-TransferLearning)

迁移学习为什么有效

训练 CNN 非常耗时且需要海量数据,但其中大量时间其实花在学习底层的通用滤波器上。课程提出自然疑问:能否把在一个数据集上训练好的网络,直接适配到另一个图像分类任务,而无需完整训练?这就是迁移学习:从一个预训练模型(通常在 ImageNet 这类大规模数据集上训练)起步,利用其已经能很好地从通用图像中提取特征的能力,只需在提取出的特征之上构建分类器,往往就能获得不错的结果。

预训练模型充当特征提取器

前文介绍的卷积网络包含多层,每一层负责提取从底层像素组合到高层部件组合的特征。只要在足够大且多样的数据集上训练,网络就能学会提取这些通用特征。Keras 与 PyTorch 都提供了一键加载常见架构预训练权重的函数,课程推荐的三个候选:

  • VGG-16 / VGG-19:相对简单仍能保持较高精度,适合作为迁移学习的首次尝试;
  • ResNet:2015 年微软研究院提出的模型族,层数更多、资源消耗更大;
  • MobileNet:模型更小,适合资源受限的移动端,可以牺牲少量精度。

features.png 展示了 VGG-16 从一张猫图中提取出的部分特征。课程选用的实战数据集是微软的 Cats and Dogs(猫狗图片集),非常贴近真实分类场景,练习 Notebook 为 TransferLearningPyTorch.ipynb 与 TransferLearningTF.ipynb。

可视化"理想猫"与对抗样本

预训练网络的"大脑"里装着理想猫、理想狗、理想斑马等模式。课程介绍了一种可视化思路:从随机图像出发,用梯度下降优化不断调整图像,直到网络认为它是猫(ideal-cat-loop.png)。但如果直接这样做,得到的几乎是一团随机噪声——因为"让网络认为输入是猫"的方式太多,且很多在视觉上毫无意义。解决办法是在损失函数中加上变分损失(variation loss)——衡量相邻像素相似度的指标,最小化它可以让图像更平滑、去除噪声,从而浮现出更美观的模式(ideal-cat.png 与 ideal-zebra.png)。

同样的思路还能用于对抗攻击(adversarial attacks):取一张被识别为狗的图像,用梯度下降微调,直到网络把它分类成猫——original-dog.png 与 adversarial-dog.png 展示了这一过程,完整代码见 AdversarialCat_TF.ipynb。

配套进阶资料:TrainingTricks.md

TrainingTricks.md 是这一单元的拓展阅读,系统总结了让深层网络训练更高效的技术:数值范围控制(把输入缩放到 -1..1] 或 [0..1]);权重初始化策略(如 uniform、N(0,1/n)、保证输入输出同分布的 N(0,1/√n_in)、Xavier 初始化 glorot);批归一化(Batch Normalization)——在权重之后、激活函数之前基于小批量统计做归一化;Dropout——训练中随机置零一定比例(通常 10%–50%)的神经元,课程用 [Dropout.ipynb 演示其对 MNIST 训练速度与精度的提升;防过拟合手段(早停、权重衰减/正则化、模型平均、Dropout);优化器选型(SGD、Momentum SGD、Adagrad、RMSProp、Adam——课程明确建议不确定时首选 Adam);梯度裁剪与学习率衰减等。迁移学习单元的课后作业是使用牛津-IIIT 宠物数据集(35 个猫狗品种)构建迁移学习分类器。

单元四:自编码器与变分自编码器(09-Autoencoders)

自监督学习与编码器-解码器结构

训练 CNN 的一大痛点是需要大量标注数据,而图像分类需要人工将图片分到不同类别。课程引出自监督学习:用未标注的原始数据训练 CNN 特征提取器,把训练图像同时作为网络输入和输出。自编码器的核心结构是:编码器网络把输入图像压缩到某种潜空间(latent space)(通常是一个尺寸更小的向量),再由解码器网络重建原始图像。网络被迫从输入中尽可能多地捕获关键信息以便准确重建,从而学到最好的**嵌入(embedding)**表示,架构示意见 autoencoder_schema.jpg。

四大应用场景

虽然"重建原图"本身看似无用,自编码器在四类场景中尤其有价值:

  1. 降维与训练图像嵌入:通常比 PCA 效果更好,因为它利用了图像的空间特性与层级特征;
  2. 去噪:噪声携带大量无用信息,无法全部塞进较小的潜空间,因此网络只捕获重要部分。训练时以原始图像为目标、加入人工噪声的图像为输入;
  3. 超分辨率:以低分辨率图作为输入,以高分辨率图作为目标;
  4. 生成模型:训练完成后,解码器部分可基于随机潜向量生成新对象。

变分自编码器(VAE)

传统自编码器的潜向量往往缺乏语义——例如在 MNIST 上,相近的潜向量不一定对应同一个数字。为了训练生成模型,需要对潜空间有更好的理解,于是引入变分自编码器(VAE)。VAE 学习潜参数的统计分布(潜分布):例如希望潜向量服从以 z_mean 为均值、z_sigma 为标准差的正态分布。其工作流程为:

  • 从输入向量预测 z_mean 和 z_log_sigma(预测标准差的对数而非标准差本身);
  • 从分布 N(z_mean, exp(z_log_sigma)) 中采样一个向量 sample;
  • 解码器用 sample 作为输入向量重建原始图像(示意图见 vae.png)。

VAE 的损失函数由两部分构成:重建损失(如 MSE,衡量重建图与目标的接近程度,与普通自编码器相同)与 KL 损失(基于 Kullback-Leibler 散度,保证潜变量分布接近正态分布)。VAE 的一个重要优势是能较容易地生成新图像,因为我们知道该从哪个分布采样潜向量。课程用 MNIST 上训练的 2D 潜向量 VAE 演示了连续变化潜向量分量得到不同数字的效果(vaemnist.png 与其 2D 空间可视化 vaemnist-diag.png),可以清楚看到图像彼此平滑过渡。

课程还总结了自编码器的三个性质:数据特定(只对训练过的图像类型效果好,例如用花训练的超分辨率网络对人像效果不佳);有损(重建图与原始图不完全相同,损失性质由训练时的损失函数决定);可工作在未标注数据上。练习 Notebook 为 AutoencodersTF.ipynb 与 AutoEncodersPyTorch.ipynb,课后作业即完成 TF 版本 Notebook 末尾的任务。

单元五:生成对抗网络(10-GANs)

生成器与判别器的对抗博弈

上一单元已经提到生成模型(VAE 是典型例子),但如果要生成真正有意义、分辨率合理的内容(如一幅画),VAE 的训练往往难以收敛。课程因此引入专门面向生成模型的架构——生成对抗网络(GAN)。其核心思想是让两个神经网络互相训练对抗(gan_architecture.png):

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

判别器的结构与普通图像分类网络无异,最简单可为全连接分类器,更常见的是卷积网络——基于卷积网络的 GAN 被称为 DCGAN。CNN 判别器由若干"卷积+池化"(空间尺寸递减)层、一到多个全连接层(得到特征向量)以及最终二分类器组成。

生成器则可以视为"反向的判别器":从潜向量(替代特征向量)出发,经过全连接层转换到所需尺寸/形状,再通过反卷积+上采样逐步生成图像,这与自编码器的解码器部分类似。细节结构见 gan_arch_detail.png。

两阶段训练流程

GAN 之所以被称为"对抗",是因为生成器与判别器之间存在持续竞争,双方都在竞争中提升。训练分两个阶段:

  1. 训练判别器:用生成器生成一批图像标为 0(伪造),从输入数据集取一批图像标为 1(真实),计算判别器损失并反向传播;
  2. 训练生成器:因为没有直接已知的期望输出,将"生成器+判别器"整体串联,输入随机向量,期望输出为 1(对应真实图像),冻结判别器参数(本步不希望它被训练),执行反向传播。

理想情况下,两个网络的损失都不会显著下降,而是相互振荡,对应双方性能同步提升。练习 Notebook 为 GANTF.ipynb 与 GANPyTorch.ipynb。

GAN 训练的典型难题

GAN 以难以训练著称,课程列出了四个常见问题与对策:

  • 模式坍缩(Mode Collapse):生成器学会了生成某一张能骗过判别器的图,而不是多样的图像;
  • 超参数敏感:常常看起来完全不收敛,忽然调低学习率后开始收敛;
  • 生成器与判别器失衡:很多情况下判别器损失很快降到 0,导致生成器无法继续训练。对策是给两者设置不同学习率,或在损失过低时跳过判别器训练;
  • 高分辨率训练:与自编码器类似的问题,重建过多卷积层会带来伪影,通常用**渐进式增长(progressive growing)**解决——先在低分辨率图上训练前几层,再逐步"解锁"或添加层。

风格迁移(Style Transfer)

GAN 之外,另一种生成艺术图像的有趣技术是风格迁移:取一张内容图像,应用风格图像的滤镜重新绘制。实现思路是:从随机噪声图(或内容图)出发,通过两个损失函数约束目标图像——内容损失(基于 CNN 在若干层从当前图与内容图提取特征的差异)与风格损失(用 Gram 矩阵巧妙计算当前图与风格图的差异,细节见 StyleTransfer.ipynb);再引入变分损失使图像平滑去噪;主优化循环用梯度下降最小化三者加权和。课后作业是用自己的图像重跑风格迁移 Notebook。

单元六:目标检测(11-ObjectDetection)

从分类到定位:朴素方案与回归方案

此前所有分类模型输入一张图、输出一个类别标签。但很多场景不仅要知道图中有目标,还要确定其精确位置,这就是目标检测(示例见 Screen_Shot_2016-11-17_at_11.14.54_AM.png)。最朴素的思路是:把图片切成若干块 → 对每块做图像分类 → 激活值足够高的块即认为包含目标(naive-detection.png)。但这种方法只能非常粗略地定位边界框,更精确的定位需要运行某种回归来预测边界框坐标,这需要专门的数据集。

常用数据集包括:PASCAL VOC(20 类)与 COCO(Common Objects in Context)(80 类,含边界框与分割掩码,示例见 coco-examples.jpg)。

评估指标:IoU、AP 与 mAP

目标检测既要衡量类别正确性,也要衡量边界框定位精度,因此需要专门指标:

  • 交并比(Intersection over Union, IoU):两个框(或任意两个区域)重叠程度的度量,等于交集面积除以并集面积(公式见 iou_equation.png)。完全相同的区域 IoU 为 1,完全不相交为 0,通常只考虑 IoU 超过某阈值的边界框;
  • 平均精度(Average Precision, AP):考察 Precision-Recall 曲线随检测阈值(0 到 1)的变化,AP 即曲线下的面积。更精确地说,Recall 轴通常划分为 10 份,对每个点求 Precision 后取平均:

AP=111∑i=010Precision(Recall=i10)AP = \frac{1}{11}\sum_{i=0}^{10}\text{Precision}\left(\text{Recall}=\frac{i}{10}\right)

  • AP 与 IoU 的结合:只考虑 IoU 超过阈值的检测。PASCAL VOC 通常假设 IoU 阈值 = 0.5,而 COCO 在不同 IoU 阈值下分别测量 AP;
  • mAP(Mean Average Precision):目标检测的主指标,即 AP 在所有类别(有时还在所有 IoU 阈值)上的平均值。

两大算法流派

目标检测算法大体分为两类:

  1. 区域提议网络(Region Proposal Networks):R-CNN、Fast R-CNN、Faster R-CNN。核心是生成**感兴趣区域(ROI)**再跑 CNN 找最大激活,类似朴素方法但 ROI 生成更聪明。主要缺点是慢,因为需要对图像做多次 CNN 分类。R-CNN 用 Selective Search 生成 ROI 的层级结构,经 CNN 特征提取与 SVM 分类器确定类别、线性回归确定边界框坐标(rcnn1.png、rcnn2.png);Fast R-CNN 在卷积层之后才定义区域(f-rcnn.png);Faster R-CNN 用神经网络(Region Proposal Network)预测 ROI(faster-rcnn.png)。
  2. 单次(One-pass)方法:YOLO、SSD、RetinaNet。网络在单次前向中同时预测类别与 ROI。R-FCN 比 Faster R-CNN 更快,思路是用 ResNet-101 提取特征 → 位置敏感得分图(每个类别的对象被分成 k×k 区域,训练预测对象部件)→ 各区域投票选出最大票数的对象类别(r-fcn.png)。YOLO(You Only Look Once) 是实时单次算法:图像分为 S×S 区域,对每个区域 CNN 预测 n 个可能对象、边界框坐标以及 confidence=probability×IoU(yolo.png)。

配套练习为 ObjectDetection.ipynb,课后作业见 lab。

单元七:语义分割(12-Segmentation)

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

目标检测通过边界框定位对象,但某些任务需要更精确的对象定位——这就是分割。分割可视为像素分类:对图像每一个像素预测其类别(背景也是类别之一)。两种主要算法:

  • 语义分割(Semantic Segmentation):只告诉像素类别,不区分同类别的不同对象;
  • 实例分割(Instance Segmentation):把同一类别进一步划分为不同实例。例如同一张图里的多只羊,对实例分割是不同对象,对语义分割则同属一个类别(对比见 instance_vs_semantic.jpeg)。

编码器-解码器结构与损失函数

分割网络与之前学过的自编码器结构相似,但目标不是重建原图而是重建掩码(mask):编码器从输入图像提取特征,解码器把这些特征转换为掩码图像,其尺寸与原图相同、通道数等于类别数(结构见 segm.png)。

分割的损失函数需要特别说明:经典自编码器用均方误差(MSE)衡量两图相似度,但分割中目标掩码的每个像素代表类别编号(沿第三维 one-hot 编码),因此需用适用于分类的交叉熵损失并对所有像素取平均;若掩码是二值的,则使用二元交叉熵损失(BCE)。

医学影像实战:PH² 数据集

本单元通过医学影像实战展示分割:训练网络识别皮肤镜图像上的人类痣(nevi)。数据源为 PH² 数据库,包含 200 张图像、三个类别(典型痣、非典型痣、黑色素瘤),每张图像都配有勾勒痣轮廓的对应掩码(示例见 navi.png)。目标即训练模型把痣从背景中分割出来。练习 Notebook 为 SemanticSegmentationPytorch.ipynb 与 SemanticSegmentationTF.ipynb。课后作业尝试用 Kaggle 的 Full Body MADS 数据集做人体分割。

模块配套环境与运行方式

整个计算机视觉模块延续课程的 Jupyter Notebook 实践风格,绝大多数内容通过 Notebook 边看边跑。仓库根目录提供了 requirements.txt 与 environment.yml(以及 binder/environment.yml、binder/requirements.txt),可据此搭建 Python 环境;5-NLP 目录下的 requirements-pytorch.txt 与 requirements-tf.txt 则分别对应 PyTorch 与 TensorFlow 两套技术栈。若选择 PyTorch 路线,课程提供的辅助模块 pytorchcv.py 会自动探测 CUDA 可用性并默认使用 GPU 设备(default_device = 'cuda' if torch.cuda.is_available() else 'cpu');若数据尚未下载,load_mnist 与 load_cats_dogs_dataset 都会在本地 data/ 目录自动解压与清洗,可直接开箱体验。

总结:一条完整的计算机视觉学习路径

从 OpenCV 的像素级图像处理,到 CNN 的层级特征提取,再到迁移学习把 ImageNet 预训练能力复用到自定义任务,随后借自编码器理解无监督表征、借 GAN 理解生成式对抗训练,最后在目标检测与语义分割上完成从"识别整图"到"定位像素"的能力升级——AI-For-Beginners 的计算机视觉模块构成了逻辑闭环。每一单元都同时提供 PyTorch 与 TensorFlow 两套平行 Notebook,并附有课后作业与挑战,是进入计算机视觉领域一条结构清晰、可完全本地复现的实践路径。

登录后查看全文
AI-For-Beginners