计算机视觉应用 · 互动课堂

同济大学 · 智慧建造与低碳环境大类 · 《人工智能科学与技术》教研组

① 概览:让机器学会“看”

计算机视觉(Computer Vision,CV)是一种让机器通过摄像头、传感器等设备获取并理解图像或视频的技术。 一句话概括:用机器代替人眼来做测量和判断。 本课程聚焦它在土木工程——隧道病害检测、桥梁监测、钢结构缺陷识别——中的应用。

1.1 引例:人眼检测 vs 机器视觉

设想你是一名隧道结构工程师,需要对一段 3 km 的盾构隧道进行全表面病害排查(渗漏水、裂缝、剥落)。两种方案:

方案 A:人工巡检
  • 2 名工程师,每天巡检约 300 m
  • 需 10 个工作日,约 160 工时
  • 易疲劳、主观差异大;夜班作业有安全风险
  • 记录靠纸笔或拍照,病害量化难统一
方案 B:图像采集车 + 计算机视觉
  • 巡检车以 5 km/h 通过,拍摄 2 h 完成
  • CV 算法自动识别、分类、量化各类病害
  • 结果可入库,逐年对比病害发展
  • 难点:复杂背景(管线、拼缝)、相似纹理(渗漏 vs 剥落)

本课程要解答的核心问题:这套自动识别系统是如何工作的?

1.2 计算机视觉发展历史

五个关键阶段 · 点击查看里程碑
1960s
数字图像处理
1970s
学科形成
1980s
工业视觉
1990s
统计学习
2012—
深度学习
点击上方任意阶段查看详情

1.3 CV 的四大任务(也是本课主线)

任务 1图像分类

输入一张图,回答“这是什么”。
例:这张混凝土表面图属于“裂缝/渗漏水/剥落/正常”中的哪一类?

任务 2目标检测

回答“什么在哪里”,用矩形框(Bounding Box)框出位置。
例:图中有 3 处裂缝、2 处渗漏水,各自在哪。

任务 3语义分割

每个像素做分类。
例:把裂缝区域所有像素涂红,背景涂黑——可直接量算裂缝面积、走向。

任务 4实例分割

语义分割 + 区分同类的不同个体。
例:图中 3 条独立裂缝分别用 3 种掩码标识,可分别统计每条裂缝长度。

1.4 本课导览(3 课时)

课时主题核心内容
课时 1CV 基础图像表示 · 数字化 · 预处理 · 边缘检测
课时 2特征提取与图像分类颜色/纹理/形状特征 · kNN/SVM/RF · CNN(LeNet→ResNet)
课时 3检测、分割与应用YOLO vs R-CNN · IoU/NMS · 语义/实例分割 · 土木案例

② 图像基础知识

所有 CV 算法的起点是一张图像。在写第一行算法之前,必须先理解: 一张图在计算机里到底是什么?它从模拟世界来到内存中经历了哪几步?

2.1 图像采集 · 从光到电

计算机视觉的第一步是采集:通过摄像头、红外传感器、激光扫描仪等把外界光信号转为电信号。

设备类型波段典型土木场景
可见光相机380—780 nm桥梁外观、隧道衬砌表面拍摄
红外热像仪3—14 μm检测建筑外墙空鼓、桥面板脱空(温差成像)
紫外相机10—400 nm高压输电线电晕放电检测
激光扫描仪(LiDAR)隧道断面收敛监测、桥梁变形
InSAR 卫星微波地表沉降、滑坡监测

2.2 模拟图像 → 数字图像

模拟图像空间坐标 $(x,y)$ 与亮度 $f(x,y)$ 均为连续量,例如老式胶片。
数字图像需把模拟图像离散化:对坐标的离散化叫采样,对亮度的离散化叫量化

$$f_{\text{digital}}[i,j]= \mathrm{round}\!\left(\frac{f_{\text{analog}}(x_i,y_j)}{\Delta}\right),\qquad i,j\in\mathbb{Z},\ \Delta=\text{量化阶距}$$

这些离散点称为像素(pixel)。一张数字图像 = 一个矩阵 $\bm{I}\in\mathbb{R}^{H\times W\times C}$,其中 $H$ 为高,$W$ 为宽,$C$ 为通道数。

· 什么是“量化级数”?

量化级数 = 一个像素能表示多少个不同的亮度值。它由位深(bit depth)决定:$n$ bit 对应 $2^n$ 个级数。

位深级数能表达典型场景
1 bit2 级仅黑、白二值图、传真
4 bit16 级16 个灰阶早期 GIF
8 bit256 级0—255 灰度最常见,普通照片、隧道巡检
12 bit4 096 级更细腻的暗部专业摄影 RAW
16 bit65 536 级HDR / 高动态范围医学 CT、桥梁红外热像

为什么常用 8 bit?因为人眼在中等亮度下大约能分辨 100—200 级灰阶,256 级已远超感知阈值。
红外热像仪需要 16 bit——温度范围跨度大(−20 ℃ 到 +400 ℃),8 bit 的 256 级不够分辨 0.1 ℃ 这样的细微温差。

