(ou o projeto anteriormente conhecido como DeepBackSub)
(Créditos pelos belos cenários para Mary Sabell e PhotoFunia)
backscrub é licenciado sob a Licença Apache 2.0. Consulte o arquivo LICENSE para obter detalhes.
Instale dependências ( sudo apt install libopencv-dev build-essential v4l2loopback-dkms curl
).
Clone este repositório com git clone --recursive https://github.com/floe/backscrub.git
. Para acelerar a finalização da compra, você também pode passar --depth=1
para git clone
. Não há problema, se você quiser apenas baixar e construir o código, porém, para desenvolvimento não é recomendado.
Use cmake
para construir o projeto: crie uma subpasta (por exemplo, build
), mude para essa pasta e execute: cmake .. && make -j $(nproc || echo 4)
.
Obsoleto : Outra opção para construir tudo é executar make
no diretório raiz do repositório. Embora isso baixe e construa todas as dependências, ele apresenta algumas desvantagens, como falta de suporte para XNNPACK. Além disso, isso pode falhar nas versões mais recentes do Tensorflow Lite, pois o suporte upstream para esta opção foi removido. Use por sua conta e risco.
Primeiro, carregue o módulo v4l2loopback (configurações extras necessárias para fazer o Chrome funcionar):
sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label="VirtualCam" video_nr=10
Em seguida, execute backscrub (-d -d para depuração completa, -c para dispositivo de captura, -v para dispositivo virtual, -b para papel de parede):
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
Algumas câmeras (como por exemplo Logitec Brio
) precisam mudar a fonte de vídeo para MJPG
passando -f MJPG
para que resoluções mais altas fiquem disponíveis para uso.
Para uso regular, configure um arquivo de configuração /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"
Para carregar automaticamente o driver na inicialização, crie /etc/modules-load.d/v4l2loopback.conf
com o seguinte conteúdo:
v4l2loopback
Testado com as seguintes dependências:
Testado com o seguinte software:
-c read
)-c read
)Nestes tempos modernos, onde todo mundo está sentado em casa e fazendo skype/zoom/webrtc o tempo todo, fiquei um pouco irritado por sempre mostrar meu escritório em casa bagunçado para o mundo. O Skype tem um recurso de “desfoque de fundo”, mas isso começa a ficar chato depois de um tempo (e é menos privado do que eu pessoalmente gostaria). O Zoom tem alguma substituição de plano de fundo integrada, mas não estou tocando nesse software com uma vara de barcaça (e esse recurso não está disponível no Linux de qualquer maneira). Então decidi pesquisar como implementar minha própria implementação sem depender de nenhum software de videoconferência específico para oferecer suporte a isso.
Toda essa coisa envolve três etapas principais com dificuldade variada:
Eu tenho trabalhado muito com câmeras de profundidade anteriormente, também para segmentação de fundo (veja SurfaceStreams), então peguei uma câmera RealSense que sobrou do laboratório e tentei. No entanto, os dados de profundidade em um ambiente de escritório desordenado são bastante barulhentos e, não importa como eu ajustei as configurações da câmera, ela não conseguiu produzir nenhum dado de profundidade para o meu cabelo...? Eu parecia um monge medieval que teve o topo da cabeça decepado, então... próximo.
Consulte https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html para obter o tutorial. Deve funcionar bem para fundos principalmente estáticos e pequenos objetos em movimento, mas não funciona para uma pessoa quase estática na frente de um fundo estático. Próximo.
Consulte https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html para obter o tutorial. Funciona bem, mas obviamente detecta apenas o rosto, e não o resto da pessoa. Além disso, corresponde apenas aproximadamente a uma elipse que parece estranha ao avaliador no final. Próximo.
Ouvi coisas boas sobre esse assunto de aprendizado profundo, então vamos tentar. Primeiro tive que encontrar meu caminho através de uma pilha de frameworks (Keras, Tensorflow, PyTorch, etc.), mas depois que encontrei um modelo pronto para segmentação semântica baseado em Tensorflow Lite (DeepLab v3+), decidi por isso.
Dei uma olhada no exemplo correspondente do Python, no exemplo do C++ e no exemplo do Android e, com base neles, primeiro criei uma demonstração do Python. Ele rodava a cerca de 2,5 FPS, o que é terrivelmente lento, então criei uma versão C++ que gerencia 10 FPS sem muita otimização manual. Bom o suficiente.
Também testei uma versão convertida em TFLite do modelo Body-Pix, mas os resultados não foram muito diferentes do DeepLab para este caso de uso.
Mais recentemente, o Google lançou um modelo treinado especificamente para segmentação de pessoas usado no Google Meet. Ele tem um desempenho muito melhor que o DeepLab, tanto em termos de velocidade quanto de precisão, então agora é o padrão. Ele precisa de uma operação personalizada da estrutura MediaPipe, mas foi bastante fácil de integrar. Obrigado a @jiangjianping por apontar isso na edição correspondente.
Esta é basicamente uma linha de código com OpenCV: bg.copyTo(raw,mask);
Eu disse que essa é a parte fácil.
Estou usando o v4l2loopback para canalizar os dados da minha ferramenta de espaço do usuário para qualquer software que possa abrir um dispositivo V4L2. Isso não é muito difícil por causa dos bons exemplos, mas existem alguns problemas, principalmente o espaço de cores. Foram necessárias algumas tentativas e erros para encontrar um formato de pixel comum aceito pelo Firefox, Skype e guvcview, que é o YUYV. Muito bem, minha webcam pode gerar YUYV diretamente como dados brutos, o que me poupa algumas conversões de espaço de cores.
O fluxo de dados através de todo o programa é aproximadamente o seguinte:
write()
dados para dispositivo de vídeo virtual(*) estes são parâmetros de entrada obrigatórios para este modelo
Como sempre: pull requests são bem-vindos.
Consulte Problemas e solicitações pull para extensões atualmente discutidas/em andamento e também verifique o branch experimental
.
Formatos preferidos do Firefox: https://searchfox.org/mozilla-central/source/third_party/libwebrtc/webrtc/modules/video_capture/linux/video_capture_linux.cc#142-159
Fomos notificados de que algumas versões do obs-studio
com pacote snap não conseguem detectar/usar uma câmera virtual conforme fornecido por backscrub
. Verifique os detalhes para soluções alternativas, se isso se aplicar a você.