当前位置: 首页 > article >正文

Flare7K数据集实战:如何用Python快速实现夜间炫光去除(附完整代码)

Flare7K数据集实战如何用Python快速实现夜间炫光去除附完整代码夜间摄影中的人造光源炫光问题一直是计算机视觉领域的棘手挑战。当路灯、车灯等点光源在镜头表面产生散射或反射时图像中会出现放射状光斑、雾化区域和彩色条纹严重影响画面质量和后续分析。传统方法往往需要专业镜头或复杂后处理而深度学习为这一问题提供了全新解决方案。本文将手把手带您完成从数据准备到模型部署的全流程使用Flare7K这个目前最全面的夜间炫光数据集构建一个端到端的炫光去除系统。1. 环境配置与数据准备在开始建模前我们需要搭建适合图像处理的Python环境。推荐使用Anaconda创建独立环境以避免依赖冲突conda create -n flare_removal python3.8 conda activate flare_removal pip install torch1.12.0cu113 torchvision0.13.0cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install opencv-python pillow matplotlib tensorboardFlare7K数据集包含7000组合成炫光图像分为散射型5000张和反射型2000张。下载后解压得到以下目录结构Flare7K/ ├── Scattering/ │ ├── train/ │ │ ├── clean/ # 无炫光图像 │ │ └── flare/ # 对应炫光污染图像 │ └── test/ ├── Reflection/ │ ├── train/ │ └── test/ └── Mixed/ # 混合测试集使用以下代码快速检查数据分布并可视化样本import cv2 import matplotlib.pyplot as plt def show_sample(clean_path, flare_path): clean cv2.cvtColor(cv2.imread(clean_path), cv2.COLOR_BGR2RGB) flare cv2.cvtColor(cv2.imread(flare_path), cv2.COLOR_BGR2RGB) plt.figure(figsize(12,6)) plt.subplot(131), plt.imshow(clean), plt.title(Clean) plt.subplot(132), plt.imshow(flare), plt.title(Flare) plt.subplot(133), plt.imshow(cleanflare), plt.title(Combined) plt.show() # 示例调用 show_sample(Flare7K/Scattering/train/clean/0001.jpg, Flare7K/Scattering/train/flare/0001.jpg)注意Flare7K中的炫光图像是单独存储的需要与干净图像叠加才能得到最终效果。这种设计允许灵活调整炫光强度。2. 模型架构设计与对比针对炫光去除任务我们对比了三种主流架构的适应性模型类型参数量(M)计算量(GFLOPs)适用场景U-Net7.832.4中小规模数据集Restormer26.5145.7高分辨率图像处理MPRNet15.189.2多阶段渐进式修复基于实验对比我们选择改进版U-Net作为基础架构在保持轻量化的同时加入以下优化import torch import torch.nn as nn class FlareRemovalUNet(nn.Module): def __init__(self, in_ch3, out_ch3): super().__init__() # 编码器 self.enc1 self._block(in_ch, 64) self.enc2 self._block(64, 128) self.enc3 self._block(128, 256) self.pool nn.MaxPool2d(2) # 注意力桥接层 self.bridge nn.Sequential( nn.Conv2d(256, 512, 3, padding1), nn.ReLU(), SpatialAttention(512), nn.Conv2d(512, 512, 3, padding1), nn.ReLU() ) # 解码器 self.up3 nn.ConvTranspose2d(512, 256, 2, stride2) self.dec3 self._block(512, 256) self.up2 nn.ConvTranspose2d(256, 128, 2, stride2) self.dec2 self._block(256, 128) self.up1 nn.ConvTranspose2d(128, 64, 2, stride2) self.dec1 self._block(128, 64) self.final nn.Conv2d(64, out_ch, 1) def _block(self, in_ch, out_ch): return nn.Sequential( nn.Conv2d(in_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU(), nn.Conv2d(out_ch, out_ch, 3, padding1), nn.BatchNorm2d(out_ch), nn.ReLU() ) def forward(self, x): # 编码路径 enc1 self.enc1(x) enc2 self.enc2(self.pool(enc1)) enc3 self.enc3(self.pool(enc2)) # 桥接层 bridge self.bridge(self.pool(enc3)) # 解码路径 dec3 self.up3(bridge) dec3 torch.cat([dec3, enc3], dim1) dec3 self.dec3(dec3) dec2 self.up2(dec3) dec2 torch.cat([dec2, enc2], dim1) dec2 self.dec2(dec2) dec1 self.up1(dec2) dec1 torch.cat([dec1, enc1], dim1) dec1 self.dec1(dec1) return self.final(dec1) class SpatialAttention(nn.Module): def __init__(self, channel): super().__init__() self.conv nn.Conv2d(channel, 1, 1) self.sigmoid nn.Sigmoid() def forward(self, x): att_map self.sigmoid(self.conv(x)) return x * att_map关键改进点包括在桥接层加入空间注意力机制增强模型对炫光区域的定位能力使用批量归一化加速收敛并提升稳定性采用跳跃连接保持细节信息不丢失3. 训练策略与显存优化针对炫光去除任务我们设计了一套完整的训练流程from torch.utils.data import Dataset, DataLoader import numpy as np class FlareDataset(Dataset): def __init__(self, clean_dir, flare_dir, augmentTrue): self.clean_paths sorted(Path(clean_dir).glob(*.jpg)) self.flare_paths sorted(Path(flare_dir).glob(*.jpg)) self.augment augment def __len__(self): return len(self.clean_paths) def __getitem__(self, idx): clean cv2.imread(str(self.clean_paths[idx]))/255.0 flare cv2.imread(str(self.flare_paths[idx]))/255.0 # 数据增强 if self.augment: if np.random.rand() 0.5: clean cv2.flip(clean, 1) flare cv2.flip(flare, 1) # 随机调整炫光强度 alpha 0.7 0.6*np.random.rand() flare flare * alpha combined np.clip(clean flare, 0, 1) return { input: torch.FloatTensor(combined.transpose(2,0,1)), target: torch.FloatTensor(clean.transpose(2,0,1)) } # 初始化数据集和加载器 train_set FlareDataset(Flare7K/Scattering/train/clean, Flare7K/Scattering/train/flare) train_loader DataLoader(train_set, batch_size8, shuffleTrue)提示在实际应用中可以动态调整炫光强度alpha参数使模型适应不同强度的炫光场景。对于显存不足的问题我们采用以下优化策略梯度累积当无法增大batch size时通过多次前向传播累积梯度再更新optimizer.zero_grad() for i, batch in enumerate(train_loader): outputs model(batch[input]) loss criterion(outputs, batch[target]) loss loss / 4 # 假设累积4次 loss.backward() if (i1) % 4 0: optimizer.step() optimizer.zero_grad()混合精度训练使用FP16减少显存占用scaler torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs model(inputs) loss criterion(outputs, targets) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()分块处理对于高分辨率图像采用重叠分块处理策略def process_large_image(model, image, tile_size512, overlap64): h, w image.shape[2:] output torch.zeros_like(image) for y in range(0, h, tile_size-overlap): for x in range(0, w, tile_size-overlap): tile image[:, :, y:ytile_size, x:xtile_size] with torch.no_grad(): pred model(tile) output[:, :, y:ytile_size, x:xtile_size] pred return output4. 实战应用与效果评估训练完成后我们可以使用以下代码进行单张图像推理def remove_flare(model, image_path, devicecuda): image cv2.imread(image_path)/255.0 input_tensor torch.FloatTensor(image.transpose(2,0,1)).unsqueeze(0).to(device) with torch.no_grad(): output model(input_tensor) result output.squeeze().cpu().numpy().transpose(1,2,0) result np.clip(result*255, 0, 255).astype(np.uint8) return result # 示例使用 model FlareRemovalUNet().to(cuda) model.load_state_dict(torch.load(best_model.pth)) result remove_flare(model, test_image.jpg) cv2.imwrite(result.jpg, cv2.cvtColor(result, cv2.COLOR_RGB2BGR))为评估模型效果我们采用以下指标进行定量分析指标计算公式理想值PSNR$10\log_{10}(\frac{MAX^2}{MSE})$越高越好SSIM$\frac{(2\mu_x\mu_y c_1)(2\sigma_{xy} c_2)}{(\mu_x^2\mu_y^2c_1)(\sigma_x^2\sigma_y^2c_2)}$接近1Flare Score$\frac{1}{N}\sum_{i1}^N |R_i - G_i|_1$接近0在Flare7K测试集上的性能对比模型PSNR ↑SSIM ↑Flare Score ↓推理时间(ms)原图18.20.760.142-U-Net28.70.890.05245Restormer29.30.910.04878我们的模型29.10.900.04652对于实际应用中的边缘设备部署建议使用TorchScript进行模型导出model.eval() example_input torch.rand(1, 3, 512, 512).to(cuda) traced_script torch.jit.trace(model, example_input) traced_script.save(flare_removal.pt)在部署到移动端时可以进一步使用量化技术减小模型体积quantized_model torch.quantization.quantize_dynamic( model, {nn.Conv2d}, dtypetorch.qint8 ) torch.jit.save(torch.jit.script(quantized_model), quantized.pt)经过实际测试量化后的模型在保持90%以上精度的同时体积减小为原来的1/4推理速度提升2倍以上。