互动:采样与量化 · 拖动滑条观察图像如何“变粗”

当前图像存储字节数:4096 B

采样太低 → 失去形状;量化太低 → 产生伪轮廓。隧道病害检测要求至少 0.5 mm/px 的采样精度。

2.3 灰度图与彩色图

灰度图(单通道)

每个像素是一个 $[0,255]$ 范围内的整数,0 = 黑,255 = 白。
存储:$H\times W$ 个字节。

彩色图(RGB 三通道)

每个像素是 $(R,G,B)$ 三元组,每分量 $[0,255]$。
存储:$H\times W\times 3$ 个字节。

互动:像素探针 · 鼠标悬停查看 RGB 值(模拟混凝土裂缝图局部)

下方 8×8 像素网格模拟一个 混凝土表面+裂缝 的小区域,灰色为混凝土,深色为裂缝。悬停查看 RGB 值。

悬停在像素上

坐标:

RGB:

灰度:

分类:

观察:裂缝像素的灰度普遍 < 60,背景混凝土普遍 > 130。这就是后面“阈值分割”的物理依据。

2.4 不同波段的图像 · 土木场景

紫外

输电线绝缘子电晕放电肉眼不可见,但紫外光下显现为亮斑——电力巡检必备。

可见光

最常用,绝大多数桥梁、隧道、混凝土外观检测都基于可见光相机。

红外

桥面板内部脱空时,太阳暴晒后脱空区域温度比周围高 3—5 ℃,热像仪一目了然。

③ 图像预处理

采集来的图像往往有噪声(电子学引入)、光照不均(隧道里光源在中部最亮)、对比度低(潮湿表面反光)。 预处理的目标:消除无关信息、增强有用信息,为后续特征提取与识别打下基础。

3.1 图像增强:让有用信息更突出

· 直方图均衡化(Histogram Equalization)

当图像直方图集中在某个狭窄区间(如隧道照片大量像素灰度在 50—90),细节就难辨认。 均衡化将像素灰度重新分布,让累积分布函数尽可能接近线性。

$$s = T(r) = (L-1)\!\int_0^{r}\! p_r(w)\,dw,\quad L=256$$

其中 $p_r$ 是原图灰度概率密度,$T$ 把任意分布“拉直”。

💡 这个公式在做什么?三步直觉

  1. 统计:$p_r(w)$ 就是“灰度值 $w$ 在图中出现的频率”。$p_r(80)$ 高,说明很多像素灰度都在 80 附近。
  2. 累加:$\int_0^r p_r(w)\,dw$ 是 累积分布函数(CDF),表示“灰度 $\le r$ 的像素占比”。 例如 CDF(80) = 0.6 意味着 60% 的像素灰度不超过 80。
  3. 缩放:乘以 $L-1=255$,把 $[0,1]$ 的占比变成 $[0,255]$ 的新灰度。

核心思想可以一句话概括:把“出现得多”的灰度区间在数轴上拉开,把“出现得少”的灰度区间压缩。 数学上等价于“令输出图像的 CDF 接近一条直线”——这就是“理想直方图是均匀分布”的几何含义。

📐 微小数值例子

假设一张 100 px 图,灰度仅出现 4 种值:

原灰度 $r$像素数$p_r(r)$CDF$\times 255$新灰度 $s$
60500.500.50127.5128
70300.300.80204.0204
80150.150.95242.3242
9050.051.00255.0255

观察:原本灰度范围只有 60—90(差 30),均衡化后变成 128—255(差 127)。对比度大幅增强!

互动:可视化映射曲线 · 拖动滑条改变原图灰度分布的“拥挤程度”

下方左图是原图灰度直方图,右图是均衡化“映射曲线” $T(r)$:陡的地方 = 原灰度被拉开;缓的地方 = 原灰度被压缩。

📌 观察规律:原图越“窄”,映射曲线在该区间越“陡”,意味着把这一小段灰度大幅拉伸到 $[0,255]$ 整个区间。

互动:直方图均衡化 · 观察对比度提升

原图(隧道衬砌)

均衡化后

左图:原图灰度集中在中间段,对比度差。
右图:均衡化后灰度铺满 $[0,255]$,裂缝边界更清晰。

3.2 噪声与去噪

高斯噪声

由 CCD 阻性元器件热振动等引起,每个像素被一个 $\mathcal{N}(0,\sigma^2)$ 扰动。

观察:成像看起来像“被均匀的雪花覆盖”。

椒盐噪声

极少数像素被替换成 0(盐)或 255(椒),常由传输错误、信号尖峰造成。

观察:图上出现稀疏的黑/白点。

· 均值滤波(线性)— 直觉

核心动作:用 $3\times 3$ 窗口内 9 个像素的平均值,替代中心像素

$$I'[i,j] = \frac{1}{9}\sum_{u=-1}^{1}\sum_{v=-1}^{1} I[i+u,j+v]$$

为什么有效?高斯噪声是零均值的随机扰动——9 个相邻像素的噪声有正有负,相加趋近于 0。所以取平均后,噪声被“抹平”。

为什么对椒盐失效?椒盐噪声是 0 或 255 的极端值,不是零均值。一个 255 的盐点拉高了平均值,整个窗口都会被它“污染”。

