PaddleHub seeinthedark 暗光增强模型实战:RAW 图像端到端低光照增强的推理与 Serving 部署指南
人工智能大模型微调模型推理服务【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址https://gitcode.com/gh_mirrors/pa/PaddleFormers点击查看免费下载seeinthedark 是 PaddleHub 图像模块库modules/image/image_processing/seeinthedark/中基于 CVPR 2018《Learning to See in the Dark》思想实现的暗光增强模型它以暗光环境下拍摄的 RAWSony .ARW图像为输入端到端地输出一张亮度正常、清晰可见的 RGB 图像。本文将以该模块的官方 README 为主体结合仓库内 module.py 源码完整讲解模型原理、环境安装、命令行预测、Python API 调用以及基于 PaddleHub Serving 的在线服务部署读完即可将暗光 RAW 图像一键增强为可见 RGB 图像。一、模型基本信息与核心原理1.1 模型档案根据 README.md 的模型基本信息表该模块的核心参数如下项目内容模型名称seeinthedark类别图像 - 暗光增强网络ConvNet数据集SID dataset是否支持 Fine-tuning否模型大小120MB最新更新日期2021-11-02数据指标-1.2 端到端暗光增强原理seeinthedark 模块的训练思路来自暗光成像的经典范式通过大量由暗光条件下的短曝光图像与同一场景长曝光正常曝光图像组成的图像对以RAW 图像为输入、RGB 图像为参照进行监督训练使模型学会直接在 RAW 域上完成亮度恢复与去噪从而端到端地将暗光 RAW 图像处理为可见的 RGB 图像。从源码结构看这一端到端思想体现在 module.py 的推理流程中使用rawpy读取 Sony RAW 文件.ARW得到原始 Bayer 马赛克数据将单通道 Bayer 图打包为 4 通道输入对应 RGGB 四个位置并做黑电平black level扣除与归一化按 512×512 的 patch 分块送入 ConvNet 推理输出对应 2 倍尺寸的 RGB 结果拼接全部 patch 结果并裁剪到 0255 的 uint8 范围保存为增强后的 RGB 图像。也就是说用户既不需要手动做去马赛克demosaic、白平衡、去噪等 ISP 流水线操作也不需要任何额外后处理模型直接从 RAW 输出可见 RGB。二、源码级推理原理剖析README 给出了模型的使用入口而 module.py 完整展示了推理的底层实现理解它有助于正确准备输入数据。2.1 RAW 数据打包pack_rawdenoising内部依赖pack_raw函数完成 Bayer 图像到 4 通道输入的转换module.pydef pack_raw(raw): # pack Bayer image to 4 channels im raw if not isinstance(raw, np.ndarray): im raw.raw_image_visible.astype(np.float32) im np.maximum(im - 512, 0) / (16383 - 512) # subtract the black level im np.expand_dims(im, axis2) img_shape im.shape H img_shape[0] W img_shape[1] out np.concatenate((im[0:H:2, 0:W:2, :], im[0:H:2, 1:W:2, :], im[1:H:2, 1:W:2, :], im[1:H:2, 0:W:2, :]), axis2) return out关键细节黑电平扣除与归一化np.maximum(im - 512, 0) / (16383 - 512)将 14-bit RAW像素最大值 16383减去黑电平 512 后归一化到 01 区间模拟 SID 数据集的预处理方式RGGB 四通道拆分im[0:H:2, 0:W:2]、im[0:H:2, 1:W:2]、im[1:H:2, 1:W:2]、im[1:H:2, 0:W:2]分别对应 Bayer 排列的 R、G、G、B 四个采样位置最终拼接为形状[H/2, W/2, 4]的张量。2.2 分块推理与倍数放大denoising的主体循环module.py做了三件关键的事input_full np.expand_dims(pack_raw(raw), axis0) * 300 px input_full.shape[1] // 512 py input_full.shape[2] // 512 rx, ry px * 512, py * 512 input_full input_full[:, :rx, :ry, :] output np.random.randn(rx * 2, ry * 2, 3) input_full np.minimum(input_full, 1.0)×300 放大归一化后的输入乘以 300将低光 RAW 的微弱信号放大到网络可感知的动态范围随后再np.minimum(input_full, 1.0)截断到 1.0512 对齐裁剪图像宽高被裁剪到 512 的整数倍rx px * 512再按 512×512 的 patch 分块送入模型2 倍超分输出每个 patch 推理结果被写入output[i*512*2 : ..., j*512*2 : ...]最终输出尺寸是输入的 2 倍即输出 RGB 图像为[H, W, 3]H、W 为原始 RAW 可见区域尺寸。推理结束后结果经np.clip(output, 0, 255).astype(uint8)转为 8-bit 图像。由于 OpenCV 的cv2.imwrite按 BGR 保存源码在写盘时做了通道反转out[:, :, ::-1]保证保存的是正常 RGB 颜色。2.3 模型加载与设备管理LearningToSeeInDark类通过set_device(use_gpu)惰性加载推理模型首次调用时使用paddle.static.load_inference_model分别加载 CPU 版paddle.CPUPlace()或 GPU 版paddle.CUDAPlace(0)的model.pdmodel/model.pdiparams并缓存到实例属性中以备复用。同时denoising开头调用paddle.enable_static()说明该模块基于 Paddle 静态图执行推理。三、环境准备与安装3.1 环境依赖模块的核心 Python 依赖只有一个见 requirements.txtrawpy用于读取 Sony 等相机的 RAW 格式文件.ARW是暗光图像输入的必备依赖。安装 rawpy$ pip install rawpy3.2 安装模块通过 PaddleHub 命令行安装$ hub install seeinthedark如需指定版本例如本文档对应的 1.0.0 初始版本可使用$ hub install seeinthedark1.0.0如安装过程遇到问题可参考 PaddleHub 的零基础安装文档Windows 安装指南、Linux 安装指南、MacOS 安装指南。安装成功后即可通过命令行、Python API 或 Serving 三种方式使用模型。四、命令行预测4.1 基本用法PaddleHub 提供了统一的hub run命令来执行模块预测CV 类任务通过--input_path指定输入图像路径参见 命令行工具说明# Read from a raw (Sony, .ARW) file $ hub run seeinthedark --input_path /PATH/TO/IMAGE4.2 可配置参数结合 module.py 中run_cmd与add_module_config_arg的实现命令行支持以下参数参数类型默认值说明--input_pathstr必填输入的暗光 RAW 图像路径相机拍摄的 RAW 文件--use_gpuboolFalse是否使用 GPU 进行预测--output_dirstrdenoising_result结果保存目录--visualizationboolFalse是否将结果保存到本地文件夹例如使用 GPU 并自定义输出目录$ hub run seeinthedark --input_path /PATH/TO/IMAGE.ARW --use_gpu --output_dir ./result --visualization从实现上hub run命令会解析参数并调用模块的denoising方法对应 paddlehub/commands/run.py 中 RunCommand 的调用链--input_path会以paths[input_path]的形式传给 API。五、Python API 预测5.1 预测代码示例在 Python 中通过hub.Module(nameseeinthedark)加载模块并调用denoisingAPIimport paddlehub as hub denoiser hub.Module(nameseeinthedark) input_path /PATH/TO/IMAGE # Read from a raw file denoiser.denoising(paths[input_path], output_path./denoising_result.png, use_gpuTrue)注README 示例中的output_path为示意写法源码中保存目录参数名为output_dir见下方 API 签名保存的图片文件以output_0.png、output_1.png形式命名。5.2 denoising API 详解def denoising(imagesNone, pathsNone, output_dir./denoising_result/, use_gpuFalse, visualizationTrue)该 API 用于完成对暗光 RAW 图像的降噪并生成 RGB 图像。参数说明如下参数类型默认值说明imageslist[numpy.ndarray]None输入的图像列表每个元素为单通道[H, W]的马赛克图像即相机传感器原始数据pathslist[str]None暗光图像文件路径列表要求为 Sony 的 RAW 格式.ARWoutput_dirstr./enlightening_result/结果保存的路径源码中的实际默认值README 中写作./denoising_result/以源码为准use_gpuboolFalse是否使用 GPU 进行预测visualizationboolTrue是否将结果保存到本地文件夹images与paths两种输入方式在源码中对应两条独立分支images分支直接对传入的numpy.ndarray调用pack_raw打包要求输入本身已是 RAW 数值矩阵paths分支则先通过rawpy.imread(path)读取 RAW 文件再取raw.raw_image_visible参与打包。因此若手头已有 RAW 数值矩阵可走images分支若只有.ARW文件直接走paths分支即可无需手动读取。当visualizationTrue时结果会以output_{i}.png的命名写入output_dir函数最终返回增强结果的 RGB 图像列表每个元素形状为[H, W, 3]的 uint8 数组。六、基于 PaddleHub Serving 的在线服务部署PaddleHub Serving 可以部署一个在线的图像暗光增强服务前端通过 Flask 与 Gunicorn 处理网络请求后端直接调用 PaddleHub 预测接口并支持多进程并发详见 PaddleHub Serving 部署文档。6.1 第一步启动 PaddleHub Serving运行启动命令$ hub serving start -m seeinthedark执行后即完成了一个暗光增强在线服务 API 的部署默认端口号为8866。NOTE如使用 GPU 预测需要在启动服务之前设置CUDA_VISIBLE_DEVICES环境变量例如$ export CUDA_VISIBLE_DEVICES0否则无需设置。除命令行方式外也可使用配置文件方式启动见 serving.md例如{ modules_info: { seeinthedark: { init_args: { version: 1.0.0 }, predict_args: { use_gpu: false } } }, port: 8866, use_multiprocess: false, workers: 2, gpu: 0 }$ hub serving start --config serving_config.json其中port指定服务端口默认 8866use_multiprocess与workers用于多进程并发Windows 仅支持单进程gpu用于指定显卡卡号。6.2 第二步发送预测请求服务启动后客户端通过 POST 请求访问http://127.0.0.1:8866/predict/seeinthedark/获取预测结果。请求体以 JSON 形式携带images字段内容为 RAW 图像矩阵rawpy.imread(...).raw_image_visible经 base64 编码后的字符串import requests import json import rawpy import base64 def cv2_to_base64(image): data cv2.imencode(.jpg, image)[1] return base64.b64encode(data.tostring()).decode(utf8) # 发送HTTP请求 data {images: [cv2_to_base64(rawpy.imread(/PATH/TO/IMAGE).raw_image_visible)]} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/seeinthedark/ r requests.post(urlurl, headersheaders, datajson.dumps(data)) # 打印预测结果 print(r.json()[results])服务端收到请求后会调用模块的serving_methodmodule.py 中由serving装饰先用base64_to_cv2解码 base64 字符串还原 RAW 数值矩阵再调用denoising(images...)完成增强最终将结果转为列表通过 JSON 返回。仓库中提供了完整的 base64 编解码工具函数见 paddlehub/utils/utils.py上述示例中的cv2_to_base64也是 PaddleHub Serving 官方模板的标准写法参见 serving_demo.tmpl。6.3 关闭服务服务使用完毕后可通过端口号安全关闭$ hub serving stop --port 8866七、更新历史该模块当前版本为 1.0.0为初始发布版本安装命令$ hub install seeinthedark1.0.0八、注意事项与最佳实践小结输入格式严格为 RAW无论是命令行、Python API 还是 Serving 请求输入都必须是相机 RAW 数据Sony.ARW文件或对应数值矩阵普通 JPEG/PNG 图像无法直接使用本模型增强内存与显存模型按 512×512 patch 分块推理输出为输入 2 倍尺寸的 RGB 图高分辨率 RAW 文件推理时建议优先使用 GPUuse_gpuTrue输出目录Python API 的output_dir参数实际默认值为./enlightening_result/以 module.py 为准命令行模式下默认输出目录为denoising_result部署选型本地单次预测用hub run或 Python API需要对外提供 HTTP 接口或接入业务系统时使用 PaddleHub Serving默认端口 8866并可按 serving.md 配置多进程与显卡参数。借助 seeinthedark 模块开发者可以用最少的代码完成暗光 RAW → 可见 RGB的端到端增强将其无缝嵌入安防监控、夜间摄影、低光成像等实际业务场景。赞分享人工智能大模型微调模型推理服务【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址https://gitcode.com/gh_mirrors/pa/PaddleFormers点击查看免费下载相关推荐MMGeneration实战教程图像翻译与CycleGAN应用详解MMGeneration实战教程图像翻译与CycleGAN应用详解 MMGeneration是基于PyTorch和MMCV的强大生成模型工具包提供了包括Cy低光图像增强终极指南让你的暗光照片瞬间变明亮低光图像增强终极指南让你的暗光照片瞬间变明亮 你是否经常遇到这样的困扰在昏暗环境下拍摄的照片太暗细节丢失严重色彩失真别担心低光图像增强技术正是解决这计算机视觉图像处理如何在5分钟内使用PaintbrushJS为网站图片添加专业滤镜效果如何在5分钟内使用PaintbrushJS为网站图片添加专业滤镜效果 想要为网站图片快速添加专业级滤镜效果吗PaintbrushJS正是你需要的轻量级浏览器图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考