简介:一份关于CNN卷积神经网络在煤矸石自动分选中的学术论文PDF,面向深度学习、机器视觉及矿业智能化方向的研究者与工程师。论文以山西焦煤和肥煤为研究对象,针对传统灰度特征受清洗条件和光照环境影响的问题,提出基于卷积神经网络的自动分选系统,通过多层次提取煤块和矸石的图像纹理特征完成分类,实验准确率达92%。压缩包内含1个PDF文件,整体大小约1.98MB,包含完整论文正文、图表及参考文献,排版清晰,适合直接阅读或打印留存。目前已有338人学习下载。读者可从中获取CNN模型架构、实验数据集处理方式以及煤矸石分选的具体实现思路,既可作为相关课题的参考范本,也能帮助快速理解卷积神经网络在工业视觉识别中的落地应用。
1. 煤和矸石在皮带上是肉眼可分、机器难分的典型场景,CNN 把老师傅的眼神固化成模型
煤炭从井下提升到地面后,第一道要过的关口就是把混在煤流里的矸石挑出去。矸石是采煤过程中夹带的岩石,含碳量低,如果不拣出来,进洗选系统会浪费重介密度、磨损设备,还会拉低商品煤的热值。过去这道工序靠人工在胶带旁手选,劳动强度大、环境粉尘重,近年用工成本越来越高,自动分选成了选煤厂和矿山设备商的刚需。
所谓“基于CNN卷积神经网络的煤矸石自动分选”,就是让工业相机对准输送带上的块煤,用卷积神经网络判断当前石块是煤还是矸石,再把分类结果传给高压气阀或机械臂,在物料下落瞬间把它吹走。这套方案能解决人工拣矸效率不稳定、招工难的问题,适合做块煤干选、原煤预排矸,以及旧产线自动化改造。对算法工程师来说,它又是一个典型的工业图像分类落地场景:硬件环境恶劣、推理延迟敏感、误判代价不对称,比实验室里的 benchmark 麻烦得多。
2. 为什么要用 CNN 做煤矸石分选:图像特征、传统方案对比与网络选型依据
2.1 煤和矸石在可见光图像上到底差在哪
先搞清楚一个最基本的问题:图像里的煤和矸石,凭什么区分?从视觉上看,新鲜煤块表面是黑色或深灰黑色的,带有油脂光泽,块体表面常常能看到裂隙和层理;矸石则复杂得多,常见的有灰白色的砂岩、灰黑色的泥岩、黄褐色的页岩,表面粗糙、光泽弱。问题恰恰在于,矸石的种类多,而且井下采出来的矸石表面往往裹着一层煤粉,让浅色矸石也变成了黑色。所以用“黑就是煤、灰就是矸石”这种简单规则,在现场一定会翻车。
真正稳定可用的特征有三个维度:一是表面纹理的粗糙度,煤块裂隙发育但整体纹理均匀,矸石表面颗粒感强、矿物颗粒边界明显;二是反光特性,煤在合适光照下有明显镜面反射,矸石多为漫反射;三是形状轮廓,块煤破碎后呈多面体,矸石板状、片状比例更高。这些特征在单张图片里都是存在的,但用传统算法去逐条描述,阈值很难定。
CNN 的优势在于,它不要求你手工把“纹理粗糙”写成数学公式。前面几层卷积核自动学会边缘和灰度突变,中间层学会纹理组合,后面全连接层把局部特征汇总成类别判断。只要数据覆盖足够广,网络能学到比人眼规则更鲁棒的判别方式。
2.2 灰度阈值和 SVM+手工特征为什么在煤矸石场景站不住脚
选煤厂早期做图像分选,最常用的就是灰度阈值分割。做法是在固定光照下拍皮带图像,矸石的平均灰度高,煤块的平均灰度低,取一个灰度值 T,小于 T 判煤,大于 T 判矸石。这套逻辑在实验室里能跑通,到井下或筛分楼就出问题:光源老化导致整体亮度漂移、煤尘落在镜头表面造成局部暗角、水雾让煤块反光变成白色高光。灰度阈值本质是在做“全局亮度比拟”,它假设场景光照恒定,这个假设在现场基本不成立。
比阈值高一级的做法是手工特征加传统分类器,这里就要提到 SVM 和 CNN 原理上的差别。SVM 的思路是:你先用 LBP、HOG 或灰度共生矩阵把图像纹理转成几百维特征向量,再找一个超平面把两类分开。这个方案对单块物料的孤立图像是有效的,模型训练速度快,早期很多论文都是这么做的。但到了实际皮带场景,煤流是连续运动的,石块互相遮挡、角度随机、携带煤泥,手工特征的分布会被这些干扰直接拉宽,SVM 的决策边界需要频繁重新标定,维护成本极高。
CNN 走的路线完全不同。它把“特征设计”这一步也变成了可学习的目标,输入是原始像素矩阵,输出是类别概率。卷积操作天然具备平移不变性,石块在皮带哪个位置出现都不影响判断,同时多层卷积叠加出的感受野能综合局部纹理和整体形状。对煤矸石分选这种类别少、但外观扰动大的任务,端到端的表示学习比手工特征现实得多,这也是我在实际项目里放弃 SVM 路线的直接原因。
2.3 CNN 基本结构和煤矸石分选场景下的网络选型
CNN 基本结构无非四件事:卷积层、激活函数、池化层、全连接层。卷积层用一组可学习的核在图像上滑动,每个核负责检测一种局部模式,比如水平边缘、颗粒边界、块状纹理;激活函数(一般用 ReLU)给网络引入非线性,避免多层卷积退化成单层线性变换;池化层做下采样,把特征图缩小,一方面减少计算量,另一方面让网络对微小位移更不敏感;最后的全连接层把特征向量映射到类别数,输出煤和矸石各自的概率。
在主干网络选型上,我的经验是小模型优先,别一上来就套 ResNet50。分选现场用的推理设备一般是工控机配显卡,或者 Jetson 这类边缘盒子,运行环境对功耗和散热都有限制。煤矸石是二分类、输入图像内容相对简单,不需要 ImageNet 那种 1000 类复杂语义的建模能力。我自己惯用的方案是三层卷积加两个全连接的小网络,参数量控制在 50 万以下;如果要求更高精度,用 MobileNetV3 或 ResNet18 做 backbone,不推荐更大的模型。
| 网络方案 | 参数量级 | 单张 224x224 推理耗时(RTX 3060) | 适用场景 |
|---|---|---|---|
| 自建 3 层卷积小网络 | 约 20-50 万 | 约 1-2 ms | 高速皮带、边缘盒子、低成本方案 |
| ResNet18 | 约 1100 万 | 约 3-4 ms | 矸石种类杂、需要迁移学习 |
| MobileNetV3-Small | 约 250 万 | 约 2-3 ms | 平衡精度与速度 |
这里补充一个选型原则:煤矸石分选不是序列问题,不需要像 RNN 或 Transformer 那样建模时序依赖。单帧图像就足够判断一块石头的属性,皮带速度的影响通过触发时机解决,而不是通过网络结构解决。
3. 从矿场到数据集:图像采集、标注规范和预处理代码
3.1 相机选型和现场采集参数:必须先定硬件再定算法
很多团队把精力全花在模型上,相机随便买个工业相机就往皮带上架,这是最典型的翻车起点。煤矸石分选对图像质量有硬性要求:一是分辨率要保证小块矸石在图像里足够清晰;二是快门速度要快到能凝固运动中的石块,否则全是运动模糊;三是补光要稳定,现场不能拉一根日光灯了事。
我的经验参数如下,实际以现场带速和物料粒度换算。物料运动方向的分辨率决定了空间采样精度,通常要求一个像素对应的实际尺寸不超过 1mm,选 500 万像素面阵相机配合 8mm 镜头,在 1 米宽的皮带上勉强够用;如果皮带更宽,优先用线阵相机。快门速度按公式算:曝光时间内物料位移不超过 1 个像素。带速 1.5m/s 时,曝光时间要压到 0.6ms 以内,所以必须用带全局快门的工业相机,不能用卷帘快门的民用摄像头,否则石块在高速运动下会倾斜变形。
| 参数项 | 建议值 | 说明 |
|---|---|---|
| 相机类型 | 面阵全局快门 / 线阵相机 | 卷帘快门会产生运动畸变 |
| 分辨率 | 单像素映射尺寸 ≤ 1mm | 保证 30mm 以下小块矸石可辨 |
| 曝光时间 | ≤ 0.6ms(带速 1.5m/s 时) | 以物料位移不超过 1 像素计算 |
| 镜头 | 定焦工业镜头,光圈 F4-F8 | 不要自动光圈,避免亮度漂移 |
| 补光 | 白色 LED 条形光源,恒流驱动 | 频闪光源会引入条纹伪影 |
| 触发方式 | 编码器脉冲触发 / 软触发 | 保证石块图像位置与后续阀门位置对应 |
光源布局上,我一般用两侧 45 度照射加顶部漫射光的组合,减少煤块表面的镜面反射直射进镜头。煤本身就是高反光物体,正面强光打上去会形成大片白色光斑,把纹理细节完全淹掉。如果现场粉尘特别大,还要给镜头加压缩空气吹扫,这个细节直接影响长周期运行的稳定性。
3.2 标注规范和数据集划分:单类别分类即可,不需要画框
煤矸石分选的标注比目标检测简单。物料在输送带上基本是单层、离散分布的,算法只需要判断“这一块煤区域是煤还是矸石”,不需要定位,所以标注按图像分类做就行,每张图一个标签,文件夹结构就是标签。
dataset/ ├── train/ │ ├── coal/ # 精煤或原煤块,约 8000 张 │ ├── gangue/ # 矸石,约 8000 张 │ └── other/ # 木板、锚杆、铁丝、塑料等杂物,约 500 张 ├── val/ │ ├── coal/ # 约 1000 张 │ ├── gangue/ # 约 1000 张 │ └── other/ # 约 100 张 └── test/ ├── coal/ # 独立时间批次采样,不与 train/val 同批 ├── gangue/ └── other/这里要重点说明“other”类。实际皮带上的干扰物远超煤和矸石两种,拉架用的木板、锚杆托盘、剥落的铁丝网、煤泥团,甚至工人扔掉的矿泉水瓶都会进入视野。我见过很多项目只分两类,结果是木板被误判成矸石被吹掉、铁丝误判成煤放进精煤。加一个杂物类别,模型才有机会把背景支撑区域和真正的煤矸石分开。
数据集的规模没有绝对下限,我的建议是每类干净样本至少 3000 张起步,宁可比这个多不要少。采集时注意覆盖不同班次、不同天气、不同煤质。如果只有白天采的样本,到了夜间灯光下模型效果就会打折。更关键的是验证集和测试集不能随机混分,煤矿是一个连续生产过程,同一批次采集的照片高度相关,随机划分会让模型“偷看”到测试集信息。正确做法是按采集时间切分,比如前三天的数据做训练集,第四天做验证集,再往后独立几天做测试集,用数据时间分布模拟真实部署后的分布漂移。
3.3 数据预处理与增强代码:让模型见够现场的脏和乱
图片采集回来是 1920x1080 或更高分辨率,不能直接喂给网络。第一步是裁剪出皮带区域,把托辊、机架这些无关背景裁掉,既减少计算量又避免模型学到“皮带边缘=矸石”这种假特征。第二步是缩放到固定尺寸,同时保持煤块比例不变形。第三步是归一化,把像素值从 0-255 缩放到网络容易优化的范围。
数据增强是煤矸石项目的命脉。这里的增强不是为了凑数量,而是为了模拟真实环境的干扰:照明波动、传感器噪声、石块姿态变化。
import albumentations as A from albumentations.pytorch import ToTensorV2 # 训练集增强 train_transform = A.Compose([ A.Resize(height=224, width=224), A.HorizontalFlip(p=0.5), # 石块姿态随机翻转 A.Rotate(limit=15, border_mode=0, p=0.8), # 模拟输送带上角度变化 A.RandomBrightnessContrast( brightness_limit=0.2, contrast_limit=0.2, p=0.8 # 模拟现场光照漂移 ), A.GaussNoise(var_limit=(5.0, 30.0), p=0.5), # 模拟低照度下传感器噪声 A.CLAHE(clip_limit=2.0, tile_grid_size=(8, 8), p=0.3), # 增强局部纹理细节 A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ToTensorV2(), ]) # 验证集只做尺寸调整和归一化,不做随机增强 val_transform = A.Compose([ A.Resize(height=224, width=224), A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ToTensorV2(), ])这套增强策略有明确的针对性。水平翻转模拟石块在皮带上的朝向不定,旋转角度只给 15 度而不是 90 度,因为大角度旋转会让煤块的长宽比失真,反而引入错误样本。亮度对比度扰动是最重要的一个,现场灯光老化或换灯泡都会造成整体亮度偏移,不加这个增强,模型遇到稍微暗一点的图就会误判。高斯噪声模拟的是暗光环境下的 CMOS 噪声,低到中等强度即可,噪声过强会破坏纹理结构。
值得注意的一个细节是预应力:煤矸石分类本质是纹理判别,CLAHE 增强能放大矸石表面的颗粒边界与煤块裂隙之间的差异,对提高小模型表现有明显帮助。但 CLAHE 不能加在验证集上,否则你评估的是增强后的效果,而不是模型在原始采集图上的真实能力。
4. 用 PyTorch 训练一个可用的煤矸石 CNN 分类器:网络结构、训练参数和评估指标
4.1 搭建轻量 CNN 模型:给边缘设备留足推理余量
训练框架我选 PyTorch,生态成熟、部署到 ONNX 方便。模型的搭建遵循“前段卷积提特征、后段分类出概率”的标准套路,重点在控制参数量和计算量。
import torch import torch.nn as nn class CoalGangueNet(nn.Module): """ 轻量级 CNN:3 个卷积块 + 自适应池化 + 两层全连接 输入: (batch, 3, 224, 224) RGB 图像 输出: (batch, 3) 煤 / 矸石 / 杂物 三分类 logits """ def __init__(self, num_classes=3): super().__init__() self.features = nn.Sequential( # 第一层: 提取低级边缘和灰度突变特征 nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(32), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # 112x112 # 第二层: 组合纹理模式 nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # 56x56 # 第三层: 高阶局部特征 nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(128), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=2, stride=2), # 28x28 ) self.classifier = nn.Sequential( nn.AdaptiveAvgPool2d(1), # 全局池化,不限制输入尺寸 nn.Flatten(), nn.Linear(128, 64), nn.ReLU(inplace=True), nn.Dropout(0.3), # 防止过拟合 nn.Linear(64, num_classes), ) def forward(self, x): x = self.features(x) x = self.classifier(x) return x这个结构的设计逻辑是:每经过一个卷积块,通道数翻倍(32→64→128),空间尺寸减半(224→112→56→28),在信息提取和计算代价之间取平衡。卷积核全部用 3x3,这是 VGG 证明过的组合:两个 3x3 堆叠等价于一个 5x5 的感受野,但参数量更少。BatchNorm 在这个任务里很重要,煤矸石图像的光照波动大,输入分布不稳定,BN 能缓解内部协变量偏移,让训练收敛更快。
最后用 AdaptiveAvgPool2d 把 28x28 的特征图压缩成 128 维向量,好处是模型对输入尺寸不敏感,部署时即使把分辨率降到 160x160,网络结构也不用改。Dropout 放在全连接前,配合后续的数据增强,能压一压训练集噪声带来的过拟合。因为类别是 3 个,输出层的神经元数量就是 3。
4.2 训练循环和关键超参数:类别不平衡是第一个要解决的问题
煤矸石现场占比经常是煤多矸石少,如果直接用原始分布训练,模型会趋向于把一切预测成煤,因为这样能拿到很高的整体准确率。处理办法是给损失函数加类别权重,让少数类被误分时产生更大的惩罚。
import torch.optim as optim from torch.utils.data import DataLoader # 假设 train_loader 返回 (images, labels) # labels: 0=煤, 1=矸石, 2=杂物 # 统计训练集中各类样本占比后设置权重 class_counts = torch.tensor([8000, 8000, 500], dtype=torch.float) total_count = class_counts.sum() # 权重与样本数成反比,同时做归一化 class_weights = total_count / class_counts class_weights = class_weights / class_weights.sum() * 3 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = CoalGangueNet(num_classes=3).to(device) criterion = nn.CrossEntropyLoss(weight=class_weights.to(device)) optimizer = optim.AdamW(model.parameters(), lr=1e-3, weight_decay=5e-4) scheduler = optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=30, eta_min=1e-5) num_epochs = 30 best_val_acc = 0.0 for epoch in range(num_epochs): model.train() running_loss = 0.0 for images, labels in train_loader: images, labels = images.to(device), labels.to(device) optimizer.zero_grad() outputs = model(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() * images.size(0) # 每个 epoch 结束后在验证集上评估 model.eval() correct, total = 0, 0 with torch.no_grad(): for images, labels in val_loader: images, labels = images.to(device), labels.to(device) outputs = model(images) _, predicted = torch.max(outputs, dim=1) total += labels.size(0) correct += (predicted == labels).sum().item() val_acc = correct / total print(f"Epoch {epoch+1:02d} | Loss {running_loss/len(train_loader.dataset):.4f} | Val Acc {val_acc:.4f}") if val_acc > best_val_acc: best_val_acc = val_acc torch.save(model.state_dict(), "coal_gangue_best.pth") scheduler.step()超参数不是拍脑袋定的。学习率 1e-3 搭配 AdamW 是工业项目的常用起点,weight_decay 设 5e-4 防止大模型权重过大,CosineAnnealing 让学习率在后半段平滑降低,帮助收敛到更平坦的极小值。类别权重的计算逻辑在上面代码里写得很清楚:用总数除以各类数量得到反比权重,再归一化到均值为 1,这样整体损失量级不会因为权重调整而大幅变化。
训练轮数 30 是基于数据量在万张级别、网络只有几十万参数的判断。如果你的数据量只有两三千张,可能 15 轮就过拟合了,这时候要盯着验证集准确率来早停,不要机械地跑满 30 轮。保存模型时用验证集准确率最高的那一轮,而不是最后一轮,这是防止训练尾部过拟合的标准操作。
4.3 评估指标:选煤厂不关心准确率,关心“矸石带出率”和“精煤回收率”
模型训练完,打印一个整体准确率是很自然的事,但到现场汇报时,选煤厂的技术负责人追问的往往是两个问题:矸石有没有被大比例挑走,精煤有没有被误吹掉。这两个需求对应的是召回率和精确率。
| 指标 | 计算方式 | 在这个场景的含义 |
|---|---|---|
| 矸石带出率(召回率) | 被正确识别的矸石数 / 实际矸石总数 | 越高越好,漏掉的矸石会混入精煤 |
| 精煤回收率(1 - 误吹率) | 被保留的精煤数 / 实际精煤总数 | 越高越好,误吹一吨精煤是直接经济损失 |
| F1 分数 | 精确率与召回率的调和平均 | 综合衡量两类错误,适合调阈值 |
| 混叠矩阵 | 每类真实标签 vs 预测标签 | 定位是哪一类在混淆 |
在代码里实现这些指标不复杂,关键是理解一个点:softmax 输出的类别概率本身不代表最优决策。模型输出煤的概率 0.51、矸石概率 0.49,默认取最大概率会判成煤,但在现场你可能更希望把阈值提高到 0.7,只有概率超过 0.7 才送气阀吹除。这就是阈值偏好问题:提高吹除阈值会减少误吹但增加漏选,降低阈值则反过来。我一般会在验证集上扫一遍 0.5 到 0.9 的阈值,把精确率-召回率曲线画出来,让选煤厂根据煤价和矸石处理成本自己选工作点。
5. 煤矸石分选训练与部署避坑记录:五个真实场景的排查思路
5.1 训练 Loss 降得很快,一到现场识别率就崩
现象:在实验室整理的数据集上训练,验证集准确率能做到 97%,模型装到现场后,在皮带上实际测试只有 70% 出头的准确率,矸石漏报一大堆。
原因:训练集是“干净”的静态石块照片,现场是运动中的、带粉尘的、伴随强烈震动和光斑的连续图像。实验室采集时石块是摆拍的,表面清洁;现场石块从筛分机落下,扬起煤尘,甚至表面沾着水雾。模型学到的特征分布和现场分布不一致,准确率自然跳水。
解决:最有效的办法是训练集里必须混入现场图像。设备安装后,用正式相机在运行皮带上采集连续图像,按帧切成训练样本,重新微调模型。这里有一个经验比例:现场数据至少要占训练集的三分之一,否则分布偏移依然压不住。在预处理里做标准化用的均值和方差,也应改成现场图像的统计数据,而不是直接用 ImageNet 的默认值。
5.2 煤和矸石外观接近时,模型准确率卡在 60% 上不去
现象:遇到底层煤炭矸石中含碳量偏高(炭质泥岩、炭质页岩),矸石表面发黑,和煤块几乎看不出区别,模型再怎么调参,准确率都在 60%-65% 之间挣扎。
原因:可见光图像本身携带的判别信息不足。当矸石表面被煤粉覆盖且自身灰分较低时,两者在 RGB 空间的距离很小,卷积网络提取的纹理特征也无法可靠区分,因为它们在图像上真的长得像。
解决:如果换硬件来得及,优先换短波红外相机或双光谱相机。煤和矸石在短波红外波段(900-1700nm)的吸收特性差异明显,这个差异是基于物质成分的,不受表面颜色影响。如果硬件不能换,只能退而求其次:用多张不同角度补光图像合成光照归一化特征,或者对图像做边缘增强放大裂隙差异,再配合现场抽检人工复核,本质上治标不治本。
5.3 验证集 98%,测试集 85%,差出了“隐藏的 13 个点”
现象:训练完成后,划分出来的验证集准确率亮眼,但当用另一批从现场新采集的图像测试时,性能明显衰减,衰减幅度不是一个点两个点,而是十几个点。
原因:验证集和训练集来自同一时间段、同一批煤质的照片。这些照片在背景、光照、煤质上高度相似,模型等效于已经看过验证集的“近似副本”。随机划分让这种情况尤其严重,因为同一块煤的不同角度照片可能分别进了训练集和验证集。
解决:数据集划分必须按时间批次和矿点分组。比如一号煤矿连续三天采集的数据统一进训练集,二号煤矿同三天采集的数据进验证集,后面再攒一周数据做测试集。这样评估的是模型面对不同煤层、不同开采条件下的真实泛化能力。划分方案定下来后,整个项目周期内不要频繁调整,否则你优化的其实是验证集本身。
5.4 模型识别延迟 5ms,但执行机构总是吹偏
现象:网络推理速度快得惊人,单张图片只有几毫秒,但实际分选时气阀启动位置总是差一截,要么提前吹掉前一块煤,要么吹空,现场看起来是“瞎吹”。
原因:只优化了模型延迟,忽略了整个系统的链路时序。相机曝光、图像传输、预处理、推理、结果写入缓存、串口通信、阀组响应,每一步都有耗时。更麻烦的是物料在相机视野中心和阀组执行位置之间有物理距离,物料以带速在运动,信号到达阀门时,目标石块已经不在原来的位置了。
解决:建一张时间预算表,把每个环节的耗时折算成物料位移。带速 1.5m/s,若总延迟 30ms,物料已经向前走了 45mm。第一步是尽量压缩各环节延迟;第二步是让相机触发信号与皮带编码器同步,用脉冲计数确定每个石块的物理位置;第三步是把软定时参数做成可调,在现场用已知颜色的试验块反复校准“触发提前量”。这一步做不好,模型再准都没有意义。
5.5 标注错误太多,模型学到的是标注员的“个人习惯”
现象:训练过程中损失能收敛,但混淆矩阵里煤和矸石的错误分布很不均衡,而且更换标注人员后,模型的性能会突然变化。
原因:煤矸石边界本身存在模糊地带。含碳量低的煤和含碳量高的矸石在外观上是一条连续过渡,标注时如果标准不统一,不同的人对同一张图会给出不同标签。模型会去拟合标注员的个人倾向,而不是客观的煤矸分类边界。
解决:提前写清楚标注细则,不能只给“煤”“矸石”两个词。细则要定义:表面可见明显矿物颗粒但整体呈黑色的石头怎么标?带煤皮包裹的矸石怎么标?水湿导致反光的煤块怎么标?我建议把所有边界案例收集出来做成一份示例图集,标注员先看示例图再开工。训练过程中还要定期抽检标注质量,用模型预测结果和人工标签对比,把差异大的图挑出来重新核验,这种方法能一次性发现大量系统性错标。
6. 从“能识别”到“能分选”:在线联动验证和持续迭代的正确姿势
6.1 算清“识别到执行”的时序账:这是现场能否落地的分水岭
模型在服务器上推理准确率再高,如果联动时序不对,分选效果依旧是零。我习惯在安装调试阶段就把整条信号链路的延迟量一遍,写成一张明确的表格贴在配电柜里:相机曝光时间、图像数据传输耗时、预处理耗时、网络推理耗时、控制指令下发耗时、气阀电磁阀启动时间。每个环节都按最坏情况估,然后加总。
举例来说,带速 1.5m/s,相机视野中心到阀组吹嘴的安装距离是 1.2 米,物料从被拍到到达阀组的时间是 800ms,减去总链路延迟 50ms,还剩 750ms 的可控窗口。这 750ms 就是触发提前量的设定基础。如果皮带速度波动大,必须接编码器做动态补偿,不能按固定延时处理。现场验证方法很简单:往皮带上放几个特定颜色的矸石样本,观察吹嘴位置和实际落点是否一致,来回调整提前量,直到命中率稳定在可用水平。
6.2 周期性掺配测试:用“已知答案”检验模型衰减
模型上线后不是一劳永逸。煤质随着采掘工作面推进在变化,镜头会脏,光源会衰减,这些都会导致模型性能缓慢下滑。我养成的习惯是每月做一次掺配测试:准备 50 块已知矸石和 50 块已知精煤,按固定比例均匀混入生产皮带,统计分选系统实际吹出的矸石数量和误吹的精煤数量,记录成一张趋势表。连续几个月数据对比,就能清晰看到模型是否在退化,提前安排重新训练和数据采集,而不是等现场反馈“最近选不干净了”。
这种做法相当于给模型建立了一道定期的“体检”:掺配样比例是已知答案,系统的实际输出与理论期望的偏差就是模型和机械整体的健康度指标。部署一年以上的系统,我见过很多都是靠这个办法维持性能长稳的。
最后说一个我做煤矸石项目的习惯:现场测试只信皮带上的实测数据,不信机房的验证集准确率。每次调整完模型,我都会先跑一轮掺配测试,确认误吹率没有上升,再继续下一步优化。分选系统的成本结构里,误吹一吨精煤比漏选一吨矸石要亏得多,这个优先级在调参时要时刻拎清。这条路我从模型搭建一直走到联动调试,希望你走的时候,能少绕几个我当年绕过的弯。希望帮到你。
本文还有配套的精品资源,点击获取