项目简介:pyiqa-sal | 图像质量评价代码库

news2024/11/15 13:40:54

项目地址:https://github.com/Alexkkir/pyiqa-sal/tree/main

这是一个纯python和pytorch编写的图像质量评估工具箱,提供了许多主流全参考(FR)和无参考(NR)指标的重新实现(如果有的话,结果会用官方matlab脚本校准)。借助GPU加速,我们的大多数实现都比Matlab快得多。同时也比torch实现的方法在调用上更加方便。

在这里插入图片描述

1、基本简介

1.1 安装库

安装代码

# Install with pip
pip install pyiqa

# Install latest github version
pip uninstall pyiqa # if have older version installed already 
pip install git+https://github.com/chaofengc/IQA-PyTorch.git

# Install with git clone
git clone https://github.com/chaofengc/IQA-PyTorch.git
cd IQA-PyTorch
pip install -r requirements.txt
python setup.py develop

1.2 使用案例

基本使用案例

import pyiqa
import torch

# list all available metrics
print(pyiqa.list_models())

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

# create metric with default setting
iqa_metric = pyiqa.create_metric('lpips', device=device)
# Note that gradient propagation is disabled by default. set as_loss=True to enable it as a loss function.
iqa_loss = pyiqa.create_metric('lpips', device=device, as_loss=True)

# create metric with custom setting
iqa_metric = pyiqa.create_metric('psnr', test_y_channel=True, color_space='ycbcr').to(device)

# check if lower better or higher better
print(iqa_metric.lower_better)

# example for iqa score inference
# Tensor inputs, img_tensor_x/y: (N, 3, H, W), RGB, 0 ~ 1
score_fr = iqa_metric(img_tensor_x, img_tensor_y)
score_nr = iqa_metric(img_tensor_x)

# img path as inputs.
score_fr = iqa_metric('./ResultsCalibra/dist_dir/I03.bmp', './ResultsCalibra/ref_dir/I03.bmp')

# For FID metric, use directory or precomputed statistics as inputs
# refer to clean-fid for more details: https://github.com/GaParmar/clean-fid
fid_metric = pyiqa.create_metric('fid')
score = fid_metric('./ResultsCalibra/dist_dir/', './ResultsCalibra/ref_dir')
score = fid_metric('./ResultsCalibra/dist_dir/', dataset_name="FFHQ", dataset_res=1024, dataset_split="trainval70k")

1.3 一次性评价多个指标

代码地址:https://github.com/wyf0912/SinSR/blob/main/evaluate.py
所依赖的 utils库地址为:https://github.com/wyf0912/SinSR/tree/main/utils

import pyiqa
import os
import argparse
from pathlib import Path
import torch
from utils import util_image
import tqdm

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

def evaluate(in_path, ref_path, ntest):
    metric_dict = {}
    metric_dict["clipiqa"] = pyiqa.create_metric('clipiqa').to(device)
    metric_dict["musiq"] = pyiqa.create_metric('musiq').to(device)
    metric_paired_dict = {}
    
    in_path = Path(in_path) if not isinstance(in_path, Path) else in_path
    assert in_path.is_dir()
    
    ref_path_list = None
    if ref_path is not None:
        ref_path = Path(ref_path) if not isinstance(ref_path, Path) else ref_path
        ref_path_list = sorted([x for x in ref_path.glob("*.[jpJP][pnPN]*[gG]")])
        if ntest is not None: ref_path_list = ref_path_list[:ntest]
        
        metric_paired_dict["psnr"]=pyiqa.create_metric('psnr', test_y_channel=True, color_space='ycbcr').to(device)
        metric_paired_dict["lpips"]=pyiqa.create_metric('lpips').to(device)
        metric_paired_dict["ssim"]=pyiqa.create_metric('ssim', test_y_channel=True, color_space='ycbcr' ).to(device)
        
    lr_path_list = sorted([x for x in in_path.glob("*.[jpJP][pnPN]*[gG]")])
    if ntest is not None: lr_path_list = lr_path_list[:ntest]
    
    print(f'Find {len(lr_path_list)} images in {in_path}')
    result = {}
    for i in tqdm.tqdm(range(len(lr_path_list))):
        in_path = lr_path_list[i]
        ref_path = ref_path_list[i] if ref_path_list is not None else None
        
        im_in = util_image.imread(in_path, chn='rgb', dtype='float32')  # h x w x c
        im_in_tensor = util_image.img2tensor(im_in).cuda()              # 1 x c x h x w
        for key, metric in metric_dict.items():
            with torch.cuda.amp.autocast():
                result[key] = result.get(key, 0) + metric(im_in_tensor).item()
        
        if ref_path is not None:
            im_ref = util_image.imread(ref_path, chn='rgb', dtype='float32')  # h x w x c
            im_ref_tensor = util_image.img2tensor(im_ref).cuda()    
            for key, metric in metric_paired_dict.items():
                result[key] = result.get(key, 0) + metric(im_in_tensor, im_ref_tensor).item()
                
    for key, res in result.items():
        print(f"{key}: {res/len(lr_path_list):.5f}")
        
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('-i',"--in_path", type=str, required=True)
    parser.add_argument("-r", "--ref_path", type=str, default=None)
    parser.add_argument("--ntest", type=int, default=None)
    args = parser.parse_args()
    evaluate(args.in_path, args.ref_path, args.ntest)
    


