目录
1. 图像画质评测的应用场景
2. 画质评测的方法
3. 低画质图像归因
4. 画质增强的方法
5. 资料
一、 图像画质评测的应用场景
图像画质对于提升用户体验起着重要的作用,高质量的图像,能够增加停留时间和点击率,构建一个有效的画质评估体系是非常有必要的。
对于UGC内容,通过画质评估,提供量化指标,打压或者增强低画质图片,提升用户体验
对于转码压制的图片(减低带宽成本),进行画质评估,评估成本和体验之间的平衡
不同画质的case
二、 画质评测的方法
主观评测: MOS和DMOS 。评测方案有:专家评测,众包评测,成本很高
客观评测: 分为全参考画质评测和无参考画质评测
2.1 有参画质评测方法有: PSNR SSIM等
图片来自:深度解读字节跳动的画质评估工具
有参画质评测需要同时有原始(无失真、参考)图像和失真图像,难度较低,核心是对比两幅图像的信息量或特征相似度,是研究比较成熟的方向。
**峰值信噪比(Peak Signal to Noise Ratio, PSNR)**通常用来评价一幅图像压缩后和原图像相比质量的好坏,PSNR越高,压缩后失真越小,可以借助均方误差(Mean Square Error, MSE)来计算,计算公式为:
PSNR是根据图像的最大像素值与均方根误差之比来衡量图像质量的传统方法。它是基于图像像素值的误差来计算的,数值越高表示图像质量越好。但PSNR只考虑了像素值的差异,忽略了人眼对结构信息的主观评价,没有考虑人类视觉系统(Human Visual System, HVS)的一些重要的生理、心理、物理学特征
结构相似性指数(Structural SIMilarity Index, SSIM)
SSIM不仅考虑了亮度信息,还将图像的结构信息纳入了评价体系。它通过比较参考图像和检测图像的亮度、对比度和结构信息的相似度来评估两幅图像的相似程度。SSIM的取值范围在0~1之间,值越接近1表示两幅图像越相似,质量越高
2.2 无参考画质评测
很多场景是没有参考的图片的,特别是UGC的场景,这就需要用到无参考画质评测(No Reference-IQA, NR-IQA)
常用的画质评估项目有LinearIQA和IQA-PyTorch
2.2.1 LinearIQA
前向传播(Forward Path)
1. 训练过程:
- 训练图像:一组训练图像作为输入。
- IQA模型:一个卷积神经网络(CNN),使用ResNeXt-101的架构,提取图像的特征。ResNeXt是一种通过重复残差模块来提取特征的深度CNN。
- 特征提取:图像经过CNN后,通过不同卷积层(Conv4和Conv5)和全局平均池化(GAP)提取特征。
- 编码器:提取到的特征经过编码器生成编码向量,然后通过全连接层(FC)得到一个预测值。
2. 测试过程:
-
测试图像:在实际使用时,一个测试图像输入IQA模型进行质量预测。
-
LSR(Linear Scaling Rule):线性映射规则用于将模型输出映射到预测质量上。这可能涉及到将CNN的输出标准化为质量分数。
反向传播(Backward Path)
在训练过程中,模型通过以下步骤更新权重:
-
1. 损失函数:Norm-in-Norm Loss:这是一个自定义的损失函数,它可能涉及到比较预测的质量评分和真实的质量评分,并通过正则化来控制模型复杂性。
-
2. 梯度计算:反向传播:从损失函数开始,通过网络计算每一层的梯度。这些梯度将用于更新网络的权重
2.2.2 IQA-PyTorch
IQA-pyTorch本身是不是某一个算法模型,而是提供了一套框架,可以适配不同的IQA算法模型,支持全参考画质评估算法(PSNR MMIS等),也支持很多无参考画质评估模型,比如:LPIPS, FID, NIQE, NRQM(Ma), MUSIQ, NIMA, DBCNN, WaDIQaM, BRISQUE, PI ,TopIQ,Clip-IQA等等
在具体实践中发现效果比较好的无参考画质评估模型有:TopIQ和Clip-IQA,下面分别进行介绍
2.2.2.1 TopIQ
提出了有别于(a)图像金字塔和(b)自底而上的特征金字塔 的 自顶而下的特征金字塔(c)
(a) 图像金字塔:平行方法
如MS-SSIM, NIQE等:这类方法并行地在不同分辨率的图像上提取特征,每一层的图像代表不同的尺度。特征提取和分数计算在每一层上独立进行,然后分数被平均以得出最终的图像质量评分。
特点:平行处理多个尺度的图像,每个尺度独立评估图像质量,最后得分通过平均获得。
(b) 特征金字塔:自底向上方法
如LPIPS, DISTS等:在这种方法中,从最低级别(通常是最高分辨率)开始,特征在金字塔的每一级上逐渐提取,并逐层聚合到更高级别。最后,在顶层进行分数回归,然后得出最终的评分。
特点:从详细特征开始,逐渐汇总信息到更抽象的级别,最终进行质量评分。
(c) 特征金字塔:自顶向下方法
这种方法从高层语义特征开始,这些特征可能由深层网络或先进的视觉模型提供。然后,这些高层特征通过语义传播逐渐影响到更低层次的特征。在每个级别上都进行传播,最终在底层得到图像质量评分。
特点:从高层特征开始,将语义信息向下传播,影响到各个层次的评分。
(C)优点在于:考虑了高级语义和低级失真的相关性,如下图所示:
尽管图像 A 中的大背景区域有噪声,但人类为 A 分配的质量Mos打分比 B 更高,因为 A 中鸟类的区域要清晰得多。这表明人类倾向于关注语义上更重要的区域。LPIPS 和 DISTS 等简单的多尺度方法忽略了高级语义和低级失真之间的相关性,因此与人类相比会产生不一致的判断。
2.2.2.2 Clip-IQA
(b) CLIP-IQA框架
这个方法使用对比的提示语句("Good photo." 和 "Bad photo."),以及改进的CLIP模型
-
文本编码器:对每个提示语句进行编码。
-
图像编码器:将输入图像编码成特征向量。
-
Softmax:通过softmax函数计算两个提示语句与图像编码的相似度,得到图像质量评分。
-
位置嵌入移除:在原始CLIP模型中,移除了位置嵌入来改进图像质量的评估。
经过改进的CLIP-IQA模型(b)与人类评价有更高的相关性,表明它是一个更准确的图像质量评估方法。
对不同图片的画质评测如下
clip-iqa不仅可以区分不同图片画质,还可以识别暖/冷色、真实/抽象、美/丑、孤独/社交、放松/有压力等属性。
2.3 常用的数据集
数据集: huggingface.co/datasets/ch…
其中使用比较多的是Koniq10这个数据集
三、低画质图像归因
图像低画质的原因可能包括:图像模糊、曝光过度、噪声、色彩失真等。
3.1 图像模糊
可以采用 opencv 拉普拉斯算子的方式进行检测
使用拉普拉斯算子对输入图像进行卷积
#估计图像的模糊程度
def estimate_blur(image: numpy.array, threshold: int = 100):
if image.ndim == 3:
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#计算拉普拉斯算子。拉普拉斯算子对于模糊检测非常有用,因为在图像模糊时,边缘区域变得不那么突出
blur_map = cv2.Laplacian(image, cv2.CV_64F)
#通过计算拉普拉斯卷积结果的方差来获取评分。方差越高,意味着边缘变化越大,图像越清晰
score = numpy.var(blur_map)
return blur_map, score, bool(score < threshold)
image = cv2.imread(str(image_path))
blur_map, score, blurry = estimate_blur(image, threshold=100)
3.2 过度曝光检测
import cv2
import numpy as np
def is_overexposed(image_path, threshold=250, overexposed_limit=0.2):
"""
检测图像是否过度曝光。
参数:
image_path (str): 图像的路径。threshold (int): 用于过曝检测的亮度阈值。overexposed_limit (float): 判定为过曝的像素比例阈值。
返回:
bool: 图像是否过曝。"""
# 读取图像
image = cv2.imread(image_path)
# 转换到HSV颜色空间并获取亮度通道
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
v_channel = hsv_image[:, :, 2]
# 获取过度曝光的像素的比例
overexposed_pixels = np.sum(v_channel > threshold)
overexposed_ratio = overexposed_pixels / v_channel.size
# 检测图像是否过度曝光
return overexposed_ratio > overexposed_limit
# 使用函数检测图像是否过曝
image_path = 'path/to/your/image.jpg'
if is_overexposed(image_path):
print("The image is overexposed.")
else:
print("The image exposure seems to be normal.")
3.3噪声检测:
使用传统的检测方式可能不太准,比如有些格子衫衣服也很容易被判断为噪声,所以就暂时忽略了该评估维度
3.4 色彩失真检测
import cv2
import numpy as np
def detect_color_distortion(image_path, threshold=0.05):
# 读取图像
image = cv2.imread(image_path)
# 转换到LAB颜色空间
lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
# 分离L, A, B通道
l_channel, a_channel, b_channel = cv2.split(lab_image)
# 计算每个通道的颜色直方图
hist_l = cv2.calcHist([l_channel], [0], None, [256], [0, 256])
hist_a = cv2.calcHist([a_channel], [0], None, [256], [0, 256])
hist_b = cv2.calcHist([b_channel], [0], None, [256], [0, 256])
# 标准化直方图
hist_l = hist_l / np.sum(hist_l)
hist_a = hist_a / np.sum(hist_a)
hist_b = hist_b / np.sum(hist_b)
# 检查每个通道是否有颜色失真,即直方图峰值是否超过阈值
distortion_l = np.any(hist_l > threshold)
distortion_a = np.any(hist_a > threshold)
distortion_b = np.any(hist_b > threshold)
# 如果任一通道的颜色失真
is_distorted = distortion_l or distortion_a or distortion_b
return is_distorted
# 使用函数检测图像色彩是否失真
image_path = 'path/to/your/image.jpg'
if detect_color_distortion(image_path):
print("The image has color distortion.")
else:
print("The image does not have significant color distortion.")
四 画质增强的方法
之前文章已经介绍过, 画质增强 CodeFormer、gfpgan
音视频开发之旅(70)- 人脸修复画质增强之CodeFormer
五、资料
1. Awesome-Image-Quality-Assessment: github.com/chaofengc/A…
2. IQA-PyTorch :github.com/chaofengc/I…
3. topiq论文:arxiv.org/pdf/2308.03…
4. CLIP- IQA论文:arxiv.org/pdf/2207.12…
5. Low Quality Image Detection towardsdatascience.com/low-quality…
6. 图片数据集汇总:huggingface.co/datasets/ch…
7. Blur detection with OpenCV github.com/WillBrennan…
8. 深度解读字节跳动的画质评估工具 www.infoq.cn/article/Vsc…
9. 图像质量评价概述(评估指标、传统检测方法) blog.csdn.net/qq_23304241…
10.图像质量评估综述 zhuanlan.zhihu.com/p/32553977
感谢你的阅读
接下来我们继续学习输出AIGC相关内容,欢迎关注“音视频开发之旅”,一起学习成长。
欢迎交流