PaddleHub seeinthedark 暗光增强模型实战:RAW 图像端到端低光照增强的推理与 Serving 部署指南
2026/9/23 13:42:01 网站建设 项目流程
  • 人工智能
  • 大模型
  • 微调
  • 模型推理服务

【免费下载链接】PaddleFormers

PaddleFormers 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》思想实现的暗光增强模型:它以暗光环境下拍摄的 RAW(Sony .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 的推理流程中:

  1. 使用rawpy读取 Sony RAW 文件(.ARW),得到原始 Bayer 马赛克数据;
  2. 将单通道 Bayer 图打包为 4 通道输入(对应 RGGB 四个位置),并做黑电平(black level)扣除与归一化;
  3. 按 512×512 的 patch 分块送入 ConvNet 推理,输出对应 2 倍尺寸的 RGB 结果;
  4. 拼接全部 patch 结果并裁剪到 0~255 的 uint8 范围,保存为增强后的 RGB 图像。

也就是说,用户既不需要手动做去马赛克(demosaic)、白平衡、去噪等 ISP 流水线操作,也不需要任何额外后处理,模型直接从 RAW 输出可见 RGB。

二、源码级推理原理剖析

README 给出了模型的使用入口,而 module.py 完整展示了推理的底层实现,理解它有助于正确准备输入数据。

2.1 RAW 数据打包:pack_raw

denoising内部依赖pack_raw函数完成 Bayer 图像到 4 通道输入的转换(module.py):

def 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, axis=2) 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, :]), axis=2) return out

关键细节:

  • 黑电平扣除与归一化np.maximum(im - 512, 0) / (16383 - 512)将 14-bit RAW(像素最大值 16383)减去黑电平 512 后归一化到 0~1 区间,模拟 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), axis=0) * 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.0);
  • 512 对齐裁剪:图像宽高被裁剪到 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.txt):

  • rawpy:用于读取 Sony 等相机的 RAW 格式文件(.ARW),是暗光图像输入的必备依赖。

安装 rawpy:

$ pip install rawpy

3.2 安装模块

通过 PaddleHub 命令行安装:

$ hub install seeinthedark

如需指定版本(例如本文档对应的 1.0.0 初始版本),可使用:

$ hub install seeinthedark==1.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/IMAGE"

4.2 可配置参数

结合 module.py 中run_cmdadd_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(name="seeinthedark")加载模块并调用denoisingAPI:

import paddlehub as hub denoiser = hub.Module(name="seeinthedark") input_path = "/PATH/TO/IMAGE" # Read from a raw file denoiser.denoising(paths=[input_path], output_path='./denoising_result.png', use_gpu=True)

注:README 示例中的output_path为示意写法,源码中保存目录参数名为output_dir(见下方 API 签名),保存的图片文件以output_0.pngoutput_1.png形式命名。

5.2 denoising API 详解

def denoising(images=None, paths=None, output_dir='./denoising_result/', use_gpu=False, visualization=True)

该 API 用于完成对暗光 RAW 图像的降噪并生成 RGB 图像。参数说明如下:

参数类型默认值说明
imageslist[numpy.ndarray]None输入的图像列表,每个元素为单通道([H, W])的马赛克图像,即相机传感器原始数据
pathslist[str]None暗光图像文件路径列表,要求为 Sony 的 RAW 格式(.ARW
output_dirstr./enlightening_result/结果保存的路径(源码中的实际默认值;README 中写作./denoising_result/,以源码为准)
use_gpuboolFalse是否使用 GPU 进行预测
visualizationboolTrue是否将结果保存到本地文件夹

imagespaths两种输入方式在源码中对应两条独立分支:images分支直接对传入的numpy.ndarray调用pack_raw打包(要求输入本身已是 RAW 数值矩阵);paths分支则先通过rawpy.imread(path)读取 RAW 文件,再取raw.raw_image_visible参与打包。因此:

  • 若手头已有 RAW 数值矩阵,可走images分支;
  • 若只有.ARW文件,直接走paths分支即可,无需手动读取。

visualization=True时,结果会以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_DEVICES=0

否则无需设置。

除命令行方式外,也可使用配置文件方式启动(见 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指定服务端口(默认 8866),use_multiprocessworkers用于多进程并发(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(url=url, headers=headers, data=json.dumps(data)) # 打印预测结果 print(r.json()["results"])

服务端收到请求后,会调用模块的serving_method(module.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 seeinthedark==1.0.0

八、注意事项与最佳实践小结

  • 输入格式严格为 RAW:无论是命令行、Python API 还是 Serving 请求,输入都必须是相机 RAW 数据(Sony.ARW文件或对应数值矩阵),普通 JPEG/PNG 图像无法直接使用本模型增强;
  • 内存与显存:模型按 512×512 patch 分块推理,输出为输入 2 倍尺寸的 RGB 图,高分辨率 RAW 文件推理时建议优先使用 GPU(use_gpu=True);
  • 输出目录:Python API 的output_dir参数实际默认值为./enlightening_result/(以 module.py 为准),命令行模式下默认输出目录为denoising_result
  • 部署选型:本地单次预测用hub run或 Python API;需要对外提供 HTTP 接口或接入业务系统时,使用 PaddleHub Serving(默认端口 8866),并可按 serving.md 配置多进程与显卡参数。

借助 seeinthedark 模块,开发者可以用最少的代码完成"暗光 RAW → 可见 RGB"的端到端增强,将其无缝嵌入安防监控、夜间摄影、低光成像等实际业务场景。

  • 人工智能
  • 大模型
  • 微调
  • 模型推理服务

【免费下载链接】PaddleFormers

PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleFormers
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询