1.4 使用脚本

# example for FR metric with dirs
python inference_iqa.py -m LPIPS[or lpips] -i ./ResultsCalibra/dist_dir[dist_img] -r ./ResultsCalibra/ref_dir[ref_img]

# example for NR metric with single image
python inference_iqa.py -m brisque -i ./ResultsCalibra/dist_dir/I03.bmp

2、评价方法

2.1 有参考评价方法

AHIQ ✅、PieAPP ✅、LPIPS ✅、DISTS ✅、WaDIQaM ✅、CKDN1 ✅、FSIM ✅、SSIM ✅、MS-SSIM ✅、CW-SSIM ✅、PSNR ✅、VIF ✅、GMSD ✅、NLPD ✅、VSI ✅、MAD ✅

2.2 无参考评价方法

FID ✖️、CLIPIQA(+) ✅、MANIQA ✅、MUSIQ ✅、DBCNN ✅、PaQ-2-PiQ ✅、HyperIQA ✅、NIMA ✅、WaDIQaM ✅、CNNIQA ✅、NRQM(Ma)2 ✖️、PI(Perceptual Index) ✖️、BRISQUE ✅、ILNIQE ✅、NIQE ✅

2.3 指标对应的论文

无参考评价方法比较多,建议使用2020年以后提出的指标

modellower better ?minmaxDATELink
clipiqaFalse012022https://arxiv.org/abs/2207.12396
maniqaFalse02022https://arxiv.org/abs/2204.08958
hyperiqaFalse012020pdf
cnniqaFalse2014pdf
tresFalse2022https://github.com/isalirezag/TReS
musiqFalse~0~1002021https://arxiv.org/abs/2108.05997
musiq-avaFalse~0~102021https://arxiv.org/abs/2108.05997
musiq-koniqFalse~0~1002021https://arxiv.org/abs/2108.05997
paq2piqFalse2020pdf
dbcnnFalse2019https://arxiv.org/bas/1907.02665
brisqueTrue2012pdf
piTrue2018https://arxiv.org/abs/1809.07517
nimaFalse2018https://arxiv.org/abs/1709.05424
nrqmFalse2016https://arxiv.org/abs/1612.05890
ilniqeTrue02015pdf
niqeTrue02012pdf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2048321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MES系统从哪几方面提升企业制造水平?

在当今这个快速变化的制造环境中,企业对于提升制造水平的追求从未停止。制造执行系统(MES)作为连接企业战略规划与车间实际操作的核心工具,其重要性日益凸显。盘古信息MES系统,凭借其独特的功能模块和创新的设计理念&a…

数据库-DDL语言-数据定义语言

DDL语言-数据定义语言 对数据库对象进行操作的语言, 涉及到的关键字CREATE,ALTER,DROP 对数据库的操作 新建一个数据库 语法 CREATE DATABASE 数据库名 [charset字符集]例 新建一个数据库:mydb CREATE DATABASE mydb;注:SQL语句不区分大小写,但是好的书写习惯…

【考研数学】题目类型:出现两次积分限,但实际上是一次积分。

考研中,有一类题目是出现了两次积分限(尤其是人为对题目进行变换、化简时),但解题方法不是利用二重积分方法,而是一次积分。常用凑微分、分部积分法。 以武忠祥老师严选题的两道题目为例: 这两道题就是“披…

模拟实现字符串相关函数(第二十七天)

!!assert---断言在函数中非常有用,能明确的指出哪里出了错误,然后后续自己方便进行更改 const不能通过直接赋值来改变,但是!!但是可以通过改地址的方式来改值!!这时只需要…

如何进军海外短剧市场?从了解海外短剧CPS开始

随着国内土味短剧在各大短视频平台爆火,从初期的蓝海红利到现在的如日中天,其中不乏有人将眼光瞄准了海外市场,预计将在未来几年打造出短剧出海的百亿市场,早期入局海外市场相当于小白一样,而现在和你们分享如何跻身海…