互动 1:均值滤波 · 数字版具体计算(看着算一遍)

下方 3×3 是一个像素窗口的灰度值(中间像素含一个高斯噪声值)。计算平均后即为新的中心值。

原始 3×3 窗口
平均值(新中心像素)
点击下方按钮

· 中值滤波(非线性)— 直觉

核心动作:用 $3\times 3$ 窗口内 9 个像素的中位数,替代中心像素。即把 9 个值排序,取正中间那个。

$$I'[i,j] = \mathrm{median}\{I[i+u,j+v] : u,v\in\{-1,0,1\}\}$$

为什么对椒盐有效?中位数完全不受极端值影响——一个 255 的盐点在排序后落在最右端,被中位数自然丢弃。
为什么能保边缘?均值滤波的“平均”会把边缘两侧的亮像素和暗像素混合,让边缘变模糊;中位数总是取已有的某个像素值,不创造新值,所以边缘锐利。

互动 2:中值滤波 · 看排序如何“消灭”极端值

同样的 3×3 窗口,把 9 个值排序后取第 5 个(中位数)。

原始窗口
9 值排序(中间为中位数)
中位数(新中心像素)

· 整图对比效果

互动:滤波器对比 · 给图像加噪声并去噪
噪声类型: 滤波器:

原图

加噪

去噪结果

PSNR(峰值信噪比,越大越好): dB

3.3 边缘检测:找到强度变化剧烈的像素

边缘是图像中灰度突变的位置。在数学上,边缘对应梯度幅值大的点:

$$\nabla I = \left(\frac{\partial I}{\partial x},\frac{\partial I}{\partial y}\right),\quad \|\nabla I\| = \sqrt{G_x^2 + G_y^2}$$

由于图像是离散的,我们用差分近似导数。“差分近似导数”是什么意思?看下方图示:

💡 差分近似导数 · 直观图示

沿一条扫描线(一行像素)看它的灰度变化:在边缘处会出现“突变”。导数测量“变化的快慢”,所以边缘 = 导数大的位置。

上图:一行像素的灰度值 $I(x)$

下图:差分值 $G(x)=I(x+1)-I(x-1)$,相当于导数

关键观察:

  • 平坦区域 → 相邻像素相等 → 差分 ≈ 0
  • 边缘处 → 相邻像素灰度差大 → 差分 峰值

所以“找边缘”等价于“找差分大的位置”。Sobel 算子 $[-1,0,1]$ 就是这一思想的二维加权版本(额外用 $[-2,0,2]$ 加权中心行,更稳定)。

最常用的近似算子是 Sobel

水平 $G_x$
−1
0
1
−2
0
2
−1
0
1
垂直 $G_y$
−1
−2
−1
0
0
0
1
2
1

$G_x$ 检测竖直方向的边缘(因为它在水平方向上做差分),$G_y$ 反之。

互动:Sobel 边缘检测 · 拖动阈值观察裂缝边缘

>当 $\|\nabla I\| T$ 时,标记为边缘像素(白色)。
$T$ 太小:噪声也被当作边缘;$T$ 太大:丢失真实的细裂缝。

🏗️ 工程视角 · 为什么裂缝检测离不开边缘检测?

裂缝的最显著视觉特征就是狭长的、明显的灰度突变。基于深度学习之前,工程界主流就是:
图像增强 → 二值化 → 形态学操作 → Sobel/Canny 提取裂缝骨架 → 拟合裂缝走向
即使在 CNN 时代,边缘检测仍常作为后处理,用于精细化分割边界。

④ 特征提取

机器无法直接用一堆原始像素去判断“这是不是裂缝”。 特征提取是从原始图像中提炼出能区分类别的紧凑表示, 它是传统计算机视觉的核心,也是深度学习方法的“隐含目标”。

4.1 四大图像特征

颜色特征

RGB 三个通道的统计量:均值、方差、直方图。
岩土工程中可用颜色区分页岩(深灰)、砂岩(黄褐)、石灰岩(浅灰)。

纹理特征

描述像素空间排列模式的全局特征,需统计计算
钢板焊缝处粗糙纹理 ≠ 母材光滑纹理,纹理特征可识别焊缝区。

形状特征

轮廓特征(外边界)与区域特征(整个形状)。
裂缝形态学参数:走向、倾角、宽度、深度。

空间关系特征

多个目标之间的相互位置:连接/邻接、交叠、包含。
“渗漏水围绕施工缝分布”——这种空间关系本身就是病害判别依据。

4.2 颜色直方图:最简单的全局特征

· 直方图是怎么“统计”出来的?

本质就是计数。三步操作:

  1. 准备 256 个“格子”(bin),分别对应灰度 0、1、2、… 、255。每个格子的计数器初始为 0。
  2. 遍历图像每一个像素,读取它的灰度值 $g$。
  3. 对应灰度的格子计数 $+1$,即 hist[g] += 1

遍历完所有像素,hist 就是一个 256 元素的数组,hist[k] = “灰度等于 k 的像素总数”。把它画成柱状图,就是直方图。

