Kodak数据集搞图像处理、视频编码、计算机视觉的朋友应该都不陌生。这24张经典的彩色测试图几乎出现在每一篇图像压缩、超分辨率、去噪相关的论文实验部分。以前想下载这套图要么去官网一张张点要么在各种学术资源站里翻找速度慢不说有时候链接失效还白折腾半天。这次直接把整理好的Kodak数据集网盘链接分享出来下载解压就能用。同时结合我自己高频使用这套数据集的经验把它的构成细节、评测习惯、常见坑点一并讲清楚给刚入坑的朋友省点时间。1. Kodak数据集是什么为什么搞图像的人都绕不开它1.1 一张图看懂Kodak数据集的定位Kodak数据集也叫Kodak PhotocD数据集是柯达公司在上世纪90年代发布的一套标准测试图像完整包含24张高分辨率彩色照片。它的诞生背景很简单当时图像压缩、数码成像技术高速发展行业需要一套统一、中立、覆盖各种真实拍摄场景的图像来做算法效果对比。于是柯达挑了一批具有代表性的照片以无损PNG格式对外公开逐渐成为图像质量评测领域事实上的标准素材之一。放到今天的语境下Kodak数据集解决的痛点非常明确算法对比需要公平的“试卷”。你做图像压缩总不能拿自己随手拍的图跟别人论文里的图比光线、内容、分辨率都不一样PSNR、SSIM这些指标数值就算高一点也说明不了问题。用Kodak这套固定图大家跑同一个输入算法好坏一目了然审稿人也认可这种对比方式。1.2 为什么偏偏是这24张图很多人第一次接触Kodak时都会问图像数据集那么多动辄几万张、几十万张怎么Kodak就24张还能一直火这里面的逻辑值得展开聊一聊。Kodak这24张图是精挑细选出来的“典型场景合集”不是随手拍的碎片。它涵盖了户外建筑、室内人像、自然风景、城市街景、动植物特写、水面倒影、复杂纹理织物、光滑金属表面、肤色特写等你能想到的大部分真实摄影题材。每张图的构图、色彩层次、细节密度都有差异既能测试算法在平滑区域的表现也能压出高频纹理来考验算法对细节的保持能力。另外24张的体量在评测时非常友好。跑图像压缩实验时比如JPEG、JPEG 2000、BPG、VVC等24张图全跑一遍加上不同量化参数耗时可控做超分辨率实验时24张图裁剪成子图块之后正好形成一个规模合适、统计波动小的评测集。相比之下要么数据量太小导致结果偶然性高要么数据量太大导致实验周期拉长Kodak处在一个“够用又不拖沓”的黄金位置。还有一个很实际的原因标准不统一才是科研成本的大头。如果每个人评测都用自己的一套图论文之间的数值就完全没法横向比较。Kodak作为一个公开、免费、格式统一的基准相当于行业默认的“通用考卷”大家在这个框架下对话才有效率。2. 数据集的构成与核心规格详解2.1 24张图像的编号与内容特点Kodak数据集的文件名格式为kodim01.png到kodim24.png命名规律很简单两位数字递增数字越小代表图像编号越靠前。这里我挑几张我印象深刻的图说一下方便你先建立一个感性认识kodim01画面里有草地、有围栏、有远处建筑整体色调偏绿中高频细节分布均匀适合做通用压缩测试。kodim02典型的室内多人场景包含人脸肤色、布料纹理、墙面渐变对色彩保真度和肤色还原比较敏感。kodim03有大量绿色植被和花朵色彩饱和度较高适合观察算法在高饱和区域的伪色和振铃现象。kodim05人像特写皮肤纹理细腻背景虚化对去块滤波和细节保持算法很挑剔。kodim07城市建筑街景窗户、砖墙、招牌文字密布是高频细节集中区很多算法在这里原形毕露。kodim08湖面倒影加建筑有大面积平滑水面、也有一圈圈波纹纹理平滑区与纹理区交界明显。kodim19水面波纹特写整体纹理密度高很适合测噪声抑制算法的副作用——纹理会不会被磨平。实际使用中你不需要记清每张图的内容但了解这些差异对分析实验结果很有帮助。比如你的压缩算法在kodim19上PSNR掉得特别多那大概率是高频纹理保持能力不足如果在kodim05上出现肤色偏色就要考虑色彩空间转换是否引入了误差。2.2 分辨率、色彩空间与文件格式的秘密Kodak数据集的标准规格是分辨率768×512像素色彩空间sRGB位深每通道8bit文件格式PNG无损压缩通道数3RGB彩色这里值得做两个补充解释。第一分辨率是横向768、纵向512横竖比例接近3:2。这个分辨率在当年是标准的高清照片输出尺寸在今天是很多评测实验的“起步档”。你把它放大到2K、4K去测超分辨率算法通常的做法是先用高倍率下采样生成低分辨率输入再用算法恢复。768×512的原图尺寸不大不小裁剪、缩放、合成都很灵活。第二PNG格式本身就是无损的所以Kodak这套图能作为“原始参考”使用。做压缩实验时压缩前的图像就是编码器输入压缩后解码再和原图算PSNR/SSIM做超分实验时从768×512下采样得到384×256的低分辨率图作为输入原图作为恢复目标。整个流程因为底图无损所以不存在“二次损失”指标算出来是可信的。还有一个容易忽略的细节Kodak图像是sRGB色彩空间。如果你的算法在YUV或YCbCr空间下处理需要先做RGB到YUV的转换再计算指标否则PSNR会跟主流论文的数值对不上。我见过不少新手在这上面栽跟头数值差个几分甚至十几分找半天原因才发现是色彩空间没对齐。2.3 和同类数据集对比Kodak强在哪数据集名称图像数量分辨率内容特点典型用途Kodak24768×512真实摄影场景全覆盖色彩丰富压缩、超分、去噪、恢复Set55小尺寸主要来自旧卡通/自然图像细节简单超分辨率快速验证Set1414多种尺寸混合卡通与真实图像超分、去噪基准BSD300/500300/500多种尺寸伯克利分割数据集含人、动物、建筑分割、去噪、边缘检测Urban100100多种尺寸城市建筑为主纹理密集超分辨率重点评测DIV2K10002K分辨率高分辨率、高画质题材极广超分训练与评测Kodak的核心优势是真实性和尺度适配性。DIV2K虽然又大又新但作为训练集它的地位更高很多人不会拿DIV2K单独做小规模对比Set5、Set14图太少太小结果可信度不够。Kodak这24张图刚好处在“图少但都是实拍高质量照片”的平衡点上至今仍是压缩和恢复方向论文里的“标配第一栏”。3. 网盘下载与使用前的完整准备3.1 网盘下载的关键细节与文件校验网上流传的Kodak数据集版本很多有直接从官网抓的、有第三方打包的、有带.mat格式的、也有混入其他测试图打包的。建议下载后第一步先做最基本的校验工作。标准Kodak数据集的PNG文件特征每张图都是768×512像素RGB三通道文件名严格为kodim01.png~kodim24.png单张PNG文件大小在1MB~2MB左右24张图总大小约30MB出头我这次提供的网盘链接已经按标准目录整理好下载解压后你会看到这样的结构Kodak/ ├── kodim01.png ├── kodim02.png ├── kodim03.png ├── ... └── kodim24.png没有子目录嵌套没有多余文件直接用就行。下载解压后建议顺手用Python做一次完整性校验确保没有下载损坏的文件import os from PIL import Image data_dir ./Kodak valid_count 0 for i in range(1, 25): path os.path.join(data_dir, fkodim{i:02d}.png) img Image.open(path) w, h img.size if img.mode RGB and w 768 and h 512: valid_count 1 else: print(f存在异常文件: {path}, 尺寸: {w}x{h}, 模式: {img.mode}) print(f校验完成: {valid_count}/24 张图像正常)这条脚本跑完如果输出校验完成: 24/24 张图像正常说明数据没问题可以放心用了。我还遇到过一种情况下载工具尤其是一些网盘客户端会把PNG文件错误重命名比如自动加后缀.png.png或改为大写.PNG在Windows上不会报错但Linux下大小写敏感注意检查一下扩展名。3.2 推荐的项目目录结构与加载方式拿到数据集之后强烈建议在你的项目目录里建立规范的路径结构不要图省事把所有文件堆在根目录。我的习惯是这样组织project/ ├── data/ │ └── Kodak/ │ ├── kodim01.png │ └── ... ├── src/ ├── results/ └── README.mddata/放原始数据集不做任何修改src/放代码results/放实验输出。这样做的好处是代码和数据集分离路径不容易乱结果单独输出不会被测试图混在一起以后换机器或复用数据集时只要data/Kodak在整个项目就是完整可迁移的。PyTorch和OpenCV两种加载方式我都用过写出来供参考。PyTorch方案适合放进训练/推理pipelineimport torch from torchvision import datasets, transforms from torch.utils.data import Dataset, DataLoader from PIL import Image import os class KodakDataset(Dataset): def __init__(self, data_dir, transformNone): self.paths [os.path.join(data_dir, fkodim{i:02d}.png) for i in range(1, 25)] self.transform transform def __len__(self): return len(self.paths) def __getitem__(self, idx): img Image.open(self.paths[idx]).convert(RGB) if self.transform: img self.transform(img) return img, os.path.basename(self.paths[idx]) transform transforms.Compose([ transforms.ToTensor(), ]) dataset KodakDataset(./data/Kodak, transformtransform) loader DataLoader(dataset, batch_size1, shuffleFalse)OpenCV方案适合快速脚本实验import cv2 import os def load_kodak(data_dir./data/Kodak): images [] for i in range(1, 25): path os.path.join(data_dir, fkodim{i:02d}.png) img cv2.imread(path, cv2.IMREAD_COLOR) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) images.append(img) return images images load_kodak() print(f已加载 {len(images)} 张图像单张尺寸: {images[0].shape})这里特意把OpenCV的BGR转RGB写进代码里是实操中很容易踩的坑。OpenCV默认读取彩色图像是BGR通道顺序不转换的话直接拿去算颜色相关指标,得到的数值和标准结果会有系统性偏差。4. 从下载到跑通评测基于Kodak数据集的实操全流程4.1 用Kodak跑一次标准PSNR/SSIM评测拿到数据集后大部分人做的第一件事就是用Kodak跑一遍传统编码器的率失真曲线。这个流程通常是把每张原图输入编码器比如JPEG在不同质量参数下压缩再解压计算压缩后图像与原图的PSNR、SSIM最后对24张图取平均画成曲线。PSNR的计算公式是PSNR 10 * log10(MAX^2 / MSE)其中MAX是像素最大值2558bit图像MSE是均方误差。SSIM则从亮度、对比度、结构三个维度综合衡量两幅图像的相似程度取值在0到1之间越接近1越好。用Python实现一个简洁的评测脚本流程分四步读取原图、模拟压缩/解压、计算指标、汇总统计。这里以加高斯噪声再去除为例演示Kodak如何充当“标准答案”import numpy as np from skimage.metrics import peak_signal_noise_ratio, structural_similarity import cv2, os def compute_metrics(clean, distorted): # clean/distorted都是RGB uint8图像 psnr peak_signal_noise_ratio(clean, distorted) ssim structural_similarity(clean, distorted, channel_axis-1) return psnr, ssim data_dir ./data/Kodak psnr_list, ssim_list [], [] for i in range(1, 25): path os.path.join(data_dir, fkodim{i:02d}.png) clean cv2.imread(path, cv2.IMREAD_COLOR) clean cv2.cvtColor(clean, cv2.COLOR_BGR2RGB) # 模拟有损过程加高斯噪声 noise np.random.normal(0, 10, clean.shape).astype(np.int16) distorted np.clip(clean.astype(np.int16) noise, 0, 255).astype(np.uint8) psnr, ssim compute_metrics(clean, distorted) psnr_list.append(psnr) ssim_list.append(ssim) print(fkodim{i:02d}.png PSNR{psnr:.2f}dB SSIM{ssim:.4f}) avg_psnr np.mean(psnr_list) avg_ssim np.mean(ssim_list) print(f\n平均 PSNR{avg_psnr:.2f}dB 平均 SSIM{avg_ssim:.4f})这里的思路很有代表性clean是Kodak原图distorted是经过你想测试的退化/压缩流程后的图两者对比就得出算法性能。很多论文里“平均PSNR/SSIM”就是这么来的。注意如果你看到的论文报告Kodak平均PSNR顺带也会报告平均bit-per-pixelbpp或压缩比。单纯比PSNR不看码率是没有意义的码率越低PSNR越高才说明算法越强。所以正式实验记得记录码率或文件大小。4.2 更经典的玩法超分辨率、去噪、压缩对比Kodak的用法远不止PSNR和SSIM这两项指标。我按使用频率排序列出几个经典场景和对应做法。第一图像压缩对比。输入原图用不同编码器JPEG、JPEG2000、WebP、BPG、AVIF等压缩到相近的码率再解码计算失真。因为Kodak是彩色图sRGB空间下的压缩表现能直观反映编码器在真实照片上的水平。码率一般用bpp表示也就是每像素平均比特数bpp 文件大小(bit) / (宽 * 高)比如一张768×512的图压缩后文件大小50KB则bpp 50×1024×8 / (768×512) ≈ 1.04。第二超分辨率重建。超分实验通常分两种设置一种是固定倍率比如×2、×3、×4将Kodak原图用双三次插值下采样到低分辨率如384×256再用模型重建回768×512和原图比较。另一种是“真实退化”设置先加模糊再加噪声再下采样更贴近实际应用。做前者的话下采样工具建议统一用MATLAB的imresize或PyTorch的F.interpolate不要混用不同下采样方式否则结果不可比。如果要用MATLAB imresize的话可以用如下方式img imread(kodim01.png); img_hr im2double(img); img_lr imresize(img_hr, 1/2, bicubic, AntiAliasing, true); % 再把 img_lr 喂给模型第三去噪评测。给原图加指定标准差的高斯噪声比如σ250到255范围用算法去噪后和原图比PSNR/SSIM。Kodak的24张图包含平滑区和纹理区能一眼看出算法是“真去噪”还是“把噪声连同细节一起抹掉”。第四色度子采样研究。因为Kodak是RGB图可以用它研究YUV420/YUV422子采样对色彩细节的影响。特别是kodim05、kodim07这类肤色和文字区域多的图色度子采样的劣化会被明显放大适合做可视化对比。4.3 写论文时如何正确处理Kodak数据如果你的算法效果要跟别人论文比有几个处理规范必须遵守否则数值就算跑出来也不被认可。第一24张图全测。不要只挑你算法表现好的那几张报审稿人对“选择性报告”特别敏感。全测的坏处是可能拉低平均值但这是学术诚信问题不值得为一点数字冒险。第二统一色彩空间。大部分论文报告的PSNR是在YCbCr空间的Y通道上算的因为人眼对亮度更敏感而且很多压缩类算法本身就在YCbCr空间处理。如果你在RGB空间算PSNR严格来说需在论文里说明。我做实验时的约定是压缩对比报告YCbCr的Y通道PSNR超分对比报告RGB全通道PSNR并在实验设置里写明这样不会产生歧义。第三固定编码器参数。编码器的质量参数JPEG的quality factor、BPG的QP直接影响码率不同参数组合会产生不同码率点。要对比同一标准下的率失真曲线必须确保所有算法可比的bpp范围大体一致。一个常用的方式是“锚定码率”调整压缩参数让每个算法输出码率尽量接近一个固定值如0.5bpp再比失真。第四注意随机性。有些深度学习算法有随机性dropout、随机初始化等跑单次可能有波动。稳妥的做法是多次运行取平均或者至少在论文中说明是单次结果。Kodak因为图少跑一次全套耗时不大有条件就多跑两三遍。5. 常见问题与避坑指南5.1 下载与解压环节的高频问题问题一下载下来的文件打不开或提示损坏。常见原因是网盘下载时文件没下完整或者用了某些下载工具导致文件截断。验证方法很简单看压缩包大小是否符合网盘页面标注的大小解压时留意是否有“CRC错误”或“文件头损坏”的报错。解决方式是删除重新下载不要“修复压缩包”——数据完整性必须从源头保证。问题二解压后找不到PNG文件生成了一堆奇怪的东西。有些网盘链接在分享时会把多个文件打包成一个自解压exe或加了密码的zip。如果你下载的是zip解压密码一般会在分享链接的描述里标注。还有过一种情况文件名被网盘自动改名比如变成“kodim01.png”或“kodim01.png”去掉前缀后缀即可。问题三Linux服务器上没有图形界面怎么确认图片内容。我以前踩过这个坑下载解压后在服务器上完全没法直接“看”图像。后来养成了习惯先看文件名和尺寸是否规范再用Python做像素级别检查比如抽查中心区域的颜色分布。需要可视化时把图像传到本地或在服务器上生成缩略图网格。下面这个脚本可以快速生成拼图预览import cv2 import os import numpy as np data_dir ./data/Kodak thumbs [] for i in range(1, 25): img cv2.imread(os.path.join(data_dir, fkodim{i:02d}.png)) thumb cv2.resize(img, (128, 128)) thumbs.append(thumb) grid np.zeros((128 * 6, 128 * 4, 3), dtypenp.uint8) for idx, thumb in enumerate(thumbs): r, c divmod(idx, 4) grid[r*128:(r1)*128, c*128:(c1)*128] thumb cv2.imwrite(kodak_preview.png, grid)5.2 评测环节容易踩的坑坑一PSNR数值异常高或异常低先查数据范围。Kodak是8bit图像像素范围0到255。如果你把图像读成float且没有归一化或者归一化到[0,1]后又在[0,255]尺度上算MSE数值就会乱。正确做法是在同一尺度下对比统一用0~255或统一用0~1。坑二SSIM窗口大小设置不一致。skimage的structural_similarity默认窗口大小是7×7MATLAB里的ssim默认窗口大小是11×11两个算出来的SSIM会有细微差别。论文和对比代码之间如果用的库不同SSIM小数点后第三位可能不同这属于正常范围。但引用别人结果时必须对齐库和参数。坑三RGB转YCbCr时转换公式错误。常见的转换标准有BT.601和BT.709两套数值略有差异。做压缩评测时如果你在Y通道算PSNR务必明确用哪套系数。OpenCV的cvtColor默认用BT.601MATLAB的rgb2ycbcr用BT.601二者通常一致。但如果用了其他库比如自己手写矩阵要仔细核对系数。坑四数据集混用导致基准失效。有人会把Kodak的24张拿去训练集增强或预处理统计再用同一组图评测这个属于“数据泄漏”指标会虚高。Kodak定位是测试集尽量不要参与任何训练数据分布相关的统计计算。如果你需要训练集用DIV2K、Flickr2K这些专门的大规模数据集。5.3 我的实操心得与建议用Kodak做评测反复折腾的次数多了我养成了几个固定习惯分享出来给大家参考。首先是固定随机种子。所有涉及随机性的操作噪声生成、模型初始化、数据洗牌在代码开头固定好随机种子保证每次跑出来结果一致。一来方便排查问题二来别人复现时不会因为随机种子不同而百思不解。其次是结果保存要结构化。每跑完一次实验保存一张CSV或JSON记录每张kodim图的PSNR、SSIM、bpp以及实验配置编码器类型、参数、随机种子。一个月后翻记录时你就知道这个习惯有多重要不然连“这个0.32dB提升是在哪个参数组合下取得的”都想不起来。最后是多做可视化对比。指标只是数字真正能说明算法问题的往往是视觉对比图。挑kodim19或kodim07的局部区域裁出来放大对比算法在纹理上的优缺点一目了然。我一般会把原图、退化图、重建图、误差热力图四联排对比这个习惯几乎每次都能找到指标看不出的问题。如果你从没碰过Kodak数据集这24张图会让你以后的实验对比有一个踏实的基准。如果你是个老手希望这份整理能帮你省一点重新整理数据集的精力或者避开几个当时卡了你很久的细节。网盘链接在文章开头拿去直接用就好。