Spaces:
Running
on
Zero
Running
on
Zero
#!/usr/bin/env python | |
# -*- coding:utf-8 -*- | |
# Power by Zongsheng Yue 2022-02-06 10:34:59 | |
import os | |
import random | |
import requests | |
import importlib | |
from pathlib import Path | |
from PIL import Image | |
def mkdir(dir_path, delete=False, parents=True): | |
import shutil | |
if not isinstance(dir_path, Path): | |
dir_path = Path(dir_path) | |
if delete: | |
if dir_path.exists(): | |
shutil.rmtree(str(dir_path)) | |
if not dir_path.exists(): | |
dir_path.mkdir(parents=parents) | |
def get_obj_from_str(string, reload=False): | |
module, cls = string.rsplit(".", 1) | |
if reload: | |
module_imp = importlib.import_module(module) | |
importlib.reload(module_imp) | |
return getattr(importlib.import_module(module, package=None), cls) | |
def instantiate_from_config(config): | |
if not "target" in config: | |
raise KeyError("Expected key `target` to instantiate.") | |
return get_obj_from_str(config["target"])(**config.get("params", dict())) | |
def str2bool(v): | |
if isinstance(v, bool): | |
return v | |
if v.lower() in ("yes", "true", "t", "y", "1"): | |
return True | |
elif v.lower() in ("no", "false", "f", "n", "0"): | |
return False | |
else: | |
raise argparse.ArgumentTypeError("Boolean value expected.") | |
def get_filenames(dir_path, exts=['png', 'jpg'], recursive=True): | |
''' | |
Get the file paths in the given folder. | |
param exts: list, e.g., ['png',] | |
return: list | |
''' | |
if not isinstance(dir_path, Path): | |
dir_path = Path(dir_path) | |
file_paths = [] | |
for current_ext in exts: | |
if recursive: | |
file_paths.extend([str(x) for x in dir_path.glob('**/*.'+current_ext)]) | |
else: | |
file_paths.extend([str(x) for x in dir_path.glob('*.'+current_ext)]) | |
return file_paths | |
def readline_txt(txt_file): | |
txt_file = [txt_file, ] if isinstance(txt_file, str) else txt_file | |
out = [] | |
for txt_file_current in txt_file: | |
with open(txt_file_current, 'r') as ff: | |
out.extend([x[:-1] for x in ff.readlines()]) | |
return out | |
def scan_files_from_folder(dir_paths, exts, recursive=True): | |
''' | |
Scaning images from given folder. | |
Input: | |
dir_pathas: str or list. | |
exts: list | |
''' | |
exts = [exts, ] if isinstance(exts, str) else exts | |
dir_paths = [dir_paths, ] if isinstance(dir_paths, str) else dir_paths | |
file_paths = [] | |
for current_dir in dir_paths: | |
current_dir = Path(current_dir) if not isinstance(current_dir, Path) else current_dir | |
for current_ext in exts: | |
if recursive: | |
search_flag = f"**/*.{current_ext}" | |
else: | |
search_flag = f"*.{current_ext}" | |
file_paths.extend(sorted([str(x) for x in Path(current_dir).glob(search_flag)])) | |
return file_paths | |
def write_path_to_txt( | |
dir_folder, | |
txt_path, | |
search_key, | |
num_files=None, | |
write_only_name=False, | |
write_only_stem=False, | |
shuffle=False, | |
): | |
''' | |
Scaning the files in the given folder and write them into a txt file | |
Input: | |
dir_folder: path of the target folder | |
txt_path: path to save the txt file | |
search_key: e.g., '*.png' | |
write_only_name: bool, only record the file names (including extension), | |
write_only_stem: bool, only record the file names (not including extension), | |
''' | |
txt_path = Path(txt_path) if not isinstance(txt_path, Path) else txt_path | |
dir_folder = Path(dir_folder) if not isinstance(dir_folder, Path) else dir_folder | |
if txt_path.exists(): | |
txt_path.unlink() | |
if write_only_name: | |
path_list = sorted([str(x.name) for x in dir_folder.glob(search_key)]) | |
elif write_only_stem: | |
path_list = sorted([str(x.stem) for x in dir_folder.glob(search_key)]) | |
else: | |
path_list = sorted([str(x) for x in dir_folder.glob(search_key)]) | |
if shuffle: | |
random.shuffle(path_list) | |
if num_files is not None: | |
path_list = path_list[:num_files] | |
with open(txt_path, mode='w') as ff: | |
for line in path_list: | |
ff.write(line+'\n') | |
def download_image_from_url(url, dir="./"): | |
# Download a file from a given URI, including minimal checks | |
# Download | |
f = str(Path(dir) / os.path.basename(url)) # filename | |
try: | |
with open(f, "wb") as file: | |
file.write(requests.get(url, timeout=10).content) | |
except: | |
print(f'Skip the url: {f}!') | |
# Rename (remove wildcard characters) | |
src = f # original name | |
for c in ["%20", "%", "*", "~", "(", ")"]: | |
f = f.replace(c, "_") | |
f = f[: f.index("?")] if "?" in f else f # new name | |
if src != f: | |
os.rename(src, f) # rename | |
# Add suffix (if missing) | |
if Path(f).suffix == "": | |
src = f # original name | |
try: | |
f += f".{Image.open(f).format.lower()}" | |
os.rename(src, f) # rename | |
except: | |
Path(f).unlink() | |