① 概览:让机器学会“看”
计算机视觉(Computer Vision,CV)是一种让机器通过摄像头、传感器等设备获取并理解图像或视频的技术。 一句话概括:用机器代替人眼来做测量和判断。 本课程聚焦它在土木工程——隧道病害检测、桥梁监测、钢结构缺陷识别——中的应用。
1.1 引例:人眼检测 vs 机器视觉
设想你是一名隧道结构工程师,需要对一段 3 km 的盾构隧道进行全表面病害排查(渗漏水、裂缝、剥落)。两种方案:
- 2 名工程师,每天巡检约 300 m
- 需 10 个工作日,约 160 工时
- 易疲劳、主观差异大;夜班作业有安全风险
- 记录靠纸笔或拍照,病害量化难统一
- 巡检车以 5 km/h 通过,拍摄 2 h 完成
- CV 算法自动识别、分类、量化各类病害
- 结果可入库,逐年对比病害发展
- 难点:复杂背景(管线、拼缝)、相似纹理(渗漏 vs 剥落)
本课程要解答的核心问题:这套自动识别系统是如何工作的?
1.2 计算机视觉发展历史
数字图像处理
学科形成
工业视觉
统计学习
深度学习
1.3 CV 的四大任务(也是本课主线)
输入一张图,回答“这是什么”。
例:这张混凝土表面图属于“裂缝/渗漏水/剥落/正常”中的哪一类?
回答“什么在哪里”,用矩形框(Bounding Box)框出位置。
例:图中有 3 处裂缝、2 处渗漏水,各自在哪。
对每个像素做分类。
例:把裂缝区域所有像素涂红,背景涂黑——可直接量算裂缝面积、走向。
语义分割 + 区分同类的不同个体。
例:图中 3 条独立裂缝分别用 3 种掩码标识,可分别统计每条裂缝长度。
1.4 本课导览(3 课时)
| 课时 | 主题 | 核心内容 |
|---|---|---|
| 课时 1 | CV 基础 | 图像表示 · 数字化 · 预处理 · 边缘检测 |
| 课时 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)$ 均为连续量,例如老式胶片。
数字图像需把模拟图像离散化:对坐标的离散化叫采样,对亮度的离散化叫量化。
这些离散点称为像素(pixel)。一张数字图像 = 一个矩阵 $\bm{I}\in\mathbb{R}^{H\times W\times C}$,其中 $H$ 为高,$W$ 为宽,$C$ 为通道数。
· 什么是“量化级数”?
量化级数 = 一个像素能表示多少个不同的亮度值。它由位深(bit depth)决定:$n$ bit 对应 $2^n$ 个级数。
| 位深 | 级数 | 能表达 | 典型场景 |
|---|---|---|---|
| 1 bit | 2 级 | 仅黑、白 | 二值图、传真 |
| 4 bit | 16 级 | 16 个灰阶 | 早期 GIF |
| 8 bit | 256 级 | 0—255 灰度 | 最常见,普通照片、隧道巡检 |
| 12 bit | 4 096 级 | 更细腻的暗部 | 专业摄影 RAW |
| 16 bit | 65 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$ 个字节。
下方 8×8 像素网格模拟一个 混凝土表面+裂缝 的小区域,灰色为混凝土,深色为裂缝。悬停查看 RGB 值。
悬停在像素上
坐标:—
RGB:—
灰度:—
分类:—
观察:裂缝像素的灰度普遍 < 60,背景混凝土普遍 > 130。这就是后面“阈值分割”的物理依据。
2.4 不同波段的图像 · 土木场景
输电线绝缘子电晕放电肉眼不可见,但紫外光下显现为亮斑——电力巡检必备。
最常用,绝大多数桥梁、隧道、混凝土外观检测都基于可见光相机。
桥面板内部脱空时,太阳暴晒后脱空区域温度比周围高 3—5 ℃,热像仪一目了然。
③ 图像预处理
采集来的图像往往有噪声(电子学引入)、光照不均(隧道里光源在中部最亮)、对比度低(潮湿表面反光)。 预处理的目标:消除无关信息、增强有用信息,为后续特征提取与识别打下基础。
3.1 图像增强:让有用信息更突出
· 直方图均衡化(Histogram Equalization)
当图像直方图集中在某个狭窄区间(如隧道照片大量像素灰度在 50—90),细节就难辨认。 均衡化将像素灰度重新分布,让累积分布函数尽可能接近线性。
其中 $p_r$ 是原图灰度概率密度,$T$ 把任意分布“拉直”。
💡 这个公式在做什么?三步直觉
- 统计:$p_r(w)$ 就是“灰度值 $w$ 在图中出现的频率”。$p_r(80)$ 高,说明很多像素灰度都在 80 附近。
- 累加:$\int_0^r p_r(w)\,dw$ 是 累积分布函数(CDF),表示“灰度 $\le r$ 的像素占比”。 例如 CDF(80) = 0.6 意味着 60% 的像素灰度不超过 80。
- 缩放:乘以 $L-1=255$,把 $[0,1]$ 的占比变成 $[0,255]$ 的新灰度。
核心思想可以一句话概括:把“出现得多”的灰度区间在数轴上拉开,把“出现得少”的灰度区间压缩。 数学上等价于“令输出图像的 CDF 接近一条直线”——这就是“理想直方图是均匀分布”的几何含义。
假设一张 100 px 图,灰度仅出现 4 种值:
| 原灰度 $r$ | 像素数 | $p_r(r)$ | CDF | $\times 255$ | 新灰度 $s$ |
|---|---|---|---|---|---|
| 60 | 50 | 0.50 | 0.50 | 127.5 | 128 |
| 70 | 30 | 0.30 | 0.80 | 204.0 | 204 |
| 80 | 15 | 0.15 | 0.95 | 242.3 | 242 |
| 90 | 5 | 0.05 | 1.00 | 255.0 | 255 |
观察:原本灰度范围只有 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 个像素的平均值,替代中心像素。
为什么有效?高斯噪声是零均值的随机扰动——9 个相邻像素的噪声有正有负,相加趋近于 0。所以取平均后,噪声被“抹平”。
为什么对椒盐失效?椒盐噪声是 0 或 255 的极端值,不是零均值。一个 255 的盐点拉高了平均值,整个窗口都会被它“污染”。
下方 3×3 是一个像素窗口的灰度值(中间像素含一个高斯噪声值)。计算平均后即为新的中心值。
· 中值滤波(非线性)— 直觉
核心动作:用 $3\times 3$ 窗口内 9 个像素的中位数,替代中心像素。即把 9 个值排序,取正中间那个。
为什么对椒盐有效?中位数完全不受极端值影响——一个 255 的盐点在排序后落在最右端,被中位数自然丢弃。
为什么能保边缘?均值滤波的“平均”会把边缘两侧的亮像素和暗像素混合,让边缘变模糊;中位数总是取已有的某个像素值,不创造新值,所以边缘锐利。
同样的 3×3 窗口,把 9 个值排序后取第 5 个(中位数)。
· 整图对比效果
原图
加噪
去噪结果
PSNR(峰值信噪比,越大越好):— dB
3.3 边缘检测:找到强度变化剧烈的像素
边缘是图像中灰度突变的位置。在数学上,边缘对应梯度幅值大的点:
由于图像是离散的,我们用差分近似导数。“差分近似导数”是什么意思?看下方图示:
沿一条扫描线(一行像素)看它的灰度变化:在边缘处会出现“突变”。导数测量“变化的快慢”,所以边缘 = 导数大的位置。
上图:一行像素的灰度值 $I(x)$
下图:差分值 $G(x)=I(x+1)-I(x-1)$,相当于导数
关键观察:
- 平坦区域 → 相邻像素相等 → 差分 ≈ 0
- 边缘处 → 相邻像素灰度差大 → 差分 峰值
所以“找边缘”等价于“找差分大的位置”。Sobel 算子 $[-1,0,1]$ 就是这一思想的二维加权版本(额外用 $[-2,0,2]$ 加权中心行,更稳定)。
最常用的近似算子是 Sobel:
$G_x$ 检测竖直方向的边缘(因为它在水平方向上做差分),$G_y$ 反之。
>当 $\|\nabla I\| T$ 时,标记为边缘像素(白色)。
$T$ 太小:噪声也被当作边缘;$T$ 太大:丢失真实的细裂缝。
裂缝的最显著视觉特征就是狭长的、明显的灰度突变。基于深度学习之前,工程界主流就是:
图像增强 → 二值化 → 形态学操作 → Sobel/Canny 提取裂缝骨架 → 拟合裂缝走向。
即使在 CNN 时代,边缘检测仍常作为后处理,用于精细化分割边界。
④ 特征提取
机器无法直接用一堆原始像素去判断“这是不是裂缝”。 特征提取是从原始图像中提炼出能区分类别的紧凑表示, 它是传统计算机视觉的核心,也是深度学习方法的“隐含目标”。
4.1 四大图像特征
RGB 三个通道的统计量:均值、方差、直方图。
岩土工程中可用颜色区分页岩(深灰)、砂岩(黄褐)、石灰岩(浅灰)。
描述像素空间排列模式的全局特征,需统计计算。
钢板焊缝处粗糙纹理 ≠ 母材光滑纹理,纹理特征可识别焊缝区。
轮廓特征(外边界)与区域特征(整个形状)。
裂缝形态学参数:走向、倾角、宽度、深度。
多个目标之间的相互位置:连接/邻接、交叠、包含。
“渗漏水围绕施工缝分布”——这种空间关系本身就是病害判别依据。
4.2 颜色直方图:最简单的全局特征
· 直方图是怎么“统计”出来的?
本质就是计数。三步操作:
- 准备 256 个“格子”(bin),分别对应灰度 0、1、2、… 、255。每个格子的计数器初始为 0。
- 遍历图像每一个像素,读取它的灰度值 $g$。
- 对应灰度的格子计数 $+1$,即 hist[g] += 1。
遍历完所有像素,hist 就是一个 256 元素的数组,hist[k] = “灰度等于 k 的像素总数”。把它画成柱状图,就是直方图。
彩色图就独立做三遍:分别统计 R、G、B 通道,得到三条曲线。
下方是一张 8×8 灰度图。点击“开始”逐像素扫描,观察右侧直方图如何逐步构建。
输入图像(8×8)
灰度直方图(动态构建)
已处理像素:0 / 64
当前像素:—
观察 R、G、B 三个通道的直方图差异——这就是用颜色特征做岩石分类的依据。
4.3 纹理特征:灰度共生矩阵(GLCM)
· 第一直觉:什么是“共生”?
“灰度共生”意思是:统计相邻两个像素的灰度组合,分别出现了多少次。
形象类比:把每对相邻像素看成一个“投票卡”,卡上写着 (左像素灰度, 右像素灰度)。GLCM 就是投票统计表。
- 如果图像很平滑(如混凝土素面),相邻像素值差不多,投票集中在 (50,50)、(55,55) 等“对角线附近”。
- 如果图像很粗糙(如砂岩颗粒),相邻像素值跳跃大,投票散布在 (30,200)、(150,40) 等“远离对角线”的位置。
下面是一张简化到 4 个灰度级的 3×3 灰度图(仅用 0、1、2、3 表示)。我们看“水平相邻对”——每行的相邻两个像素构成一对。
行=左像素灰度
列=右像素灰度
点击“平滑”或“粗糙”切换输入图,观察 GLCM 矩阵中“高频组合”的位置。
· 形式化定义
$\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 集中在对角线) |
下方是两个 32×32 仿真纹理图及其 GLCM 热图。同质性、对比度的数值标在下方。
对比度:—
同质性:—
对比度:—
同质性:—
观察 GLCM 热图:平滑纹理的亮点集中在对角线;粗糙纹理的亮点散布到远离对角线的位置。对比度数值随之大幅增加。
三种沉积岩的 GLCM 对比度典型值:
页岩 ≈ 12 石灰岩 ≈ 25 砂岩 ≈ 48
砂岩颗粒粗大、纹理粗糙,对比度最高;页岩颗粒细密,对比度最低。仅凭这一个数就能做大致区分。
4.4 土木工程中的特征体系
结构图像
- 裂缝特征:走向/倾角/宽度
- 变形特征:位移/局部变形/速率
- 材料劣化:风化/强度退化
- 渗漏特征:位置/水质/活动性
岩土图像
- 纹理特征:成因/组构/风化
- 颜色特征:矿物/氧化程度
- 形状特征:颗粒/裂隙几何
- 结构特征:层理/节理
- 尺度特征:颗粒大小分布
环境图像
- 气象:天气/光照/能见度
- 地形地貌:起伏/坡度/植被
- 季节变化:物候/积雪
- 人为干扰:工程痕迹/土地利用
4.5 传统特征 vs 深度学习特征
| 维度 | 传统手工特征(SIFT/HOG/GLCM 等) | 深度学习特征(CNN 自动学习) |
|---|---|---|
| 设计 | 研究者根据领域知识“手工设计” | 从数据中自动学习 |
| 可解释性 | 强(每个特征有物理含义) | 弱(“黑盒”) |
| 所需数据量 | 小 | 大 |
| 泛化能力 | 对工况变化敏感 | 训练充分时强 |
| 典型应用 | 受限场景:固定光照、固定相机的产线检测 | 开放场景:野外巡检、多类病害混合 |
课程下半段我们重点学深度学习方法,但传统特征不会过时—— 它们仍广泛用于小样本、高可解释性要求、嵌入式部署场景。
⑤ 图像分类
图像分类:输入一张图,输出它属于哪一类。 例如把混凝土表面图像分到 {裂缝, 渗漏水, 剥落, 正常} 四类之一。 这是 CV 中最基础、也是其他任务(检测、分割)的“原子能力”。
5.1 传统方法:基于特征 + 经典分类器
· k 近邻(k-NN)
思想极其朴素:“和你相似的人就是一伙的”。给一张待分类图像 $\bm{x}$,从训练集中找距离最近的 k 个邻居,投票决定 $\bm{x}$ 的类别。
常用距离:欧氏 $\sqrt{\sum(x_i-y_i)^2}$、曼哈顿 $\sum|x_i-y_i|$、余弦相似度。
优点:零训练成本;缺点:预测慢(要遍历整个训练集),高维下“距离”失真。
假设我们用两个特征(对比度 和 平均亮度)描述混凝土表面图像。三类样本已在特征空间中标出。鼠标点击空白处放置待测样本,调节 k 观察分类变化。
● 裂缝
● 渗漏水
● 正常
预测结果:点击图中放置样本
· 支持向量机(SVM)
寻找一个最大间隔超平面把两类样本分开:
对非线性问题可用核技巧:把样本映射到高维空间再分。
优点:小样本下表现稳定、理论完备;缺点:训练复杂度高,多分类需特殊处理(OvR、OvO)。
· 随机森林(RF)
多棵决策树投票(Bagging)。每棵树训练时随机抽样样本和特征,降低过拟合风险,对噪声鲁棒。
在工业 CV 软件里仍是常用的“开箱即用”分类器。
5.2 深度学习方法:卷积神经网络(CNN)
传统方法的瓶颈:特征是手工设计的,工程师必须问“对裂缝分类有用的特征是什么”。 CNN 的革命在于:把特征提取本身也变成一个可学习的过程。
$32\times32\times3$
提取局部特征
降维 + 平移不变
分类
5.3 卷积运算 · CNN 的核心
卷积:把一个小卷积核(kernel)滑过整张图像,每个位置做点积。
关键洞察:
- 局部连接:每个输出像素只看输入的一个小局部 → 学习局部模式
- 参数共享:同一卷积核在整张图上重复使用 → 学习平移不变的特征
- 不同的卷积核 = 不同的特征检测器(边缘、纹理、角点……)
输入
卷积核
输出特征图
边缘检测核:拉普拉斯算子,对周围像素差值响应大的位置变亮。
5.4 池化与全连接
· 池化(Pooling)
把一个区域(如 $2\times 2$)的像素压成一个:最大池化取最大值,平均池化取平均。
作用:降维(减少计算量)、平移不变性(小幅位移不影响结果)、扩大感受野。
· 全连接层(FC)
把最后的特征图展平成一维向量,接 softmax 输出每类的概率。
5.5 经典 CNN 架构演化
| 架构 | 年份 | 层数 | 关键创新 | Top-5 错误率 (ImageNet) |
|---|---|---|---|---|
| LeNet-5 | 1998 | 7 | 首个成功的 CNN,用于手写数字识别 | — |
| AlexNet | 2012 | 8 | ReLU + Dropout + GPU 训练,深度学习浪潮起点 | 15.3% |
| VGG-16 | 2014 | 16 | 统一使用 3×3 小卷积核堆叠 | 7.3% |
| GoogLeNet | 2014 | 22 | Inception 模块:并行多尺度卷积 | 6.7% |
| ResNet-152 | 2015 | 152 | 残差连接(skip connection),首次超越人类 | 3.57% |
观察:网络从 7 层涨到 152 层,错误率从两位数降到个位数——但不是简单地堆深度。 ResNet 的成功在于它解决了“深网络反而更难训练”的梯度消失问题。
普通深网络 $\bm y = F(\bm x)$ 强迫每层学到完整变换。残差网络改为 $\bm y = F(\bm x) + \bm x$,让每层只学“变化量”。
类比:你在调一道菜,普通方案是把所有调料重新搭一遍;残差方案是“在原本味道基础上加 5 g 盐”——后者明显更容易。
某高校研究组采集了 12 万张混凝土表面图像(4 类:裂缝/渗漏水/剥落/正常),用 ResNet-50(在 ImageNet 上预训练)做迁移学习:
- 替换最后一层全连接:1000 类 → 4 类
- 冻结前 80% 层,只微调最后几层(小数据集策略)
- 训练 30 epoch,测试集准确率 95.7%
- 对比:手工 GLCM 特征 + RF 只有 78%,提升 17 个百分点
⑥ 目标检测
分类只回答整张图是什么,但隧道一张图里可能有多处不同病害——
我们需要算法回答“哪里有什么、有多少个”。
这就是目标检测:对每个目标输出 (类别, x, y, w, h, 置信度)。
6.1 任务分解:分类 + 定位
目标检测的核心问题有四个:
- 分类问题:每个候选区域属于哪个类别
- 定位问题:目标可能在图像任何位置
- 大小问题:目标的尺度差异很大(远处一条 5 px 的裂缝 vs 近处占据半张图)
- 形状问题:目标可能有各种长宽比
因此,目标检测的损失函数自然由两部分组成:
其中 $\mathcal{L}_{\text{cls}}$ 是分类损失(交叉熵),$\mathcal{L}_{\text{loc}}$ 是回归损失(Smooth L1),$\lambda$ 是权重。
为什么有两项?因为“分对类”和“框得准”是两个独立的目标。
6.2 Bounding Box 表示
角点表示
左上角 $(x_1,y_1)$ + 右下角 $(x_2,y_2)$。
中心表示
中心点 + 宽高,YOLO 系列常用。
6.3 模型好不好?用 IoU 来衡量
交并比(Intersection over Union):预测框与真实框的交集面积 ÷ 并集面积。
约定:
- IoU $\ge$ 0.5 → 视为“检测正确”(PASCAL VOC 标准)
- IoU $\ge$ 0.7 → 高精度场景(如医学影像、桥梁裂缝)
- IoU = 1 → 完全重合
真实框(Ground Truth)
预测框(Prediction)
交集
交集面积:—
并集面积:—
IoU = —
判定:—
点击 SVG 内的蓝色(预测)框可以拖动它,观察 IoU 如何随重叠度变化。
6.4 非极大值抑制(NMS)
问题:检测算法常对同一目标输出多个高度重叠的框(例如同一条裂缝被框了 3 次,置信度分别 0.95、0.88、0.72)。 我们需要保留最好的、去掉冗余的。这就是 NMS。
算法(伪代码):
输出: 保留框列表 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”开始
6.5 两大算法家族:R-CNN vs YOLO
“先找可能区域,再分类”
- 区域提议(Selective Search 或 RPN)→ ~2000 个候选框
- 对每个候选框用 CNN 分类 + 回归边界
- NMS 去重
特点:精度高,速度慢。
演化:R-CNN → Fast R-CNN → Faster R-CNN → Mask R-CNN。
“一眼看全图”
- 把图划分为 $S\times S$ 网格
- 每个网格预测固定数量的框 + 类别概率
- 一次前向得到全部检测结果 + NMS
特点:极快(实时),小目标略弱。
演化:YOLOv1 → v3 → v5 → v8 → v11。
点击“开始”同时启动两条流水线,观察处理同一张隧道图像时,两者的阶段数、耗时差异。
R-CNN(两阶段)
阶段:就绪 · 累计耗时:0 ms
YOLO(单阶段)
阶段:就绪 · 累计耗时:0 ms
目标中心落在哪个网格,这个网格就负责预测它。
YOLOv1 用 $S$ = 7 网格,每格预测 2 个框 + 20 类概率,共 $7\times 7\times (2\times 5 + 20) = 1470$ 个输出。
6.6 速度 vs 精度的权衡
| 模型 | mAP (%) | 速度 (FPS) | 适用场景 |
|---|---|---|---|
| Faster R-CNN | 73.2 | 5 | 医学影像、桥梁高精度裂缝检测 |
| YOLOv3 | 57.9 | 45 | 视频流实时巡检 |
| YOLOv8-L | 69.8 | 71 | 自动驾驶、无人机巡检 |
工程选型口诀:要快用 YOLO,要超准用 R-CNN。
⑦ 图像分割
分割的目标:把图像划分为若干具有语义意义的区域。 与检测的区别在于:检测输出的是矩形框,分割输出的是逐像素的类别。 对裂缝这种狭长不规则的目标,分割比检测更合适——可以直接量算长度、宽度、面积。
7.1 三种分割任务
每个像素打一个类别标签,同类不区分个体。
三条裂缝都被标成“裂缝类”,但不分谁是谁。
语义分割 + 区分不同个体,每个目标单独的掩码。
三条裂缝各得一个 Mask,可分别量长度。
实例分割 + 背景类别分割。
既区分“裂缝 1/2/3”,也把“混凝土背景”“管线”“拼缝”各自标出来。
7.2 传统分割方法
· 基于阈值的分割
最简单:选一个阈值 $T$,灰度 $< T$ 的像素归类 1,$\ge T$ 归类 2。
问题:阈值怎么选?经典自动方法是 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×)
分类
(上采样 32×)
$H\times W\times C$
点击各层观察特征图尺寸的变化,理解 FCN 如何先压缩、再还原。
点击上图任意特征层查看说明。
下方展示同一张“3 条裂缝”输入图,分别用三种方法输出,直观感受输出差异。
输入图
① 目标检测(框)
3 个矩形框;无法量长度
② 语义分割
所有裂缝同色;可量总面积
③ 实例分割
3 个独立掩码;可分别量
7.4 实例分割:Mask R-CNN
Mask R-CNN(2017)= Faster R-CNN + 分割分支。
对每个 RoI(感兴趣区域),并行预测:
- 类别 $\hat{c}$(分类分支)
- 边界框 $\hat{\bm b}$(回归分支)
- 分割掩码 $\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 mm | U-Net / DeepLabv3 语义分割 |
| 渗漏水 | 不规则块状、深色、纹理平滑 | 与剥落极易混淆 | Mask R-CNN 实例分割 |
| 剥落 | 不规则块状、深色、纹理粗糙 | 与渗漏水混淆 | Mask R-CNN + 纹理特征辅助 |
| 错台/拼缝 | 规则直线 | 需排除:拼缝是结构特征而非病害 | 规则过滤(先验位置) |
关键工程经验:渗漏水有平滑纹理,剥落有粗糙纹理——这是经典的“加入领域知识”提升模型性能的例子。 实际系统常用 GLCM 纹理特征作为 CNN 的辅助输入。
假设 CNN 已输出裂缝掩码(白色像素)。下方演示如何从掩码计算 长度、平均宽度、走向角——这是从“识别”到“工程量化”的关键一步。
分割掩码
+ 骨架线(红)+ 走向(黄)
量化结果(像素单位):
| 裂缝长度 | — px |
| 平均宽度 | — px |
| 最大宽度 | — px |
| 走向角 | —° |
| 掩码面积 | — px² |
长度 = 骨架像素数;
平均宽度 = 面积 / 长度;
走向 = 骨架点的 PCA 主方向。
隧道每半年巡检一次。把两次掩码做“差分”,可自动发现新增/扩展病害——这就是结构健康监测的核心。
2025-04 巡检
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