01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
01-什么是机器学习?从零基础到自动驾驶案例全解析
02-从过拟合到强化学习:机器学习核心知识全解析
03-从零精通机器学习:线性回归入门
04-逻辑回归 vs. 线性回归:一文搞懂两者的区别与应用
05-决策树算法全解析:从零基础到Titanic实战,一文搞定机器学习经典模型
06-集成学习与随机森林:从理论到实践的全面解析
07-支持向量机(SVM):从入门到精通的机器学习利器
08-【机器学习】KNN算法入门:从零到电影推荐实战
09-【机器学习】朴素贝叶斯入门:从零到垃圾邮件过滤实战
10-【机器学习】聚类算法全解析:K-Means、层次聚类、DBSCAN在市场细分的应用
11-【机器学习】降维与特征选择全攻略:PCA、LDA与特征选择方法详解
12-【机器学习】手把手教你构建神经网络:从零到手写数字识别实战
13-【机器学习】从零开始学习卷积神经网络(CNN):原理、架构与应用
14-【机器学习】RNN与LSTM全攻略:解锁序列数据的秘密
15-【机器学习】GAN从入门到实战:手把手教你实现生成对抗网络
16-【机器学习】强化学习入门:从零掌握 Agent 到 DQN 核心概念与 Gym 实战
17-【机器学习】AUC、F1分数不再迷茫:图解Scikit-Learn模型评估与选择核心技巧
18-【机器学习】Day 18: 告别盲猜!网格/随机/贝叶斯搜索带你精通超参数调优
19-【机器学习】从零精通特征工程:Kaggle金牌选手都在用的核心技术
20-【机器学习】模型性能差?90%是因为数据没洗干净!(缺失值/异常值/不平衡处理)
21-【机器学习】保姆级教程:7步带你从0到1完成泰坦尼克号生还预测项目
22-【机器学习】框架三巨头:Scikit-Learn vs TensorFlow/Keras vs PyTorch 全方位对比与实战
23-【机器学习】揭秘迁移学习:如何用 ResNet 和 BERT 加速你的 AI 项目?
24-【机器学习】NLP核心技术详解:用Scikit-learn、Gensim和Hugging Face玩转文本处理 (Day 24)
25-【机器学习】解密计算机视觉:CNN、目标检测与图像识别核心技术(Day 25)
欢迎来到机器学习之旅的第25天!今天,我们将深入探索计算机视觉(Computer Vision, CV)这一激动人心的领域。计算机视觉的目标是让机器能够像人类一样“看懂”图像和视频。从人脸识别、自动驾驶到医疗影像分析,CV 技术已渗透到我们生活的方方面面。本文将系统梳理计算机视觉的核心技术,包括图像基础、关键的卷积神经网络(CNN)及其经典架构,并介绍主要的 CV 任务(如图像分类、目标检测、图像分割)及其代表性算法。无论您是刚接触 CV 的新手,还是希望系统巩固知识的进阶者,相信本文都能为您带来价值。让我们一起揭开机器“看见”世界的奥秘!
在计算机视觉中,图像是信息的载体。理解图像的基本表示方式并对其进行有效的预处理,是后续所有高级任务的基础。
计算机将图像理解为像素的集合。每个像素都有一个或多个数值来表示其颜色和强度。
不同的颜色空间提供了不同的方式来表示颜色信息。
最简单的图像表示,每个像素只有一个值(通常0-255),表示从黑到白的灰度强度。适合不依赖颜色信息的场景。
最常用的彩色模型,每个像素由红 (Red)、绿 (Green)、蓝 (Blue) 三个通道的值组成。每个通道的值域通常也是 0-255。这是显示器和相机常用的模式。
将颜色表示为色调 (Hue)、饱和度 (Saturation) 和亮度 (Value/Lightness)。这种表示方式更符合人类对颜色的感知,有时在特定任务(如颜色分割)中更有优势。
图像由像素矩阵构成,分辨率(如 1920x1080)表示图像的宽度和高度包含的像素数量。分辨率越高,图像细节越丰富,但计算量也越大。
深度学习模型通常需要大量的标注数据才能达到良好性能。数据增强(Data Augmentation)是一种通过对现有训练图像进行各种变换来人工增加训练样本数量和多样性的技术,能有效提高模型的泛化能力,防止过拟合。
水平翻转或垂直翻转图像。对于很多物体(如猫、狗),水平翻转后的图像仍然是有效的。
将图像随机旋转一定角度。
放大或缩小图像尺寸。
随机从图像中裁剪出一部分,或先填充再裁剪(如 RandomResizedCrop)。
在水平或垂直方向上移动图像的一部分。
改变图像的整体明暗程度。
改变图像明暗区域的差异程度。
改变图像颜色的鲜艳程度。
轻微改变图像的颜色倾向。
[示例图:展示同一张图片经过不同数据增强(旋转、亮度调整、裁剪)后的效果]
代码示例 (使用 TensorFlow/Keras)
import tensorflow as tf
from tensorflow.keras.layers.experimental import preprocessing
# 创建数据增强层
data_augmentation_layers = tf.keras.Sequential([
preprocessing.RandomFlip("horizontal"),
preprocessing.RandomRotation(0.1), # 旋转角度范围 +/- 10%
preprocessing.RandomZoom(0.1), # 缩放范围 +/- 10%
preprocessing.RandomContrast(0.1), # 对比度调整范围 +/- 10%
])
# 假设 'image' 是一个 (height, width, 3) 的 Tensor
# 在训练时应用增强
# augmented_image = data_augmentation_layers(image, training=True)
卷积神经网络(Convolutional Neural Networks, CNNs)是计算机视觉领域取得巨大成功的关键。它借鉴了生物视觉皮层的机制,通过特定的结构有效提取图像的空间层次特征。
卷积层是 CNN 的核心。它通过使用称为“卷积核”或“滤波器”的小窗口在输入图像(或特征图)上滑动来工作。
在输入图像的边界周围添加额外的像素(通常是0),可以控制输出特征图的空间尺寸。常用的有 ‘valid’(不填充,输出会缩小)和 ‘same’(填充使得输出尺寸与输入尺寸相同,需配合合适的步长)。
卷积核每次滑动的像素数。步长大于1可以减小输出特征图的尺寸。
池化层通常紧跟在卷积层之后,用于降低特征图的空间维度(下采样),减少计算量,并提高模型的鲁棒性(对微小位移不敏感)。
在池化窗口内选取最大值作为输出。它能保留最显著的特征。
计算池化窗口内所有值的平均值作为输出。它能保留更平滑的背景信息。
输入特征图: 池化窗口 1: | 1 5 | --> 输出: 5
| 2 3 |
池化窗口 2: | 6 8 | --> 输出: 8
| 4 7 |
输出特征图: | 5 8 |
| ? ? | (取决于后续窗口)
池化操作显著减小了特征图的尺寸(这里从 4x? 变成了 2x?)。激活函数为神经网络引入非线性,使得网络能够学习和表示更复杂的模式。没有激活函数,多层神经网络本质上等同于一个单层线性模型。
最常用的激活函数之一。其公式为: f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)。
Sigmoid ( f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1) 和 Tanh ( f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=ex+e−xex−e−x) 在早期的网络中使用较多,但在深层网络中易引发梯度消失。Leaky ReLU、Parametric ReLU (PReLU)、ELU 等是 ReLU 的变种,旨在解决“神经元死亡”问题。
了解经典 CNN 架构的演进,有助于理解深度学习在 CV 领域的发展脉络和设计思想。
提出者:Kaiming He 等 (Microsoft Research)。
贡献:解决了极深网络训练中的“梯度消失/爆炸”和“网络退化”(Degradation)问题,使得构建数百甚至上千层的网络成为可能。在 ImageNet 竞赛中再次取得突破。
核心思想:引入“残差块”(Residual Block)。通过“快捷连接”(Shortcut Connection 或 Skip Connection),将输入直接加到卷积层的输出上,使得网络更容易学习恒等映射(即输入等于输出),从而保护了梯度。学习目标从学习 H(x) 变为学习残差 F(x) = H(x) - x。
O u t p u t = A c t i v a t i o n ( F ( x ) + x ) Output = Activation(F(x) + x) Output=Activation(F(x)+x)
可视化残差块
计算机视觉涵盖了多种任务,让机器从不同层面理解图像内容。
目标检测是 CV 中非常重要且应用广泛的任务。主流算法大致分为两类:
先生成候选区域(Region Proposals),再对这些区域进行分类和边界框回归。精度通常较高,但速度相对较慢。
直接在整个图像上预测边界框和类别概率,无需生成候选区域。速度快,适合实时应用。
现代深度学习框架(如 TensorFlow/Keras, PyTorch)使得加载和使用在大规模数据集(如 ImageNet)上预训练好的模型变得非常简单。这被称为迁移学习(Transfer Learning),可以让我们用较少的数据和计算资源快速实现不错的 CV 效果。
假设我们需要一个程序,能够识别用户上传图片中的主要物体是什么。
以下代码演示如何加载预训练的 ResNet50 模型,并用它来识别一张图片。
import tensorflow as tf
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input, decode_predictions
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt # 用于显示图片
# 1. 加载预训练的 ResNet50 模型 (在 ImageNet 上训练)
# include_top=True 表示包含顶部的全连接分类层
model = ResNet50(weights='imagenet', include_top=True)
# 打印模型结构 (可选)
# model.summary()
# 2. 加载并预处理图像
img_path = 'your_image.jpg' # <--- 替换为你自己的图片路径
img = image.load_img(img_path, target_size=(224, 224)) # ResNet50 需要 224x224 的输入
# 将图像转换为 NumPy 数组
x = image.img_to_array(img)
# 增加一个维度,使其符合模型的输入格式 (batch_size, height, width, channels)
x = np.expand_dims(x, axis=0)
# 对图像进行 ResNet50 特定的预处理 (例如,颜色通道转换,均值归一化等)
x = preprocess_input(x)
# 3. 使用模型进行预测
predictions = model.predict(x)
# 4. 解码预测结果
# decode_predictions 会将预测的概率向量转换为人类可读的标签 (ImageNet 类别)
# top=3 表示显示概率最高的 3 个预测结果
decoded_preds = decode_predictions(predictions, top=3)[0]
print('Predicted:')
for i, (imagenet_id, label, score) in enumerate(decoded_preds):
print(f"{i+1}: {label} ({score*100:.2f}%)")
# 5. (可选) 显示图片和预测结果
plt.imshow(img)
plt.title(f"Top prediction: {decoded_preds[0][1]} ({decoded_preds[0][2]*100:.2f}%)")
plt.axis('off')
plt.show()
代码注释:已在代码中添加关键行注释。
运行前准备:
pip install tensorflow
pip install matplotlib
'your_image.jpg'
。预期效果:程序将输出对图片内容的预测结果(如 ‘golden_retriever’, ‘laptop’, ‘traffic_light’)及对应的置信度分数,并可能显示带有最高预测结果标题的图片。
类似地,可以使用 PyTorch Hub 或 torchvision.models
加载预训练模型,步骤类似:加载模型 -> 加载图像 -> 预处理 -> 预测 -> 解码。目标检测也可以用类似方式加载预训练的 YOLOv5 (来自 Ultralytics) 或 Faster R-CNN (来自 torchvision) 模型进行推理。
今天我们深入探讨了计算机视觉的核心技术,回顾一下关键知识点:
计算机视觉是一个充满活力且快速发展的领域。掌握这些核心技术是进入 CV 世界的钥匙。