一、图像生成
1. FID(Fréchet Inception Distance)
(1)含义
用于评估生成图像质量的指标,衡量的是生成图像的特征分布与真实图像的特征分布在高维空间中的距离。
(2)数学定义
FID 利用Inception v3 网络对图像提取高层特征(通常是 pool3 层(2048维)),然后将这些特征视为服从高维高斯分布。对于生成图像集 和真实图像集
,我们分别得到它们在特征空间中的分布:
,
(生成图像特征的均值和协方差);
,
(真实图像特征的均值和协方差)。然后用 Fréchet 距离(又称 2-Wasserstein 距离) 计算两者的分布差异:
第一项是均值的欧式距离,第二项是协方差的距离(矩阵范数)。
(3)计算流程
准备图像集:一组真实图像,一组生成图像
,建议每组图像数量在 500~10000 之间越多越稳定。
用 Inception v3 模型提取图像特征:通常选用 pre-trained 的 Inception v3 网络,提取 pool3 层(2048维向量) 的输出作为图像的高层语义特征。
统计特征分布:对每组图像提取的特征,计算均值和协方差矩阵。
代入 Fréchet 公式计算距离:得到一个标量值,即 FID score。
(4)数值解释
FID 值范围(越低越好) | 含义 |
---|---|
0~10 | 极高质量,接近真实图像 |
10~30 | 良好质量,有真实感 |
30~50 | 中等质量,可见缺陷 |
50~100+ | 明显差距或模式崩溃 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
对图像分布敏感:不像 IS 只看生成图像的“好坏”,FID 能判断生成分布是否逼近真实分布。 | 与 Inception v3 强耦合:特征提取依赖 Inception v3,若生成图和训练数据域不一致(如医学图像),结果会偏差。 |
可比性强:可用于跨模型或同一模型不同训练阶段的性能对比。 | 对样本数量敏感:少于几百张图像时波动较大,不稳定。建议至少 1000 张以上。 |
反应生成图的整体质量:包括清晰度、样式和多样性。 | 不一定与人类感知完全一致:有时 FID 改善但图像主观感觉变差,需辅以人类评价。 |
只衡量整体分布,不反映局部质量:一些图像看起来很好但分布“歪”了,FID 仍可能高。 |
(6)代码示例
from torchmetrics.image.fid import FrechetInceptionDistance
import torch
from torchvision import transforms
from PIL import Image
# 初始化 FID 模块
fid = FrechetInceptionDistance(feature=2048)
# 示例:添加真实图像
real_img = transforms.ToTensor()(Image.open("real_image.jpg")).unsqueeze(0)
fid.update(real_img, real=True)
# 示例:添加生成图像
fake_img = transforms.ToTensor()(Image.open("generated_image.jpg")).unsqueeze(0)
fid.update(fake_img, real=False)
# 计算 FID
score = fid.compute()
print(f"FID score: {score}")
2. IS(Inception Score)
(1)含义
用于评估生成图像“清晰度”和“多样性”的指标,利用预训练的 Inception v3 网络对生成图像进行分类预测,然后根据输出分布计算图像“可信度”和“多样性”。通俗理解:如果每张图预测分布“集中”而整体分布“分散”,那么 IS 高,说明生成结果清晰且多样。IS 是无监督指标,不依赖真实图像,只能评估生成图像本身,不判断它是否“逼真”。
(2)数学定义
给定生成图像 ,通过 Inception v3 得到类别分布
,其中
是 ImageNet 中的 1000 个类别。计算 KL 散度(Kullback–Leibler divergence)来度量图像的个体预测
和整个图集的平均预测
的差异:
(3)计算流程
生成图像集(通常为几百到几千张);
用 Inception v3 提取 softmax 输出 (1000维);
计算每张图像的 KL 散度:;
对所有图像取平均再取指数,得出最终的 IS 值。
(4)数值解释
IS 值范围(越高越好) | 含义 |
---|---|
>9 | 非常好(接近真实图像) |
7~9 | 好,具有多样性和清晰度 |
4~6 | 一般,图像模糊或类别重复 |
<4 | 差,图像模糊或模式崩溃 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
简单:无需真实图像参与,只依赖 Inception 模型。 | 与 Inception v3 强耦合:对非 ImageNet 类别(如医学图、卫星图)无效。 |
高效:计算成本较低,快速。 | 不判断图像是否逼真:模型生成垃圾图像也能得高 IS(如果种类多)。 |
双重评价:同时反映图像的“清晰度”和“多样性”。 | 不对模式崩溃敏感:只要类多样,IS 高,但图像质量可能很差。 |
非对称、不稳定:同一图像多次评估可能结果有波动,尤其样本较小时。 |
(6)代码示例
import torch
from torchvision import models, transforms
from torchvision.utils import save_image
from torchmetrics.image.inception import InceptionScore
from PIL import Image
# 加载图像(假设是生成图像)
transform = transforms.Compose([
transforms.Resize((299, 299)),
transforms.ToTensor(),
])
images = []
for path in ["img1.jpg", "img2.jpg", "img3.jpg"]: # 替换为实际路径
img = transform(Image.open(path).convert("RGB"))
images.append(img)
batch = torch.stack(images)
# 计算 IS 分数
inception = InceptionScore()
score = inception(batch)
print(f"Inception Score: {score}")
3. LPIPS(Learned Perceptual Image Patch Similarity)
(1)含义
用于评估两张图像之间视觉相似性的指标,能更好地反映人类感知差异。人类并不敏感于像素点的逐一差别,而是通过图像的 纹理、边缘、结构和语义特征来感知相似性。LPIPS 的核心思想是:把图像输入预训练深度网络(如 VGG、AlexNet、SqueezeNet),提取多个层次的特征图,然后衡量它们之间的差异,并加权组合得出相似度。
(2)数学定义
设两张图像为 和
,经过神经网络
的第
层提取特征:
然后对特征做逐通道归一化(unit norm),再计算每个像素位置的欧氏距离,取平均:
其中, 表示第
层经过单位归一化的特征图。
最终,将所有层的差异进行加权求和,得出 LPIPS 指标:
其中,是通过回归人类主观感知相似度学得的通道加权系数。
(3)计算流程
准备两张图像:一张为参考图像(GT),一张为生成图像;
将图像输入预训练神经网络(如 VGG16);
提取多个层次的中间特征;
对每层特征进行归一化、取差、加权求和;
输出 LPIPS 值。
(4)数值解释
LPIPS 值范围(距离越小越相似) | 相似度说明 |
---|---|
0.0 ~ 0.1 | 非常相似,几乎无感知差别 |
0.1 ~ 0.3 | 有些微差别,人眼需细看 |
0.3 ~ 0.5 | 明显差别,可直接分辨 |
> 0.5 | 差别很大,完全不同图像 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
更贴近人类视觉感知,比 MSE/SSIM 更真实 | 与人类感知也不总完全一致,特定失真类型(如颜色差)下偏差 |
可用于感知质量评估(图像重建、合成等) | 强依赖选定的特征提取网络(如 VGG、AlexNet) |
支持多种 backbone 模型选择(VGG、AlexNet 等) | 不同模型输出的 LPIPS 值不具可比性 |
可微分,可作为感知损失函数用于训练 | 需要成对图像,不能评估单张生成图像质量 |
对结构、纹理和语义差异更敏感 | 计算复杂度略高于 PSNR / SSIM |
(6)代码示例
import lpips
import torch
from PIL import Image
from torchvision import transforms
# 加载图像
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
])
img1 = transform(Image.open("real.jpg").convert("RGB")).unsqueeze(0)
img2 = transform(Image.open("generated.jpg").convert("RGB")).unsqueeze(0)
# 初始化 LPIPS 模型(VGG 为 backbone)
loss_fn = lpips.LPIPS(net='vgg') # 可选:'alex', 'squeeze', 'vgg'
# 计算 LPIPS 距离
dist = loss_fn(img1, img2)
print(f"LPIPS Distance: {dist.item():.4f}")
4. SSIM(Multi-Scale Structural Similarity Index)
(1)含义
SSIM(结构相似性指数) 是用于衡量两张图像在结构、亮度和对比度方面的相似性的指标。它不是像传统指标(如 MSE 或 PSNR)那样仅考虑像素差异,而是从感知层面模拟人眼对图像差异的理解,强调图像“结构”是否一致。
(2)数学定义
SSIM 是由亮度相似度 、对比度相似度
、结构相似度
三项组成:
通常取 ,简化后为:
定义各项如下:亮度项:;对比度项:
;结构项:
。最终简化形式:
其中, 是图像局部窗口的均值;
是局部方差;
是协方差;
是常数,防止除以零。
(3)计算流程
图像灰度化(可选);
使用滑动窗口提取图像块(通常 11×11 高斯窗口);
计算局部统计量:均值、方差、协方差;
计算每个块的 SSIM 值;
将所有块的 SSIM 值平均,得到整体 SSIM 指标。
(4)数值解释
SSIM 值范围(越接近 1 越相似) | 相似度解释 |
---|---|
1.0 | 完全相同 |
0.9 ~ 1.0 | 几乎一致 |
0.6 ~ 0.9 | 有明显差异(常见范围) |
< 0.5 | 结构差异显著 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
模拟人类视觉系统,更关注结构信息 | 不能感知语义层面的差异,如人脸换人、风格变换等 |
考虑亮度、对比度、结构,比 MSE/PSNR 更合理 | 对颜色变化、高频纹理等细节不够敏感 |
适合压缩、恢复等图像质量任务 | 对几何变换不鲁棒,如旋转、缩放会显著降低得分 |
可分块计算,局部感知差异强 | 仅适用于成对图像比较,不能评估无参考图像 |
实现简单、计算效率高 | 与人类主观感知仍存在一定偏差 |
(6)代码示例
import torch
import torchvision.transforms as T
from PIL import Image
from torchmetrics.image.ssim import StructuralSimilarityIndexMeasure
# 加载图像
img1 = Image.open("ref.png").convert("RGB")
img2 = Image.open("gen.png").convert("RGB")
# 预处理
transform = T.Compose([
T.Resize((256, 256)),
T.ToTensor(), # 转为 [C, H, W]
])
img1 = transform(img1).unsqueeze(0) # [1, 3, H, W]
img2 = transform(img2).unsqueeze(0)
# 计算 SSIM
ssim = StructuralSimilarityIndexMeasure(data_range=1.0)
score = ssim(img1, img2)
print(f"SSIM Score: {score.item():.4f}")
5. MS-SSIM(Multi-Scale Structural Similarity Index)
(1)含义
MS-SSIM(Multi-Scale Structural Similarity Index)是结构相似性指数 SSIM 的多尺度扩展版本,MS-SSIM 在SSIM的基础上引入多尺度处理,更加鲁棒、稳定,能更好模拟人类对图像质量的感知。相比单尺度 SSIM,MS-SSIM 能捕捉图像在多个分辨率上的相似性,更适合评估图像质量和感知相似性,尤其在高分辨率图像上效果更好。
(2)数学定义
设参考图像为 ,待评估图像为
,则 SSIM 的基本形式如下:
其中, 是亮度对比项(luminance);
是对比度项(contrast);
是结构项(structure)。
在 MS-SSIM 中,我们在多个尺度 MMM 上下采样图像,然后分别计算结构和对比度项,只有在最低分辨率计算亮度项。总公式如下:
其中, 表示尺度级别,
是最高分辨率,
是最低分辨率,
是权重(一般取 1),
只在最后一个尺度计算亮度项。
(3)计算流程
图像下采样:对图像进行多尺度金字塔下采样(如 5 层);
在每个尺度上计算 SSIM 的结构项和对比度项;
在最后一个尺度上计算亮度项;
将各尺度结果按权重组合,得到最终 MS-SSIM 值。
(4)数值解释
MS-SSIM 值范围(越接近 1 越相似) | 相似度解释 |
---|---|
1.0 | 完全一致(无差异) |
0.9 ~ 1.0 | 几乎无感知差异 |
0.6 ~ 0.9 | 有一定感知差异(常见范围) |
< 0.5 | 明显差异,感知差异强烈 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
能在多尺度上衡量图像结构相似性,更贴近人眼感知 | 仅适用于成对图像比较,不能评估无参考图像 |
比 SSIM 更鲁棒,对亮度、尺度、压缩等变换不敏感 | 对颜色失真和高频细节变化不够敏感 |
计算效率高,可快速评估大量图像 | 不考虑图像语义信息,对语义变化不敏感 |
可作为图像生成或重建任务中的训练目标函数(可微) | 对于大分辨率图像需更长时间或更复杂下采样处理 |
(6)代码示例
pip install pytorch-msssim
import torch
from torchvision import transforms
from PIL import Image
from pytorch_msssim import ms_ssim
# 图像预处理
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(),
])
img1 = transform(Image.open("ref.png").convert("RGB")).unsqueeze(0) # shape: [1, 3, H, W]
img2 = transform(Image.open("gen.png").convert("RGB")).unsqueeze(0)
# 计算 MS-SSIM(默认 scales=5)
ms_ssim_score = ms_ssim(img1, img2, data_range=1.0, size_average=True)
print(f"MS-SSIM: {ms_ssim_score.item():.4f}")
6. PSNR(Peak Signal-to-Noise Ratio)
(1)含义
PSNR(峰值信噪比) 是衡量图像或视频压缩质量的传统指标,用于评估原始图像与压缩或重建图像之间的误差大小。它基于均方误差(MSE),反映图像失真的程度,适用于图像压缩、图像恢复、去噪、图像生成等任务的质量评估。PSNR 越高,表示图像失真越小,质量越好。
(2)数学定义
设原始图像为 ,重建图像为
,图像尺寸为
,其均方误差(MSE)定义为:
然后,PSNR 定义为:
其中,:图像像素的最大可能值(如 255 表示 8 位图像)
(3)计算流程
将两张图像(原始和重建)转换为灰度或三通道格式,确保维度一致;
计算它们的 MSE(均方误差);
将 MSE 代入公式,计算 PSNR。
(4)数值解释
PSNR 值(dB) | 图像质量评价 |
---|---|
> 40 | 非常高质量(接近无损) |
30 ~ 40 | 高质量 |
20 ~ 30 | 中等质量 |
< 20 | 明显失真 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
实现简单,计算效率高,广泛应用 | 不能反映人类视觉系统对图像差异的真实感知 |
可解释性强:越高表示失真越低 | 对图像的结构、纹理、语义等信息不敏感 |
在信号处理、图像压缩标准中已有广泛应用 | 两张图像像素位置必须严格对齐(对几何变形极其敏感) |
可用于快速粗略评估图像质量 | 容易对高 PSNR 产生误导,图像“看起来”可能并不好看 |
(6)代码示例
import torch
import torch.nn.functional as F
from torchvision import transforms
from PIL import Image
def psnr(img1, img2, max_val=1.0):
mse = F.mse_loss(img1, img2)
if mse == 0:
return float('inf')
psnr_val = 10 * torch.log10(max_val**2 / mse)
return psnr_val
# 加载图像
transform = transforms.Compose([
transforms.Resize((256, 256)),
transforms.ToTensor(), # Converts to [0, 1]
])
img1 = transform(Image.open("ref.png").convert("RGB")).unsqueeze(0) # [1, 3, H, W]
img2 = transform(Image.open("gen.png").convert("RGB")).unsqueeze(0)
# 计算 PSNR
psnr_score = psnr(img1, img2)
print(f"PSNR: {psnr_score.item():.2f} dB")
7. A/B Test(用户偏好测试)
(1)含义
A/B 测试是一种统计方法,用于比较两个版本(A 和 B)之间的用户偏好差异。在图像质量评估中,通常用于让用户判断**“你更喜欢 A 图像还是 B 图像?”用于生成图像的主观质量对比,如 GAN、图像重建、超分等领域。
(2)数学定义
令 :总测试次数(即参与者数或评估次数);
:选择图像 A 的次数;
:选择图像 B 的次数(有
)。那么偏好率为:
若进行统计假设检验(如二项检验)来判断显著性,可以进一步构造:零假设 :无显著偏好(即
)。
(3)计算流程
随机排列图像 A 和 B 的显示顺序(防止偏置);
向用户展示图像对,收集他们更偏好的图像;
累计每个版本被选择的次数;
统计并可选做显著性检验。
(4)数值解释
如果 PA>0.6P_A > 0.6PA>0.6,可以认为用户整体偏好 A 图像。若进行假设检验,还能判断差异是否显著。
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
简单直观,符合用户主观体验 | 无法提供评分强度,仅表示偏好 |
无需评分标准,用户易于理解 | 无法反映多维感知(如清晰度 vs 真实感) |
可用于两种模型/算法的直接对比 | 若参与者数量太少,结果可能不可靠 |
易与统计检验方法结合,支持显著性分析 | 只适用于两个样本间对比,无法同时评估多个方法 |
(6)代码示例
<h3>请选择你更喜欢的图像:</h3>
<img src="image_A.jpg" width="256">
<img src="image_B.jpg" width="256">
<br>
<button onclick="vote('A')">更喜欢左图</button>
<button onclick="vote('B')">更喜欢右图</button>
<script>
let results = { A: 0, B: 0 };
function vote(choice) {
results[choice]++;
alert(`当前结果:A = ${results.A},B = ${results.B}`);
}
</script>
8. MOS(Mean Opinion Score)
(1)含义
MOS 是一种主观图像/音视频质量评分指标,由多位人类评审员对图像进行打分,计算平均分作为质量评价。评分通常使用 1~5 或 1~10 的离散等级,数值越高表示质量越好。
(2)数学定义
设 :参与评分的用户数量;
:第
位用户的评分(通常为 1~5 的整数)。MOS 定义为:
也可以计算标准差(评分一致性):
(3)计算流程
准备需要评分的图像集合;
每位用户对每张图像打分(通常 1~5);
汇总每张图像的所有评分,计算平均值作为该图像的 MOS;
可进一步分析方差(评分一致性)。
(4)数值解释
分数范围 | 评价等级 |
---|---|
4.5 ~ 5 | 非常好 |
3.5 ~ 4.5 | 良好 |
2.5 ~ 3.5 | 一般 |
1.5 ~ 2.5 | 较差 |
1 ~ 1.5 | 极差 |
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
可量化主观质量,结果连续,适用于模型训练 | 结果受参与者主观偏差影响较大 |
可用于多个样本、模型之间的对比分析 | 无法体现样本之间的相对差异(如“哪个更好”) |
与人类感知一致度高,广泛用于图像/视频质量评估 | 测试成本较高,需要足够多且分布广的评估者 |
可计算方差评估评分一致性 | 打分区间解释可能因人而异(“4”和“5”的标准可能不同) |
(6)代码示例
# Flask 后端
from flask import Flask, request, render_template
app = Flask(__name__)
scores = []
@app.route('/')
def index():
return '''
<h3>请对图像进行评分(1~5):</h3>
<img src="image.jpg" width="256"><br>
<form action="/vote" method="post">
<input type="number" name="score" min="1" max="5">
<input type="submit" value="提交">
</form>
'''
@app.route('/vote', methods=['POST'])
def vote():
score = int(request.form['score'])
scores.append(score)
avg = sum(scores) / len(scores)
return f"当前MOS: {avg:.2f},投票数:{len(scores)}"
9. Diversity Score
(1)含义
衡量一组生成图像内部的多样性程度。多样性高的图像集合在特征空间中分布广泛、差异性强。常用于避免“模式崩溃”(mode collapse)的问题。
(2)数学定义
设有 张生成图像,通过特征提取网络(如 Inception 或 CLIP)得到每张图像的向量表示
。定义 Diversity Score 为所有成对图像间距离的平均值:
(3)计算流程
对所有生成图像提取特征(如 Inception Pool3 或 CLIP embedding);
计算每对图像之间的欧氏距离;
取所有距离的平均值作为多样性评分。
(4)数值解释
分数越高,图像间差异越大,多样性越好,0 表示所有图像完全相同。
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
可衡量生成模型是否存在模式崩溃 | 仅衡量多样性,不考虑与真实图像的对齐性 |
实现简单、可视化明确 | 对噪声敏感,生成的"异常图像"会抬高分数 |
可适配任意特征提取器(Inception、CLIP 等) | 难以定义“理想多样性”的参考基准 |
(6)代码示例
import torch
from sklearn.metrics.pairwise import euclidean_distances
def diversity_score(features):
features = features.cpu().numpy()
dists = euclidean_distances(features, features)
upper_tri = dists[np.triu_indices_from(dists, k=1)]
return upper_tri.mean()
10. Coverage / Precision
(1)含义
通过在特征空间中比较生成图像和真实图像的分布,来衡量分布覆盖性(Coverage)和样本真实性(Precision)。Precision:生成图像落入真实图像分布的比例(真实性)。Coverage:真实图像被生成图像覆盖的比例(多样性)。
(2)数学定义
设 :真实图像的特征集合;
:生成图像的特征集合。定义:
Precision:对每个
,若其最近的
个邻居中有
,则计为1:
Coverage:每个
至少被一个生成图像的
-邻居覆盖:
(3)计算流程
提取真实图像和生成图像的特征;
对所有生成图像计算其最近邻是否包含真实图像 → Precision;
对所有真实图像看是否被生成图像覆盖 → Coverage;
使用 KD-Tree 或 FAISS 提速最近邻搜索。
(4)数值解释
Precision 高说明生成图像真实可信,Coverage 高说明生成图像多样性强,两者兼顾时,模型才是优质的。
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
同时评估真实性和多样性(兼顾 GAN 两大指标) | 依赖特征提取器,维度不同会影响效果 |
数值有明确物理意义(点是否落入某个区域) | 最近邻参数 kk 选择敏感 |
可视化性强(如球面覆盖图) | 计算复杂度高(尤其在高维特征空间) |
(6)代码示例
from sklearn.neighbors import NearestNeighbors
def precision_recall_coverage(real_feats, gen_feats, k=5):
nn_real = NearestNeighbors(n_neighbors=k).fit(real_feats)
nn_gen = NearestNeighbors(n_neighbors=k).fit(gen_feats)
# Precision
_, indices = nn_real.kneighbors(gen_feats)
precision = (indices < len(real_feats)).any(axis=1).mean()
# Coverage
_, indices = nn_gen.kneighbors(real_feats)
coverage = (indices < len(gen_feats)).any(axis=1).mean()
return precision, coverage
11. CLIP Score
(1)含义
用于图文生成(Text-to-Image)中衡量生成图像是否与输入文本语义一致。使用 OpenAI 的 CLIP(Contrastive Language-Image Pretraining) 模型对图像和文本分别编码。再计算两者的余弦相似度,作为图文对齐程度。
(2)数学定义
设文本嵌入:;图像嵌入:
。则 CLIP Score 为:
(3)计算流程
使用 CLIP 模型对图像和文本分别提取嵌入向量;
计算图像和文本嵌入的余弦相似度;
多个样本时取平均作为整体得分。
(4)数值解释
得分 ∈ [–1, 1],越高越好(通常实际范围在 [0.1, 0.35])。0 表示不相关,> 0.3 一般代表高度相关(根据任务)。
(5)优缺点
✅ 优点 | ❌ 缺点 |
---|---|
可用于任何文本图像生成任务 | 高分不一定代表图像好看,只是与文本匹配 |
无需真实图像对,适用于 zero-shot 测试 | 不考虑图像内部的真实性或细节 |
利用预训练 CLIP,语义泛化能力强 | 对细粒度文本差异不敏感(如颜色变化等) |
(6)代码示例
import torch
import clip
from PIL import Image
model, preprocess = clip.load("ViT-B/32")
image = preprocess(Image.open("generated.png")).unsqueeze(0).to("cuda")
text = clip.tokenize(["a dog wearing sunglasses"]).to("cuda")
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
score = (image_features @ text_features.T).item()
print(f"CLIP Score: {score:.3f}")
二、图像分割
1. 准确类指标
指标名称 | 定义描述 | 数值范围 | 获取方式 / 数学公式 |
---|---|---|---|
|
针对不同目标尺寸(Small < 32², Medium 32²–96², Large > 96²)的平均精度 | [0, 1],越大越好 | COCO 官方评估工具,基于 IoU ≥ [0.5:0.95] 多阈值计算 AP |
mAP | 对所有类别/尺度的平均 AP,衡量整体检测与分割精度 | [0, 1],越大越好 | |
mIoU | 所有类别 IoU 平均值,衡量预测与真实区域重叠程度 | [0, 1],越大越好 | |
F-score(调和平均数) / Dice Coefficient | Precision 与 Recall 的调和平均,用于衡量区域预测重叠 | [0, 1],越大越好 | |
ODS(Optimal Dataset Scale) | 在统一阈值下,全数据集上获得的最佳 F-score(用于边缘检测) | [0, 1],越大越好 | 取 F-score 最高点作为 ODS。 |
OIS(Optimal Image Scale) | 每张图像上独立选择最优阈值后取平均 F-score | [0, 1],越大越好 | 将所有图像的最优 F-score 取平均,即为 OIS。 |
AR@10 / AR@100 / AR@1000 | 不同候选数下的平均召回率,衡量模型对实例的覆盖能力(用于实例分割) | [0, 1],越大越好 | COCO 评估脚本统计在给定最大检测数下的平均 Recall |
2. 效率类指标
指标名称 | 定义描述 | 数值说明 | 获取方式 / 数学公式 |
---|---|---|---|
Parameters (参数量) |
模型中所有可学习参数的总数,反映模型复杂度和大小 | 单位:M(百万),越小越轻量 | 通过 model.parameters() 统计,PyTorch中:sum(p.numel() for p in model.parameters()) |
GFLOPs(Giga Floating Point Operations) | 每次前向传播所需的浮点运算数(乘加等),衡量计算复杂度 | 单位:GFLOPs(十亿次),越小越快 | 工具计算,如 fvcore , ptflops , thop 等 |
Inference Time (推理时间) |
单张图像从输入到输出所需的处理时间 | 单位:ms,越小越好 | 利用 time.time() 或 PyTorch/ONNX profiler 对单张图像推理多次取平均 |
Throughput (吞吐量) |
单位时间内处理图像的能力,常用于批处理性能评估 | 单位:images/sec,越大越好 | |
FPS(Frames Per Second) | 每秒处理图像帧数,衡量模型实时性 | 单位:帧/秒,越大越好 |
三、目标检测
1. 准确类指标
指标名称 | 定义描述 | 数值范围 | 数学公式 |
---|---|---|---|
IoU | 衡量预测框与真实框重叠程度的比值,常用阈值:0.5、0.75、0.95 等。 | [0, 1],越大越好 | |
Precision | 正确预测为目标的比例。 | [0, 1],越大越好 | |
Recall | 真实目标中被检测出的比例。 | [0, 1],越大越好 | |
F1-score | Precision 和 Recall 的调和平均值。 | [0, 1],越大越好 | |
AP | 精度-召回曲线(PR 曲线)下的面积。 |
[0, 1],越大越好 | 实际为对 PR 曲线的离散积分 |
mAP | 对所有类别的 AP 求平均。 | [0, 1],越大越好 | N为类别数 |
AR | 在不同 IoU 阈值下的召回率平均值。 | [0, 1],越大越好 | COCO中通常 K=10,IoU从0.5到0.95 |
指标使用建议说明:
IoU:用于判断是否“命中”目标(例如 IoU ≥ 0.5 视为 TP)。
Precision / Recall / F1-score:特别适用于单类别检测或不平衡样本场景。
AP / mAP:主流多类别目标检测的标准精度评估指标。
AR:补充指标,反映模型对目标的覆盖能力,常用于 COCO。
2. 效率类指标
指标名称 | 定义描述 | 数值说明 | 获取方式 / 数学公式 |
---|---|---|---|
FPS | 每秒能处理的图像帧数,表示推理速度 | 数值越大越好,单位:帧/秒 | |
Latency | 单张图像从输入到输出的处理时间 | 越小越好,单位:毫秒(ms) | 用 time.time() 或 profiler 工具测量单张图像推理时间 |
Throughput | 单位时间内处理图像数量,通常用于批处理 | 越大越好,单位:图像/秒 | |
MACs | 模型执行的乘加操作总数,衡量计算复杂度 | 单位:G(十亿次),越小越轻量 | 工具计算,如 ptflops , fvcore ,与网络结构强相关 |
FLOPs | 模型的浮点运算总量 | 单位:G或T,越小越快 | 工具估算,近似值,依赖框架(如 fvcore , torchprofile ) |
Parameters | 模型中可学习的参数总数 | 单位:M(百万),越小越轻 | |
Model Size | 模型保存为文件后的磁盘占用 | 单位:MB,越小越适合部署 | 直接查看 .pt , .onnx , .pb 文件大小 |
Memory Usage | 模型在推理时的 GPU/CPU 显存使用量 | 单位:MB / GB,越小越好 | 工具监控,如 nvidia-smi , torch.cuda.max_memory_allocated() |
Energy Consumption | 模型推理时的电能消耗,常用于边缘部署评估 | 单位:Joule 或 Watt,越小越节能 | 使用能耗计或框架支持的能耗统计(如 NVIDIA Nsight,Jetson Power Estimator) |