Compare commits

...

6 Commits

Author SHA1 Message Date
killerlux c72642381d
Merge dd622d8837 into 87d982e6f8 2025-08-07 22:21:40 +02:00
Kenneth Estanislao 87d982e6f8
Merge pull request #1435 from rugk/patch-1
Add Golem.de (German IT news magazine) article
2025-08-08 02:26:51 +08:00
rugk cf47dabf0e
Add Golem.de (German IT news magazine) article 2025-08-06 15:43:52 +02:00
Kenneth Estanislao d0d90ecc03 Creating a fallback and switching of models
Models switch depending on the execution provider
2025-08-02 02:56:20 +08:00
Aymen Kouskoussi dd622d8837 Add security policy, pull request template, and new issue templates (feature request, question) 2025-05-03 09:20:13 +02:00
Aymen Kouskoussi 02ecc245bd Fix: Improve Linux CPU execution and webcam handling. Update README. 2025-05-03 09:16:41 +02:00
9 changed files with 135 additions and 10 deletions

View File

@ -0,0 +1,17 @@
---
name: Feature Request
description: Suggest an idea for this project
labels: enhancement
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@ -0,0 +1,11 @@
---
name: Question
about: Ask a question or request support
labels: question
---
**Your question**
Please describe your question or what you need help with.
**Context**
Add any other context or details that might help us answer your question.

View File

@ -0,0 +1,22 @@
# Pull Request Template
Thank you for your contribution!
Please fill out the following checklist and provide all relevant information to help us review your pull request.
## Description
Please include a summary of the change and which issue is fixed (if any). Also describe your motivation and context.
Fixes #(issue)
## Checklist
- [ ] My code follows the project style and guidelines
- [ ] I have performed a self-review of my code
- [ ] I have tested the changes and they work as expected
- [ ] I have added tests that prove my fix is effective or that my feature works (if applicable)
- [ ] I have added necessary documentation (if appropriate)
## Additional Information
Please add any other information or screenshots that may help the reviewers.

11
.github/SECURITY.md vendored 100644
View File

@ -0,0 +1,11 @@
# Security Policy
## Reporting a Vulnerability
If you discover a security vulnerability, please report it by emailing the project maintainers at [your-email@example.com].
- Do **not** create a public issue for security vulnerabilities.
- Provide as much information as possible to help us understand and address the issue quickly.
- We will acknowledge your report within 3 business days and strive to resolve all security issues promptly.
Thank you for helping keep this project and its users safe!

View File

