fid-helper-pytorch 简单易用的 FID 计算工具
发布日期:2022-04-22 13:45:47 浏览次数:8 分类:技术文章

本文共 7242 字,大约阅读时间需要 24 分钟。

fid-helper-pytorch

Github 仓库地址:https://github.com/One-sixth/fid-helper-pytorch

Gitee 仓库地址:https://gitee.com/ONE_SIX_MIX/fid-helper-pytorch

这是一个FID助手工具。

提供了一个简单方便的接口来计算FID。

仓库使用pytorch jit script来打包模型,包含了一个默认模型。

:default_1 的模型和权重来自 styleganv3 fid tool。

文件夹 make_default_model 包含了默认模型的编译脚本。

我本想实现一个简单的fid工具,但顺便发现了clean-fid和它很棒的效果。

所以顺便追加了clean-fid的计算方式。

他们均有相同的权重,但可能是因为jit包装,计算顺序,随机数相关的的问题,它们的输出均有细微的差异。

支持clean-fid的计算方式同时,我把尽可能多的采样方法涵盖进去,尽管这并没有什么用。(笑)

对了,如果你希望使用最新的pytorch抗锯齿的方法 torch_bilinear_aa 和 torch_bicubic_aa。

你需要更新到 pytorch-1.11 以及更新版本。

一些杂事

原本包含了 3个默认模型。

:default_1 的模型和权重来自 styleganv3 fid tool。
:default_2 的模型和权重来自 pytorch_fid。
:default_3 的模型和权重来自 clean-fid。
但我发现它们是完全一样的,最后我只保留了第一个模型。
第二个和第三个模型你可以在 make_default_model 里面找到它们的构建脚本。

安装

从pip中安装

pip install fid-helper-pytorch

从源码中安装

git clone https://github.com/One-sixth/fid-helper-pytorchcd fid-helper-pytorchpython setup.py install

构建轮子

git clone https://github.com/One-sixth/fid-helper-pytorchcd fid-helper-pytorchpython setup.py bdist_wheel# The wheel that you can found in dist folder.

如何使用

直接比对两个文件夹,默认FID计算方式与pytorch-fid一致。

其中,dir1 和 dir2 都可以是 图片文件夹,图片zip压缩包或统计文件。

# 比较两个文件夹fid-helper compare dir1 dir2# 比较两个zip压缩包fid-helper compare dir1.zip dir2.zip# 比较两个统计文件fid-helper compare dir1_stat.pkl dir2_stat.pkl# 你也可以自由交换它们# 比较文件夹和zip压缩包fid-helper compare dir1 dir2.zip# 毕竟统计文件和文件夹fid-helper compare dir1_stat.pkl dir2.zip

给目标图片文件夹,图片压缩包生成统计文件,便于后续快速评估

# 导出文件夹1的统计文件fid-helper extract dir1 dir1_stat.pkl# 导出压缩包的统计文件fid-helper extract dir1.zip dir1_stat.pkl# 导出统计文件的统计文件 :)fid-helper extract dir1_stat.pkl dir1_stat_2.pkl

与其他库进行比较


如果你希望获得与 clean-fid legacy_tensorflow 模式一致的分数

如果你希望获得与 NVlabs/stylegan3’s FID tool 一致的分数

fid-helper-pytorch compare folder1 folder2

or

fid-helper-pytorch --model=:default_1 --resample=nv_bilinear_float --field tf compare folder1 folder2

如果你希望获得与 pytorch-fid 一致的分数。

如果你希望获得与 clean-fid legacy_pytorch 模式一致的分数。
or

fid-helper-pytorch --model=:default_1 --resample=torch_bilinear_float --field pt compare folder1 folder2

如果你希望获得与 clean-fid clean 模式一致的分数

clean-fid

fid-helper-pytorch --model=:default_1 --resample=pil_bicubic_float --field tf compare folder1 folder2

or

fid-helper-pytorch --model=:default_1 --resample=torch_bicubic_float --field tf compare folder1 folder2

FID 测试

全部测试数据均生成自 stylegan3。

