用 AI 做缺陷检测,关键点到底在哪?------从一次「公开数据集翻车」说起
三句话看懂今天:
- 用 AI 做缺陷检测,真正决定「能不能检得出」的,是数据处理,不是算法,也不是把模型塞进板子。
- 我们拿一个出名的公开超声数据集训缺陷二分类,AUC 只有 0.52~0.63------跟瞎猜一个水平。
- 换成「真实噪声 + 物理缺陷回波」的半仿真路线后,AUC 直接到 0.976 ,一个 110KB 的小模型做到 93.5% 准确率,还顺带拿到了能对外讲的 POD 曲线。
一、翻译器:先解决「这词儿啥意思」
| 技术词 | 说人话 | 本文里它干什么 |
|---|---|---|
| 缺陷检测 AI | 让机器自动看/听出来东西坏没坏 | 本文讨论的核心:这类项目的关键点到底在哪 |
| 公开数据集 | 别人录好、标好的一堆样本 | 我们第一次尝试的数据来源,结果翻车了 |
| AUC | 猜硬币(0.5)到火眼金睛(1.0)之间 | 衡量「能不能分开好坏」的核心指标 |
| 半仿真 | 真的环境录音 + 合成的说话声 | 真实噪声背景 + 物理模型算出来的缺陷回波 |
| 标签 / 标注 | 标准答案 | 决定模型学不学得对,比模型本身更致命 |
| RK3568 NPU | 一块便宜的边缘计算芯片 | 我们把模型部署上去实测的那块板子 |
| POD 曲线 | 多大的毛病有多大概率被抓到 | 超声领域的标准验收方式,不是我们自己发明的 |
二、先抛结论:数据处理才是关键
一句话:算法是货架上的货,部署是把货送到现场的车,只有「数据里有真信号、标签是真」这件事实实在在长在土里。
很多人(包括我一开始)会本能地把注意力放在两端:
- 一端是「模型够不够花」------ ResNet?Transformer?要不要上预训练?
- 一端是「能不能上板」------ 量化、NPU、实时性、功耗。
但我们在超声缺陷检测这个项目里,从头到尾最大的卡点、最关键的转折、最值钱的经验,全在**中间那段没人爱聊的「数据处理」**上。
下面用我们项目的真实数字,把三个阶段摆在一起比一比。
三、三阶段关键度对比
柱高 = 对「能不能检出缺陷」的决定性。
| 阶段 | 对结果的决定性 | 我们的真实情况 | 一句话定性 |
|---|---|---|---|
| 数据处理 | ★★★★★ 决定生死 | 真实数据 AUC 0.52 → 半仿真 0.976;标签 100% 精确 | 关键·决定生死 |
| 算法训练 | ★★★ 重要但可商品化 | 小 CNN 跑 30 轮即 93.5%,架构不是瓶颈 | 重要·可商品化 |
| 部署板子 | ★★ 必要但下游 | RK3568 NPU 1.16ms/条(861 条/秒),与 PC 一致率 100% | 必要·下游通道 |
3.1 数据处理:决定生死
这是整篇文章最想讲清楚的一点。
我们第一次拿到的,是超声领域最出名的公开数据集之一(相控阵 FMC 全矩阵,256×256×100 的 UInt16)。
先花大力气把数据弄下来(直连被墙、限速,最后靠 API 分段续传),然后做探查,结果触目惊心:
把扫描按「有无缺陷」分组,逐条归一化后比差异:
轴 0(256 点):组间平均差异 0.6%,最大 3.3%
轴 1(256 点):组间平均差异 1.7%,最大 7.2%
相邻行相关系数:-0.035 相邻列相关系数:0.102
16×16 收发矩阵:对角线能量 / 非对角线能量 = 0.87
把能想到的 A 扫合成方式全试了一遍,AUC 全在 0.48~0.63 之间。0.5 就是瞎猜。
为什么会这样?三个硬伤:
- 形态根本不是 A 扫。它是收发组合矩阵,是相控阵原始采集数据,不是工人屏幕上的那条波形。
- 缺陷回波被相位抵消了。FMC 是「每个阵元发射、所有阵元接收」,缺陷回波到达各阵元时间不同,直接相加波峰对波谷、互相抵消。要聚焦得做 TFM,但数据里没有几何参数。
- Clever Hans 风险。那个数据集的缺陷是「虚拟缺陷」叠加上去的,模型可能学到的是拼接痕迹而非缺陷本身。
这一步如果硬扛过去,后面就是「部署一台猜谜机器」。
转折点出现在我们换路线:半仿真------真实噪声纹理(从那个公开数据集里取,但只取噪声背景)+ 物理公式注入缺陷回波。
python
背景噪声 ← 从实测数据取,保留真实材料晶粒散射纹理
缺陷回波 ← 按物理模型注入,位置 = 2d/c,幅值 ∝ φ²/d
始波/底波 ← 按声程摆到对应采样点
因为缺陷是我们自己按公式放进去 的,位置、深度、尺寸 100% 知道 → 标签 100% 精确。这一步,是整个项目真正的分水岭:AUC 从 0.52 跳到 0.976。
没有这一步,后面一切免谈。
3.2 算法训练:重要,但可商品化
模型本身我们用了个很小的 CNN(4 个卷积块 + 全局池化 + 两层全连接),没有任何花哨架构。
训练 40000 条、30 个 epoch,CPU 上约 2 分钟训完:
| 指标 | 数值 |
|---|---|
| 准确率 | 93.48% |
| AUC | 0.9764 |
| 缺陷召回率 | 91.31% |
| 精确率 | 95.38% |
| 模型体积 | 110 KB |
我的判断很直白:这类「波形/信号二分类」,现成卷积网络就够了,架构不是护城河。 真正拉开差距的,是喂进去的数据有没有真信号、标签真不真。算法是「谁都能请到的标准化工人」。
3.3 部署板子:必要,但属于下游
这一步我们也实打实做了------把模型转到 RK3568 的 NPU 上真机跑:
| 环节 | 结果 |
|---|---|
| PC 推理(onnxruntime) | ✅ 0.068 ms/条,14651 条/秒 |
| ONNX → RKNN 转换 | ✅ toolkit2 1.5.0,FP16,77.6 KB |
| RK3568 NPU 推理 | ✅ 1.16 ms/条(861 条/秒) |
| 端到端(含取数) | ✅ 1.20 ms/条(836 条/秒) |
板端 1000 条独立测试集:准确率 93.3%,与 PC 端逐条比对一致率 100%,logits 平均误差仅 0.22%------证明转换没搞坏模型。
但必须说清楚:部署再快,模型是瞎猜也没用;模型对了,部署慢点也能迭代。部署是把已经能检出的模型接通到边缘端,属于「交付通道」,不是「决定能不能检出」的环节。
(顺带一个坑:RKNN 1.5.0 拒「某一维特别小」的输入,最早想用 (1,1,1,256) 被拒,最后把 256 点每点重复 4 次铺成 32×32 正方形图才过。这是工程细节,不是认知层面的关键点。)
四、用我们那个超声项目当证据(小结)
把上面三段的证据压缩成一条时间线:
拿真实公开数据训 → AUC 0.52(瞎猜) → 项目不成立
换半仿真数据 → AUC 0.976(火眼金睛)→ 项目活了
小 CNN 训 30 轮 → 93.5% 准确率 → 架构无巧思
部署到 RK3568 NPU → 1.16ms/条、861 条/秒 → 工程搞定
注意看:决定这个项目生死的,是第 1→2 步那一下「数据换路」。第 3 步和第 4 步,是「数据对了之后顺理成章的事」。
五、一个重要的 nuance:关键点 = 当前最大的瓶颈
别把「数据处理是关键」记成绝对真理。更准确的说法是:关键点 = 当前最大的瓶颈在哪。
- 你这种「非标准传感器 + 弱信号」的工业缺陷场景(超声、振动、声学、某些红外):数据几乎永远是瓶颈。真实信号弱、标注贵、分布乱,数据处理(含数据生成、标注、分布对齐)就是生死线。
- 图像分类 / 常见视觉(数据海量、标签易得):算法架构 + 部署延迟/功耗会更决定性。
- 要上线卖钱的产品:部署的实时性、可靠性、成本就是生死线------模型再准,跑不动、贵到用不起,也上不了市。
所以这篇文章的结论不是「数据永远第一」,而是:先找到你这个项目当前最卡的那一环,把资源砸在那。 而我们这个超声缺陷项目,从头到尾最卡的就是数据。
六、给工程师的三条实操建议(都是踩出来的)
- 先花 20% 精力验证「数据里到底有没有可学的信号」,再花 80% 搭模型。我们复算过:真实数据缺陷组和正常组差异 <2%,直接训就是白干。一个「分组对比 + AUC 探底」的探查脚本,能帮你提前一个月发现数据废了。
- 标签的可靠性 > 标签的数量。 半仿真之所以管用,不是因为数据多,而是因为标签 100% 精确(缺陷是我们自己放的)。真实数据若标签存疑,宁可用合成数据把信号学对,也不要拿脏标签硬喂。
- 部署别上头,但别拖到最后。 部署是下游,但 RKNN 形状限制、量化掉点这类坑,最好在设计模型时(输入输出形状、算子选择)就提前规避,别等训完才发现有维度被拒。
说人话通俗易懂版
三句话看懂今天
- 用 AI 找毛病,最要命的不是「模型多厉害」,也不是「能不能装进小芯片」,而是「喂进去的数据里到底有没有真毛病、答案标得对不对」。
- 我们最开始用的公开数据,试了五种办法都跟猜硬币差不多(AUC 0.5)。
- 换成「真环境录音 + 按规律算出来的毛病声」之后,一个小 AI 就准了,还能说出毛病在哪一层。
翻译器
| 听到的词 | 换成你家的话 | 今天这个数是好是坏 |
|---|---|---|
| 缺陷检测 AI | 让机器自动看/听出来东西坏没坏 | --- |
| 公开数据集 | 别人录好、标好的一堆样本 | 坏:噪声太大,分不出来 |
| AUC 0.52 | 猜硬币的水平 | 坏:等于白干 |
| 半仿真 | 真录音 + 合成的说话声 | 好:知道答案才能练 |
| 标签 100% 精确 | 标准答案一个没错 | 好:学得对 |
| 小 CNN 模型 | 一个普通但够用的师傅 | 好:不挑人 |
| RK3568 NPU 1.16ms | 小芯片上一秒查 861 次 | 好:够快够省 |
生活类比串讲
想象你开了家只有一个收银台的小超市(这就是边缘设备,算力有限、不能乱来)。
- 数据处理 = 供货。供应商送来的货里,到底有没有真东西、标签对不对。如果供应商把空箱子当满箱子送来(真实数据里缺陷信号被抵消、答案不可信),你后面再怎么折腾,都是在卖空箱子。
- 算法训练 = 你请的收银员手艺。这活儿是标准化的,市面上随便请一个都会(现成的卷积网络)。手艺重要,但不是你能不能开张的决定因素。
- 部署板子 = 把货和人都搬进那个小超市、让收银台转起来。必要,但它干的是「把已经做好的事搬到现场」,不是「决定卖不卖得出去」的环节。
关键在哪一看就明白:货不对板,收银再快也是白忙;货对了,搬进小超市就能卖。
我们那个超声项目,最开始的「公开数据」就是送来的空箱子------试了五种办法都分不出好坏;后来换成「真环境录音 + 按物理规律算出来的毛病声」,等于自己把控了供货、答案一个不错,小 AI 一下就灵了。
记住这一句就够了
用 AI 做缺陷检测,数据决定「检不检得出」,算法决定「检多准」,部署决定「能不能用上」------而你这项目最卡的,多半是数据那一关。
下一篇预告
- 把二分类扩成「分类 + 深度回归」联合输出(现在深度靠峰值检测算,让网络直接学更稳)
- 加入「伪缺陷」样本(焊缝根部几何反射这类不是缺陷但长得像的信号)------这才是真实检测里最考人的部分