feat: implement Python BiRefNet background segmentation processor and installer
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import venv
|
||||
|
||||
# Force line buffering
|
||||
sys.stdout.reconfigure(line_buffering=True)
|
||||
|
||||
def run_command(command, description):
|
||||
print(f"[STATUS] {description}...")
|
||||
try:
|
||||
process = subprocess.Popen(
|
||||
command,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
text=True,
|
||||
shell=True,
|
||||
bufsize=1
|
||||
)
|
||||
|
||||
# Read output in real-time
|
||||
for line in process.stdout:
|
||||
line_str = line.strip()
|
||||
# If the output has pip download status, keep it readable but don't spam too much
|
||||
if "Downloading" in line_str or "Installing" in line_str:
|
||||
print(f"[STATUS] {line_str}")
|
||||
elif line_str:
|
||||
print(f"[INFO] {line_str}")
|
||||
|
||||
process.wait()
|
||||
if process.returncode != 0:
|
||||
print(f"[ERROR] Command failed with code {process.returncode}", file=sys.stderr)
|
||||
return False
|
||||
return True
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Exception occurred: {str(e)}", file=sys.stderr)
|
||||
return False
|
||||
|
||||
def main():
|
||||
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
venv_dir = os.path.join(base_dir, ".venv")
|
||||
|
||||
# 1. Create venv if not exists
|
||||
if not os.path.exists(venv_dir):
|
||||
print("[STATUS] Creating Python virtual environment...")
|
||||
try:
|
||||
venv.create(venv_dir, with_pip=True)
|
||||
print("[STATUS] Virtual environment successfully created.")
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Failed to create virtual environment: {str(e)}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("[STATUS] Virtual environment already exists.")
|
||||
|
||||
# 2. Path to pip inside the venv
|
||||
if os.name == 'nt':
|
||||
pip_path = os.path.join(venv_dir, "Scripts", "pip.exe")
|
||||
python_path = os.path.join(venv_dir, "Scripts", "python.exe")
|
||||
else:
|
||||
pip_path = os.path.join(venv_dir, "bin", "pip")
|
||||
python_path = os.path.join(venv_dir, "bin", "python")
|
||||
|
||||
if not os.path.exists(pip_path):
|
||||
print("[ERROR] pip executable not found inside virtual environment!", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# 3. Upgrade pip
|
||||
run_command(f'"{pip_path}" install --upgrade pip', "Upgrading pip to latest version")
|
||||
|
||||
# 4. Install dependencies
|
||||
requirements_path = os.path.join(base_dir, "backend", "requirements.txt")
|
||||
|
||||
# Use extra index URL for CPU-only torch to download faster (150MB instead of 2.5GB+ GPU version)
|
||||
# This is perfect for single images on desktop!
|
||||
pip_install_cmd = f'"{pip_path}" install -r "{requirements_path}" --extra-index-url https://download.pytorch.org/whl/cpu'
|
||||
|
||||
success = run_command(pip_install_cmd, "Installing PyTorch, Transformers, and PIL dependencies")
|
||||
if not success:
|
||||
print("[ERROR] Dependency installation failed!", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print("[STATUS] Setup completed successfully!")
|
||||
print("[STATUS] DONE")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user