资讯详情

OpenCV dnn_superres 模块实战指南:EDSR / ESPCN / FSRCNN / LapSRN 四种 CNN 超分辨率模型从编译、推理到基准测试

📅 2026/9/24 14:32:18 | 华诺云谱 👁 阅读
OpenCV dnn_superres 模块实战指南:EDSR / ESPCN / FSRCNN / LapSRN 四种 CNN 超分辨率模型从编译、推理到基准测试
计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载dnn_superres 是 OpenCV contrib 扩展库中专门用于基于卷积神经网络的图像/视频超分辨率放大的模块封装了 EDSR、ESPCN、FSRCNN、LapSRN 四款业界经典模型开发者只需几行代码即可完成加载模型、设置缩放倍数、单图/多输出/视频流的推理放大。读完本文你将掌握该模块的 CMake 编译开关、核心DnnSuperResImplAPI 的调用方式、四种模型的选型要点以及如何复现仓库自带的 PSNR/SSIM 性能基准测试。模块概述用深度学习替代传统插值放大本模块的全部功能位于仓库的 modules/dnn_superres 目录模块头文件为 include/opencv2/dnn_superres.hpp。模块通过 OpenCV 的 dnn 推理后端加载 TensorFlow 训练好的.pb模型文件对输入图像执行学习型上采样learning-based upscaling其效果与质量显著优于双三次bicubic、最近邻nearest neighbor、Lanczos 等传统插值算法——插值只能平滑补点而 CNN 模型能基于海量图像数据学习出高频细节纹理。核心接口是一个面向 C 与 Python 双语言导出的类DnnSuperResImpl其公开方法包括readModel(path)/readModel(weights, definition)加载 TensorFlow 模型权重文件或权重网络定义文件setModel(algo, scale)指定算法名edsr/espcn/fsrcnn/lapsrn与放大倍数决定前后处理的正确方式upsample(img, result)单输出推理放大upsampleMultioutput(img, outputs, scale_factors, node_names)一次前向获得多个缩放倍数的输出目前仅 LapSRN 支持setPreferableBackend(int)/setPreferableTarget(int)切换计算后端与目标设备须先加载模型getScale()/getAlgorithm()查询当前模型配置。模块在构造对象时会自动注册一个名为DepthToSpace的自定义 dnn 层实现 ESPCN 所需的像素重排 pixel shuffling 操作相关实现见 src/dnn_superres.cpp。编译与启用模块模块依赖 OpenCV 主仓库的 core 与 dnn 模块需要先准备 OpenCV 主源码与 opencv_contrib 源码然后在 CMake 配置阶段显式开启。README 给出的标准命令如下cmake -DOPENCV_EXTRA_MODULES_PATHopencv_contrib/modules -Dopencv_dnn_superresON opencv_source_dir其中opencv_contrib指向本仓库opencv_contrib的路径opencv_source_dir指向 OpenCV 主仓库源码。编译教程 upscale_image_single.markdown 还提供了另外两种等效方式# 方式一一次启用全部 contrib 模块 cmake -D OPENCV_EXTRA_MODULES_PATHopencv_contrib/modules/ opencv_source_dir # 方式二只编译 dnn_superres 一个模块 cmake -D OPENCV_EXTRA_MODULES_PATHopencv_contrib/modules/dnn_superres opencv_source_dir也可以直接在 CMake 图形界面cmake-gui中勾选opencv_dnn_superres选项。编译完成后仓库 samples 目录下的示例会生成对应的example_dnn_superres_*可执行文件位于 OpenCV 构建目录的bin/下。四种预训练模型横向对比模块内置支持四种模型均针对超分辨率任务设计但体积、速度、精度与可用缩放倍数差异明显。下表汇总了 README.md 中给出的官方资料推理速度为 256x256 图像在 Intel i7-9700K CPU 上的实测结果模型模型大小训练规模可用缩放倍数优势劣势CPU 推理速度EDSR~38.5MB量化版原始 150MB3 天batch size 16x2 / x3 / x4精度最高慢、文件大 3 秒ESPCN~100KB~100 轮batch size 32x2 / x3 / x4体积极小、速度快、效果仍不错视觉质量逊于更新的强模型 0.01 秒FSRCNN~40KBFSRCNN-small 约 9KB~30 轮batch size 1x2 / x3 / x4快速、小巧、准确非最先进的精度 0.01 秒LapSRN1~5MB~50 轮batch size 32x2 / x4 / x8一次前向即可输出多尺度结果比 ESPCN/FSRCNN 慢精度低于 EDSR 0.1 秒EDSREnhanced Deep Residual NetworksEDSR 是 2017 年 NTIRE 超分辨率挑战赛的冠军方案采用增强的深度残差网络结构去除了批归一化层以扩大模型容量。它是四款模型中精度最高的代价是模型体积与推理时间都明显偏大。注意仓库提供的 ~38.5MB 版本为量化后的模型原始模型约 150MB。其原始论文为《Enhanced Deep Residual Networks for Single Image Super-Resolution》CVPR 2017。ESPCNEfficient Sub-Pixel CNNESPCN 提出在网络的最后一层使用亚像素卷积sub-pixel convolution完成上采样其余卷积都在低分辨率空间进行因此计算量极小约 100KB 的体积可实现接近实时的超分推理适合嵌入式与实时场景。其原始论文为《Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network》CVPR 2016。FSRCNNFast Super-Resolution CNNFSRCNN 通过先降维、再映射、后扩张的紧凑结构大幅加速了早期的 SRCNN 方案模型仅 ~40KB并提供了参数更少、更快但精度略低的 FSRCNN-small 变体~9KB。其原始论文为《Accelerating the Super-Resolution Convolutional Neural Network》ECCV 2016。LapSRNLaplacian Pyramid SR NetworkLapSRN 基于拉普拉斯金字塔架构网络的每个层级负责输出一个倍数的超分结果因此一次前向推理即可同时得到 2x、4x、8x 等多尺度输出也支持 [2x,4x] 与 [2x,4x,8x] 组合是模块中唯一支持多输出模式的模型。其原始论文为《Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution》CVPR 2017。模型文件需要按 README 中的指引从各模型的原始实现项目单独下载例如 EDSR 的量化版本、LapSRN 的导出模型模块源码本身不附带.pb权重文件。仓库测试则通过cvtest::findDataFile(dnn_superres/...pb)从 OpenCV 测试数据目录opencv_extra读取模型见 test_dnn_superres.cpp。单图超分实战单输出以最常用的单张图像放大为例编译后可运行仓库示例 samples/dnn_superres.cpppath_of_your_opencv_build_directory/bin/example_dnn_superres_dnn_superres path_to_image.png algo_string upscale_int model_path.pb # 示例用 EDSR 模型将 image.png 放大 2 倍 /home/opencv/build/bin/example_dnn_superres_dnn_superres /home/image.png edsr 2 /home/EDSR_x2.pb命令行参数含义第 1 个参数为输入图像路径第 2 个为算法名可选bilinear、bicubic、edsr、espcn、fsrcnn、lapsrn前两个为传统插值直接调用cv::resize不需要模型文件第 3 个为缩放倍数 2/3/4第 4 个为模型文件路径。核心调用链如下#include opencv2/dnn_superres.hpp using namespace std; using namespace cv; using namespace dnn; using namespace dnn_superres; // 1. 创建超分对象构造函数会注册 DepthToSpace 自定义层 DnnSuperResImpl sr; // 2. 读取 TensorFlow 模型.pb 文件 sr.readModel(models/FSRCNN_x2.pb); // 3. 设置算法与缩放倍数即使 .pb 文件名被改动前后处理也按这里指定的算法与倍数执行 sr.setModel(fsrcnn, 2); // 其他可选 edsr、espcn、lapsrn // 4. 读取图像并放大结果写入 img_new Mat img cv::imread(img_path); Mat img_new; sr.upsample(img, img_new);Python 版本的写法几乎一致区别仅在于通过工厂方法创建对象import cv2 from cv2 import dnn_superres # 创建 SR 对象Python 与 C 的唯一区别 sr dnn_superres.DnnSuperResImpl_create() # 读取图像 image cv2.imread(./image.png) # 读取模型 path EDSR_x4.pb sr.readModel(path) # 设置算法与缩放倍数以选择正确的前后处理 sr.setModel(edsr, 4) # 放大并保存 result sr.upsample(image) cv2.imwrite(./upscaled.png, result)下图来自单图教程 upscale_image_single.markdown 的运行结果可以直观对比原始输入、FSRCNN 输出与 Bicubic 插值输出的差异底层推理流程源码视角在 src/dnn_superres.cpp 的upsample()实现中不同算法走了两条截然不同的前后处理路径ESPCN / FSRCNN / LapSRN先通过preprocess_YCrCb()将 BGR 图像转为归一化的 YCrCb 浮点图源码 L239-L265只把 Y亮度通道送入网络推理Cr/Cb 色度通道则在重建阶段用cv::resize直接放大源码 L267-L299——因为人眼对亮度细节最敏感对色度不敏感EDSR直接在 BGR 空间推理blobFromImage时减去了 Div2K 数据集的 BGR 均值Scalar(103.1545782, 111.561547, 114.35629928)输出时再加回均值并转回CV_8U。无论哪种算法若未先调用readModel/setModel就执行upsample源码会抛出StsError异常提示Model not specified. Please set model via setModel()。多输出超分实战LapSRN 一次推理多尺度放大OpenCV dnn 模块支持在一次推理中同时访问多个输出节点只要给出节点名。目前模块内只有 LapSRN 具备这种能力官方导出的三个模型其输出节点名分别为模型输出节点名2x 模型NCHW_output4x 模型NCHW_output_2x,NCHW_output_4x8x 模型NCHW_output_2x,NCHW_output_4x,NCHW_output_8x对应示例为 samples/dnn_superres_multioutput.cpp运行命令教程原版./bin/example_dnn_superres_dnn_superres_multioutput path/to/image.png 2,4 NCHW_output_2x,NCHW_output_4x \ path/to/opencv_contrib/modules/dnn_superres/models/LapSRN_x4.pb即依次传入输入图像、用逗号分隔的缩放倍数列表、用逗号分隔的输出节点名列表、模型文件路径。关键代码DnnSuperResImpl sr; sr.readModel(models/LapSRN_x8.pb); // 设置算法为 lapsrn缩放倍数传入所有目标倍数中的最大值8 sr.setModel(lapsrn, 8); // 声明目标倍数与对应输出节点名顺序一一对应 std::vectorint scales{2, 4, 8}; std::vectorint node_names{NCHW_output_2x, NCHW_output_4x, NCHW_output_8x}; // 一次前向同时得到 2x、4x、8x 三张放大图 Mat img cv::imread(img_path); std::vectorMat outputs; sr.upsampleMultioutput(img, outputs, scales, node_names);需要注意源码 upsampleMultioutput() 会先做若干断言——输入图像不能为空、scale_factors与node_names必须等长且非空更重要的是目前只有 LapSRN 支持多尺度上采样其他算法调用会直接抛出StsBadArg异常。内部实现与单输出类似对 Y 通道生成 blob 后调用net.forward(outputs_blobs, node_names)一次取回所有输出再对每个输出分别重建 YCrCb 得到对应倍数的结果。视频超分实战超分同样可以逐帧应用于视频示例为 samples/dnn_superres_video.cpp运行参数为输入视频路径、输出视频路径、算法名、缩放倍数、模型路径。核心逻辑教程原版非常简单——把读一帧 → 放大一帧 → 写入一帧循环起来DnnSuperResImpl sr; sr.readModel(models/ESPCN_x2.pb); sr.setModel(espcn, 2); // 输出视频的宽高按缩放倍数放大编码器沿用输入视频的 FOURCC 与 FPS Size S Size((int) input_video.get(CAP_PROP_FRAME_WIDTH) * scale, (int) input_video.get(CAP_PROP_FRAME_HEIGHT) * scale); VideoWriter output_video; output_video.open(output_path, ex, input_video.get(CAP_PROP_FPS), S, true); for (;;) { Mat frame, output_frame; input_video frame; if (frame.empty()) break; sr.upsample(frame, output_frame); // 逐帧放大 output_video output_frame; // 写入输出视频 }由于 ESPCN、FSRCNN 单帧推理低于 0.01 秒这类轻量模型是视频实时/准实时超分的首选若追求画质则可换成 EDSR但要接受每秒仅处理数帧的代价。基准测试PSNR / SSIM 与推理耗时对比模块提供了两个专门用于评测的示例dnn_superres_benchmark_quality.cpp质量与时间对比与 dnn_superres_benchmark_time.cpp纯耗时测试详细的评测方法学与结果记录在 benchmark 教程。评测流程对应dnn_superres_benchmark_quality.cpp降采样构造低分辨率输入先把原图按缩放倍数裁剪对齐width - width % scale再用cv::resize以 1/scale 缩小确保后续比较时像素严格对齐超分重建readModelsetModelupsample得到放大图计算指标用 OpenCV 核心的cv::PSNR与 contrib 模块的cv::quality::QualitySSIM::compute比较重建图与原始裁剪图SSIM 取三个通道均值再对 Bicubic、Nearest neighbor、Lanczos 等传统插值做同样评测以作对照。README 内置基准monarch.png768x512x4算法CPU 推理时间秒PSNRSSIMESPCN0.0115926.54710.88116EDSR3.2675829.24040.92112FSRCNN0.0129826.56460.88064LapSRN0.2825726.73300.88622Bicubic0.0003126.06350.87537Nearest neighbor0.0001423.56280.81741Lanczos0.0010125.91150.87057General100 数据集平均结果CPUIntel i7-9700K / Ubuntu 18.042x 缩放算法平均推理时间秒平均 PSNR平均 SSIMESPCN0.00879532.70590.9276EDSR5.92345034.13000.9447FSRCNN0.02174132.88860.9301LapSRN0.11481232.26810.9248Bicubic0.00020832.16380.9305Nearest neighbor0.00011429.16650.9049Lanczos0.00109432.46870.93273x 缩放算法平均推理时间秒平均 PSNR平均 SSIMESPCN0.00549528.42290.8474EDSR2.45551029.98280.8801FSRCNN0.00880728.30680.8429LapSRN0.28257526.73300.8862Bicubic0.00031126.06350.8754Nearest neighbor0.00014823.56280.8174Lanczos0.00101225.91150.87064x 缩放算法平均推理时间秒平均 PSNR平均 SSIMESPCN0.00431126.68700.7891EDSR1.60757028.15520.8317FSRCNN0.00530226.60880.7863LapSRN0.12122926.73830.7896Bicubic0.00031126.06350.8754Nearest neighbor0.00014823.56280.8174Lanczos0.00101225.91150.8706从数据中可以清晰看出选型规律EDSR 在全部缩放倍数下 PSNR/SSIM 均领先但 CPU 耗时高达 1.6~5.9 秒ESPCN/FSRCNN 在毫秒级开销下逼近 EDSR 的八成以上质量LapSRN 的精度介于两者之间。此外 benchmark 教程还给出了多组单图对比Set5 butterfly 2x、Urban100 img_001 3x、Set14 comic 4x、Div2K 0006 8x其中 LapSRN 因金字塔架构未提供 3x 模型在 8x 场景下 LapSRN 的 PSNR26.7046超过 Bicubic26.3139与 Lanczos26.1565是极端放大倍数下唯一的深度模型选择。注意 4x 表格中传统插值的 SSIM 高于所有深度模型这源于评测的 General100 图像集特性选型时应综合参考多组数据而非单一指标。测试验证与质量保障模块自带单元测试 test_dnn_superres.cpp覆盖单输出与多输出两条路径单输出测试runSingleModel()对espcn、fsrcnn的 x2/x3 模型执行完整流程断言getScale()/getAlgorithm()与配置一致并验证放大后图像尺寸精确等于原图宽高 × 缩放倍数多输出测试对 LapSRN 模型验证多尺度输出集合。此外 perf 目录 提供了性能回归测试perf_dnn_superres.cpp用于持续监控推理耗时Python 测试 与 Java 测试 则验证了多语言绑定的 API 一致性。小结dnn_superres 模块以极低的上手成本把四种主流 CNN 超分模型统一封装在DnnSuperResImpl一个类中readModel加载权重、setModel声明算法与倍数、upsample/upsampleMultioutput完成推理Python 与 C 接口一一对应。实际项目中可按精度优先选 EDSR、实时优先选 ESPCN/FSRCNN、多尺度一次输出选 LapSRN的原则选型并借助仓库自带的 benchmark 示例在同一数据集上量化对比后再做决定。赞分享计算机视觉图像处理深度学习机器学习【免费下载链接】opencv_contribRepository for OpenCVs extra modules项目地址https://gitcode.com/gh_mirrors/op/opencv_contrib点击查看免费下载相关推荐Skyvern 复杂输入处理实战日期选择器、文件上传、级联下拉与富文本编辑器的自动化指南Skyvern 复杂输入处理实战日期选择器、文件上传、级联下拉与富文本编辑器的自动化指南 在浏览器自动化中复杂输入控件——日期选择器Date Picker计算机视觉图像处理深度学习机器学习如何永久保存微信聊天记录WeChatMsg免费导出工具完全指南如何永久保存微信聊天记录WeChatMsg免费导出工具完全指南 你是否曾因手机空间不足而被迫删除珍贵聊天记录是否担心设备损坏导致重要对话永远消失在这个数字计算机视觉图像处理深度学习机器学习OpenCV dnn_superres 单图超分辨率实战用预训练 CNN 完成图像放大OpenCV dnn_superres 单图超分辨率实战用预训练 CNN 完成图像放大 本教程围绕 OpenCV 扩展模块 dnn_superres 展开讲计算机视觉图像处理深度学习机器学习上一篇uWebSockets服务网格可观测性最佳实践指标、日志与追踪下一篇5分钟上手vimpager让Vim秒变强大文件阅读器的终极教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。