full upload so not to lose anything important
This commit is contained in:
100
tools/plot_score.py
Normal file
100
tools/plot_score.py
Normal file
@@ -0,0 +1,100 @@
|
||||
from pathlib import Path
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
import numpy as np
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Path to your .npy file with anomaly scores
|
||||
scores_path = Path(
|
||||
"/home/fedex/mt/projects/thesis-kowalczyk-jan/Deep-SAD-PyTorch/infer/"
|
||||
"DeepSAD/subter_test/inference/3_smoke_human_walking_2023-01-23.npy"
|
||||
)
|
||||
|
||||
# Frames per second
|
||||
fps = 10
|
||||
|
||||
# Load all scores
|
||||
all_scores = np.load(scores_path)
|
||||
|
||||
# (Optional) If your scores are a 1D array, remove or adjust this reshape
|
||||
# The final shape is expected to be (1, total_frames) or (N,) if you want only one line.
|
||||
all_scores = all_scores.reshape(1, -1) # shape becomes (1, total_frames)
|
||||
|
||||
# We only want frames [0..299] => 300 frames
|
||||
max_frames = 300
|
||||
scores = all_scores[0, :max_frames] # Take the first row's first 300 frames
|
||||
|
||||
# Convert frames to time in seconds: time[i] = i / fps
|
||||
time_values = np.arange(len(scores)) / fps # shape is (max_frames,)
|
||||
|
||||
# Recalculate y-limit based on the selected slice
|
||||
y_limit = 1.1 * np.max(scores[np.isfinite(scores)])
|
||||
# If you want to ensure y_limit >= 10, uncomment below:
|
||||
# y_limit = max(y_limit, 10)
|
||||
|
||||
print("Selected Scores Shape:", scores.shape)
|
||||
print("Time Range:", time_values[0], "->", time_values[-1])
|
||||
print("Y-limit:", y_limit)
|
||||
|
||||
# --------------------------
|
||||
# Improve default font sizes
|
||||
# --------------------------
|
||||
plt.rcParams.update(
|
||||
{
|
||||
"figure.dpi": 150,
|
||||
"font.size": 14,
|
||||
"axes.labelsize": 16,
|
||||
"axes.titlesize": 16,
|
||||
"xtick.labelsize": 14,
|
||||
"ytick.labelsize": 14,
|
||||
"legend.fontsize": 14,
|
||||
}
|
||||
)
|
||||
|
||||
# --------------------------------------------------
|
||||
# Create the figure (half the previous width = 3.84)
|
||||
# --------------------------------------------------
|
||||
fig, ax = plt.subplots(figsize=(3.84, 7))
|
||||
|
||||
# Plot the scores vs. time
|
||||
ax.plot(time_values, scores, label="Anomaly Score", color="blue")
|
||||
|
||||
# Set axis labels
|
||||
ax.set_xlabel("Time [s]", fontsize=16)
|
||||
ax.set_ylabel("Score", fontsize=16)
|
||||
|
||||
# Restrict X-axis from 0 to last time value (or 30 s if exactly 300 frames)
|
||||
ax.set_xlim([0, time_values[-1]])
|
||||
ax.set_ylim([0, y_limit])
|
||||
|
||||
# -------------------------
|
||||
# Customize the ticks
|
||||
# -------------------------
|
||||
# Example: only 4 ticks on the x-axis (0, 10, 20, 30) if 300 frames => 30 s
|
||||
ax.set_xticks([0, 10, 20, 30])
|
||||
|
||||
# Guarantee at least one tick at y=10.
|
||||
# Adjust other ticks as you like; here we use 0 and the y_limit.
|
||||
# If y_limit <= 10, you might want to override it.
|
||||
if y_limit > 10:
|
||||
ax.set_yticks([0, 10, round(y_limit, 1)]) # round for cleaner display
|
||||
else:
|
||||
# If your data doesn't go that high, just keep 0 and y_limit
|
||||
ax.set_yticks([0, round(y_limit, 1)])
|
||||
|
||||
# Optionally add a legend
|
||||
ax.legend(loc="upper right")
|
||||
|
||||
plt.axvline(x=22, color="r", label="shown image")
|
||||
|
||||
# Tight layout for small figure
|
||||
plt.tight_layout()
|
||||
|
||||
# ----------------------
|
||||
# Save to disk, no show
|
||||
# ----------------------
|
||||
output_filename = f"{scores_path.stem}_static_time_plot.png"
|
||||
plt.savefig(output_filename, dpi=150)
|
||||
|
||||
# Clear the figure if you continue using matplotlib
|
||||
plt.clf()
|
||||
Reference in New Issue
Block a user