(또는 이전에 DeepBackSub로 알려진 프로젝트)
(Mary Sabell 및 PhotoFunia의 멋진 배경에 대한 크레딧)
backscrub은 Apache License 2.0에 따라 라이센스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
종속성을 설치합니다( sudo apt install libopencv-dev build-essential v4l2loopback-dkms curl
).
git clone --recursive https://github.com/floe/backscrub.git
사용하여 이 저장소를 복제하세요. 체크아웃 속도를 높이려면 --depth=1
git clone
에 추가로 전달할 수 있습니다. 코드를 다운로드하고 빌드하기만 하려는 경우에는 괜찮지만 개발용으로는 권장되지 않습니다.
cmake
사용하여 프로젝트를 빌드합니다. 하위 폴더(예: build
)를 만들고 해당 폴더로 변경한 후 cmake .. && make -j $(nproc || echo 4)
실행합니다.
더 이상 사용되지 않음 : 모든 것을 빌드하는 또 다른 옵션은 저장소의 루트 디렉터리에서 make
실행하는 것입니다. 이는 모든 종속성을 다운로드하고 빌드하지만 XNNPACK에 대한 지원 누락과 같은 몇 가지 단점이 있습니다. 또한 이 옵션에 대한 업스트림 지원이 제거되었으므로 최신 버전의 Tensorflow Lite에서는 문제가 발생할 수 있습니다. 사용에 따른 책임은 본인에게 있습니다.
먼저 v4l2loopback 모듈을 로드합니다(Chrome이 작동하려면 추가 설정이 필요함).
sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label="VirtualCam" video_nr=10
그런 다음 백스크럽을 실행합니다(전체 디버그의 경우 -d -d, 캡처 장치의 경우 -c, 가상 장치의 경우 -v, 배경화면의 경우 -b).
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
일부 카메라(예: Logitec Brio
)는 더 높은 해상도를 사용할 수 있도록 -f MJPG
전달하여 비디오 소스를 MJPG
로 전환해야 합니다.
정기적으로 사용하려면 /etc/modprobe.d/v4l2loopback.conf
구성 파일을 설정하십시오.
# V4L loopback driver
options v4l2loopback max_buffers=2
options v4l2loopback exclusive_caps=1
options v4l2loopback video_nr=10
options v4l2loopback card_label="VirtualCam"
시작 시 드라이버를 자동 로드하려면 다음 내용으로 /etc/modules-load.d/v4l2loopback.conf
생성하십시오.
v4l2loopback
다음 종속성으로 테스트되었습니다.
다음 소프트웨어로 테스트되었습니다.
-c read
와 함께 작동)-c read
와 함께 작동)모두가 집에 앉아 스카이프/줌/웹RTC를 하고 있는 요즘 시대에 나는 항상 지저분한 홈 오피스를 세상에 보여주는 것이 조금 짜증이 났습니다. Skype에는 "배경 흐림" 기능이 있지만 시간이 지나면 지루해지기 시작합니다(그리고 개인적으로 원하는 것보다 덜 비공개적입니다). Zoom에는 몇 가지 배경 대체 기능이 내장되어 있지만 바지선으로 해당 소프트웨어를 건드리지는 않습니다(어차피 Linux에서는 해당 기능을 사용할 수 없습니다). 그래서 나는 이를 지원하기 위해 특정 화상 회의 소프트웨어에 의존하지 않고 내 자신의 구현을 롤링하는 방법을 조사하기로 결정했습니다.
이 전체 셔뱅에는 다양한 난이도의 세 가지 주요 단계가 포함됩니다.
저는 이전에 배경 분할(SurfaceStreams 참조)을 위해 깊이 카메라로 많은 작업을 해왔기 때문에 실험실에서 남은 RealSense 카메라를 가져와서 한 번 촬영했습니다. 하지만 어수선한 사무실 환경의 깊이 데이터는 꽤 시끄럽고, 카메라 설정을 아무리 조정해도 머리카락에 대한 깊이 데이터가 생성되지 않습니다...? 머리 꼭대기가 잘린 중세 승려처럼 보였으니 ... 다음.
튜토리얼은 https://docs.opencv.org/3.4/d1/dc5/tutorial_Background_subtraction.html을 참조하세요. 대부분 정적인 배경과 작은 움직이는 물체에 대해서는 제대로 작동하지만 정적인 배경 앞에 있는 대부분 정적인 사람에게는 작동하지 않습니다. 다음.
튜토리얼은 https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html을 참조하세요. 괜찮게 작동하지만 분명히 얼굴만 감지하고 나머지 사람은 감지하지 않습니다. 또한 결국에는 이상하게 보이는 타원과 대략적으로만 일치합니다. 다음.
딥러닝에 관해 좋은 소식을 들었으니 한번 시도해 보겠습니다. 처음에는 수많은 프레임워크(Keras, Tensorflow, PyTorch 등)를 헤쳐나가야 했지만 Tensorflow Lite(DeepLab v3+)를 기반으로 하는 의미론적 분할을 위한 기성 모델을 찾은 후에는 그것에 정착했습니다.
해당 Python 예제, C++ 예제 및 Android 예제를 살펴보고 이를 기반으로 먼저 Python 데모를 엮었습니다. 약 2.5FPS로 실행되고 있었는데, 이는 정말 극도로 느렸습니다. 그래서 저는 너무 많은 수동 최적화 없이 10FPS를 관리하는 C++ 버전을 만들었습니다. 충분합니다.
또한 Body-Pix 모델의 TFLite 변환 버전을 테스트했지만 결과는 이 사용 사례에서 DeepLab과 크게 다르지 않았습니다.
최근 Google은 Google Meet에서 사용되는 사람 세분화를 위해 특별히 훈련된 모델을 출시했습니다. 이는 속도와 정확성 측면에서 DeepLab보다 훨씬 더 나은 성능을 제공하므로 이제 이것이 기본값입니다. MediaPipe 프레임워크에서 하나의 사용자 정의 작업이 필요하지만 통합하기가 매우 쉬웠습니다. 해당 문제에서 이를 지적한 @jiangjianping에게 감사드립니다.
이것은 기본적으로 OpenCV를 사용하는 한 줄의 코드입니다: bg.copyTo(raw,mask);
그게 쉬운 부분이라고 말했잖아.
나는 v4l2loopback을 사용하여 사용자 공간 도구의 데이터를 V4L2 장치를 열 수 있는 소프트웨어로 파이프합니다. 좋은 예가 있기 때문에 그리 어렵지는 않지만 몇 가지 중요한 점, 특히 색상 공간이 있습니다. Firefox, Skype 및 guvcview에서 허용되는 공통 픽셀 형식, 즉 YUYV를 찾는 데는 상당한 시행착오가 필요했습니다. 다행히 내 웹캠은 YUYV를 원시 데이터로 직접 출력할 수 있으므로 색상 공간 변환이 절약됩니다.
전체 프로그램의 데이터 흐름은 대략 다음과 같습니다.
write()
(*) 이는 이 모델의 필수 입력 매개변수입니다.
평소와 같이 풀 요청을 환영합니다.
현재 논의되고 진행 중인 확장에 대한 문제 및 풀 요청을 확인하고 experimental
분기도 확인하세요.
Firefox 선호 형식: https://searchfox.org/mozilla-central/source/third_party/libwebrtc/webrtc/modules/video_capture/linux/video_capture_linux.cc#142-159
obs-studio
의 일부 스냅 패키지 버전은 backscrub
에서 제공하는 가상 카메라를 감지/사용할 수 없다는 알림을 받았습니다. 해당되는 경우 자세한 해결 방법을 확인하세요.