Spaces:
Running
on
Zero
Running
on
Zero
| """ | |
| File: plots.py | |
| Author: Dmitry Ryumin, Maxim Markitantov, Elena Ryumina, Anastasia Dvoynikova, and Alexey Karpov | |
| Description: Plotting functions. | |
| License: MIT License | |
| """ | |
| import numpy as np | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import cv2 | |
| def plot_audio(time_axis, waveform, frame_indices, fps, figsize=(10, 4)) -> plt.Figure: | |
| frame_times = np.array(frame_indices) / fps | |
| fig, ax = plt.subplots(figsize=figsize) | |
| ax.plot(time_axis, waveform[0]) | |
| ax.set_xlabel("Time (frames)") | |
| ax.set_ylabel("Amplitude") | |
| ax.grid(True) | |
| ax.set_xticks(frame_times) | |
| ax.set_xticklabels([f"{int(frame_time * fps) + 1}" for frame_time in frame_times]) | |
| fig.tight_layout() | |
| return fig | |
| def plot_images(image_paths): | |
| fig, axes = plt.subplots(1, len(image_paths), figsize=(12, 2)) | |
| for ax, img_path in zip(axes, image_paths): | |
| ax.imshow(img_path) | |
| ax.axis("off") | |
| fig.tight_layout() | |
| return fig | |
| def get_evenly_spaced_frame_indices(total_frames, num_frames=10): | |
| if total_frames <= num_frames: | |
| return list(range(total_frames)) | |
| step = total_frames / num_frames | |
| return [int(np.round(i * step)) for i in range(num_frames)] | |
| def plot_predictions( | |
| df: pd.DataFrame, | |
| column: str, | |
| title: str, | |
| y_labels: list[str], | |
| figsize: tuple[int, int], | |
| x_ticks: list[int], | |
| line_width: float = 2.0, | |
| ) -> None: | |
| fig, ax = plt.subplots(figsize=figsize) | |
| df[column] += 1 | |
| ax.plot(df.index, df[column], linestyle="dotted", linewidth=line_width) | |
| ax.set_title(title) | |
| ax.set_xlabel("Frames") | |
| ax.set_ylabel(title) | |
| ax.set_xticks(x_ticks) | |
| ax.set_yticks(range(len(y_labels) + 2)) | |
| ax.set_yticklabels([" "] + y_labels + [" "]) | |
| ax.grid(True) | |
| fig.tight_layout() | |
| return fig | |
| def display_frame_info(img, text, margin=1.0, box_scale=1.0, scale=1.5): | |
| img_copy = img.copy() | |
| img_h, img_w, _ = img_copy.shape | |
| line_width = int(min(img_h, img_w) * 0.001) | |
| thickness = max(int(line_width / 3), 1) | |
| font_face = cv2.FONT_HERSHEY_SIMPLEX | |
| font_color = (0, 0, 0) | |
| font_scale = thickness / scale | |
| t_w, t_h = cv2.getTextSize(text, font_face, font_scale, None)[0] | |
| margin_n = int(t_h * margin) | |
| sub_img = img_copy[ | |
| 0 + margin_n : 0 + margin_n + t_h + int(2 * t_h * box_scale), | |
| img_w - t_w - margin_n - int(2 * t_h * box_scale) : img_w - margin_n, | |
| ] | |
| white_rect = np.ones(sub_img.shape, dtype=np.uint8) * 255 | |
| img_copy[ | |
| 0 + margin_n : 0 + margin_n + t_h + int(2 * t_h * box_scale), | |
| img_w - t_w - margin_n - int(2 * t_h * box_scale) : img_w - margin_n, | |
| ] = cv2.addWeighted(sub_img, 0.5, white_rect, 0.5, 1.0) | |
| cv2.putText( | |
| img=img_copy, | |
| text=text, | |
| org=( | |
| img_w - t_w - margin_n - int(2 * t_h * box_scale) // 2, | |
| 0 + margin_n + t_h + int(2 * t_h * box_scale) // 2, | |
| ), | |
| fontFace=font_face, | |
| fontScale=font_scale, | |
| color=font_color, | |
| thickness=thickness, | |
| lineType=cv2.LINE_AA, | |
| bottomLeftOrigin=False, | |
| ) | |
| return img_copy | |