python 图像相似性评估

简介: 相似性经常通过距离的方式来度量,但图像是高纬度的数据,而且图像相似性判断和人类的主观感受存在一定的关系。本文针对图像相似性,梳理了传统的经典算法和基于感知的深度学习方法【2月更文挑战第7天】

python 图像相似性评估

1. 图像相似性

在计算机视觉任务或者图像处理中,常常需要计算图像之间的相似性。特别的,图像相似性经常会用在如图像超分重建,恢复,去噪等任务的质量评估上。

相似性经常通过距离的方式来度量,但图像是高纬度的数据,而且图像相似性判断和人类的主观感受存在一定的关系。本文针对图像相似性,梳理了传统的经典算法和基于感知的深度学习方法,主要方法如下:

  • 峰值信噪比 PSNR
  • 结构化相似度 SSIM
  • 可学习的感知图像相似度 LPIPS

2. 方法

2.1 PSNR

PSNR全名Peak Signal-to-Noise Ratio 即峰值信噪比,是传统的基于像素级别的图像相似性比较。从下面公式(X和Y是两幅图)可知,PSNR是像素的均方误差后取对数,指标上,PSNR越大越相似。公式中n一般取8,即一副图用8比特表示,即图像的像素值范围为[0-255]。

yyq-2021-10-30-23-03-44.png

我们来看下PSNR的效果,第一张图为原图,后面依次是扭曲失真,模糊,jpeg压缩,噪声,对比度亮度调整以及饱和度失真:

from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio  as psnr
from imgaug import augmenters as iaa
import numpy as np
import matplotlib.pyplot as plt
import cv2

test_img = cv2.cvtColor(cv2.imread('./cat.png'), cv2.COLOR_BGR2RGB)

blur_aug = iaa.GaussianBlur(sigma=10)
blur_img = blur_aug.augment_image(test_img)

psnr_value = psnr(test_img, blur_img)

yyq-2021-10-30-22-19-33.png

从上图可知,psnr对像素偏差影响较大,对模糊这种人类感知差的反而值越好。

2.2 SSIM

PSNR简单粗暴,有计算效率高的特点,但是与人类感知的视觉质量不太匹配。SSIM是2004年Image quality assessment: from error visibility to structural
similarity提出的基于结构化的图像质量评估方法。SSIM从亮度、对比度、结构三个方面度量图像相似性。SSIM取值范围[0, 1],值越大,表示图像失真越小,越相似。

SSIM的计算过程可以分为三个部分:亮度、对比度、结构。

  • 亮度:以灰度值的平均值作为亮度测量

    yyq-2021-10-30-23-00-51.png

  • 对比度:以灰度值的方差作为对比度测量

    yyq-2021-10-30-23-01-24.png

  • 结构:以像素值的分布来做结构测量

    yyq-2021-10-30-23-02-01.png

综合ssim值为:
yyq-2021-10-30-23-03-08.png

yyq-2021-10-30-23-03-44.png

其中C1、C2、C3为常数,避免分母接近于0时造成的不稳定性。

在实现过程中,一张图以小尺寸进行滑窗然后计算ssim后,然后取均值,会比较有效。

我们来看下SSIM的效果,第一张图为原图,后面依次是扭曲失真,模糊,jpeg压缩,噪声,对比度亮度调整以及饱和度失真。

from skimage.metrics import structural_similarity as ssim
from skimage.metrics import peak_signal_noise_ratio  as psnr
from imgaug import augmenters as iaa
import numpy as np
import matplotlib.pyplot as plt
import cv2

test_img = cv2.cvtColor(cv2.imread('./cat.png'), cv2.COLOR_BGR2RGB)

noise_aug = iaa.AdditiveGaussianNoise(scale=0.2*255)
noise_img = noise_aug.augment_image(test_img)

ssim_value = ssim(test_img, noise_img, multichannel=True)

yyq-2021-10-30-22-22-39.png

从上图可知,相比psnr, ssmi对于亮度和对比度有一定的鲁棒性,但是相对来说模糊也不能很好的体现人类感知效果。

2.3 LPIPS

虽然SSIM也是基于一种感知的度量方法,但是构建人类感知度量是一个挑战,图像相似的感知因素是复杂多变的:结构,上下文等。随着深度学习的发展,由于卷积神经网络高效的提取特征的能力,从语义上评估图像相似性成为可能。The Unreasonable Effectiveness of Deep Features as a Perceptual Metric 这篇文章提出了基于可学习的感知图像相似度量方法LPIPS。

LPIPS通过构建大量的评估图像数据集(Berkeley-Adobe Perceptual Patch Similarity Dataset 简称(BAPPS))来训练深度的感知度量方法。

