【FDA】图像通过傅里叶变换改变光谱风格,实现域自适应

news2024/11/30 12:48:15

FDA: Fourier Domain Adaptation for Semantic Segmentation, CVPR2020

翻译:CVF2020邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic SegmentationFDA:用于语义分割的傅立叶域自适应算法_傅里叶域适应_HheeFish的博客-CSDN博客

论文:https://openaccess.thecvf.com/content_CVPR_2020/papers/Yang_FDA_Fourier_Domain_Adaptation_for_Semantic_Segmentation_CVPR_2020_paper.pdf

代码:https://github.com/YanchaoYang/FDA/

Domain adaptation via style transfer made easy using Fourier Transform. FDA needs no deep networks for style transfer, and involves no adversarial training. Below is the diagram of the proposed Fourier Domain Adaptation method:

Step 1: Apply FFT to source and target images.

Step 2: Replace the low frequency part of the source amplitude with that from the target.

Step 3: Apply inverse FFT to the modified source spectrum.

光谱转移:在不改变语义内容的情况下,将源图像映射到目标“样式”。随机采样的目标图像通过将源图像频谱的低频分量与其自身频谱进行交换来提供样式。结果“目标风格的源图像”在感知上显示了更小的域差距,并改进了语义分割的迁移学习
上图所示的域β大小的影响,其中光谱被交换:增加β将减少域间隙,但会引入伪影(参见放大的插图)。调整β,直到变换图像中的伪影变得明显。

 

GTA5→CityScapes任务的消融研究。 使用不同β训练的分割网络保持了相似的性能

 文中设置了0.01,0.05,0.09三个消融实验值,存在差异,但不算大。

 

关键代码:

# https://github.com/YanchaoYang/FDA/blob/master/utils/__init__.py

import torch
import numpy as np

# LB = 0.01 or 0.05 or 0.09 ,依情况而定,论文建议尽量小于0.15
# source to target, target to target
    src_in_trg = FDA_source_to_target( src_img, trg_img, L=LB )            # src_lbl
    trg_in_trg = trg_img

def extract_ampl_phase(fft_im):
    # fft_im: size should be bx3xhxwx2
    fft_amp = fft_im[:,:,:,:,0]**2 + fft_im[:,:,:,:,1]**2
    fft_amp = torch.sqrt(fft_amp)
    fft_pha = torch.atan2( fft_im[:,:,:,:,1], fft_im[:,:,:,:,0] )
    return fft_amp, fft_pha

def low_freq_mutate( amp_src, amp_trg, L=0.1 ):
    _, _, h, w = amp_src.size()
    b = (  np.floor(np.amin((h,w))*L)  ).astype(int)     # get b
    amp_src[:,:,0:b,0:b]     = amp_trg[:,:,0:b,0:b]      # top left
    amp_src[:,:,0:b,w-b:w]   = amp_trg[:,:,0:b,w-b:w]    # top right
    amp_src[:,:,h-b:h,0:b]   = amp_trg[:,:,h-b:h,0:b]    # bottom left
    amp_src[:,:,h-b:h,w-b:w] = amp_trg[:,:,h-b:h,w-b:w]  # bottom right
    return amp_src

def low_freq_mutate_np( amp_src, amp_trg, L=0.1 ):
    a_src = np.fft.fftshift( amp_src, axes=(-2, -1) )
    a_trg = np.fft.fftshift( amp_trg, axes=(-2, -1) )

    _, h, w = a_src.shape
    b = (  np.floor(np.amin((h,w))*L)  ).astype(int)
    c_h = np.floor(h/2.0).astype(int)
    c_w = np.floor(w/2.0).astype(int)

    h1 = c_h-b
    h2 = c_h+b+1
    w1 = c_w-b
    w2 = c_w+b+1

    a_src[:,h1:h2,w1:w2] = a_trg[:,h1:h2,w1:w2]
    a_src = np.fft.ifftshift( a_src, axes=(-2, -1) )
    return a_src

