第1章 计算机视觉基础¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
📚 章节概述¶
本章介绍计算机视觉的基本概念、发展历史、应用场景以及必要的数学基础。通过本章学习,你将对计算机视觉有一个全面的认识,为后续深入学习打下坚实基础。
学习时间:5-7天 难度等级:⭐⭐ 前置知识:Python基础、线性代数基础
🎯 学习目标¶
完成本章后,你将能够: - 理解计算机视觉的定义和重要性 - 了解计算机视觉的发展历史和里程碑 - 掌握计算机视觉的核心任务分类 - 熟悉计算机视觉在各行业的应用场景 - 掌握必要的数学基础知识 - 成功搭建开发环境并运行第一个视觉程序
1.1 计算机视觉概述¶
1.1.1 什么是计算机视觉?¶
定义:计算机视觉(Computer Vision, CV)是一门研究如何使机器"看"的科学,旨在让计算机和系统能够从图像或多维数据中获取高层次理解。
核心问题: - 图像中有什么?(识别) - 它在哪里?(定位) - 它在做什么?(理解) - 将会发生什么?(预测)
与相关领域的关系:
1.1.2 计算机视觉的重要性¶
为什么计算机视觉如此重要?
- 人类感知的数字化:人类70%以上的感知来自视觉,CV让机器具备类似能力
- 海量视觉数据:每天产生数十亿张图像和视频,需要自动化处理
- 广泛的应用场景:从手机到自动驾驶,从医疗到工业
- 商业价值巨大:CV市场规模预计2025年达到500亿美元
CV vs 人类视觉:
| 特性 | 人类视觉 | 计算机视觉 |
|---|---|---|
| 速度 | 快速 | 可以更快 |
| 精度 | 高度准确 | 取决于模型 |
| 疲劳 | 容易疲劳 | 不知疲倦 |
| 成本 | 高(人力) | 低(规模化) |
| 适应性 | 强 | 需要训练 |
1.1.3 计算机视觉的发展历史¶
里程碑事件:
1960s: Larry Roberts的"Block World"
- 第一个CV系统
- 三维物体识别
1970s: David Marr的视觉计算理论
- 建立CV理论框架
- 三层表示理论
1980s: 边缘检测、光流、立体视觉
- 经典算法成熟
- 商业应用起步
1990s: 特征提取(SIFT、HOG)
- 统计学习方法
- 人脸识别应用
2000s: 深度学习兴起
- AlexNet (2012)
- CNN成为主流
2010s: 大规模应用
- 自动驾驶
- 医疗影像
- 智能手机
2020s: 多模态、自监督、大模型
- CLIP、SAM
- 生成式AI
- 边缘AI
关键突破:
- 2012年 - AlexNet
- ImageNet竞赛夺冠
- 深度学习统治CV
-
GPU加速训练
-
2014年 - VGG & GoogLeNet
- 更深的网络
-
Inception架构
-
2015年 - ResNet
- 残差连接
- 解决梯度消失
-
152层网络
-
2017年 - Transformer
- 注意力机制
-
ViT (2020)
-
2023年 - SAM (Segment Anything)
- 通用分割模型
-
零样本能力
-
2023年 - 多模态大模型
- GPT-4V
- 视觉-语言理解
1.1.4 计算机视觉的任务分类¶
按任务层次分类:
低层视觉 (Low-level)
├── 图像增强
├── 去噪
├── 边缘检测
└── 特征提取
中层视觉 (Mid-level)
├── 图像分割
├── 目标检测
├── 运动估计
└── 立体匹配
高层视觉 (High-level)
├── 图像分类
├── 场景理解
├── 行为识别
└── 视觉推理
按输入输出分类:
| 任务类型 | 输入 | 输出 | 典型应用 |
|---|---|---|---|
| 图像分类 | 图像 | 类别标签 | 相机识别、内容审核 |
| 目标检测 | 图像 | 边界框+类别 | 自动驾驶、安防监控 |
| 语义分割 | 图像 | 像素级标签 | 医疗影像、自动驾驶 |
| 实例分割 | 图像 | 实例掩码+类别 | 工业检测、AR/VR |
| 图像生成 | 文本/噪声 | 图像 | 创意设计、数据增强 |
| 风格迁移 | 内容图+风格图 | 风格化图像 | 艺术创作、滤镜 |
| 图像超分 | 低分图像 | 高分图像 | 医疗影像、老照片修复 |
| 视频分析 | 视频 | 动作/事件 | 安防、体育分析 |
1.2 计算机视觉的应用场景¶
1.2.1 消费电子¶
智能手机应用: - 人脸解锁 - 美颜滤镜 - 智能相册(自动分类、搜索) - AR相机(贴纸、特效) - 文字识别(OCR)
示例代码:人脸检测:
import cv2
import numpy as np
# 加载预训练的人脸检测模型
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
# 读取图像
image = cv2.imread('face.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30)
)
# 绘制检测结果
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2.2 自动驾驶¶
核心CV任务: - 车道线检测 - 交通标志识别 - 行人/车辆检测 - 深度估计 - 语义分割
技术栈:
挑战: - 实时性要求(<100ms) - 复杂场景(天气、光照) - 安全性要求(零容忍) - 边缘计算限制
1.2.3 医疗影像¶
应用场景: - CT/MRI分析:肿瘤检测、器官分割 - X光片诊断:肺炎、骨折检测 - 病理图像:细胞分类、癌症筛查 - 眼科影像:视网膜疾病诊断
案例:COVID-19诊断:
import torch
import torch.nn as nn
from torchvision import models, transforms
from PIL import Image
# 加载预训练的ResNet模型
model = models.resnet50(weights=models.ResNet50_Weights.DEFAULT)
model.fc = nn.Linear(model.fc.in_features, 2) # 二分类:COVID/正常
# 图像预处理
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
# 预测
image = Image.open('xray.jpg')
input_tensor = transform(image).unsqueeze(0) # unsqueeze增加一个维度
output = model(input_tensor)
prediction = torch.argmax(output, dim=1).item() # 将单元素张量转为Python数值
print(f"诊断结果: {'COVID-19' if prediction == 1 else '正常'}")
1.2.4 安防监控¶
应用场景: - 人脸识别(门禁、考勤) - 行为分析(异常检测) - 人流统计 - 车牌识别 - 视频摘要
技术挑战: - 大规模数据(百万级人脸库) - 实时处理(多路视频流) - 隐私保护 - 抗干扰(光照、遮挡)
1.2.5 工业制造¶
应用场景: - 缺陷检测:表面缺陷、装配错误 - 尺寸测量:精密测量、质量控制 - 机器人视觉:抓取、装配、焊接 - 3D检测:深度测量、形状分析
案例:PCB缺陷检测:
import cv2
import numpy as np
def detect_defects(image):
"""检测PCB板缺陷"""
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 二值化
_, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
# 形态学操作
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
# 边缘检测
edges = cv2.Canny(opening, 50, 150)
# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
defects = []
for contour in contours:
area = cv2.contourArea(contour)
if area > 100: # 阈值过滤
x, y, w, h = cv2.boundingRect(contour)
defects.append((x, y, w, h))
return defects
# 使用
image = cv2.imread('pcb.jpg')
defects = detect_defects(image)
print(f"检测到 {len(defects)} 个缺陷")
1.2.6 电商零售¶
应用场景: - 商品识别(拍照购物) - 虚拟试衣 - 智能推荐 - 库存管理 - 无人零售
1.2.7 文娱创意¶
应用场景: - 滤镜特效:美颜、风格化 - 内容生成:AI绘画、视频生成 - 游戏:姿态估计、表情识别 - 影视制作:特效、后期处理
1.3 数学基础¶
1.3.1 线性代数¶
向量和矩阵:
图像本质上是矩阵:
矩阵运算:
import numpy as np
# 图像表示
image = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)
# 矩阵乘法(卷积的基础)
A = np.array([[1, 2], [3, 4]]) # np.array创建NumPy数组
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B) # 或 A @ B
# 特征值和特征向量(PCA的基础)
eigenvalues, eigenvectors = np.linalg.eig(A) # np.linalg线性代数运算
重要概念: - 卷积:图像滤波的核心操作 - 特征值分解:PCA、SVD的基础 - 矩阵求导:反向传播的基础
1.3.2 概率论与统计¶
概率分布:
import numpy as np
from scipy.stats import norm
# 高斯分布(噪声模型)
mu, sigma = 0, 1
x = np.linspace(-3, 3, 100)
pdf = norm.pdf(x, mu, sigma)
# 添加高斯噪声
image = np.random.randint(0, 256, (100, 100), dtype=np.uint8)
noise = np.random.normal(0, 25, image.shape).astype(np.uint8)
noisy_image = cv2.add(image, noise)
贝叶斯定理:
最大似然估计:模型训练的核心思想
1.3.3 微积分¶
导数和梯度:
import sympy as sp
# 符号计算
x = sp.symbols('x')
f = x**2 + 2*x + 1
df_dx = sp.diff(f, x) # 求导
print(df_dx) # 2*x + 2
# 数值梯度
def numerical_gradient(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h)
链式法则:反向传播的核心
1.3.4 优化理论¶
梯度下降:
def gradient_descent(f, df, x0, learning_rate=0.01, max_iter=1000):
"""梯度下降算法"""
x = x0
for i in range(max_iter):
gradient = df(x)
x = x - learning_rate * gradient
return x
# 示例:最小化 f(x) = x^2
f = lambda x: x**2 # lambda匿名函数
df = lambda x: 2*x
x_opt = gradient_descent(f, df, x0=10)
print(f"最优解: {x_opt}") # 接近0
优化方法: - SGD(随机梯度下降) - Adam(自适应学习率) - RMSprop
1.4 开发环境搭建¶
1.4.1 Python环境配置¶
步骤1:安装Anaconda
步骤2:创建虚拟环境
# 创建环境
conda create -n cv python=3.9
# 激活环境
conda activate cv # Linux/Mac
# 或
activate cv # Windows
1.4.2 核心库安装¶
OpenCV:
NumPy:
深度学习框架(二选一):
PyTorch(推荐):
# CPU版本
pip install torch torchvision torchaudio
# GPU版本(CUDA 11.7)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117
TensorFlow:
可视化工具:
1.4.3 开发工具¶
Jupyter Lab:
VS Code: - 安装Python扩展 - 安装Jupyter扩展 - 配置代码格式化(Black)
1.4.4 第一个CV程序¶
Hello World:读取和显示图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 方法1:使用OpenCV
def opencv_example():
# 读取图像
image = cv2.imread('example.jpg')
# 检查是否成功
if image is None:
print("无法读取图像")
return
# 显示图像信息
print(f"图像尺寸: {image.shape}")
print(f"数据类型: {image.dtype}")
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 方法2:使用Matplotlib
def matplotlib_example():
# 读取图像(OpenCV读取是BGR,需要转换为RGB)
image = cv2.imread('example.jpg')
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 显示图像
plt.figure(figsize=(10, 8))
plt.imshow(image_rgb)
plt.axis('off')
plt.title('First CV Image')
plt.show()
# 运行
if __name__ == '__main__':
opencv_example()
matplotlib_example()
运行结果:
1.5 实战案例:图像基本信息分析¶
案例描述¶
创建一个工具,分析图像的基本信息,包括尺寸、通道、像素分布等。
完整代码¶
import cv2
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
class ImageAnalyzer:
"""图像分析工具类"""
def __init__(self, image_path):
self.image_path = image_path
self.image = None
self.gray_image = None
self.load_image()
def load_image(self):
"""加载图像"""
self.image = cv2.imread(self.image_path)
if self.image is None:
raise ValueError(f"无法加载图像: {self.image_path}")
self.gray_image = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)
def get_basic_info(self):
"""获取基本信息"""
height, width, channels = self.image.shape
total_pixels = height * width
info = {
'文件路径': self.image_path,
'图像尺寸': f"{width}x{height}",
'通道数': channels,
'总像素数': total_pixels,
'数据类型': str(self.image.dtype),
'文件大小': f"{Path(self.image_path).stat().st_size / 1024:.2f} KB"
}
return info
def get_color_distribution(self):
"""获取颜色分布"""
colors = ['B', 'G', 'R']
distributions = {}
for i, color in enumerate(colors): # enumerate同时获取索引和元素
hist = cv2.calcHist([self.image], [i], None, [256], [0, 256])
distributions[color] = hist.flatten()
return distributions
def get_statistics(self):
"""获取统计信息"""
stats = {
'亮度均值': np.mean(self.gray_image),
'亮度标准差': np.std(self.gray_image),
'亮度最小值': np.min(self.gray_image),
'亮度最大值': np.max(self.gray_image),
'亮度中位数': np.median(self.gray_image)
}
return stats
def visualize_info(self):
"""可视化信息"""
fig, axes = plt.subplots(2, 2, figsize=(15, 12))
# 原始图像
image_rgb = cv2.cvtColor(self.image, cv2.COLOR_BGR2RGB)
axes[0, 0].imshow(image_rgb)
axes[0, 0].set_title('原始图像')
axes[0, 0].axis('off')
# 灰度图像
axes[0, 1].imshow(self.gray_image, cmap='gray')
axes[0, 1].set_title('灰度图像')
axes[0, 1].axis('off')
# 颜色直方图
colors = ['b', 'g', 'r']
for i, color in enumerate(colors):
hist = cv2.calcHist([self.image], [i], None, [256], [0, 256])
axes[1, 0].plot(hist, color=color, label=f'{color.upper()}通道')
axes[1, 0].set_title('颜色直方图')
axes[1, 0].set_xlabel('像素值')
axes[1, 0].set_ylabel('像素数量')
axes[1, 0].legend()
# 灰度直方图
axes[1, 1].hist(self.gray_image.ravel(), bins=256, color='gray')
axes[1, 1].set_title('灰度直方图')
axes[1, 1].set_xlabel('像素值')
axes[1, 1].set_ylabel('像素数量')
plt.tight_layout()
plt.savefig('image_analysis.png', dpi=300, bbox_inches='tight')
plt.show()
def generate_report(self):
"""生成分析报告"""
print("=" * 50)
print("图像分析报告")
print("=" * 50)
# 基本信息
print("\n【基本信息】")
basic_info = self.get_basic_info()
for key, value in basic_info.items():
print(f"{key}: {value}")
# 统计信息
print("\n【统计信息】")
stats = self.get_statistics()
for key, value in stats.items():
print(f"{key}: {value:.2f}")
print("\n【可视化】")
print("已生成图像分析可视化: image_analysis.png")
print("\n" + "=" * 50)
# 使用示例
if __name__ == '__main__':
# 创建测试图像
test_image = np.random.randint(0, 256, (480, 640, 3), dtype=np.uint8)
cv2.imwrite('test_image.jpg', test_image)
# 分析图像
analyzer = ImageAnalyzer('test_image.jpg')
analyzer.generate_report()
analyzer.visualize_info()
1.6 练习题¶
基础题¶
- 简答题:
- 什么是计算机视觉?它与图像处理有什么区别?
计算机视觉是让机器从图像/视频中"理解"内容并提取高层语义信息的学科。图像处理侧重于图像到图像的变换(如去噪、增强),输出仍是图像;计算机视觉侧重于图像到语义的理解,输出是分类、检测等决策结果。
-
列举计算机视觉的三个主要应用场景。
①自动驾驶(车道检测、障碍物识别);②医学影像分析(病灶检测、辅助诊断);③安防监控(人脸识别、异常行为检测)。
-
选择题:
-
以下哪项不是计算机视觉的任务? a) 图像分类 b) 目标检测 c) 数据库管理 d) 图像分割
答案:c) 数据库管理。图像分类、目标检测、图像分割都是CV核心任务,数据库管理属于数据管理领域。
-
计算题:
- 一张分辨率为1920×1080的RGB图像,每个像素8位,计算其文件大小(未压缩)。
文件大小 = 1920 × 1080 × 3(通道)× 1(字节/通道)= 6,220,800 字节 ≈ 5.93 MB。
进阶题¶
- 编程题:
-
编写一个Python程序,读取图像并显示其R、G、B三个通道的图像。
-
思考题:
- 为什么深度学习在计算机视觉领域取得了巨大成功?
主要原因:①大规模标注数据集(如ImageNet)的出现;②GPU等硬件算力的提升;③深度网络能自动学习层次化特征(从低层边缘到高层语义),避免了手工设计特征的局限;④端到端训练大幅简化流程。
- 计算机视觉面临的主要挑战是什么?
主要挑战:①数据标注成本高且存在长尾分布;②模型泛化能力有限,域迁移困难;③实时性要求与模型复杂度矛盾;④模型可解释性不足(黑盒问题);⑤对抗攻击下的鲁棒性问题。
挑战题¶
- 项目题:
- 实现一个简单的图像浏览器,支持缩放、旋转等基本操作。
1.7 面试准备¶
大厂面试题¶
Q1: 什么是计算机视觉?它与图像处理有什么区别?
参考答案: - 计算机视觉:让机器"理解"图像内容,提取高层语义信息 - 图像处理:对图像进行变换和增强,改善视觉效果 - 区别: - 图像处理:输入图像→输出图像(低层) - 计算机视觉:输入图像→输出理解/决策(高层)
Q2: 计算机视觉的主要任务有哪些?
参考答案: - 图像分类:识别图像中的主要对象 - 目标检测:定位和识别图像中的多个对象 - 语义分割:像素级别的分类 - 实例分割:区分同一类别的不同实例 - 图像生成:从文本或噪声生成图像 - 视频分析:动作识别、目标跟踪
Q3: 你认为计算机视觉面临的最大挑战是什么?
参考答案: - 数据问题:标注成本高、数据不平衡 - 泛化能力:模型在新场景下的表现 - 实时性:复杂模型的推理速度 - 可解释性:深度学习的黑盒特性 - 鲁棒性:对抗攻击、噪声干扰
Q4: 介绍一下你熟悉的计算机视觉项目
参考答案模板:
算法题¶
LeetCode相关题目: - 旋转图像(48) - 图像平滑器(661) - 转置矩阵(867)
系统设计题¶
设计一个实时视频监控系统
关键点: - 架构设计(边缘计算 vs 云端) - 模型选择(速度 vs 精度) - 数据流处理 - 异常检测 - 告警机制
1.8 本章小结¶
核心知识点¶
- 计算机视觉定义:让机器"看"的科学
- 发展历史:从传统算法到深度学习
- 任务分类:低层、中层、高层视觉
- 应用场景:消费电子、自动驾驶、医疗、安防等
- 数学基础:线性代数、概率论、微积分、优化
- 开发环境:Python、OpenCV、PyTorch/TensorFlow
下一步¶
完成本章后,你应该: - [ ] 理解计算机视觉的基本概念 - [ ] 了解CV的应用场景 - [ ] 搭建好开发环境 - [ ] 运行第一个CV程序 - [ ] 完成图像分析实战案例
下一章:02-图像处理基础.md - 学习图像处理的基本操作
1.9 扩展阅读¶
推荐论文¶
- AlexNet (2012): "ImageNet Classification with Deep Convolutional Neural Networks"
- VGG (2014): "Very Deep Convolutional Networks for Large-Scale Image Recognition"
- ResNet (2015): "Deep Residual Learning for Image Recognition"
推荐书籍¶
- 《Computer Vision: Algorithms and Applications》- Richard Szeliski
- 《Deep Learning》- Ian Goodfellow(第5章)
在线资源¶
- CS231n - Stanford计算机视觉课程
- OpenCV官方文档 - https://docs.opencv.org/
- Papers with Code - https://paperswithcode.com/
恭喜完成第1章! 🎉
你已经迈出了计算机视觉学习的第一步。继续加油!