LPIPS主要的贡献在于如何构建BAPPS,或者说如何获得人类感知的评价, 有了评价值才能训练模型,否则一切免谈。LPIPS首先基于参考图(原图)生成很多失真的图片如模糊,噪声,对比度饱和度变化等,也有基于CNN如去噪,超分,色彩增强等方法生成的图片,在此基础上,基于两种标准找不同人来对参考图和失真进行判断,标准如下:

  • 2AFC(two alternative forced choice):给出两种不同失真操作,挑选出和参考图(原始图)最相近的图,方法中选取了小的区域(64x64)进行判断,有利于局部感知。
  • Just noticeable differences (JND):给出两张图,只判别是否是相同还是不同

数据集构建完成之后,就要搭建可训练的网络。已知x是参考图,x0,x1是失真操作之后的图,由下图可知:

  • 计算x和x0的感知距离d0(同理x和x1距离为d1):先通过特征提取网络F(可以是VGG,AlexNet,SqueezeNet),提取x和x0的各层特征,并作差值,然后乘以一个可学习的权重w,最后进行全局平均得到d0
    yyq-2021-10-23-21-16-56.png
  • 训练一个简单的网络来拟合两种判断d0和d1,与人为判断标准h(即gt)

yyq-2021-10-21-23-31-02.png

注意的是,w和简单网络G都是训练学习的,特征提取网络F可根据预训练网络固定,也可微调学习

官方github(https://www.github.com/richzhang/PerceptualSimilarity) 提供了可直接使用的预训练模型,我们来试下对比效果 lpips值越小越好,0表示完全一致。 第一张图为原图,后面依次是扭曲失真,模糊,jpeg压缩,噪声,对比度亮度调整以及饱和度失真。

pip install lpips
import lpips

loss_fn = lpips.LPIPS(net='alex',version='0.1')
use_gpu = True
path0 = './cat.png'
path1 = './noise_cat.png'
if(use_gpu):
    loss_fn.cuda()

# Load images
img0 = lpips.im2tensor(lpips.load_image(path0)) # RGB image from [-1,1]
img1 = lpips.im2tensor(lpips.load_image(path1))

if(use_gpu):
    img0 = img0.cuda()
    img1 = img1.cuda()

# Compute distance
lpips_value = loss_fn.forward(img0, img1)

yyq-2021-10-30-22-44-48.png

从lpips的值可知,相对细微的扭曲(2),亮度(6)和对比度(7)都符合人体感知,模糊也处理可接受的范围。

3. 总结

本文分享了图像相似性评估中三种不同但常用的原理和具体使用,希望对你有帮助,欢迎交流(weixin:@mintel)。总结如下:

  • PSNR峰值信噪比:简单速度快,最常见的方式,但与人类感知存在差距,越大越好
  • SSIM:亮度、对比度、结构的感知,越大越好
  • LPIPS:基于深度学习的感知相似性评估,重在基于2AFC和JND的训练数据构建,和常规网络模型,符合人类感知,越小越好
目录
相关文章
|
3月前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
100 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
20天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
45 3
|
2月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
56 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
3月前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
136 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
3月前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
111 12
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2月前
|
机器学习/深度学习 数据挖掘 Serverless
手把手教你全面评估机器学习模型性能:从选择正确评价指标到使用Python与Scikit-learn进行实战演练的详细指南
【10月更文挑战第10天】评估机器学习模型性能是开发流程的关键,涉及准确性、可解释性、运行速度等多方面考量。不同任务(如分类、回归)采用不同评价指标,如准确率、F1分数、MSE等。示例代码展示了使用Scikit-learn库评估逻辑回归模型的过程,包括数据准备、模型训练、性能评估及交叉验证。
81 1
|
2月前
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
54 0
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
3月前
|
机器学习/深度学习 算法 数据挖掘
Python数据分析革命:Scikit-learn库,让机器学习模型训练与评估变得简单高效!
在数据驱动时代,Python 以强大的生态系统成为数据科学的首选语言,而 Scikit-learn 则因简洁的 API 和广泛的支持脱颖而出。本文将指导你使用 Scikit-learn 进行机器学习模型的训练与评估。首先通过 `pip install scikit-learn` 安装库,然后利用内置数据集进行数据准备,选择合适的模型(如逻辑回归),并通过交叉验证评估其性能。最终,使用模型对新数据进行预测,简化整个流程。无论你是新手还是专家,Scikit-learn 都能助你一臂之力。
142 8
|
3月前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
63 4
|
6月前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
194 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow