File size: 4,504 Bytes
d643072 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
#!/bin/bash
# ===================== hyper =================
fid=true
py=tools/metrics/pytorch-fid/compute_fid.py
default_img_size=256 # 256, 512, 1024
default_sample_nums=30000 # 1000, 2500, 5000, 10000, 30000
report_to=wandb
default_log_suffix_label=''
# parser
img_path=$1
exp_names=$2
job_name=$(basename $(dirname "$img_path"))
#job_name=online_monitor_debug
for arg in "$@"
do
case $arg in
--img_size=*)
img_size="${arg#*=}"
shift
;;
--sample_nums=*)
sample_nums="${arg#*=}"
shift
;;
--suffix_label=*)
suffix_label="${arg#*=}"
shift
;;
--log_fid=*)
log_fid="${arg#*=}"
shift
;;
--tracker_pattern=*)
tracker_pattern="${arg#*=}"
shift
;;
*)
;;
esac
done
img_size=${img_size:-$default_img_size}
sample_nums=${sample_nums:-$default_sample_nums}
tracker_pattern=${tracker_pattern:-"epoch_step"}
log_suffix_label=${suffix_label:-$default_log_suffix_label}
log_fid=${log_fid:-true}
echo "img_size: $img_size"
echo "sample_nums: $sample_nums"
echo "log_fid: $log_fid"
echo "log_suffix_label: $log_suffix_label"
echo "tracker_pattern: $tracker_pattern"
JSON_PATH="data/test/PG-eval-data/MJHQ-30K/meta_data.json"
refer_path="data/test/PG-eval-data/MJHQ-30K/MJHQ_30K_${img_size}px_fid_embeddings_${sample_nums}.npz"
if [ ! -f "$refer_path" ]; then
# =============== save specific fid embeddings if not exists ==================
echo "==================== saving embeddings ===================="
IMG_PATH="data/test/PG-eval-data/MJHQ-30K/imgs"
OUTPUT_PATH="data/test/PG-eval-data/MJHQ-30K/MJHQ_30K_${img_size}px_fid_embeddings_${sample_nums}.npz"
echo "Saving reference embedding to $OUTPUT_PATH"
CUDA_VISIBLE_DEVICES=0 \
python $py --img_size $img_size --path $JSON_PATH $OUTPUT_PATH \
--img_path $IMG_PATH --stat --sample_nums $sample_nums
fi
if [ "$fid" = true ]; then
# =============== compute fid from two jsons ==================
echo "==================== computing fid ===================="
cmd_template="python $py --img_size $img_size --path $refer_path $JSON_PATH \
--exp_name {exp_name} --txt_path {img_path} --img_path {img_path} --sample_nums $sample_nums \
--report_to $report_to --name {job_name} --gpu_id {gpu_id} --tracker_pattern $tracker_pattern"
if [[ "$exp_names" != *.txt ]]; then
cmd="${cmd_template//\{img_path\}/$img_path}"
cmd="${cmd//\{exp_name\}/$exp_names}"
cmd="${cmd//\{job_name\}/$job_name}"
cmd="${cmd//\{gpu_id\}/0}"
eval CUDA_VISIBLE_DEVICES=0 $cmd
else
if [ ! -f "$exp_names" ]; then
echo "Model paths file not found: $exp_names"
exit 1
fi
gpu_id=0
max_parallel_jobs=8
job_count=0
echo "" >> "$exp_names" # add a new line to the file avoid skipping last line dir
while IFS= read -r exp_name; do
echo $exp_name
if [ -n "$exp_name" ] && ! [[ $exp_name == \#* ]]; then
cmd="${cmd_template//\{img_path\}/$img_path}"
cmd="${cmd//\{exp_name\}/$exp_name}"
cmd="${cmd//\{job_name\}/$job_name}"
cmd="${cmd//\{gpu_id\}/$gpu_id}"
echo "Running on GPU $gpu_id: $cmd"
eval CUDA_VISIBLE_DEVICES=$gpu_id $cmd &
gpu_id=$(( (gpu_id + 1) % 8 ))
job_count=$((job_count + 1))
if [ $job_count -ge $max_parallel_jobs ]; then
wait
job_count=0
fi
fi
done < "$exp_names"
wait
fi
fi
# =============== log fid result online after the above result saving ==================
if [ "$log_fid" = true ] && [ "$fid" = true ]; then
echo "==================== logging onto $report_to ===================="
if [ -n "${log_suffix_label}" ]; then
cmd_template="${cmd_template} --suffix_label ${log_suffix_label}"
fi
if [[ "$exp_names" != *.txt ]]; then
cmd="${cmd_template//\{img_path\}/$img_path}"
cmd="${cmd//\{exp_name\}/$exp_names}"
cmd="${cmd//\{job_name\}/$job_name}"
cmd="${cmd//\{gpu_id\}/0}"
echo $cmd
eval $cmd --log_fid
else
while IFS= read -r exp_name; do
if [ -n "$exp_name" ] && ! [[ $exp_name == \#* ]]; then
cmd="${cmd_template//\{img_path\}/$img_path}"
cmd="${cmd//\{exp_name\}/$exp_name}"
cmd="${cmd//\{job_name\}/$job_name}"
cmd="${cmd//\{gpu_id\}/0}"
eval $cmd --log_fid
fi
done < "$exp_names"
wait
fi
fi
echo fid finally done
|