def FDA_source_to_target(src_img, trg_img, L=0.1):
    # exchange magnitude
    # input: src_img, trg_img

    # get fft of both source and target
    fft_src = torch.rfft( src_img.clone(), signal_ndim=2, onesided=False ) 
    fft_trg = torch.rfft( trg_img.clone(), signal_ndim=2, onesided=False )

    # extract amplitude and phase of both ffts
    amp_src, pha_src = extract_ampl_phase( fft_src.clone())
    amp_trg, pha_trg = extract_ampl_phase( fft_trg.clone())

    # replace the low frequency amplitude part of source with that from target
    amp_src_ = low_freq_mutate( amp_src.clone(), amp_trg.clone(), L=L )

    # recompose fft of source
    fft_src_ = torch.zeros( fft_src.size(), dtype=torch.float )
    fft_src_[:,:,:,:,0] = torch.cos(pha_src.clone()) * amp_src_.clone()
    fft_src_[:,:,:,:,1] = torch.sin(pha_src.clone()) * amp_src_.clone()

    # get the recomposed image: source content, target style
    _, _, imgH, imgW = src_img.size()
    src_in_trg = torch.irfft( fft_src_, signal_ndim=2, onesided=False, signal_sizes=[imgH,imgW] )

    return src_in_trg

def FDA_source_to_target_np( src_img, trg_img, L=0.1 ):
    # exchange magnitude
    # input: src_img, trg_img

    src_img_np = src_img #.cpu().numpy()
    trg_img_np = trg_img #.cpu().numpy()

    # get fft of both source and target
    fft_src_np = np.fft.fft2( src_img_np, axes=(-2, -1) )
    fft_trg_np = np.fft.fft2( trg_img_np, axes=(-2, -1) )

    # extract amplitude and phase of both ffts
    amp_src, pha_src = np.abs(fft_src_np), np.angle(fft_src_np)
    amp_trg, pha_trg = np.abs(fft_trg_np), np.angle(fft_trg_np)

    # mutate the amplitude part of source with target
    amp_src_ = low_freq_mutate_np( amp_src, amp_trg, L=L )

    # mutated fft of source
    fft_src_ = amp_src_ * np.exp( 1j * pha_src )

    # get the mutated image
    src_in_trg = np.fft.ifft2( fft_src_, axes=(-2, -1) )
    src_in_trg = np.real(src_in_trg)

    return src_in_trg

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

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

相关文章

【TCP/IP】多进程服务器的实现(进阶) - 进程和僵尸进程

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要,如果未处理好,将会导致出现“僵尸进程”,进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…

数据类型

常见的数据类型: int,整数类型(整形)bool,布尔类型str,字符串类型list,列表类型tuple,元组类型dict,字典类型set,集合类型float,浮点类型&#x…

python Web开发 flask轻量级Web框架实战项目--学生管理系统

上次发的一篇文章,有很多朋友私信我要后面的部分,那咱们就今天来一起学习一下吧,因为我的数据库这门课选中的课题是学生管理系统,所以今天就以这个课题为例子,从0到1去实现一个管理系统。数据库设计部分我会专门出一个…

《Java 核心技术面试》课程笔记(十二)

Java 有几种文件拷贝方式?哪一种最高效? 典型回答 Java 有多种比较典型的文件拷贝实现方式,比如:利用java.io 类库,直接为源文件构建一个 FileInputStream 读取,然后再为目标文件构建一个 FileOutputStre…

chatgpt赋能python:Python模块(Module)是什么?

Python模块(Module)是什么? Python模块(Module)是指一些预先编写好的代码,这些代码可以在程序中被引入和使用。它们可以包含可以复用的函数、常量和类。Python模块是一种封装程序代码的方法。 下载Python…

领取的AWS亚马逊云服务器到期会扣费的问题解决办法。

本篇文章主要讲解,领取的AWS亚马逊服务器到期后会持续扣费问题的解决办法。 作者:任聪聪 日期:2023年6月8日 关于aws服务器一年免费期限到期后扣费的问题,网络上的文章并不是很全,故此我通过个人的经验进行了如下的教程…

chatgpt赋能python:Python怎么print换行?

Python怎么print换行? 如果你是一个Python开发者,你可能遇到过需要在Python中打印输出换行的情况。本文将分享几种方式,让你学会如何在Python中print换行。 1. 使用"\n" 您可以在print语句中使用"\n"来表示换行。这个…

陈丹琦团队新作:单卡A100可训300亿参数模型啦!

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 近年来,随着大模型的涌现,微调语言模型已经在各种下游任务上展现出了卓越的性能。然而,这些庞大模型的参数量常常达到数十亿甚至上百亿的级别,训练这样规模的模型需要消耗大量…

