以inherit为例
这是借助bksdm的代码用于我的A-sdm的生成
bksdm中2个关键路径是
src/genetate.py
script/eval_scores.sh
一 以generate.py文件进行生成
借助ms-coco的csv文件里面的30K个提示词和图片名字,来生成图片,并保存
share/huanggao/zjc/code_i2i_ti2/CombineSD_t2i/03_t2i_inherit_metric_coco/01_inherit_inter_dn0up3/generate.py
def parse_args():### data_listparser.add_argument("--data_list", type=str, default="/share/huanggao/zjc/code_BK-SDM/BK-SDM-main/data/mscoco_val2014_30k/metadata.csv")
文件/share/huanggao/xxx/data/mscoco_val2014_30k/metadata.csv
csv文件读取
file_list = get_file_list_from_csv(args.data_list)params_str = pipeline.get_sdm_params()t0 = time.perf_counter()for batch_start in range(0, len(file_list), args.batch_sz): # 0-文件总数,1个1个取batch_end = batch_start + args.batch_sz# (i)-> (i+1) img_names = [file_info[0] for file_info in file_list[batch_start: batch_end]] # 第一个是文件名val_prompts = [file_info[1] for file_info in file_list[batch_start: batch_end]] # 第二个是提示此imgs = pipeline.generate(prompt = val_prompts,n_steps = args.num_inference_steps,img_sz = args.img_sz) # 提示词、步数、图大小for i, (img, img_name, val_prompt) in enumerate(zip(imgs, img_names, val_prompts)):img.save(os.path.join(save_dir_im512, img_name)) # img保存img.close()print(f"{batch_start + i}/{len(file_list)} | {img_name} {val_prompt}")print(f"---{params_str}")
0 从csv文件获取提示词和图片名字: metadata.csv -> file_list -> val_prompts, img_names
1 val_prompts作为提示词生成图img
2 生成结果以img_names来进行保存
get_file_list_from_csv来读取csv文件
get_file_list_from_csv(args.data_list)
from utils.misc import get_file_list_from_csv, change_img_size
utils.misc文件里面
import csv
import os
from PIL import Imagedef get_file_list_from_csv(csv_file_path):file_list = []with open(csv_file_path, newline='') as csvfile:csv_reader = csv.reader(csvfile) next(csv_reader, None) # Skip the header rowfor row in csv_reader: # (row[0], row[1]) = (img name, txt prompt) file_list.append(row)return file_listdef change_img_size(input_folder, output_folder, resz=256):img_list = sorted([file for file in os.listdir(input_folder) if file.endswith('.jpg')])for i, filename in enumerate(img_list):img = Image.open(os.path.join(input_folder, filename))img.resize((resz, resz)).save(os.path.join(output_folder, filename))img.close()if i % 2000 == 0:print(f"{i}/{len(img_list)} | {filename}: resize to {resz}")
二 以eval_scores.sh文件进行结果的评估
BK-SDM-main/scripts/eval_scores.sh
GPU_NUM=1
MODEL_ID=xxx_results
MODEL_ID=xxx_results
是评估结果的地址,这个需要就在sh文件当前路径下
IMG_PATH=./results/$MODEL_ID/im256echo "=== Inception Score (IS) ==="
IS_TXT=./results/$MODEL_ID/im256_is.txt
fidelity --gpu $GPU_NUM --isc --input1 $IMG_PATH | tee $IS_TXT
echo "============"echo "=== Fréchet Inception Distance (FID) ==="
FID_TXT=./results/$MODEL_ID/im256_fid.txt
NPZ_NAME_gen=./results/$MODEL_ID/im256_fid.npz
NPZ_NAME_real=./data/mscoco_val2014_41k_full/real_im256.npz
CUDA_VISIBLE_DEVICES=$GPU_NUM python3 -m pytorch_fid --save-stats $IMG_PATH $NPZ_NAME_gen
CUDA_VISIBLE_DEVICES=$GPU_NUM python3 -m pytorch_fid $NPZ_NAME_real $NPZ_NAME_gen | tee $FID_TXT
echo "============"echo "=== CLIP Score ==="
CLIP_TXT=./results/$MODEL_ID/im256_clip.txt
CUDA_VISIBLE_DEVICES=$GPU_NUM python3 src/eval_clip_score.py --img_dir $IMG_PATH --save_txt $CLIP_TXT
echo "============"
FID是用pytorch_fid库进行评测的
下面详解FID的评测方式:
./data/mscoco_val2014_41k_full/real_im256.npz是真实图片
这个npz文件就是对比的真实结果