【DA-CLIP】图像退化类型检测功能演示代码

背景

在CLIP基础上微调而来,使用图像控制器编码生成退化类型embedding并在训练中对图像编码器进行控制。针对十种退化类型进行了训练。

解决CLIP模型在图像纹理等层面无法针对退化类型识别或识别率较低的问题。

训练数据集情况

 GitHub有对应数据集连接

 

完整代码

项目没有提供退化类型识别准确率计算的代码。只提供了上面的雷达图对比。毕竟这只是复原处理的一小部分。

以下代码是缺少img复原处理的版本。这份代码是在app.py的基础上做了退化类型检测功能,并去掉图像复原处理过程。GitHub - Algolzw/daclip-uir: [ICLR 2024] Controlling Vision-Language Models for Universal Image Restoration. 5th place in the NTIRE 2024 Restore Any Image Model in the Wild Challenge.[ICLR 2024] Controlling Vision-Language Models for Universal Image Restoration. 5th place in the NTIRE 2024 Restore Any Image Model in the Wild Challenge. - Algolzw/daclip-uiricon-default.png?t=N7T8https://github.com/Algolzw/daclip-uir

下载项目、预训练模型权重、安装环境后将该份代码复制到app.py同一目录下运行即可 

 # 缺少img处理的版本
# 这份代码是在app的基础上做了daclip退化类型检测功能,并去掉图像复原处理过程
import os
import gradio as gr
import argparse
import numpy as np
import torch
from PIL import Image
from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize, InterpolationMode
import options as option
from models import create_model
import open_clipparser = argparse.ArgumentParser()
# ArgumentParser对象是argparse模块的核心,它提供了一个接口来添加参数(arguments)和选项(options)到你的程序
parser.add_argument("-opt", type=str, default='options/test.yml', help="Path to options YMAL file.")
# 添加一个命令行选项,这个选项被命名为-opt,它是一个接受字符串类型的参数
opt = option.parse(parser.parse_args().opt, is_train=False)
# 调用options.py中的parse方法,接受两个参数,args.opt是通过 argparse 解析器得到的选项值,采用刚刚定义的默认YMAL地址opt = option.dict_to_nonedict(opt)
# convert to NoneDict, which return None for missing key.
# load pretrained model by default
model = create_model(opt)
# 在models的init.py中的create_model()
device = model.device
# 根据配置决定CUDA还是CPUclip_model, preprocess = open_clip.create_model_from_pretrained('daclip_ViT-B-32', pretrained=opt['path']['daclip'])clip_model = clip_model.to(device)def clip_transform(np_image, resolution=224):# 这一行定义了一个名为clip_transform的函数,它接受两个参数:np_image(一个NumPy数组格式的图像)和resolution(一个可选参数,默认值为224,表示图像的目标分辨率)。pil_image = Image.fromarray((np_image * 255).astype(np.uint8))# 这一行将NumPy数组格式的图像转换为PIL(Python Imaging Library)图像。首先,将NumPy数组中的像素值乘以255,然后转换为无符号的8位整数格式,这是因为图像的像素值通常在0到255的范围内。return Compose([# 来自torchvision.transforms# 这一行开始定义一个转换流程,Compose是来自albumentations库的一个函数,用于组合多个图像转换操作。Resize(resolution, interpolation=InterpolationMode.BICUBIC),# 这一行使用Resize操作来调整图像大小到指定的分辨率。interpolation=InterpolationMode.BICUBIC指定了使用双三次插值方法来调整图像大小,这是一种高质量的插值算法。CenterCrop(resolution),# 这一行应用CenterCrop操作,将调整大小后的图像进行中心裁剪,以确保图像的尺寸严格等于指定的分辨率ToTensor(),# 这一行使用ToTensor操作将PIL图像转换为PyTorch张量。这是为了使图像能够被深度学习模型处理。Normalize((0.48145466, 0.4578275, 0.40821073), (0.26862954, 0.26130258, 0.27577711))])(pil_image)# 这一行应用Normalize操作,对图像的每个通道进行标准化。它使用两组参数,分别对应图像的均值和标准差。这些参数通常是根据预训练模型的要求来设置的。# 然后,将转换流程应用到PIL图像上,并返回处理后的张量。examples = [os.path.join(os.path.dirname(__file__), f"images/{i}.jpg") for i in range(1, 11)]degradations = ["运动模糊", "有雾", "JPEG压缩伪影", "低光照", "噪声", "雨滴", "多雨的", "阴影遮挡的", "多雪的", "遮挡修复"
]
text_tokens = ['motion-blurry', 'hazy', 'jpeg-compressed', 'low-light', 'noisy', 'raindrop', 'rainy', 'shadowed','snowy', 'uncompleted']
text = open_clip.tokenize(text_tokens).to(device)def detect(image):image = image / 255.# 这一行将输入的图像张量的像素值归一化到0到1的范围内。img4clip = clip_transform(image).unsqueeze(0).to(device)if image is None:passelse:# 计算daclip识别结果with torch.no_grad(), torch.cuda.amp.autocast():image_features, degra_features = clip_model.encode_image(img4clip, control=True)# degra_features = clip_model.encode_image(img4clip, control=False)# control=True启动图像控制器,不设置只有clip图像编码器text_features = clip_model.encode_text(text)# normalized featuresdegra_features = degra_features / degra_features.norm(dim=1, keepdim=True)text_features = text_features / text_features.norm(dim=1, keepdim=True)# cosine similarity as logitslogit_scale = clip_model.logit_scale.exp()logits_per_image = logit_scale * degra_features @ text_features.t()# ...(省略之前的代码)probs = logits_per_image.softmax(dim=-1).cpu().numpy()degradation_probabilities = {degradation: round(prob, 3) for degradation, prob inzip(degradations, probs[0].flatten())}print(degradation_probabilities)# 返回恢复后的图像和输入的退化类型。return degradation_probabilitiesinterface = gr.Interface(fn=detect,  # 要调用的函数inputs=[gr.Image(label="输入图像")],outputs=gr.Label(label="退化类型概率"),title="DA-CLIP的图像退化识别" # 界面标题, examples=examples
)interface.launch()
# 修改为原图输出,只求退化类型

