multimodalart's picture
Squashing commit
4450790 verified
raw
history blame
6.88 kB
import os
import requests
from rich.console import Console
from tqdm import tqdm
import subprocess
import sys
try:
import folder_paths
except ModuleNotFoundError:
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), "../../.."))
import folder_paths
models_to_download = {
"DeepBump": {
"size": 25.5,
"download_url": "https://github.com/HugoTini/DeepBump/raw/master/deepbump256.onnx",
"destination": "deepbump",
},
"Face Swap": {
"size": 660,
"download_url": [
"https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_mobilenet0.25_Final.pth",
"https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth",
"https://huggingface.co/deepinsight/inswapper/resolve/main/inswapper_128.onnx",
],
"destination": "insightface",
},
"GFPGAN (face enhancement)": {
"size": 332,
"download_url": [
"https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth",
"https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth"
# TODO: provide a way to selectively download models from "packs"
# https://github.com/TencentARC/GFPGAN/releases/download/v0.1.0/GFPGANv1.pth
# https://github.com/TencentARC/GFPGAN/releases/download/v0.2.0/GFPGANCleanv1-NoCE-C2.pth
# https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth
],
"destination": "face_restore",
},
"FILM: Frame Interpolation for Large Motion": {
"size": 402,
"download_url": [
"https://drive.google.com/drive/folders/131_--QrieM4aQbbLWrUtbO2cGbX8-war"
],
"destination": "FILM",
},
}
console = Console()
from urllib.parse import urlparse
from pathlib import Path
def download_model(download_url, destination):
if isinstance(download_url, list):
for url in download_url:
download_model(url, destination)
return
filename = os.path.basename(urlparse(download_url).path)
response = None
if "drive.google.com" in download_url:
try:
import gdown
except ImportError:
print("Installing gdown")
subprocess.check_call(
[
sys.executable,
"-m",
"pip",
"install",
"git+https://github.com/melMass/gdown@main",
]
)
import gdown
if "/folders/" in download_url:
# download folder
try:
gdown.download_folder(download_url, output=destination, resume=True)
except TypeError:
gdown.download_folder(download_url, output=destination)
return
# download from google drive
gdown.download(download_url, destination, quiet=False, resume=True)
return
response = requests.get(download_url, stream=True)
total_size = int(response.headers.get("content-length", 0))
destination_path = os.path.join(destination, filename)
with open(destination_path, "wb") as file:
with tqdm(
total=total_size, unit="B", unit_scale=True, desc=destination_path, ncols=80
) as progress_bar:
for data in response.iter_content(chunk_size=4096):
file.write(data)
progress_bar.update(len(data))
console.print(
f"Downloaded model from {download_url} to {destination_path}",
style="bold green",
)
def ask_user_for_downloads(models_to_download):
console.print("Choose models to download:")
choices = {}
for i, model_name in enumerate(models_to_download.keys(), start=1):
choices[str(i)] = model_name
console.print(f"{i}. {model_name}")
console.print(
"Enter the numbers of the models you want to download (comma-separated):"
)
user_input = console.input(">> ")
selected_models = user_input.split(",")
models_to_download_selected = {}
for choice in selected_models:
choice = choice.strip()
if choice in choices:
model_name = choices[choice]
models_to_download_selected[model_name] = models_to_download[model_name]
elif choice == "":
# download all
models_to_download_selected = models_to_download
else:
console.print(f"Invalid choice: {choice}. Skipping.")
return models_to_download_selected
def handle_interrupt():
console.print("Interrupted by user.", style="bold red")
def main(models_to_download, skip_input=False):
try:
models_to_download_selected = {}
def check_destination(urls, destination):
if isinstance(urls, list):
for url in urls:
check_destination(url, destination)
return
filename = os.path.basename(urlparse(urls).path)
destination = os.path.join(folder_paths.models_dir, destination)
if not os.path.exists(destination):
os.makedirs(destination)
destination_path = os.path.join(destination, filename)
if os.path.exists(destination_path):
url_name = os.path.basename(urlparse(urls).path)
console.print(
f"Checkpoint '{url_name}' for {model_name} already exists in '{destination}'"
)
else:
model_details["destination"] = destination
models_to_download_selected[model_name] = model_details
for model_name, model_details in models_to_download.items():
destination = model_details["destination"]
download_url = model_details["download_url"]
check_destination(download_url, destination)
if not models_to_download_selected:
console.print("No new models to download.")
return
models_to_download_selected = (
ask_user_for_downloads(models_to_download_selected)
if not skip_input
else models_to_download_selected
)
for model_name, model_details in models_to_download_selected.items():
download_url = model_details["download_url"]
destination = model_details["destination"]
console.print(f"Downloading {model_name}...")
download_model(download_url, destination)
except KeyboardInterrupt:
handle_interrupt()
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-y", "--yes", action="store_true", help="skip user input")
args = parser.parse_args()
main(models_to_download, args.yes)