彩色图就独立做三遍:分别统计 R、G、B 通道,得到三条曲线。

互动 1:直方图统计过程动画 · 看像素如何“投票”进入 bin

下方是一张 8×8 灰度图。点击“开始”逐像素扫描,观察右侧直方图如何逐步构建。

输入图像(8×8)

灰度直方图(动态构建)

已处理像素:0 / 64

当前像素:—

互动 2:彩色图像 RGB 直方图 · 切换不同岩石类型

观察 R、G、B 三个通道的直方图差异——这就是用颜色特征做岩石分类的依据。

4.3 纹理特征:灰度共生矩阵(GLCM)

· 第一直觉:什么是“共生”?

“灰度共生”意思是:统计相邻两个像素的灰度组合,分别出现了多少次

形象类比:把每对相邻像素看成一个“投票卡”,卡上写着 (左像素灰度, 右像素灰度)。GLCM 就是投票统计表

  • 如果图像很平滑(如混凝土素面),相邻像素值差不多,投票集中在 (50,50)、(55,55) 等“对角线附近”。
  • 如果图像很粗糙(如砂岩颗粒),相邻像素值跳跃大,投票散布在 (30,200)、(150,40) 等“远离对角线”的位置。
互动 1:3×3 小图构建 GLCM · 数着看

下面是一张简化到 4 个灰度级的 3×3 灰度图(仅用 0、1、2、3 表示)。我们看“水平相邻对”——每行的相邻两个像素构成一对。

输入 3×3 图
扫描水平像素对 (左, 右)
GLCM 矩阵(4×4)

行=左像素灰度
列=右像素灰度

点击“平滑”或“粗糙”切换输入图,观察 GLCM 矩阵中“高频组合”的位置。

· 形式化定义

$$P_{\Delta x,\Delta y}(i,j) = \#\{(x,y) : I(x,y)=i,\ I(x+\Delta x,y+\Delta y)=j\}$$

$\Delta x, \Delta y$ 是“邻居方向”(如水平向右 $(\Delta x, \Delta y)=(1,0)$、对角 $(1,1)$)。$P(i,j)$ 就是上面的投票数。

· 四个统计量的直觉对照

统计量公式直觉大值代表
对比度$\sum (i-j)^2 P(i,j)$$(i-j)^2$ 是“两像素差距的平方”,离对角线越远权重越大粗糙(GLCM 散布远)
能量$\sum P(i,j)^2$所有概率平方和,越集中 → 越大均匀(少数组合占多数)
$-\sum P\log P$分布越均匀越大(信息论中“不可预测度”)复杂(GLCM 各处都有值)
同质性$\sum \frac{P(i,j)}{1+|i-j|}$用 $1+|i-j|$ 倒数加权,强调对角线附近平滑(GLCM 集中在对角线)
互动 2:平滑 vs 粗糙纹理的 GLCM 热图对比

下方是两个 32×32 仿真纹理图及其 GLCM 热图。同质性、对比度的数值标在下方。

平滑纹理(混凝土素面)

对比度:
同质性:

粗糙纹理(砂岩颗粒)

对比度:
同质性:

观察 GLCM 热图:平滑纹理的亮点集中在对角线;粗糙纹理的亮点散布到远离对角线的位置。对比度数值随之大幅增加。

🏗️ 应用 · 页岩 vs 砂岩 vs 石灰岩纹理

三种沉积岩的 GLCM 对比度典型值:
页岩 ≈ 12 石灰岩 ≈ 25 砂岩 ≈ 48
砂岩颗粒粗大、纹理粗糙,对比度最高;页岩颗粒细密,对比度最低。仅凭这一个数就能做大致区分。

4.4 土木工程中的特征体系

结构图像

  • 裂缝特征:走向/倾角/宽度
  • 变形特征:位移/局部变形/速率
  • 材料劣化:风化/强度退化
  • 渗漏特征:位置/水质/活动性

岩土图像

  • 纹理特征:成因/组构/风化
  • 颜色特征:矿物/氧化程度
  • 形状特征:颗粒/裂隙几何
  • 结构特征:层理/节理
  • 尺度特征:颗粒大小分布

环境图像

  • 气象:天气/光照/能见度
  • 地形地貌:起伏/坡度/植被
  • 季节变化:物候/积雪
  • 人为干扰:工程痕迹/土地利用

4.5 传统特征 vs 深度学习特征

维度传统手工特征(SIFT/HOG/GLCM 等)深度学习特征(CNN 自动学习)
设计研究者根据领域知识“手工设计”从数据中自动学习
可解释性强(每个特征有物理含义)弱(“黑盒”)
所需数据量
泛化能力对工况变化敏感训练充分时强
典型应用受限场景:固定光照、固定相机的产线检测开放场景:野外巡检、多类病害混合

课程下半段我们重点学深度学习方法,但传统特征不会过时—— 它们仍广泛用于小样本、高可解释性要求、嵌入式部署场景。

⑤ 图像分类

图像分类:输入一张图,输出它属于哪一类。 例如把混凝土表面图像分到 {裂缝, 渗漏水, 剥落, 正常} 四类之一。 这是 CV 中最基础、也是其他任务(检测、分割)的“原子能力”。