代码思路 

  • 设置命令行参数:通过argparse库设置命令行参数,用于指定配置文件的路径。
  • 加载预训练模型:根据提供的配置文件加载预训练的DA-CLIP模型。
  • 图像预处理:定义clip_transform函数,用于将NumPy数组格式的图像转换为适合模型输入的格式。
  • 定义退化类型列表:创建一个包含所有可能退化类型的列表。
  • 模型推理:在detect函数中,对输入图像进行必要的预处理,然后使用DA-CLIP模型进行推理,计算每个退化类型的概率。
  • 格式化输出:将模型输出的概率转换为字典格式,并选择概率最高的退化类型。
  • Gradio界面:使用Gradio库创建一个界面,用户可以通过它上传图像并获取退化类型的概率。

 图像编码模型处理过程:

【DA-CLIP】encode_image图像编码过程和IRSDE对image_context,、degra_context的使用-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_60350022/article/details/137692282

 clip_model.encode_image也可设置control为False进行CLIP的分类演示测试。

  • 模型编码 (encode_imageencode_text方法): 经过预处理的图像被送入模型进行特征提取。在DA-CLIP模型中,encode_image方法用于从图像中提取视觉特征,而encode_text方法用于提取文本特征。这些特征向量是高维空间中的点,它们编码了输入数据的关键信息。

  • 特征归一化: 为了提高计算效率和模型性能,通常会对提取的特征进行归一化处理。在代码中,使用norm方法对图像特征和文本特征进行L2归一化,使得每个特征向量的长度为1。

  • 相似度计算 (logits_per_image计算): 模型使用特征向量来计算图像与每个退化类型之间的相似度。在DA-CLIP模型中,这通常是通过计算特征向量之间的点积(即内积)来实现的。logit_scale是一个可学习的参数,用于调整相似度得分的尺度。

  • 概率计算 (softmax函数): 得到相似度得分后,需要将它们转换成概率分布。softmax函数可以将任意实数值向量转换成概率分布,使得向量中所有元素的和为1。这样,每个得分就表示了图像属于某个特定退化类型的概率。

运行演示 

上传图像,展示退化类型识别结果百分比。后台提供三位小数计算结果

  • 比较难绷的是example计算全为近100% ,所以是十边形战士?没啥精力搞十个数据集测试,感兴趣的同学可以去了解一下
  • readme提供的LQ_image其实是训练集、测试集的一部分计算出来也全是100%

  • 合成噪声比较明显的话也很好识别
  • 可以改一个DACLIP和CLIP结果对比的,我就先不搞了,可以复制一份搞两个网页,不过很吃内存hh
  • 上面是DA-CLIP,下面修改了control是CLIP的计算结果

  •  SIDD智能手机图像去噪数据集的sRGB噪声图
  •  对于真实手机拍摄图像的识别效果还不是很好,这个计算是不是有点绝对了,,虽然低光照是一个很明显的问题
  • 可能这也导致不同数据集上测试这个模型效果不够好的原因,比如是想做去噪的但是复原模型却输入了低光照的退化嵌入

 CLIP有时候确实感觉在胡扯,比如下面这图识别成rainy..

 

  •  old photo数据集,没翻论文看经过了什么处理合成的LQ图像,直观看比较接近snowy也算合理

 

CLIP的结果 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HBase的数据模型与架构

官方文档:Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文,HBase建立在Hadoop之上,是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于…

工作流引擎项目解析

API 编辑 在Camunda中,API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系: ProcessEngineServices 接口: RepositoryService: 负责管理流程定义和部署。 RuntimeService: 负责管…

2024年nodejs调用小红书最新关注(粉丝)follow接口,api接口分析2004-04-16

一、打开chrome按f12,点击右上角的“关注”按钮,抓包位置如下: (图1 follow接口) 二、follow接口分析 1、请求地址 https://edith.xiaohongshu.com/api/sns/web/v1/user/follow 2、请求方法: POST 3、请求头: :authority: edith…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…

