《博主简介》
小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!
《------往期经典推荐------》
一、AI应用软件开发实战专栏【链接】
项目名称 | 项目名称 |
---|---|
1.【人脸识别与管理系统开发】 | 2.【车牌识别与自动收费管理系统开发】 |
3.【手势识别系统开发】 | 4.【人脸面部活体检测系统开发】 |
5.【图片风格快速迁移软件开发】 | 6.【人脸表表情识别系统】 |
7.【YOLOv8多目标识别与自动标注软件开发】 | 8.【基于YOLOv8深度学习的行人跌倒检测系统】 |
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】 | 10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】 |
11.【基于YOLOv8深度学习的安全帽目标检测系统】 | 12.【基于YOLOv8深度学习的120种犬类检测与识别系统】 |
13.【基于YOLOv8深度学习的路面坑洞检测系统】 | 14.【基于YOLOv8深度学习的火焰烟雾检测系统】 |
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】 | 16.【基于YOLOv8深度学习的舰船目标分类检测系统】 |
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】 | 18.【基于YOLOv8深度学习的血细胞检测与计数系统】 |
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】 | 20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】 |
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】 | 22.【基于YOLOv8深度学习的路面标志线检测与识别系统】 |
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】 | 24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】 |
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】 | 26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】 |
27.【基于YOLOv8深度学习的人脸面部表情识别系统】 | 28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】 |
29.【基于YOLOv8深度学习的智能肺炎诊断系统】 | 30.【基于YOLOv8深度学习的葡萄簇目标检测系统】 |
31.【基于YOLOv8深度学习的100种中草药智能识别系统】 | 32.【基于YOLOv8深度学习的102种花卉智能识别系统】 |
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】 | 34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】 |
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】 | 36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】 |
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】 | 38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】 |
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】 | 40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】 |
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】 | 42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】 |
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】 | 44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】 |
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】 | 46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】 |
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】 | 48.【车辆检测追踪与流量计数系统】 |
49.【行人检测追踪与双向流量计数系统】 | 50.【基于YOLOv8深度学习的反光衣检测与预警系统】 |
51.【危险区域人员闯入检测与报警系统】 | 52.【高压输电线绝缘子缺陷智能检测系统】 |
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
引言
本文主要介绍一个开源的C2PNet去雾算法的使用。这篇文章主要研究了单图像去雾问题,并提出了一个新的去雾网络C2PNet。C2PNet使用了课程对比正则化和物理感知的双分支单元来提高去雾模型的解释性和性能。文章首先介绍了去雾问题的挑战,然后详细阐述了C2PNet的设计原理和实现方法,包括物理感知双分支单元和共识负样本对比正则化。最后,通过在合成数据集和真实世界数据集上的定量评估,证明了C2PNet在去雾性能上的优越性。
去雾效果
基本原理
C2PNet(Curricular Contrastive Regularization for Physics-aware Single Image Dehazing Network)的设计原理和实现方法如下:
1. 物理感知双分支单元(Physics-aware Dual-branch Unit, PDU):
- 设计背景:传统的单张图像去雾方法要么在原始空间直接估计未知因素(传输图和大气光),要么在特征空间中忽略这些物理特性。为了结合物理模型的优势并避免累积误差,设计了PDU。
- 原理:基于大气散射模型,PDU将传输图和大气光的估计任务分配给两个并行的分支,每个分支分别学习与相应物理因素相关的特征表示。这样可以更精确地合成符合物理模型的潜在清晰图像。
- 实现:通过一系列卷积层和非线性激活函数,两个分支各自提取图像特征,然后通过加权求和的方式结合这些特征,最终得到去雾化的图像输出。
2. 共识负样本对比正则化(Consensual Contrastive Regularization, CR):
- 设计背景:为了提高特征空间的可解释性和引导网络学习更有区分度的特征表示,引入了基于对比学习的正则化方法。
- 原理:对比学习的核心思想是区分正样本对(锚点与其正样本)和负样本对(锚点与其负样本)。在去雾任务中,正样本对是指同一场景下的清晰图像和模糊图像,负样本对则是不同场景下的清晰图像。通过最小化正样本之间的距离和最大化负样本之间的距离,可以约束解决方案的空间,从而提高去雾效果。
- 实现:在训练过程中,对于每个清晰图像和对应的模糊图像对,网络会学习一个对比损失函数。这个损失函数会随着训练进程动态调整,以平衡正样本和负样本的贡献。具体来说,容易区分的样本(例如,PSNR大于30的样本)会被视为“容易的”样本,而其他样本则被视为“非容易的”样本,并给予更高的权重。这样,网络就会首先学习到容易样本的特征,然后再逐渐聚焦于更难以区分的样本,从而实现一种渐进式的学习策略。
3. 网络整体结构:
- C2PNet由多个PDU模块串联而成,形成一个多阶段的去雾网络。每个PDU模块负责处理输入图像的不同分辨率版本,从而逐步恢复出高分辨率的清晰图像。在每个PDU模块中,都会对输入图像执行上采样操作,以逐渐重建出全分辨率的清晰图像。
4. 训练策略:
- 除了传统的L1损失用于直接衡量网络预测的去雾图像和真实清晰图像之间的差异外,C2PNet还采用了CR作为正则化手段来提升特征学习的质量。
- 在训练过程中,网络会为每个清晰图像和其对应的模糊图像对生成对比损失。同时,为了使网络能够从难易程度不同的样本中学习到有效的特征表示,网络会根据样本的难度动态调整对比损失的权重。
5. 实现细节:
- C2PNet使用PyTorch 1.11.0在NVIDIA RTX 3090 GPU上实现。
- 为了评估C2PNet的效果,论文中使用了多个合成数据集和真实世界的去雾数据集,并与其他几种先进的去雾算法进行了比较。实验结果表明,C2PNet在各种数据集上均取得了领先的性能。
总结,C2PNet的设计原理在于结合物理模型和对比学习正则化来提升单张图像去雾的效果。通过物理感知双分支单元对传输图和大气光进行分别建模,以及通过共识负样本对比正则化引导网络学习更加鲁棒和有区分度的特征表示,C2PNet能够在去雾任务中取得显著的性能提升。
模型结果对比
模型使用完整代码
我们直接使用onnx
模型进行图片去雾推理,将图片对比结果存入results
目录中:
import argparse
import osimport cv2
import onnxruntime
import numpy as npclass C2PNet:def __init__(self, modelpath):# Initialize modelself.onnx_session = onnxruntime.InferenceSession(modelpath)self.input_name = self.onnx_session.get_inputs()[0].name_, _, self.input_height, self.input_width = self.onnx_session.get_inputs()[0].shapedef detect(self, image):input_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)if isinstance(self.input_height ,int) and isinstance(self.input_width, int):input_image = cv2.resize(input_image, (self.input_width, self.input_height)) ###固定输入分辨率, HXW.onnx文件是动态输入分辨率的input_image = input_image.astype(np.float32) / 255.0input_image = input_image.transpose(2, 0, 1)input_image = np.expand_dims(input_image, axis=0)result = self.onnx_session.run(None, {self.input_name: input_image}) ###opencv-dnn推理时,结果图全黑# Post process:squeeze, RGB->BGR, Transpose, uint8 castoutput_image = np.squeeze(result[0])output_image = output_image.transpose(1, 2, 0)output_image = output_image * 255output_image = np.clip(output_image, 0, 255)output_image = output_image.astype(np.uint8)output_image = cv2.cvtColor(output_image.astype(np.uint8), cv2.COLOR_RGB2BGR)output_image = cv2.resize(output_image, (image.shape[1], image.shape[0]))return output_imageif __name__ == '__main__':path = 'testimgs/outdoor'for each in os.listdir(path):parser = argparse.ArgumentParser()parser.add_argument('--imgpath', type=str,default=os.path.join(path, each), help="image path")parser.add_argument('--modelpath', type=str,default='weights/c2pnet_outdoor_HxW.onnx', help="onnx path")args = parser.parse_args()mynet = C2PNet(args.modelpath)srcimg = cv2.imread(args.imgpath)dstimg = mynet.detect(srcimg)if srcimg.shape[0] > srcimg.shape[1]:boundimg = np.zeros((10, srcimg.shape[1], 3), dtype=srcimg.dtype)+255 ###中间分开原图和结果combined_img = np.vstack([srcimg, boundimg, dstimg])else:boundimg = np.zeros((srcimg.shape[0], 10, 3), dtype=srcimg.dtype)+255combined_img = np.hstack([srcimg, boundimg, dstimg])cv2.imwrite(os.path.join('results',each), combined_img)winName = 'Deep learning Image Dehaze use onnxruntime'cv2.namedWindow(winName, 0)cv2.imshow(winName, combined_img) ###原图和结果图也可以分开窗口显示cv2.waitKey(0)cv2.destroyAllWindows()
运行后,保存结果如下:
参考:
https://github.com/YuZheng9/C2PNet
https://github.com/hpc203/C2PNet-onnxrun
资料获取
关于本文的相关代码及文件都已打包好,供需要的小伙伴们学习,免费获取方式如下:
关注文末名片G-Z-H:【阿旭算法与机器学习】,发送【开源】即可获取下载方式