相关文章:

Flare7K数据集实战:如何用Python快速实现夜间炫光去除(附完整代码)

Flare7K数据集实战:如何用Python快速实现夜间炫光去除(附完整代码) 夜间摄影中的人造光源炫光问题一直是计算机视觉领域的棘手挑战。当路灯、车灯等点光源在镜头表面产生散射或反射时,图像中会出现放射状光斑、雾化区域和彩色条纹…...

如何同时降AI率和降重?一套操作解决两个问题

如何同时降AI率和降重?一套操作解决两个问题 我改了三遍论文,AI率从45%涨到了62%,查重率也没降下来。后来才搞明白,降AI和降重根本不是两件事,用对工具可以一套操作同时搞定。核心方法就是:选一个同时支持…...

嘎嘎降AI和论文去AI哪个值得买?从5个维度帮你选

嘎嘎降AI和论文去AI哪个值得买?从5个维度帮你选 选降AI工具这件事,我之前也纠结了好久。看了一堆测评,越看越迷糊,每款工具都说自己效果好,到底该信谁?后来我想了个笨办法:自己测。拿同一篇论文…...

FSearch智能检索引擎:让文件查找效率提升80%

FSearch智能检索引擎:让文件查找效率提升80% 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch FSearch是一款基于GTK3的Unix-like系统文件搜索工具&#xff…...