OpenCV图像滤波(15)梯度计算函数Scharr()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 函数使用 Scharr 运算符计算图像的第一个 x- 或 y- 空间导数。 调用 Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType) \texttt{Sc…

数据库(六):事务和索引

一、事务 (一)概念 1、事务是一组操作集合,它是一个不可分割的工作单位,事物会把所有操作作为一个整体一起向系统提交或者撤销操作请求,即这些操作要么同时成功,要么同时失效。 2、默认MySQL的事务是自动…

用关系图和示例解释异步/等待

**解释在各种场景中使用等待时的程序执行流**本文原文 前言 这个文档解释了 Async/Await 是如何工作的。这可能是一个令人困惑的话题。我们将从一些简单的基本概念开始,然后慢慢地向更高级的概念发展。希望这些可视化图表能够帮助那些学习者。 下面的讨论主要是从…

从Retrofit支持suspend协程请求说开去

在现代Android开发中,异步请求已经成为不可或缺的一部分。传统的异步请求往往涉及大量的回调逻辑,使代码难以维护和调试。随着Kotlin协程的引入,异步编程得到了极大的简化。而作为最流行的网络请求库之一,Retrofit早在Kotlin协程的…

【JavaEE】深入探索SpringBoot的日志管理功能与实践应用

目录 SpringBoot 日志日志概述日志使用打印日志在程序中得到⽇志对象使用日志对象打印日志 ⽇志框架介绍(了解)⻔⾯模式(外观模式)SLF4J 框架介绍日志格式的说明⽇志级别日志级别的分类日志级别的使用 ⽇志配置配置⽇志级别⽇志持久化配置⽇志⽂件分割配置⽇志格式 更简单的⽇志…

IBMS管理平台,推动建筑行业向智能化发展

智能建筑管理系统是一套集成了多种技术和功能的综合性管理平台,旨在提高建筑设施的运行效率、减少能源消耗、改善室内环境质量,并为建筑管理者提供全面的监控、控制和分析手段。IBMS管理平台的特点和优势如下: IBMS系统融合了建筑自动化、能源…

2024 国内自闭症学校排名榜:突破边界,创造无限可能

在 2024 年,当家长们面对国内自闭症学校的排名榜时,心中或许充满了期待与困惑。然而,这些排名榜虽然能提供一定的参考,但绝不能成为选择学校的唯一依据。家长们更需要深入了解每所学校的真实情况,通过线下考察&#xf…

网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)

绪论​: “节省时间的方法就是全力以赴的将所要做的事情完美快速的做完,不留返工重新学习的时间,才能省下时间给其他你认为重要的东西。” 本章主要讲到OSI网络协议栈中的应用层的作用和再次在应用层的角度理解协议的具体意义,以及…

#Datawhale AI夏令营第4期#多模态大模型Task3

写在前面的碎碎念》 为时一个礼拜的学习,即将结束了。回顾这一个礼拜,因此这次的任务较难,大部分的时间都花在跑模型上了,跑一次一天就没了,所以基本没有很好的去尝试优化上分,一个礼拜,差不多…

微商城系统 goods.php SQL注入漏洞复现

0x01 产品简介 微商城系统,又称微信商城系统,是基于微信等社交平台构建的一种小型电子商务系统。该系统融合了社交媒体的互动性和网络商城的交易功能,为商家提供了一个集商品展示、在线交易、营销推广、用户管理、数据分析等功能于一体的综合性电商平台。系统充分利用了微信…

【SecureLock】藏起你的秘密文件!

我们都知道,在 Windows 中可以右键文件夹,选择”属性“,勾选”隐藏“来实现隐藏某个文件夹。 我们还知道,在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“,来使上述方法变得形同虚设。 本工具就是用于解决以上…

使用Linux内核自带的V4L2设备驱动 采集图像

一、定义 V4L2代表Video for Linux Two,它是Linux内核的一部分,提供了一种统一的方式来访问各种视频输入/输出设备,如摄像头、电视卡等。 二、工作流程(重点) 打开设备-> 检查和设置设备属性&#xf…

Elasticsearch-关键词随机查询(8.x)

目录 一、查询语句 二、Java代码实现 基础介绍: ES自定义评分机制:function_score查询详解-阿里云开发者社区ES自定义评分机制:function_score查询详解https://developer.aliyun.com/article/1054571 开发版本详见:Elasticsearch-经纬度查询(8.x-半径…

面向对象程序设计(C++)之 vector(初阶)

1. vector 的构造 vector 需要显式实例化类模版,在创建 vector 类型的容器时可以直接创建,也可以进行初始化,例如 v2 ,也可以使用迭代器的方式创建,具体关于更多vector的知识: vector //模版类只能显式实例化 vector&l…

Linux ubuntu 24.04 安装运行《帝国时代3》免安装绿色版游戏,解决 “Could not load DATAP.BAR”等问题

Linux ubuntu 24.04 安装运行《帝国时代3》游戏,解决 “Could not load DATAP.BAR" 等问题 《帝国时代 3》是一款比较经典的即时战斗游戏,伴随了我半个高中时代,周末有时间就去泡网吧,可惜玩的都是简单人机,高难…