5.1 传统方法:基于特征 + 经典分类器

· k 近邻(k-NN)

思想极其朴素:“和你相似的人就是一伙的”。给一张待分类图像 $\bm{x}$,从训练集中找距离最近的 k 个邻居,投票决定 $\bm{x}$ 的类别。

$$\hat{y}(\bm x) = \mathrm{mode}\{y_i : \bm x_i \in \mathcal{N}_k(\bm x)\}$$

常用距离:欧氏 $\sqrt{\sum(x_i-y_i)^2}$、曼哈顿 $\sum|x_i-y_i|$、余弦相似度。
优点:零训练成本;缺点:预测慢(要遍历整个训练集),高维下“距离”失真。

互动:2D 特征空间中的 k-NN 分类(混凝土病害)

假设我们用两个特征(对比度平均亮度)描述混凝土表面图像。三类样本已在特征空间中标出。鼠标点击空白处放置待测样本,调节 k 观察分类变化。

● 裂缝

● 渗漏水

● 正常

预测结果:点击图中放置样本

· 支持向量机(SVM)

寻找一个最大间隔超平面把两类样本分开:

$$\min_{\bm w,b}\ \tfrac{1}{2}\|\bm w\|^2,\quad \text{s.t.}\ y_i(\bm w^\top\bm x_i + b)\ge 1$$

对非线性问题可用核技巧:把样本映射到高维空间再分。
优点:小样本下表现稳定、理论完备;缺点:训练复杂度高,多分类需特殊处理(OvR、OvO)。

· 随机森林(RF)

多棵决策树投票(Bagging)。每棵树训练时随机抽样样本和特征,降低过拟合风险,对噪声鲁棒。
在工业 CV 软件里仍是常用的“开箱即用”分类器。

5.2 深度学习方法:卷积神经网络(CNN)

传统方法的瓶颈:特征是手工设计的,工程师必须问“对裂缝分类有用的特征是什么”。 CNN 的革命在于:把特征提取本身也变成一个可学习的过程。

输入图像
$32\times32\times3$
卷积层
提取局部特征
池化层
降维 + 平移不变
(重复多次)
全连接层
分类

5.3 卷积运算 · CNN 的核心

卷积:把一个小卷积核(kernel)滑过整张图像,每个位置做点积。

$$(I * K)[i,j] = \sum_{u}\sum_{v} I[i+u,\,j+v]\cdot K[u,v]$$

关键洞察:

  • 局部连接:每个输出像素只看输入的一个小局部 → 学习局部模式
  • 参数共享:同一卷积核在整张图上重复使用 → 学习平移不变的特征
  • 不同的卷积核 = 不同的特征检测器(边缘、纹理、角点……)
互动:卷积运算可视化 · 选择不同卷积核观察输出特征图

输入

卷积核

输出特征图

边缘检测核:拉普拉斯算子,对周围像素差值响应大的位置变亮。

5.4 池化与全连接

· 池化(Pooling)

把一个区域(如 $2\times 2$)的像素压成一个:最大池化取最大值,平均池化取平均。
作用:降维(减少计算量)、平移不变性(小幅位移不影响结果)、扩大感受野

· 全连接层(FC)

把最后的特征图展平成一维向量,接 softmax 输出每类的概率。

$$p_c = \frac{e^{z_c}}{\sum_{k=1}^{C} e^{z_k}},\quad \hat{y}=\arg\max_c p_c$$

5.5 经典 CNN 架构演化

架构年份层数关键创新Top-5 错误率
(ImageNet)
LeNet-519987首个成功的 CNN,用于手写数字识别
AlexNet20128ReLU + Dropout + GPU 训练,深度学习浪潮起点15.3%
VGG-16201416统一使用 3×3 小卷积核堆叠7.3%
GoogLeNet201422Inception 模块:并行多尺度卷积6.7%
ResNet-1522015152残差连接(skip connection),首次超越人类3.57%

观察:网络从 7 层涨到 152 层,错误率从两位数降到个位数——但不是简单地堆深度。 ResNet 的成功在于它解决了“深网络反而更难训练”的梯度消失问题。

互动:ResNet 残差连接的直觉

普通深网络 $\bm y = F(\bm x)$ 强迫每层学到完整变换。残差网络改为 $\bm y = F(\bm x) + \bm x$,让每层只学“变化量”。
类比:你在调一道菜,普通方案是把所有调料重新搭一遍;残差方案是“在原本味道基础上加 5 g 盐”——后者明显更容易。

🏗️ 案例 · 用 ResNet-50 做混凝土病害分类

某高校研究组采集了 12 万张混凝土表面图像(4 类:裂缝/渗漏水/剥落/正常),用 ResNet-50(在 ImageNet 上预训练)做迁移学习

  • 替换最后一层全连接:1000 类 → 4 类
  • 冻结前 80% 层,只微调最后几层(小数据集策略)
  • 训练 30 epoch,测试集准确率 95.7%
  • 对比:手工 GLCM 特征 + RF 只有 78%,提升 17 个百分点

⑥ 目标检测

分类只回答整张图是什么,但隧道一张图里可能有多处不同病害—— 我们需要算法回答“哪里有什么、有多少个”。 这就是目标检测:对每个目标输出 (类别, x, y, w, h, 置信度)

6.1 任务分解:分类 + 定位

目标检测的核心问题有四个:

  1. 分类问题:每个候选区域属于哪个类别
  2. 定位问题:目标可能在图像任何位置
  3. 大小问题:目标的尺度差异很大(远处一条 5 px 的裂缝 vs 近处占据半张图)
  4. 形状问题:目标可能有各种长宽比

因此,目标检测的损失函数自然由两部分组成:

$$\mathcal{L}_{\text{det}} = \mathcal{L}_{\text{cls}}(\hat{c},c) + \lambda\,\mathcal{L}_{\text{loc}}(\hat{\bm b},\bm b)$$

其中 $\mathcal{L}_{\text{cls}}$ 是分类损失(交叉熵),$\mathcal{L}_{\text{loc}}$ 是回归损失(Smooth L1),$\lambda$ 是权重。
为什么有两项?因为“分对类”和“框得准”是两个独立的目标。

6.2 Bounding Box 表示

角点表示

$$\bm b = (x_1, y_1, x_2, y_2)$$

左上角 $(x_1,y_1)$ + 右下角 $(x_2,y_2)$。

中心表示

$$\bm b = (x_c, y_c, w, h)$$

中心点 + 宽高,YOLO 系列常用。

6.3 模型好不好?用 IoU 来衡量

交并比(Intersection over Union):预测框与真实框的交集面积 ÷ 并集面积

$$\text{IoU}(\bm b_p,\bm b_g) = \frac{|\bm b_p \cap \bm b_g|}{|\bm b_p \cup \bm b_g|}\in[0,1]$$

约定:

  • IoU $\ge$ 0.5 → 视为“检测正确”(PASCAL VOC 标准)
  • IoU $\ge$ 0.7 → 高精度场景(如医学影像、桥梁裂缝)
  • IoU = 1 → 完全重合
互动:IoU 计算器 · 拖动预测框观察 IoU 变化

真实框(Ground Truth)

预测框(Prediction)

交集


交集面积:

并集面积:

IoU =

判定:

点击 SVG 内的蓝色(预测)框可以拖动它,观察 IoU 如何随重叠度变化。

6.4 非极大值抑制(NMS)

问题:检测算法常对同一目标输出多个高度重叠的框(例如同一条裂缝被框了 3 次,置信度分别 0.95、0.88、0.72)。 我们需要保留最好的、去掉冗余的。这就是 NMS

算法(伪代码):

输入: 候选框列表 B = [(b₁, s₁), (b₂, s₂), …], IoU 阈值 τ
输出: 保留框列表 D
1. 按置信度 s 降序排列 B
2. while B 不空 do
3.    取出 B 中置信度最高的框 b*,加入 D
4.    for 剩余每个框 b ∈ B do
5.        if IoU(b*, b) > τ then 从 B 中删除 b
6. return D
互动:NMS 动画 · 点击运行

点击“运行 NMS”开始

6.5 两大算法家族:R-CNN vs YOLO

两阶段R-CNN 系列

“先找可能区域,再分类”

  1. 区域提议(Selective Search 或 RPN)→ ~2000 个候选框
  2. 对每个候选框用 CNN 分类 + 回归边界
  3. NMS 去重

特点:精度高速度慢
演化:R-CNN → Fast R-CNN → Faster R-CNN → Mask R-CNN。

单阶段YOLO 系列

“一眼看全图”

  1. 把图划分为 $S\times S$ 网格
  2. 每个网格预测固定数量的框 + 类别概率
  3. 一次前向得到全部检测结果 + NMS

特点:极快(实时),小目标略弱
演化:YOLOv1 → v3 → v5 → v8 → v11。

互动:R-CNN vs YOLO 流水线动画对比

点击“开始”同时启动两条流水线,观察处理同一张隧道图像时,两者的阶段数、耗时差异

R-CNN(两阶段)

阶段:就绪 · 累计耗时:0 ms

YOLO(单阶段)

阶段:就绪 · 累计耗时:0 ms

互动:YOLO 网格划分可视化

目标中心落在哪个网格,这个网格就负责预测它
YOLOv1 用 $S$ = 7 网格,每格预测 2 个框 + 20 类概率,共 $7\times 7\times (2\times 5 + 20) = 1470$ 个输出。

6.6 速度 vs 精度的权衡

模型mAP (%)速度 (FPS)适用场景
Faster R-CNN73.25医学影像、桥梁高精度裂缝检测
YOLOv357.945视频流实时巡检
YOLOv8-L69.871自动驾驶、无人机巡检

工程选型口诀:要快用 YOLO,要超准用 R-CNN

⑦ 图像分割

分割的目标:把图像划分为若干具有语义意义的区域。 与检测的区别在于:检测输出的是矩形框,分割输出的是逐像素的类别。 对裂缝这种狭长不规则的目标,分割比检测更合适——可以直接量算长度、宽度、面积。

7.1 三种分割任务

语义分割

每个像素打一个类别标签,同类不区分个体

三条裂缝都被标成“裂缝类”,但不分谁是谁。

实例分割

语义分割 + 区分不同个体,每个目标单独的掩码。

三条裂缝各得一个 Mask,可分别量长度。

全景分割

实例分割 + 背景类别分割。

既区分“裂缝 1/2/3”,也把“混凝土背景”“管线”“拼缝”各自标出来。

7.2 传统分割方法

· 基于阈值的分割

最简单:选一个阈值 $T$,灰度 $< T$ 的像素归类 1,$\ge T$ 归类 2。

$$\hat{c}(x,y) = \begin{cases} 1 & I(x,y) < T \\ 0 & \text{otherwise} \end{cases}$$

问题:阈值怎么选?经典自动方法是 Otsu(最大类间方差法)。

互动:阈值分割 · 拖动阈值观察裂缝分割效果

裂缝像素占比: %

阈值法的局限:当背景光照不均(如隧道弧形顶部反光),全局阈值就失效——需要局部阈值或更复杂的方法。

· 基于区域的分割

区域生长法:从一个“种子点”开始,把邻居中与种子相似的像素加进来,相似准则可以是灰度差、颜色差、梯度等。
分裂合并法:先粗划分,再根据相似性分裂或合并子区域(四叉树思想)。

· 基于边缘的分割

先用 Sobel/Canny 检测边缘,再把边缘连成闭合轮廓,轮廓内即为一个区域。

互动:区域生长法 · 点击图中放种子,观察区域如何“生长”

从种子点出发,遇到与种子灰度差 $\le \tau$ 的邻居就并入区域。逐步扩展,直到没有新邻居满足条件。

📌 操作:在左图点击放置种子;右图实时显示生长出的区域(红色高亮)。
小 τ → 严格相似 → 区域小;大 τ → 宽松 → 区域可能“漏出”边界。

区域大小: 像素

7.3 深度学习分割:FCN

FCN(Fully Convolutional Network,2015):第一个端到端的语义分割网络。

问题:经典 CNN 末尾是全连接层,输出固定维度(如 4 类的 softmax)。但分割要输出和输入图同样大小的标签图,怎么办?

FCN 的回答:把全连接层换成1×1 卷积,再用反卷积/上采样把特征图恢复到原图大小。

输入
$H\times W\times 3$
卷积+池化
(下采样 32×)
1×1 卷积
分类
反卷积
(上采样 32×)
输出
$H\times W\times C$
互动:FCN 特征图“下采样 → 上采样”尺寸演化

点击各层观察特征图尺寸的变化,理解 FCN 如何先压缩、再还原

点击上图任意特征层查看说明。

互动:三种分割方法对比(同一张图,三种输出)

下方展示同一张“3 条裂缝”输入图,分别用三种方法输出,直观感受输出差异。

输入图

① 目标检测(框)

3 个矩形框;无法量长度

② 语义分割

所有裂缝同色;可量总面积

③ 实例分割

3 个独立掩码;可分别量

7.4 实例分割:Mask R-CNN

Mask R-CNN(2017)= Faster R-CNN + 分割分支。

对每个 RoI(感兴趣区域),并行预测:

  1. 类别 $\hat{c}$(分类分支)
  2. 边界框 $\hat{\bm b}$(回归分支)
  3. 分割掩码 $\hat{\bm M}$(分割分支:一个 $m\times m$ 的二值图)

关键技巧 RoIAlign:把不同大小的 RoI 用双线性插值精确对齐到固定尺寸,避免了 RoIPool 的量化误差——这对分割边界精度至关重要。

其他经典实例分割算法

  • FCIS — 在全卷积特征图中直接分割,避免重复计算
  • YOLACT — 引入注意力机制,超快
  • PANet — 多尺度特征聚合,精度高
  • DeepMask / SharpMask — 锚点 + 分层聚合
🏗️ 案例 · 隧道渗漏水实例分割

为什么要用实例而不是语义分割?

某地铁隧道一次巡检发现 4 处渗漏水。养护单位需要:

  • 分别记录每处渗漏水的位置坐标(建立病害数据库)
  • 统计每处面积、湿润程度等
  • 下次巡检对比每个渗漏点的发展速度

语义分割只告诉你“哪些像素是渗漏水”,无法区分这 4 处——实例分割才能输出可入库的个体清单

⑧ 土木工程中的计算机视觉应用

本节回到土木场景。我们已经掌握了 CV 的四大任务、两大算法家族, 现在看看它们在真实工程中是怎么组合、怎么落地的。

8.1 五大应用方向

① 表面缺陷检测

混凝土裂缝、钢筋腐蚀、瓷砖空鼓、沥青坑槽

典型流程:图像采集 → 预处理 → 缺陷检测/分割 → 缺陷量化(长度、宽度、面积)

② 结构健康监测

实时监测裂缝发展、位移、变形

关键技术:多时相图像配准——把不同时间拍的图对齐后做差分,识别新增病害或扩大病害。

③ 建筑质量控制

混凝土均匀性、钢筋位置、连接质量

