Source code for aitlas.tasks.visualize
import logging
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
from ..base import BaseModel, BaseTask
from .schemas import VisualizeTaskSchema
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
[docs]class VisualizeTask(BaseTask):
schema = VisualizeTaskSchema
def __init__(self, model: BaseModel, config):
super().__init__(model, config)
[docs] def get_distribution_for_split(self, split, split_type):
if split:
dataset = self.create_dataset(split)
df = dataset.data_distribution_table()
df["Split"] = split_type
return df, dataset.get_name()
return None, None
[docs] def get_distribution(self):
# load the datasets and distributions
train, train_name = self.get_distribution_for_split(
self.config.split.train, "Train"
)
val, val_name = self.get_distribution_for_split(self.config.split.val, "Val")
test, test_name = self.get_distribution_for_split(
self.config.split.test, "Test"
)
name = (
train_name
if train_name
else test_name
if test_name
else val_name
if val_name
else ""
)
label_count = pd.concat([train, val, test])
fig, ax = plt.subplots(figsize=(12, 10))
sns.barplot(y="Label", x="Count", hue="Split", data=label_count)
ax.set_title("Image distribution for {}".format(name), pad=20, fontsize=18)
return fig, label_count
[docs] def run(self):
"""Visualize the distribution of the dataset"""
logging.info("Loading config...")
fig, df = self.get_distribution()
output_xls = self.config.output_xls
if not output_xls:
output_xls = self.config.output_file.split(".")[0] + ".xls"
logging.info(f"Saving plot to {self.config.output_file}")
fig.savefig(self.config.output_file, format="png")
logging.info(f"Saving excel to {output_xls}")
df.to_excel(output_xls)
logging.info("Done!")