_gen_sample_from_stylegan3/_gen_sample.py 为测试数据生成源码。
_gen_sample_from_stylegan3/_batch_compare_fid.py 为完整的FID测试。

这是我生成的测试数据。你可以从该测试数据中复现我的结果。

每个压缩包均有 10000 张png图像。

https://anonfiles.com/dfDej8Oaxe/sample_1_ziphttps://anonfiles.com/V3N5j6O1x3/sample_2_zip

分数比较

更详细的数据你可以在这里找到

--# pytorch-fid3.772843757504859# clean-fid mode=legacy_pytorch3.772843691229639# fid-helper-pytorch model=:default_1 input_range=pytorch resample=torch_bilinear_float3.7728430784583953---# clean-fid mode=clean3.7965344580221654# fid-helper-pytorch model=:default_1 input_range=tf resample=pil_bicubic_float3.79653415593325# fid-helper-pytorch model=:default_1 input_range=tf resample=torch_bicubic_aa_float3.7965341239671466---# clean-fid mode=legacy_tensorflow3.773897315245904# stylegan3 fid toolnone. please see clean-fid legacy_tensorflow# fid-helper-pytorch model=:default_1 input_range=tf resample=nv_bilinear_float3.7738974250271213---

应用内FID计算

Example_1 Compute fid by yourself.

import numpy as npfrom fid_helper_pytorch import FidHelper, INPUT_RANGE_TFfidhelper = FidHelper(':default_1', INPUT_RANGE_TF, resample_mode='nv_bilinear_float', device='cuda:0')# Compute real image stat by yourself.fidhelper.begin_ref_stat()for _ in range(16):    batch_image = np.random.randint(0, 255, size=[6, 3, 256, 256], dtype=np.uint8)    fidhelper.update_ref_stat(batch_image, data_range=(0, 255))    fidhelper.finish_ref_stat()# Compute fake image stat by yourself.fidhelper.begin_eval_stat()for _ in range(16):    gen_images = np.random.uniform(-1., 1., size=[18, 3, 256, 256])    fidhelper.update_eval_stat(gen_images, data_range=[-1, 1])fidhelper.finish_eval_stat()# Compute fid.fid_score = fidhelper.compute_fid_score()print('FID:', fid_score)

Example_2 Compute stat and fid from folder and cycle.

import torchfrom fid_helper_pytorch import FidHelperfidhelper = FidHelper(':default_1')batch_size = 4num_workers = 1real_img_dir = 'real_img'# Compute real image stat from image folder.fidhelper.compute_ref_stat_from_dir(real_img_dir, batch_size=batch_size, num_workers=num_workers)# Compute fake image stat by yourself.fidhelper.begin_eval_stat()for _ in range(16):    gen_images = torch.rand(size=[18, 3, 256, 256])    fidhelper.update_eval_stat(gen_images, data_range=[0, 1])fidhelper.finish_eval_stat()# Compute fid.fid_score = fidhelper.compute_fid_score()print('FID:', fid_score)

Example_3 Compute fid from zip and get last fid.

from fid_helper_pytorch import FidHelperfidhelper = FidHelper(':default_1')batch_size = 4num_workers = 1real_img_arc = 'real_img.zip'fake_img_arc = 'fake_img.zip'# Compute real image stat from image folder.fid_score = fidhelper.compute_fid_score_from_dir(real_img_arc, fake_img_arc, batch_size=batch_size, num_workers=num_workers, verbose=True)print('FID:', fid_score)# Compute fid.fid_score = fidhelper.fid_scoreprint('last FID:', fid_score)

Example_4 Compute stat and fid from folder.

from fid_helper_pytorch import FidHelperfidhelper = FidHelper(resample_mode='pil_bicubic_float')fake_img_dir = 'fake_img'real_img_dir = 'real_img'# Compute real image stat from image folder.fidhelper.compute_ref_stat_from_dir(fake_img_dir, batch_size=16, num_workers=2, verbose=True)# Compute fake image stat from image folder.fidhelper.compute_eval_stat_from_dir(real_img_dir, batch_size=24, num_workers=3, verbose=True)# Compute fid.fid_score = fidhelper.compute_fid_score()print('FID:', fid_score)