例:钢筋扫描成像 + CV 自动量测保护层厚度,比卷尺量快 10 倍。

④ 土壤与地质勘探

岩石分类、地层识别、岩心扫描

钻孔获得的岩芯柱用相机拍摄后,CV 自动分割岩层、统计裂隙密度。

⑤ 桥梁与隧道监测

这是 CV 在土木中最成熟、应用最广的方向,下面详细讲解一个完整案例。

8.2 综合案例:盾构隧道衬砌病害自动识别系统

系统总览 · 点击各环节查看技术细节
① 数据采集
MTI-200a 巡检车
② 预处理
拼接 / 去噪 / 增强
③ 病害识别
检测 + 分割
④ 量化分析
面积 / 长度 / 走向
⑤ 入库与预警
多年对比
点击上方任意环节查看技术细节

8.3 病害类型的视觉特征

病害类型视觉特征难点推荐算法
裂缝狭长、深色、走向多样背景管线干扰、宽度仅 0.1—2 mmU-Net / DeepLabv3 语义分割
渗漏水不规则块状、深色、纹理平滑与剥落极易混淆Mask R-CNN 实例分割
剥落不规则块状、深色、纹理粗糙与渗漏水混淆Mask R-CNN + 纹理特征辅助
错台/拼缝规则直线需排除:拼缝是结构特征而非病害规则过滤(先验位置)

关键工程经验:渗漏水有平滑纹理,剥落有粗糙纹理——这是经典的“加入领域知识”提升模型性能的例子。 实际系统常用 GLCM 纹理特征作为 CNN 的辅助输入。

互动 1:从分割掩码到工程参数 · 裂缝量化演示

假设 CNN 已输出裂缝掩码(白色像素)。下方演示如何从掩码计算 长度、平均宽度、走向角——这是从“识别”到“工程量化”的关键一步。

分割掩码

+ 骨架线(红)+ 走向(黄)

量化结果(像素单位):

裂缝长度 px
平均宽度 px
最大宽度 px
走向角°
掩码面积 px²

长度 = 骨架像素数;
平均宽度 = 面积 / 长度;
走向 = 骨架点的 PCA 主方向。

互动 2:多时相对比 · 同一裂缝在两次巡检中的变化

隧道每半年巡检一次。把两次掩码做“差分”,可自动发现新增/扩展病害——这就是结构健康监测的核心。

2025-04 巡检

vs

2025-10 巡检

=

差分(红=新增,黄=扩展)

自动报告:

⚠️ 预警规则示例

裂缝长度增长 ≥ 50 mm/半年 → 触发现场复核
裂缝宽度增长 ≥ 0.05 mm/半年 → 触发现场复核
渗漏水面积扩大 ≥ 20% → 列入观察清单

8.4 人工巡检 vs 计算机视觉

对比维度人工巡检计算机视觉
速度慢(300 m/日 / 人)快(5 km/h × 24 h 连续)
客观性主观差异大同一算法 → 同一结果
记录方式纸笔、拍照数字化、可入库
对比分析逐年自动比对
安全性需高空/夜间作业设备代劳
初期投入
处理细微病害凭经验灵活取决于训练数据
新型病害识别可发现未见过的仅识别训练过的类别

实际工程趋势:人机结合——CV 做粗筛与量化,工程师做最终判定与新型病害发现。

8.5 进一步阅读

  • Cha, Y.-J. et al. (2017). Deep Learning-Based Crack Damage Detection Using Convolutional Neural Networks. Computer-Aided Civil and Infrastructure Engineering.
  • Spencer, B.F. et al. (2019). Advances in Computer Vision-Based Civil Infrastructure Inspection and Monitoring. Engineering.
  • Dorafshan, S. et al. (2018). Comparison of Deep Convolutional Neural Networks and Edge Detectors for Image-Based Crack Detection. Construction and Building Materials.
  • Github:microsoft/SyntheticDataForCV(合成数据辅助小样本训练)
  • 开源工具:OpenCV(传统 CV)、MMDetection(检测)、MMSegmentation(分割)

⑨ 课后小测

共 15 题,覆盖 3 个课时核心内容。完成后查看得分与解析。

🎓 恭喜你完成了 3 课时的计算机视觉学习!

本课带你走过:

  • 从光信号到数字图像的采样与量化过程
  • 图像预处理三剑客:增强、去噪、边缘检测
  • 四类传统图像特征及它们在土木图像中的应用
  • 从 kNN/SVM/RF 到 LeNet→ResNet 的分类方法演化
  • 目标检测的IoU、NMS,YOLO 与 R-CNN 的取舍
  • 三种分割任务及其在隧道病害中的实际意义
  • 一个完整的盾构隧道衬砌病害自动识别系统架构

下一步建议:

  • 动手实践:用 OpenCV + Python 实现一个混凝土裂缝二值化程序(不到 50 行代码)
  • 读经典论文:ResNet(He, 2015)、YOLOv1(Redmon, 2016)、Mask R-CNN(He, 2017)
  • 用开源框架:MMSegmentation 在公开裂缝数据集(如 CrackForest)上跑通分割 baseline