4. 深度学习与计算机视觉入门:卷积神经网络(CNN)核心概念、目标检测与语义分割任务简介、从分类到检测的演进
各位同学,欢迎来到第四讲。今天我们要聊的,是整个风电叶片裂纹检测大模型训练的基石——深度学习与计算机视觉。说白了,就是让机器学会“看”裂纹。
我刚开始接触这个领域时,也觉得神经网络像个黑盒子。但做了几年算法落地,我慢慢发现,只要把几个核心概念吃透,后面的路就好走了。今天我们就从CNN的核心概念讲起,再聊聊目标检测和语义分割,最后看看从分类到检测,这条路到底是怎么走过来的。
4.1 卷积神经网络(CNN)核心概念
CNN,卷积神经网络,是处理图像数据的利器。为什么叫“卷积”?其实就是一个滑动窗口,在图像上提取特征。我习惯把它想象成一个“特征扫描仪”。
4.1.1 卷积层:特征提取器
卷积层干的事很简单:用一个小矩阵(卷积核)在图像上滑动,每次做点乘运算。这个小矩阵就是“特征提取器”。
举个例子,一个3x3的卷积核,可以检测边缘、纹理、角点等低级特征。多个卷积核堆叠,就能提取更复杂的特征。
核心参数:
- 卷积核大小(Kernel Size):常用3x3、5x5。我建议从3x3开始,参数量小,堆叠多层效果更好。
- 步长(Stride):每次滑动的像素数。步长为1,输出尺寸不变;步长为2,尺寸减半。
- 填充(Padding):在图像边缘补0,保持输出尺寸。我习惯用“same”填充,省心。
我在项目中遇到过一个问题:卷积核太多,模型参数爆炸。后来我学会了用1x1卷积降维,效果立竿见影。嗯,这里要注意,1x1卷积不是用来提取空间特征的,而是用来调整通道数的。
4.1.2 池化层:降采样与特征压缩
池化层的作用,说白了就是“压缩”。把图像变小,保留最重要的特征,丢掉冗余信息。
最常见的两种池化:
- 最大池化(Max Pooling):取窗口内的最大值。保留最显著的特征。
- 平均池化(Average Pooling):取窗口内的平均值。保留整体信息。
我个人习惯在卷积层之后接最大池化,因为裂纹检测中,裂纹的边缘和纹理是“显著特征”,最大池化能更好地保留它们。
4.1.3 激活函数:引入非线性
没有激活函数,神经网络就是一堆线性变换的叠加,表达能力有限。激活函数引入非线性,让网络能学习复杂模式。
常用的激活函数:
| 函数名 | 公式 | 特点 |
|---|---|---|
| ReLU | f(x) = max(0, x) | 计算快,缓解梯度消失。但负半轴神经元会“死掉”。 |
| Leaky ReLU | f(x) = max(αx, x) | 解决ReLU“死神经元”问题。α通常取0.01。 |
| Sigmoid | f(x) = 1 / (1 + e^{-x}) | 输出在0-1之间,适合二分类。但梯度容易饱和。 |
我曾经在训练一个裂纹分类模型时,用了Sigmoid,结果梯度消失,模型死活不收敛。换成ReLU后,问题迎刃而解。所以,我建议在隐藏层优先用ReLU。
4.1.4 全连接层:特征整合与分类
全连接层,就是把前面提取到的所有特征“拉直”,然后做分类或回归。它位于网络的最后几层。
举个例子,经过卷积和池化后,我们得到了一堆特征图。全连接层把这些特征图展平成一维向量,然后通过权重矩阵映射到输出类别上。
我的经验:全连接层参数量巨大,容易过拟合。我建议用全局平均池化(Global Average Pooling)替代全连接层,参数量少,还能防止过拟合。这在裂纹检测中特别有用,因为我们的训练数据往往不够多。
4.2 目标检测与语义分割任务简介
好了,CNN的核心概念讲完了。接下来我们聊聊两个更高级的任务:目标检测和语义分割。这两个任务在风电叶片裂纹检测中,应用场景完全不同。
4.2.1 目标检测:定位与分类
目标检测,不仅要告诉“这是什么”,还要告诉“它在哪里”。输出是一个边界框(Bounding Box)和类别标签。
举个例子,一张风电叶片图像,目标检测模型会输出:
- 裂纹1:类别“横向裂纹”,位置 (x1, y1, x2, y2)
- 裂纹2:类别“纵向裂纹”,位置 (x3, y3, x4, y4)
常用的目标检测模型有两类:
- 两阶段检测器:如Faster R-CNN。先生成候选区域,再分类和回归。精度高,但速度慢。
- 单阶段检测器:如YOLO、SSD。直接回归边界框和类别。速度快,适合实时检测。
我在风电叶片巡检项目中,用的是YOLOv5。为什么?因为无人机巡检需要实时处理,YOLO的速度优势太明显了。当然,精度上需要做一些调优,比如调整锚框大小、数据增强等。
4.2.2 语义分割:像素级分类
语义分割,比目标检测更精细。它要对图像中的每个像素进行分类。输出是一张与输入同尺寸的“分割图”,每个像素点都有一个类别标签。
举个例子,一张叶片图像,语义分割模型会输出:
- 像素点 (100, 200):类别“裂纹”
- 像素点 (300, 400):类别“背景”
常用的语义分割模型:
- FCN(全卷积网络):用卷积层替代全连接层,输出分割图。是语义分割的奠基之作。
- U-Net:编码器-解码器结构,跳跃连接保留细节。适合医学图像和工业缺陷检测。
- DeepLab系列:使用空洞卷积,扩大感受野,捕捉多尺度信息。
语义分割在裂纹检测中有什么用?我举个例子:当裂纹非常细微,目标检测的边界框可能框不准,但语义分割能精确到像素级别,计算出裂纹的长度、宽度、面积。这对叶片结构健康评估至关重要。
避坑指南:我曾经在语义分割任务中,直接用了ImageNet预训练的VGG16作为编码器。结果发现,自然图像和叶片图像的纹理差异太大,迁移效果很差。后来我改用自监督预训练,在叶片数据集上做对比学习,效果好了很多。所以,预训练模型的选择要结合你的数据特点。
4.3 从分类到检测的演进
最后,我们来梳理一下,从图像分类到目标检测,这条路是怎么走过来的。理解了这条演进路线,你就能明白为什么现在的检测模型长这样。
4.3.1 图像分类:起点
图像分类,就是给一张图打一个标签。比如“这张图里有裂纹”或“这张图里没有裂纹”。
经典的分类网络:AlexNet、VGG、ResNet、EfficientNet。它们都是“全图输入,单标签输出”。
但分类有个局限:它不知道裂纹在哪里。如果一张图里有多个裂纹,它只能告诉你“有裂纹”,却说不清有几个、在哪儿。
4.3.2 滑动窗口:从分类到检测的朴素尝试
最早的检测思路很简单:用不同大小的窗口在图像上滑动,对每个窗口做分类。如果窗口内包含裂纹,就输出一个边界框。
这个方法的问题很明显:计算量太大。一张图可能要滑动成千上万个窗口,每个窗口都要跑一次分类网络。速度慢得无法接受。
4.3.3 区域提议:两阶段检测的诞生
为了解决滑动窗口的效率问题,R-CNN(Region-based CNN)出现了。它先用一个“区域提议”算法(如Selective Search)生成几百个候选区域,然后只对这些区域做分类。
R-CNN的改进:
- Fast R-CNN:共享卷积计算,不再对每个候选区域单独提取特征,速度提升。
- Faster R-CNN:用“区域提议网络”(RPN)替代Selective Search,实现端到端训练。
两阶段检测器的核心思想:先粗筛,再精判。精度高,但速度仍有瓶颈。
4.3.4 单阶段检测:YOLO的革命
YOLO(You Only Look Once)的出现,彻底改变了检测的范式。它把检测看作一个回归问题:输入一张图,直接输出边界框和类别概率。
YOLO的核心思想:将图像划分成网格,每个网格负责预测中心点落在该网格内的物体。
YOLO的优势:
- 速度快,可以达到实时(30 FPS以上)。
- 端到端训练,简单高效。
YOLO的劣势:
- 对小物体检测效果不如两阶段方法。
- 网格划分限制了检测精度。
我在风电叶片裂纹检测中,最终选择了YOLOv5的改进版。为什么?因为叶片裂纹往往细长,标准YOLO的锚框设计不太适用。我调整了锚框的宽高比,增加了细长锚框,检测效果明显提升。
4.3.5 从检测到分割:更精细的认知
目标检测之后,语义分割和实例分割(如Mask R-CNN)进一步提升了视觉认知的精细度。从“框出裂纹”到“画出裂纹的轮廓”,这是一个质的飞跃。
为什么需要分割?因为裂纹的形状、走向、宽度等信息,对叶片结构健康评估至关重要。一个边界框只能告诉你裂纹的大致位置,而分割图能告诉你裂纹的精确形态。
演进路线总结:
- 分类:全图标签 → 知道“有没有”
- 检测:边界框 + 类别 → 知道“在哪里、是什么”
- 分割:像素级标签 → 知道“精确形态”
每一步演进,都是对视觉信息更精细的建模。在风电叶片裂纹检测中,我建议根据实际需求选择任务:巡检用检测,评估用分割。
好了,这一章的内容就到这里。CNN的核心概念、目标检测与语义分割的任务定义、从分类到检测的演进路线,我都讲清楚了。下一章,我们会深入讲解数据集的构建与标注,这是模型训练的基础。你想想看,没有高质量的数据,再好的模型也是白搭。