balthou's picture
initiate demo
cec5823
import json
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
import pandas as pd
def snr_to_sigma(snr):
return 10**(-snr/20.)*255.
def sigma_to_snr(sigma):
return -20.*np.log10(sigma/255.)
def plot_results(selected_paths, title=None, diff=True, ylim=None):
# plt.figure(figsize=(10, 10))
all_stats = {}
fig, ax = plt.subplots(layout='constrained', figsize=(10, 10))
for selected_path, selected_regex in selected_paths:
selected_path = Path(selected_path)
assert selected_path.exists()
results_path = sorted(list(selected_path.glob(selected_regex)))
stats = []
for result_path in results_path:
df = pd.read_csv(result_path)
in_psnr = df["in_PSNR"].mean()
out_psnr = df["out_PSNR"].mean()
out_ssim = df["out_SSIM"].mean()
noise_stddev = np.array([
float(el.replace("}", "").split(":")[1]) for el in df["degradation"]]).mean()
stats.append({
# "label": label,
"in_psnr": in_psnr,
"out_psnr": out_psnr,
"noise_stddev": noise_stddev,
"ssim": out_ssim
})
label = selected_path.name + " " + df["size"][0]
stats_array = pd.DataFrame(stats)
all_stats[label] = stats_array
x_data = stats_array["in_psnr"].copy()
x_data = snr_to_sigma(x_data)
ax.plot(
x_data,
stats_array["out_psnr"]-stats_array["in_psnr"] if diff else stats_array["out_psnr"],
"-o",
label=label
)
# label=selected_path.name)
if not diff:
neutral_sigma = np.linspace(1, 80, 80)
ax.plot(neutral_sigma, sigma_to_snr(neutral_sigma), "k--", alpha=0.1, label="Neutral")
secax = ax.secondary_xaxis('top', functions=(sigma_to_snr, snr_to_sigma))
secax.set_xlabel('PSNR [db]')
ax.set_xlabel("sigma 255")
ax.set_ylabel("PSNR improvement" if diff else "PSNR out")
plt.xlim(1., 50.)
if diff:
plt.ylim(0, 15)
else:
if ylim is not None:
plt.ylim(*ylim)
if title is not None:
plt.title(title)
plt.legend()
plt.grid()
plt.show()
return all_stats