@ -148,6 +148,31 @@ source venv/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
``` ```
**For Linux (Debian/Ubuntu based):**
```bash
# Install system dependencies (if needed)
sudo apt-get update
sudo apt-get install python3-venv python3-pip ffmpeg git
# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate
# Install Python dependencies
# (Important: Ensure you have CPU-only versions if not using GPU)
pip uninstall -y torch torchvision torchaudio onnxruntime*
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
# Install webcam utilities (optional but helpful for troubleshooting)
sudo apt-get install v4l-utils
# Ensure your user is in the 'video' group for webcam access
# (You might need to log out and log back in after adding)
sudo adduser $USER video
groups
```
**For macOS:** **For macOS:**
Apple Silicon (M1/M2/M3) requires specific setup: Apple Silicon (M1/M2/M3) requires specific setup:
@ -181,7 +206,7 @@ source venv/bin/activate
pip install -r requirements.txt pip install -r requirements.txt
``` ```
**Run:** If you don't have a GPU, you can run Deep-Live-Cam using `python run.py`. Note that initial execution will download models (~300MB). **Run:** If you don't have a GPU, you can run Deep-Live-Cam using `python run.py` or `python run.py --execution-provider cpu`. Note that initial execution will download models (~300MB). Performance will be very low (potentially < 1 FPS) without a compatible GPU.
### GPU Acceleration ### GPU Acceleration
@ -348,6 +373,7 @@ Looking for a CLI mode? Using the -s/--source argument will make the run program
- [*"That's Crazy, Oh God. That's Fucking Freaky Dude... That's So Wild Dude"*](https://www.youtube.com/watch?time_continue=1074&v=py4Tc-Y8BcY) - SomeOrdinaryGamers - [*"That's Crazy, Oh God. That's Fucking Freaky Dude... That's So Wild Dude"*](https://www.youtube.com/watch?time_continue=1074&v=py4Tc-Y8BcY) - SomeOrdinaryGamers
- [*"Alright look look look, now look chat, we can do any face we want to look like chat"*](https://www.youtube.com/live/mFsCe7AIxq8?feature=shared&t=2686) - IShowSpeed - [*"Alright look look look, now look chat, we can do any face we want to look like chat"*](https://www.youtube.com/live/mFsCe7AIxq8?feature=shared&t=2686) - IShowSpeed
- [*"They do a pretty good job matching poses, expression and even the lighting"*](https://www.youtube.com/watch?v=wnCghLjqv3s&t=551s) - TechLinked (LTT) - [*"They do a pretty good job matching poses, expression and even the lighting"*](https://www.youtube.com/watch?v=wnCghLjqv3s&t=551s) - TechLinked (LTT)
- [*"Als Sean Connery an der Redaktionskonferenz teilnahm"*](https://www.golem.de/news/deepfakes-als-sean-connery-an-der-redaktionskonferenz-teilnahm-2408-188172.html) - Golem.de (German)
## Credits ## Credits

View File

@ -4,7 +4,11 @@ import sys
if any(arg.startswith('--execution-provider') for arg in sys.argv): if any(arg.startswith('--execution-provider') for arg in sys.argv):
os.environ['OMP_NUM_THREADS'] = '1' os.environ['OMP_NUM_THREADS'] = '1'
# reduce tensorflow log level # reduce tensorflow log level
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
# disable GPU for tensorflow when using CPU provider
if '--execution-provider' in sys.argv and 'cpu' in sys.argv[sys.argv.index('--execution-provider') + 1]:
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
import warnings import warnings
from typing import List from typing import List
import platform import platform
@ -81,6 +85,13 @@ def parse_args() -> None:
modules.globals.execution_threads = args.execution_threads modules.globals.execution_threads = args.execution_threads
modules.globals.lang = args.lang modules.globals.lang = args.lang
# If using CPU provider, ensure we're not using any GPU features
if 'cpu' in args.execution_provider:
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
if torch.cuda.is_available():
torch.cuda.empty_cache()
torch.cuda.set_device('cpu')
#for ENHANCER tumbler: #for ENHANCER tumbler:
if 'face_enhancer' in args.frame_processor: if 'face_enhancer' in args.frame_processor:
modules.globals.fp_ui['face_enhancer'] = True modules.globals.fp_ui['face_enhancer'] = True

View File

@ -1,3 +1,3 @@
name = 'Deep-Live-Cam' name = 'Deep-Live-Cam'
version = '1.8' version = '1.8.1'
edition = 'GitHub Edition' edition = 'GitHub Edition'

View File

@ -28,12 +28,14 @@ models_dir = os.path.join(
def pre_check() -> bool: def pre_check() -> bool:
download_directory_path = abs_dir download_directory_path = models_dir
model_url = "https://huggingface.co/hacksider/deep-live-cam/resolve/main/inswapper_128.onnx"
if "CUDAExecutionProvider" in modules.globals.execution_providers:
model_url = "https://huggingface.co/hacksider/deep-live-cam/resolve/main/inswapper_128_fp16.onnx"
conditional_download( conditional_download(
download_directory_path, download_directory_path,
[ [model_url],
"https://huggingface.co/hacksider/deep-live-cam/blob/main/inswapper_128_fp16.onnx"
],
) )
return True return True
@ -60,7 +62,10 @@ def get_face_swapper() -> Any:
with THREAD_LOCK: with THREAD_LOCK:
if FACE_SWAPPER is None: if FACE_SWAPPER is None:
model_path = os.path.join(models_dir, "inswapper_128_fp16.onnx") model_name = "inswapper_128.onnx"
if "CUDAExecutionProvider" in modules.globals.execution_providers:
model_name = "inswapper_128_fp16.onnx"
model_path = os.path.join(models_dir, model_name)
FACE_SWAPPER = insightface.model_zoo.get_model( FACE_SWAPPER = insightface.model_zoo.get_model(
model_path, providers=modules.globals.execution_providers model_path, providers=modules.globals.execution_providers
) )

View File

@ -42,15 +42,31 @@ class VideoCapturer:
for dev_id, backend in capture_methods: for dev_id, backend in capture_methods:
try: try:
print(f"Trying device {dev_id} with backend {backend}")
self.cap = cv2.VideoCapture(dev_id, backend) self.cap = cv2.VideoCapture(dev_id, backend)
if self.cap.isOpened(): if self.cap.isOpened():
print(f"Successfully opened device {dev_id} with backend {backend}")
break break
self.cap.release() self.cap.release()
except Exception: except Exception as e:
print(f"Failed to open device {dev_id} with backend {backend}: {str(e)}")
continue continue
else: else:
# Unix-like systems (Linux/Mac) capture method # Unix-like systems (Linux/Mac) capture method
self.cap = cv2.VideoCapture(self.device_index) # Try device 0 first, then the specified device index if different
capture_methods = [(0, cv2.CAP_V4L2), (self.device_index, cv2.CAP_V4L2)] if self.device_index != 0 else [(0, cv2.CAP_V4L2)]
for dev_id, backend in capture_methods:
try:
print(f"Trying device {dev_id} with backend {backend}")
self.cap = cv2.VideoCapture(dev_id, backend)
if self.cap.isOpened():
print(f"Successfully opened device {dev_id} with backend {backend}")
break
self.cap.release()
except Exception as e:
print(f"Failed to open device {dev_id} with backend {backend}: {str(e)}")
continue
if not self.cap or not self.cap.isOpened(): if not self.cap or not self.cap.isOpened():
raise RuntimeError("Failed to open camera") raise RuntimeError("Failed to open camera")
@ -60,6 +76,12 @@ class VideoCapturer:
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
self.cap.set(cv2.CAP_PROP_FPS, fps) self.cap.set(cv2.CAP_PROP_FPS, fps)
# Print actual camera settings
actual_width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)
actual_height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
actual_fps = self.cap.get(cv2.CAP_PROP_FPS)
print(f"Camera initialized with: {actual_width}x{actual_height} @ {actual_fps}fps")
self.is_running = True self.is_running = True
return True return True