chatgpt赋能python:Python视图(View)在SEO中的重要性

Python视图(View)在SEO中的重要性 什么是Python视图? Python视图是指,在Web应用程序中,将业务逻辑与显示逻辑分开处理,并以代码的形式定义的可重用组件。它们是与URL相对应的函数或方法。Python视图可以生…

uniapp:uni-app-base 项目基础配置,开箱可用

目前(20230605)uni-app最新版本(3.8.4.20230531) 一、官网文档 uni-app官网 二、创建项目 项目目标:vue3tsvitevscode 创建以 typescript 开发的工程(如命令行创建失败,请直接访问 gitee 下…

《面试1v1》JVM调优

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: 小伙子,说听说你JVM调优挺在行? 候选人: 谢谢夸奖,我对JVM调优还在学习中,远未达到在行的程度。不过日常工作…

springboot项目外卖管理 day04-文件的上传下载与菜品的新增与修改

文章目录 1、文件上传下载1.1、文件上传介绍与实现1.2、文件下载介绍与实现 2、新增菜品2.1、需求分析2.2、代码开发-梳理交互过程2.2.1、菜品分类下拉框:在CategoryController添加 2.2.2、新增保存 3、菜品信息分页查询3.1、代码开发-梳理交互过程对象拷贝BeanUtil…

chatgpt赋能python:Python输出方法详解:从基础print()到高级logging模块

Python输出方法详解:从基础print()到高级logging模块 在Python编程中,输出是一个必不可少的步骤。然而,Python提供了多种输出方法,如何选择最适合的方法呢?本文将详细介绍Python输出的不同方法,并给出实际…

只给大模型LeetCode编号,也能解题!大模型表现好是源于对训练数据的记忆吗?请不要迷信大模型

夕小瑶科技说 原创 作者 | Python 自从推出以来,ChatGPT这款智能高效的人机对话平台迅速风靡全球。人们开始广泛尝试使用ChatGPT来解决各种问题,无论是医学检测报告的解释,还是公众号文章的取名,甚至是论文修改润色和rebuttal撰…

微服务治理框架- - -Spring Cloud

前言:最近微服务很是火热,那么什么是微服务?相信小伙伴们对此也是一知半解,那么今天叶秋学长带领大家一起学习微服务治理框架Spring Cloud,快来跟着学长一起学习吧~~ 目录 对SpringCloud了解多少? 什么是…

【动态规划】NK刷题之DP7 连续子数组的最大乘积

【动态规划】NK刷题之DP7 连续子数组的最大乘积 1.题目2.题解3.代码部分法一:动态规划3.1.1 创建变量n,并读入数据3.1.2 创建动态数组,并初始化3.1.3 对动态数组断言3.1.4 读入原整形数组的数据3.1.5 创建变量ret,并赋初值3.1.6 循…

chatgpt赋能python:Python怎么下jieba库

Python怎么下jieba库 Python是目前最流行的动态编程语言之一,广泛应用于Web开发、数据分析、人工智能等领域。对于中文文本处理来说,jieba库是一款非常实用的工具。本文将介绍如何下载jieba库,并探讨其在中文分词、情感分析等方面的应用。 …

week7 表示学习(Representation Learning) Part1--Pretext Text

文章目录 Representation LearningInferring structure(推断结构) Transformation predictionRotation predictionRelative transformation prediction ReconstructionDenoising AutoencodersContext encodersColorizationSplit-brain encoders Instance…

Keras-3-实例3-回归问题

1. 回归问题 1.1 波士顿房价数据集加载: 预测20世界70年代中期波士顿郊区房屋价格的中位数。 已知当时郊区有一些数据点,如犯罪率、房产税率等。 与IMDB和路透社数据集相比,波士顿房价数据集样本量比较少,只有506个样本;同时&a…

数据结构——绪论/线性表

文章目录 **一 基本概念****二 算法和算法评价****三 线性表的定义和基本操作****四 线性表的顺序表示****1 定义****2 基本操作** **五 线性表的链式表示****1 单链表的定义****2 单链表的基本操作实现****3 双链表****4 循环链表****5 静态链表** 一 基本概念 数据类型&…