AP_TFT_eSPI:嵌入式SPI显示库的平滑字体与ePaper优化

1. 项目概述AP_TFT_eSPI 是一个面向嵌入式平台的高性能 SPI 接口图形库,专为 ESP8266、ESP32 和 STM32 系列微控制器深度优化。该项目源自广为人知的 TFT_eSPI 开源库,但并非简单复刻——其核心演进在于重构了平滑字体(Smooth Fonts&#xff…...

Vue3如何扩展WebUploader支持汽车设计图纸的跨平台断点续传与状态同步?

(抱着键盘在宿舍转圈圈版) 各位大佬好呀!我是福州某大学网络工程大三刚学会console.log()的编程小白秃头预备役。最近被导师按头要求搞个"能上传10G文件还带加密的文件夹传输系统",现在每天的状态be like: …...

计算机网络学习助手:Qwen3-0.6B-FP8图解TCP/IP协议栈与故障排查

计算机网络学习助手:Qwen3-0.6B-FP8图解TCP/IP协议栈与故障排查 你是不是也有过这样的经历?翻开厚厚的计算机网络教材,满篇都是“三次握手”、“四次挥手”、“协议栈分层”这些抽象的概念,看得人头晕眼花,感觉每个字…...

Kook Zimage 真实幻想 Turbo 光影效果专题:如何生成逼真的光影变化

Kook Zimage 真实幻想 Turbo 光影效果专题:如何生成逼真的光影变化 光影是画面的灵魂,好的光影能让AI生成的作品瞬间提升一个档次 我一直觉得,AI生成图像最迷人的地方就是光影效果的处理。一张普通的图片,只要光影到位&#xff0c…...

ClearerVoice-Studio开发者API文档:RESTful接口定义+Python SDK调用示例

ClearerVoice-Studio开发者API文档:RESTful接口定义Python SDK调用示例 1. 引言 ClearerVoice-Studio是一个功能强大的语音处理开源工具包,为开发者提供了一整套语音增强、语音分离和目标说话人提取的解决方案。这个工具包集成了多个先进的预训练模型&…...

Qwen-Image-2512-SDNQ实战:一键生成农业病虫害识别图,农民也能轻松用

Qwen-Image-2512-SDNQ实战:一键生成农业病虫害识别图,农民也能轻松用 想象一下,一位农民在自家玉米地里,发现叶片上出现了奇怪的斑点。他掏出手机,打开一个简单的网页,输入“玉米叶片上有黄色小斑点&#…...

PP-DocLayoutV3实战手册:26类标签置信度阈值调优与误检抑制策略

PP-DocLayoutV3实战手册:26类标签置信度阈值调优与误检抑制策略 1. 引言:当文档布局分析遇上“误判”难题 想象一下,你正在处理一份扫描的学术论文PDF,希望自动提取其中的图表、公式和正文。你满怀期待地运行了PP-DocLayoutV3模…...

阿里通义Z-Image文生图模型进阶技巧:提示词编写与参数调整指南

阿里通义Z-Image文生图模型进阶技巧:提示词编写与参数调整指南 1. 模型概述与核心能力 1.1 Z-Image模型简介 阿里通义实验室开源的Z-Image是基于先进扩散模型的文生图AI系统,其GGUF量化版本在保持高质量生成能力的同时显著降低了硬件需求。该模型支持…...

SeqGPT模型提示词工程实战指南

SeqGPT模型提示词工程实战指南 掌握提示词设计,释放SeqGPT全部潜力 1. 开篇:为什么提示词如此重要? 你有没有遇到过这样的情况:给AI模型输入了一段话,但生成的結果完全不是你想要的样子?或者生成的内容总是…...

GD32F4标准外设库实战:从零搭建Keil工程模板(含常见错误解决方案)

GD32F4标准外设库实战:从零搭建Keil工程模板(含常见错误解决方案) 对于刚接触GD32系列单片机的开发者来说,搭建一个稳定可靠的Keil工程模板是开发过程中的首要任务。本文将详细介绍从官方库下载到完整工程模板构建的全流程&#x…...

7×24小时运行:OpenClaw+Qwen3-32B构建稳定定时任务系统

724小时运行:OpenClawQwen3-32B构建稳定定时任务系统 1. 为什么需要AI驱动的定时任务系统 去年整理个人知识库时,我遇到了一个典型问题:每周需要手动从十几个订阅源抓取技术文章,清洗格式后归档到Notion。重复劳动不仅耗时&…...

Qwen3.5-9B真实生成效果:多轮对话中保持视觉上下文一致性

Qwen3.5-9B真实生成效果:多轮对话中保持视觉上下文一致性 1. 模型核心能力展示 Qwen3.5-9B作为新一代多模态大模型,在多轮对话场景中展现出卓越的视觉上下文保持能力。不同于传统模型容易在对话过程中"遗忘"先前讨论的视觉内容,Q…...

Nanbeige 4.1-3B部署详解:NVIDIA驱动/CUDA/Transformers版本匹配

Nanbeige 4.1-3B部署详解:NVIDIA驱动/CUDA/Transformers版本匹配 1. 环境准备与系统要求 1.1 硬件需求 GPU要求:至少需要NVIDIA显卡(推荐RTX 3060及以上)显存要求:最低8GB,推荐12GB以上内存要求&#xf…...

【STM32】状态机实战:从按键消抖到协议解析的嵌入式应用

1. 状态机在STM32开发中的核心价值 第一次接触状态机是在五年前的一个智能门锁项目里。当时客户要求实现一个能识别单击、双击、长按的按键系统,我用if-else写了300多行代码,结果调试时发现各种边界条件处理不完。直到同事建议改用状态机,代码…...

国内主流大模型API调用入门与对比:DeepSeek/智谱GLM/Kimi/千问完整指南

国内主流大模型API调用入门与对比指南 随着人工智能技术的飞速发展,国内大模型厂商推出的API服务已经相当成熟本文将详细介绍DeepSeek、智谱GLM、Kimi(月之暗面)和阿里千问四大主流国产大模型的API调用方式,帮助开发者快速上手并选…...

GSON:嵌入式JSON解析与构建的轻量级高性能库

1. GSON:面向嵌入式系统的轻量级 JSON 解析与构建库1.1 设计定位与工程价值GSON 是专为 Arduino 及各类资源受限微控制器平台设计的 JSON 处理库,其核心设计哲学是极简、高效、确定性内存占用。它并非通用 JSON 框架(如 ArduinoJson&#xff…...

华为S7700交换机忘记console密码?3分钟教你用BootROM重置(附双主控操作)

华为S7700交换机Console密码重置实战指南:从单主控到双主控全解析 当你面对一台锁死的华为S7700交换机时,那种焦虑感我深有体会——核心网络设备突然失去管理权限,运维工作陷入停滞。本文将分享一套经过实战验证的密码重置方案,不…...

Vue3前端集成Qwen3字幕编辑组件开发

Vue3前端集成Qwen3字幕编辑组件开发 在视频内容创作日益普及的今天,高效的字幕编辑工具成为提升工作效率的关键。本文将介绍如何在Vue3项目中集成Qwen3字幕编辑组件,打造响应式、用户友好的字幕编辑界面。 1. 场景需求与痛点分析 视频创作者在日常工作中…...

华硕笔记本性能调优新选择:GHelper如何用5MB替代臃肿控制软件?

华硕笔记本性能调优新选择:GHelper如何用5MB替代臃肿控制软件? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and oth…...

Phi-3-Mini-128K安全加固指南:防止提示词注入与敏感信息泄露

Phi-3-Mini-128K安全加固指南:防止提示词注入与敏感信息泄露 最近在帮几个朋友的公司部署AI服务,发现一个挺普遍的现象:大家一上来都关心模型效果好不好、速度快不快,但安全问题往往被放到了最后,甚至被忽略。这其实挺…...

HUNYUAN-MT 7B翻译终端Java面试题精讲:高并发翻译服务的设计与实现

HUNYUAN-MT 7B翻译终端Java面试题精讲:高并发翻译服务的设计与实现 1. 引言 如果你正在准备Java后端开发的面试,那么“如何设计一个高并发的翻译服务”这道题,很可能已经躺在你的复习清单里了。它考察的不仅仅是你会不会调用一个翻译接口&a…...

PyCharm+Docker开发必看:如何用多阶段构建打造超轻量Python镜像(含Anaconda集成)

PyCharmDocker多阶段构建:打造极致轻量化的Python开发环境 1. 为什么需要超轻量Python镜像? 在容器化开发中,镜像体积直接影响着构建速度、传输效率和运行时性能。传统Python镜像动辄接近1GB的体积,不仅浪费存储空间,还…...

WPF动画实战:用Storyboard实现按钮点击后的渐变消失效果(附完整代码)

WPF动画实战:用Storyboard实现按钮点击后的渐变消失效果 在WPF应用开发中,流畅的动画效果能显著提升用户体验。当用户点击按钮时,如果元素能优雅地淡出而非突然消失,会给界面带来更专业的质感。本文将深入讲解如何利用Storyboard…...

Qwen3.5-27B惊艳效果:会议合影→识别出席人员+标注职务+生成组织关系简述

Qwen3.5-27B惊艳效果:会议合影→识别出席人员标注职务生成组织关系简述 1. 引言:一张照片背后的智能洞察 想象一下,你刚参加完一场重要的行业会议,手机里存了几十张现场合影。领导让你整理一份参会人员名单,并简要说…...

【第1章>第27节】FPGA图像形态学处理应用3——膨胀/腐蚀形态学处理硬件开发板调试2

目录 1.将测试图片保存为ceo文件 2.ROM核配置 3.图像转换为灰度图模块 4.膨胀/腐蚀模块 5.将图像存储ROM核,RGB转灰度模块,膨胀/腐蚀模块加入到HDMI工程中 欢迎订阅FPGA图像处理算法开发教程 《FPGA图像处理算法开发学习教程》 1.将测试图片保存为ceo文件 在进行硬件调试…...

【路由器】OpenWrt 入门指南:从零开始安装与配置

1. 为什么选择OpenWrt? 如果你正在寻找一款能够完全掌控路由器行为的系统,OpenWrt绝对值得考虑。我第一次接触OpenWrt是在五年前,当时家里的路由器经常断流,刷了OpenWrt之后不仅解决了问题,还解锁了广告过滤、多拨等实…...