- 人工智能
- 大模型
- 微调
- 模型推理服务
【免费下载链接】PaddleFormers
PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.
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 的推理流程中:
- 使用
rawpy读取 Sony RAW 文件(.ARW),得到原始 Bayer 马赛克数据; - 将单通道 Bayer 图打包为 4 通道输入(对应 RGGB 四个位置),并做黑电平(black level)扣除与归一化;
- 按 512×512 的 patch 分块送入 ConvNet 推理,输出对应 2 倍尺寸的 RGB 结果;
- 拼接全部 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 rawpy3.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_cmd与add_module_config_arg的实现,命令行支持以下参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--input_path | str | 必填 | 输入的暗光 RAW 图像路径(相机拍摄的 RAW 文件) |
--use_gpu | bool | False | 是否使用 GPU 进行预测 |
--output_dir | str | denoising_result | 结果保存目录 |
--visualization | bool | False | 是否将结果保存到本地文件夹 |
例如使用 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.png、output_1.png形式命名。
5.2 denoising API 详解
def denoising(images=None, paths=None, output_dir='./denoising_result/', use_gpu=False, visualization=True)该 API 用于完成对暗光 RAW 图像的降噪并生成 RGB 图像。参数说明如下:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
images | list[numpy.ndarray] | None | 输入的图像列表,每个元素为单通道([H, W])的马赛克图像,即相机传感器原始数据 |
paths | list[str] | None | 暗光图像文件路径列表,要求为 Sony 的 RAW 格式(.ARW) |
output_dir | str | ./enlightening_result/ | 结果保存的路径(源码中的实际默认值;README 中写作./denoising_result/,以源码为准) |
use_gpu | bool | False | 是否使用 GPU 进行预测 |
visualization | bool | True | 是否将结果保存到本地文件夹 |
images与paths两种输入方式在源码中对应两条独立分支: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_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(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.
相关推荐
MMGeneration实战教程:图像翻译与CycleGAN应用详解
MMGeneration实战教程:图像翻译与CycleGAN应用详解 MMGeneration是基于PyTorch和MMCV的强大生成模型工具包,提供了包括Cy
低光图像增强终极指南:让你的暗光照片瞬间变明亮
低光图像增强终极指南:让你的暗光照片瞬间变明亮 你是否经常遇到这样的困扰:在昏暗环境下拍摄的照片太暗,细节丢失严重,色彩失真?别担心,低光图像增强技术正是解决这
计算机视觉图像处理如何在5分钟内使用PaintbrushJS为网站图片添加专业滤镜效果
如何在5分钟内使用PaintbrushJS为网站图片添加专业滤镜效果 想要为网站图片快速添加专业级滤镜效果吗?PaintbrushJS正是你需要的轻量级浏览器图
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考