1. 项目背景与核心需求
煤矿井下作业环境具有光照条件差、粉尘浓度高、能见度低等特点,这给安全生产监控带来了巨大挑战。传统监控系统在低照度环境下拍摄的图像往往存在细节丢失、噪声明显、对比度不足等问题,严重影响后续人员检测的准确性。
这个毕设项目的核心目标是通过深度学习技术实现两个关键功能:
- 低光照图像增强:提升井下监控画面的可视性
- 人员检测:在增强后的图像中准确识别作业人员
我在实际煤矿安全系统的开发中发现,单纯使用现成的图像增强算法(如直方图均衡化)往往无法满足井下特殊环境的需求。粉尘散射和点光源照射会形成独特的光学干扰,需要针对性设计处理流程。
2. 技术方案设计
2.1 整体架构设计
系统采用端到端的处理流程:
code复制原始图像 → 低光增强模块 → 目标检测模块 → 可视化输出
我选择Python作为开发语言,主要基于以下考虑:
- OpenCV、PyTorch等库对图像处理支持完善
- 便于部署到煤矿现有的Windows服务器环境
- 丰富的预训练模型资源
2.2 低光照增强模块实现
经过对比测试,最终采用改进的Retinex算法作为基础框架。传统Retinex在井下场景存在三个主要问题:
- 对局部强光源敏感(如矿灯)
- 粉尘造成的散射光处理不足
- 暗区细节恢复效果差
我的改进方案:
python复制def enhanced_retinex(img):
# 多尺度高斯滤波分解
low_freq = gaussian_filter(img, sigma=15)
mid_freq = gaussian_filter(img, sigma=80)
# 自适应权重融合
detail_layer = img - 0.6*low_freq - 0.4*mid_freq
# 粉尘散射补偿
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
hsv[:,:,1] = hsv[:,:,1]*0.7 # 降低饱和度
return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) + detail_layer
2.3 人员检测模块选型
对比测试了三种主流模型:
| 模型 | mAP@0.5 | 推理速度(FPS) | 显存占用 |
|---|---|---|---|
| YOLOv5s | 0.78 | 45 | 2.1GB |
| Faster R-CNN | 0.82 | 12 | 4.3GB |
| SSD300 | 0.75 | 38 | 1.8GB |
最终选择YOLOv5s并进行以下优化:
- 使用K-means重新聚类Anchor box
- 添加注意力模块CBAM
- 采用Mosaic数据增强
3. 关键实现细节
3.1 数据集构建
真实井下数据获取困难,我采用以下方法构建训练集:
- 使用ExDark数据集作为基础
- 通过物理模型模拟井下光学环境:
python复制def simulate_coal_mine(img): # 添加粉尘散射效果 img = cv2.addWeighted(img, 0.7, cv2.GaussianBlur(img,(101,101),0), 0.3, 0) # 模拟点光源照射 h,w = img.shape[:2] center = (w//2, h//3) mask = np.zeros_like(img) cv2.circle(mask, center, 200, (255,255,255), -1) img = cv2.addWeighted(img, 0.8, mask, 0.2, 0) return img
3.2 模型训练技巧
在有限算力条件下(单卡RTX3060),采用这些训练策略:
- 渐进式学习率调整:
- 初始lr=0.01
- 每10个epoch衰减0.1倍
- 早停机制:验证集mAP连续3个epoch不提升则停止
- 混合精度训练:节省30%显存
3.3 系统集成
使用PyQt构建可视化界面,主要功能模块:
mermaid复制graph TD
A[视频输入] --> B[帧提取]
B --> C{低光增强}
C --> D[人员检测]
D --> E[报警判断]
E --> F[结果展示]
4. 实际应用效果
在山西某煤矿的测试数据显示:
- 图像质量指标提升:
- PSNR从18.6dB提升到26.3dB
- SSIM从0.48提升到0.79
- 人员检测准确率:
距离 白天 夜间 <5m 98% 95% 5-10m 92% 87% >10m 85% 76%
5. 常见问题与解决方案
5.1 增强后图像出现光晕
问题现象:在矿灯直射区域周围出现明显光晕
解决方法:
python复制# 在Retinex处理前添加光晕抑制
def suppress_halo(img):
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
# 高光区域检测
_, mask = cv2.threshold(l, 220, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 区域平滑
l = cv2.inpaint(l, mask, 3, cv2.INPAINT_TELEA)
return cv2.cvtColor(cv2.merge((l,a,b)), cv2.COLOR_LAB2BGR)
5.2 密集人群漏检
问题原因:井下交接班时人员密集,目标重叠严重
优化方案:
- 使用DIOU-NMS替代传统NMS
- 添加小目标检测头
- 在训练数据中增加密集场景样本
6. 工程实践建议
-
部署注意事项:
- 井下设备需通过防爆认证
- 建议使用工控机而非普通PC
- 摄像头需具备IP67防护等级
-
性能优化技巧:
- 使用TensorRT加速推理
- 对静态区域启用帧差分法减少计算量
- 采用多进程处理流水线
-
扩展方向:
- 结合UWB定位数据
- 添加行为识别功能
- 开发移动端监控APP
在具体实施时,我发现煤矿井下网络的带宽限制是个容易被忽视的问题。实际部署时建议:
- 在井下部署边缘计算节点
- 采用H.265编码压缩视频流
- 设置动态码率调整策略
