|
import cv2 |
|
import os |
|
import numpy as np |
|
import json |
|
import argparse |
|
|
|
import streamlit as st |
|
|
|
|
|
@st.cache_data |
|
def get_arguments(): |
|
"""Return the values of CLI params""" |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument("--image_folder", default="images") |
|
parser.add_argument("--image_width", default=400, type=int) |
|
args = parser.parse_args() |
|
return getattr(args, "image_folder"), getattr(args, "image_width") |
|
|
|
|
|
@st.cache_data |
|
def get_images_list(path_to_folder: str) -> list: |
|
"""Return the list of images from folder |
|
Args: |
|
path_to_folder (str): absolute or relative path to the folder with images |
|
""" |
|
image_names_list = [ |
|
x for x in os.listdir(path_to_folder) if x[-3:] in ["jpg", "peg", "png"] |
|
] |
|
return image_names_list |
|
|
|
|
|
@st.cache_data |
|
def load_image(image_name: str, path_to_folder: str, bgr2rgb: bool = True): |
|
"""Load the image |
|
Args: |
|
image_name (str): name of the image |
|
path_to_folder (str): path to the folder with image |
|
bgr2rgb (bool): converts BGR image to RGB if True |
|
""" |
|
path_to_image = os.path.join(path_to_folder, image_name) |
|
image = cv2.imread(path_to_image) |
|
if bgr2rgb: |
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
return image |
|
|
|
|
|
def upload_image(bgr2rgb: bool = True): |
|
"""Uoload the image |
|
Args: |
|
bgr2rgb (bool): converts BGR image to RGB if True |
|
""" |
|
file = st.sidebar.file_uploader( |
|
"Upload your image (jpg, jpeg, or png)", ["jpg", "jpeg", "png"] |
|
) |
|
image = cv2.imdecode(np.fromstring(file.read(), np.uint8), 1) |
|
if bgr2rgb: |
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
return image |
|
|
|
|
|
@st.cache_data |
|
def load_augmentations_config( |
|
placeholder_params: dict, path_to_config: str = "configs/augmentations.json" |
|
) -> dict: |
|
"""Load the json config with params of all transforms |
|
Args: |
|
placeholder_params (dict): dict with values of placeholders |
|
path_to_config (str): path to the json config file |
|
""" |
|
with open(path_to_config, "r") as config_file: |
|
augmentations = json.load(config_file) |
|
for name, params in augmentations.items(): |
|
params = [fill_placeholders(param, placeholder_params) for param in params] |
|
return augmentations |
|
|
|
|
|
def fill_placeholders(params: dict, placeholder_params: dict) -> dict: |
|
"""Fill the placeholder values in the config file |
|
Args: |
|
params (dict): original params dict with placeholders |
|
placeholder_params (dict): dict with values of placeholders |
|
""" |
|
|
|
if "placeholder" in params: |
|
placeholder_dict = params["placeholder"] |
|
for k, v in placeholder_dict.items(): |
|
if isinstance(v, list): |
|
params[k] = [] |
|
for element in v: |
|
if element in placeholder_params: |
|
params[k].append(placeholder_params[element]) |
|
else: |
|
params[k].append(element) |
|
else: |
|
if v in placeholder_params: |
|
params[k] = placeholder_params[v] |
|
else: |
|
params[k] = v |
|
params.pop("placeholder") |
|
return params |
|
|
|
|
|
def get_params_string(param_values: dict) -> str: |
|
"""Generate the string from the dict with parameters |
|
Args: |
|
param_values (dict): dict of "param_name" -> "param_value" |
|
""" |
|
params_string = ", ".join( |
|
[k + "=" + str(param_values[k]) for k in param_values.keys()] |
|
) |
|
return params_string |
|
|
|
|
|
def get_placeholder_params(image): |
|
return { |
|
"image_width": image.shape[1], |
|
"image_height": image.shape[0], |
|
"image_half_width": int(image.shape[1] / 2), |
|
"image_half_height": int(image.shape[0] / 2), |
|
} |
|
|
|
|
|
def select_transformations(augmentations: dict, interface_type: str) -> list: |
|
|
|
if interface_type == "Simple": |
|
transform_names = [ |
|
st.sidebar.selectbox( |
|
"Select a transformation:", sorted(list(augmentations.keys())) |
|
) |
|
] |
|
|
|
elif interface_type == "Professional": |
|
transform_names = [ |
|
st.sidebar.selectbox( |
|
"Select transformation β1:", sorted(list(augmentations.keys())) |
|
) |
|
] |
|
while transform_names[-1] != "None": |
|
transform_names.append( |
|
st.sidebar.selectbox( |
|
f"Select transformation β{len(transform_names) + 1}:", |
|
["None"] + sorted(list(augmentations.keys())), |
|
) |
|
) |
|
transform_names = transform_names[:-1] |
|
return transform_names |
|
|
|
|
|
def show_random_params(data: dict, interface_type: str = "Professional"): |
|
"""Shows random params used for transformation (from A.ReplayCompose)""" |
|
if interface_type == "Professional": |
|
st.subheader("Random params used") |
|
random_values = {} |
|
for applied_params in data["replay"]["transforms"]: |
|
random_values[ |
|
applied_params["__class_fullname__"].split(".")[-1] |
|
] = applied_params["params"] |
|
st.write(random_values) |
|
|