Example_5 Compute stat file and save to disk.

from fid_helper_pytorch import FidHelperfidhelper = FidHelper(':default_1')real_img_dir = 'real_img'fake_img_dir = 'fake_img'# Compute real image stat from image folder.fidhelper.compute_ref_stat_from_dir(real_img_dir)# Save stat file to disk.fidhelper.save_ref_stat_dict('out_real_stat.pkl')# Compute fake image stat from image folder.fidhelper.compute_eval_stat_from_dir(fake_img_dir)# Save stat file to disk.fidhelper.save_eval_stat_dict('out_fake_stat.pkl')

Example_6 Load stat file and compute fid.

from fid_helper_pytorch import FidHelperfidhelper = FidHelper(':default_1')# Get fake image stat from stat file.fidhelper.load_ref_stat_dict('fake_stat.pkl')# Get real image stat from stat file.fidhelper.load_eval_stat_dict('real_stat.pkl')fid_score = fidhelper.compute_fid_score()print('FID:', fid_score)

Example_7 Change paramters anywhere.

from fid_helper_pytorch import FidHelperfidhelper = FidHelper(':default_1')# Change model anywhere.fidhelper.load_model('xxx.pt', model_input_range=None)# Change device anywhere.fidhelper.change_device('cuda:1')# Change model input range anywhere.fidhelper.change_model_input_range([0, 1])# Change resample_mode anywhere.fidhelper.change_resample_mode('torch_bilinear_float')# Change resize_hw anywhere.fidhelper.change_resize_hw([320, 320])

参考引用

非常感谢大佬们的开源仓库,没有他们无私奉献,这个库将不可能存在。

如果你喜欢本仓库,请为下面大佬的仓库star。

https://github.com/mseitzer/pytorch-fid 最流行的pytorch-fid仓库

https://github.com/GaParmar/clean-fid 最新的clean-fid仓库
https://github.com/NVlabs/stylegan3 stylegan3的官方仓库

转载地址:https://blog.csdn.net/ONE_SIX_MIX/article/details/123539768 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Fiddler 模拟浏览器提交数据
下一篇:Fibonacci数列通项公式的几种求法

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月13日 07时10分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【C++】算法集锦(12):高楼扔鸡蛋 2019-04-27
【图解】拥塞控制 2019-04-27
线程上下文切换 2019-04-27
什么是服务熔断? 2019-04-27
服务器压力过大?CPU打满?我来帮你快速检查Linux服务器性能 2019-04-27
C++面经总结之《Effective C++》(一) 2019-04-27
C++面经总结之《Effective C++》(二) 2019-04-27
这是什么“虎狼之词”啊!!!程序员的健康问题,看一线老中医怎么说!!! 2019-04-27
打开我的收藏夹 -- Python数据分析杂谈 2019-04-27
上手Pandas,带你玩转数据(1)-- 实例详解pandas数据结构 2019-04-27
上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据 2019-04-27
上手Pandas,带你玩转数据(3)-- pandas数据存入文件 2019-04-27
爬虫遇上不让右击、不让F12的网站,该怎么办? 2019-04-27
上手Pandas,带你玩转数据(4)-- 数据清洗 2019-04-27
上手Pandas,带你玩转数据(5)-- 数据转换与数据定位 2019-04-27
上手Pandas,带你玩转数据(6)-- 摆脱对pandas可视化丑图的刻板印象吧 2019-04-27
从零开始,学会Python爬虫不再难!!! -- (1)开篇:初识爬虫,基础铺垫 丨蓄力计划 2019-04-27
从零开始,学会Python爬虫不再难!!! -- (2)承接:解析网页,抓取标签 丨蓄力计划 2019-04-27
AttributeError: module ‘urllib‘ has no attribute ‘quote‘的解决办法 2019-04-27
linux shell — 6.初识 EXT2 文件系统 2019-04-27