25. 【Android教程】列表控件 ListView

在学习了 ScrollView 及 Adapter 两节内容之后,大家应该对 ListView 有了一些基本的了解,它是一个列表样式的 ViewGroup,将若干 item 按行排列。ListView 是一个很基本的控件也是 Android 中最重要的控件之一。它可以帮助我们完成多个 View 的…

Udio——革命性的AI音乐生成软件

Udio是一款革命性的AI音乐生成软件,由前谷歌DeepMind的顶尖AI研究人员和工程师共同创立,得到著名风险投资公司a16z的支持。它旨在为音乐爱好者和专业人士提供一个全新的音乐创作和分享平台。用户可以通过文本提示来生成音乐,支持广泛的音乐风…

水牛社:打造你的居家副业利器,让赚钱变得更简单

水牛社,这个已经陪伴我们走过九个春秋的综合性网络任务和项目资源整合平台,真的给我留下了深刻的印象。它不仅仅是一个资源的汇聚地,更是一个帮助无数人实现网络副业梦想的平台。作为一个资深用户,我深感其中的价值和魅力。 水牛…

“香港批准比特币、以太坊ETF”!华夏、博时、嘉实计划发行相关产品!美国ETF分析师泼冷水:别指望香港ETF会有很大流量!

周一(4月15日),比特币短线迎来反弹行情,币价回升至66000美元上方。华夏基金、博时国际与嘉实投资3家中国头部基金宣布,旗下虚拟资产现货ETF获准在香港发行。 据了解,华夏基金(香港)现计划发行能够投资于现货…

两部电话机怎样能实现对讲?直接连接能互相通话吗?门卫门房传达室岗亭电话怎么搞?

目录 两部电话机能直接连接吗?用三通头分出来一条电话线两部电话机用一根电话线直接连接能互相通话吗? 什么电话机可以直接连接两部IP电话机(网络电话机)可以直接连接两部普通电话机之间通过一个电话交换机也可以连接跨区域的两部…

mfc 带有复选框的ListBox

mfc 带有复选框的 ListBox 效果: 添加 ListBox 控件 从工具箱拖拽 ListBox 控件到窗口上,并设置属性: 包含字符串:true所有者描述:Fixed 给ListBox添加控制变量 添加完后,将m_list_box的类型使用CC…

react使用npm i @reduxjs/toolkit react-redux

npm i reduxjs/toolkit react-redux 创建一个 store文件夹,里面创建index.js文件和子模块文件夹 index,js文件写入以下代码 import {configureStore} from reduxjs/toolkit // 导入子模块 import counterReducer from ./modules/one import two from ./modules/tw…

OpenBayes 在线教程|张国荣、鲁迅等老照片秒变高清!即刻上手的超火 SUPIR-AI 图像修复教程

小伙伴们,大家在生活中是不是也会遇到这样的烦恼:心心念念想要打印一张充满回忆的老照片或酷炫动漫壁纸,却发现图像糊得像打了马赛克? 市面上的图像修复工具五花八门,选择困难症人群找得快要崩溃? 终于找…

Linux: softirq 简介

文章目录 1. 前言2. softirq 实现2.1 softirq 初始化2.1.1 注册各类 softirq 处理接口2.1.2 创建 softirq 处理线程 2.2 softirq 的 触发 和 处理2.1.1 softirq 触发2.1.2 softirq 处理2.1.2.1 在 中断上下文 处理 softirq2.1.2.2 在 ksoftirqd 内核线程上下文 处理 softirq 3.…

电子烟特效音语音方案选型-WTN6020-8S-E

随着科技的迅猛进步,电子烟行业亦在持续创新与突破,引领着全新的潮流。其中,电子烟产品所特有的吸烟声音特效播报功能,无疑成为了技术革新的璀璨亮点。这一设计巧妙地将吸烟的声效融入使用体验中,使得用户在吸电子烟时…

CSS3 立体 3D 变换

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍CSS3 立体 3D 变换💎1 坐标轴💎2 perspective 透视视…

linux管理进程

一、程序 程序:执行特定任务的一串代码 1.是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具 2.用于描述进程要完成的功能,是控制进程执行的指令集 二、进程和线程 1.进程 进程是程序的执行…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

jenkins构建微信小程序并展示二维码

测试小程序的过程中&#xff0c;很多都是在回头和前端开发说一句&#xff0c;兄弟帮我打一个测试版本的测试码&#xff0c;开发有时间的情况下还好&#xff0c;就直接协助了&#xff0c;但是很多时候他们只修复了其中几个bug&#xff0c;其他需要修复的bug代码正在编写&#xf…

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

BTI功能验证与异常解析

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击&#xff1f;什么是ROP攻击&#xff1f;区别与联系&#xff1f; 2、什么是JOP攻击&#xff1f;间接分支跳转指令&#xff1f; 3、JOP攻击的缓解技术&#xff1f;控制流完整性保护&#xff1f; 4、BTI下的JOP如何…