(o el proyecto anteriormente conocido como DeepBackSub)
(Créditos por los bonitos fondos para Mary Sabell y PhotoFunia)
backscrub tiene la licencia Apache 2.0. Consulte el archivo de LICENCIA para obtener más detalles.
Instale dependencias ( sudo apt install libopencv-dev build-essential v4l2loopback-dkms curl
).
Clona este repositorio con git clone --recursive https://github.com/floe/backscrub.git
. Para acelerar el pago, también puede pasar --depth=1
a git clone
. Esto está bien si solo desea descargar y compilar el código; sin embargo, para el desarrollo no se recomienda.
Utilice cmake
para construir el proyecto: cree una subcarpeta (por ejemplo, build
), cambie a esa carpeta y ejecute: cmake .. && make -j $(nproc || echo 4)
.
En desuso : otra opción para compilar todo es ejecutar make
en el directorio raíz del repositorio. Si bien esto descargará y creará todas las dependencias, tiene algunos inconvenientes, como la falta de soporte para XNNPACK. Además, esto podría fallar con las versiones más nuevas de Tensorflow Lite, ya que se eliminó el soporte inicial para esta opción. Úselo bajo su propio riesgo.
Primero, cargue el módulo v4l2loopback (se necesitan configuraciones adicionales para que Chrome funcione):
sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label="VirtualCam" video_nr=10
Luego, ejecute backscrub (-d -d para depuración completa, -c para dispositivo de captura, -v para dispositivo virtual, -b para fondo de pantalla):
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
Algunas cámaras (como, por ejemplo, Logitec Brio
) necesitan cambiar la fuente de vídeo a MJPG
pasando -f MJPG
para que resoluciones más altas estén disponibles para su uso.
Para uso regular, configure un archivo de configuración /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 cargar automáticamente el controlador al inicio, cree /etc/modules-load.d/v4l2loopback.conf
con el siguiente contenido:
v4l2loopback
Probado con las siguientes dependencias:
Probado con el siguiente software:
-c read
)-c read
)En estos tiempos modernos en los que todo el mundo está sentado en casa usando Skype, haciendo zoom o webrtc todo el tiempo, me molestaba un poco tener que mostrar siempre mi desordenada oficina en casa al mundo. Skype tiene una función de "fondo borroso", pero empieza a resultar aburrida después de un tiempo (y es menos privado de lo que personalmente me gustaría). Zoom tiene algo de sustitución de fondo incorporado, pero no voy a tocar ese software con una barcaza (y esa característica no está disponible en Linux de todos modos). Así que decidí investigar cómo implementar mi propia implementación sin depender de ningún software de videoconferencia en particular para respaldarlo.
Todo este asunto implica tres pasos principales con diferente dificultad:
He estado trabajando mucho con cámaras de profundidad anteriormente, también para la segmentación del fondo (ver SurfaceStreams), así que tomé una cámara RealSense sobrante del laboratorio y le di una oportunidad. Sin embargo, los datos de profundidad en un entorno de oficina desordenado son bastante ruidosos y no importa cómo modifiqué la configuración de la cámara, ¿no pudo producir ningún dato de profundidad para mi cabello...? Parecía un monje medieval al que le habían cortado la parte superior de la cabeza, así que... a continuación.
Consulte https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html para ver el tutorial. Debería funcionar bien para fondos en su mayoría estáticos y pequeños objetos en movimiento, pero no funciona para una persona mayormente estática frente a un fondo estático. Próximo.
Consulte https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html para ver el tutorial. Funciona bien, pero obviamente solo detecta la cara y no el resto de la persona. Además, solo coincide aproximadamente con una elipse que al final parece bastante extraña. Próximo.
He oído cosas buenas sobre este tema del aprendizaje profundo, así que intentémoslo. Primero tuve que encontrar mi camino a través de un montón de marcos (Keras, Tensorflow, PyTorch, etc.), pero después de encontrar un modelo listo para usar para la segmentación semántica basado en Tensorflow Lite (DeepLab v3+), me decidí por eso.
Eché un vistazo al ejemplo correspondiente de Python, el ejemplo de C++ y el ejemplo de Android y, basándose en ellos, primero preparé una demostración de Python. Se ejecutaba a aproximadamente 2,5 FPS, lo cual es terriblemente lento, así que construí una versión C++ que maneja 10 FPS sin demasiada optimización manual. Bastante bien.
También probé una versión convertida a TFLite del modelo Body-Pix, pero los resultados no han sido muy diferentes a los de DeepLab para este caso de uso.
Más recientemente, Google lanzó un modelo específicamente entrenado para la segmentación de personas que se utiliza en Google Meet. Tiene un rendimiento mucho mejor que DeepLab, tanto en términos de velocidad como de precisión, por lo que ahora es el valor predeterminado. Necesita una operación personalizada del marco MediaPipe, pero fue bastante fácil de integrar. Gracias a @jiangjianping por señalar esto en la edición correspondiente.
Esto es básicamente una línea de código con OpenCV: bg.copyTo(raw,mask);
Te dije que esa es la parte fácil.
Estoy usando v4l2loopback para canalizar los datos de mi herramienta de espacio de usuario a cualquier software que pueda abrir un dispositivo V4L2. Esto no es demasiado difícil debido a los buenos ejemplos, pero hay algunos inconvenientes, sobre todo el espacio de color. Fue necesario bastante prueba y error para encontrar un formato de píxel común que sea aceptado por Firefox, Skype y guvcview, y ese es YUYV. Muy bien, mi cámara web puede generar YUYV directamente como datos sin procesar, lo que me ahorra algunas conversiones de espacio de color.
El flujo de datos a lo largo de todo el programa es aproximadamente el siguiente:
write()
datos en un dispositivo de vídeo virtual(*) estos son parámetros de entrada requeridos para este modelo
Como siempre: las solicitudes de extracción son bienvenidas.
Consulte Problemas y solicitudes de extracción para conocer las extensiones actualmente discutidas o en progreso, y también consulte la rama experimental
.
Formatos preferidos de Firefox: https://searchfox.org/mozilla-central/source/third_party/libwebrtc/webrtc/modules/video_capture/linux/video_capture_linux.cc#142-159
Se nos ha notificado que algunas versiones empaquetadas de obs-studio
no pueden detectar/usar una cámara virtual proporcionada por backscrub
. Consulte los detalles para encontrar soluciones alternativas si esto se aplica a su caso.