(ou le projet anciennement connu sous le nom de DeepBackSub)
(Crédits pour les jolis fonds à Mary Sabell et PhotoFunia)
backscrub est sous licence Apache License 2.0. Voir le fichier LICENSE pour plus de détails.
Installez les dépendances ( sudo apt install libopencv-dev build-essential v4l2loopback-dkms curl
).
Clonez ce référentiel avec git clone --recursive https://github.com/floe/backscrub.git
. Pour accélérer le paiement, vous pouvez également transmettre --depth=1
à git clone
. Ce n'est pas grave, si vous souhaitez uniquement télécharger et créer le code, cependant, pour le développement, cela n'est pas recommandé.
Utilisez cmake
pour construire le projet : créez un sous-dossier (par exemple build
), accédez à ce dossier et exécutez : cmake .. && make -j $(nproc || echo 4)
.
Obsolète : Une autre option pour tout construire consiste à exécuter make
dans le répertoire racine du référentiel. Bien que cela télécharge et crée toutes les dépendances, cela présente quelques inconvénients, comme le manque de prise en charge de XNNPACK. Cela pourrait également être interrompu avec les versions plus récentes de Tensorflow Lite, car la prise en charge en amont de cette option a été supprimée. Utilisez à vos propres risques.
Tout d’abord, chargez le module v4l2loopback (paramètres supplémentaires nécessaires pour faire fonctionner Chrome) :
sudo modprobe v4l2loopback devices=1 max_buffers=2 exclusive_caps=1 card_label="VirtualCam" video_nr=10
Ensuite, exécutez backscrub (-d -d pour un débogage complet, -c pour le périphérique de capture, -v pour le périphérique virtuel, -b pour le fond d'écran) :
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
Certaines caméras (comme par exemple Logitec Brio
) doivent basculer la source vidéo sur MJPG
en passant -f MJPG
afin que des résolutions plus élevées soient disponibles.
Pour une utilisation régulière, configurez un fichier de configuration /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"
Pour charger automatiquement le pilote au démarrage, créez /etc/modules-load.d/v4l2loopback.conf
avec le contenu suivant :
v4l2loopback
Testé avec les dépendances suivantes :
Testé avec le logiciel suivant :
-c read
)-c read
)En ces temps modernes où tout le monde est assis à la maison et utilise Skype/Zoom/Webrtc tout le temps, j'étais un peu ennuyé de toujours montrer au monde mon bureau à domicile en désordre. Skype a une fonctionnalité "arrière-plan flou", mais cela commence à devenir ennuyeux après un certain temps (et c'est moins privé que je ne le souhaiterais personnellement). Zoom a un truc de substitution d'arrière-plan intégré, mais je ne touche pas à ce logiciel avec un bargepole (et cette fonctionnalité n'est de toute façon pas disponible sous Linux). J'ai donc décidé de chercher comment déployer ma propre implémentation sans dépendre d'un logiciel de visioconférence particulier pour prendre en charge cela.
Tout ce shebang comprend trois étapes principales avec des difficultés variables :
J'ai déjà beaucoup travaillé avec des caméras de profondeur, également pour la segmentation en arrière-plan (voir SurfaceStreams), j'ai donc simplement récupéré une caméra RealSense restante du laboratoire et je l'ai essayée. Cependant, les données de profondeur dans un environnement de bureau encombré sont assez bruyantes, et peu importe la façon dont j'ai modifié les paramètres de l'appareil photo, elle ne pouvait produire aucune donnée de profondeur pour mes cheveux... ? Je ressemblais à un moine médiéval à qui on aurait coupé le haut de la tête, alors... ensuite.
Voir https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html pour le didacticiel. Cela devrait fonctionner correctement pour les arrière-plans principalement statiques et les petits objets en mouvement, mais ne fonctionne pas pour une personne principalement statique devant un arrière-plan statique. Suivant.
Voir https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html pour un didacticiel. Fonctionne bien, mais ne détecte évidemment que le visage, et pas le reste de la personne. De plus, cela ne correspond qu'à peu près à une ellipse qui semble finalement bizarre. Suivant.
J'ai entendu de bonnes choses à propos de ce truc d'apprentissage en profondeur, alors essayons ça. J'ai d'abord dû me frayer un chemin à travers une pile de frameworks (Keras, Tensorflow, PyTorch, etc.), mais après avoir trouvé un modèle prêt à l'emploi pour la segmentation sémantique basé sur Tensorflow Lite (DeepLab v3+), j'ai opté pour cela.
J'ai jeté un œil à l'exemple Python, à l'exemple C++ et à l'exemple Android correspondants, et sur cette base, j'ai d'abord bricolé une démo Python. Cela fonctionnait à environ 2,5 FPS, ce qui est vraiment atrocement lent, j'ai donc construit une version C++ qui gère 10 FPS sans trop d'optimisation manuelle. Suffisant.
J'ai également testé une version convertie en TFLite du modèle Body-Pix, mais les résultats n'ont pas été très différents de ceux de DeepLab pour ce cas d'utilisation.
Plus récemment, Google a publié un modèle spécialement conçu pour la segmentation des personnes utilisé dans Google Meet. Il offre de bien meilleures performances que DeepLab, à la fois en termes de vitesse et de précision, c'est donc désormais la valeur par défaut. Il nécessite une opération personnalisée du framework MediaPipe, mais cela a été assez facile à intégrer. Merci à @jiangjianping de l'avoir signalé dans le numéro correspondant.
Il s'agit essentiellement d'une ligne de code avec OpenCV : bg.copyTo(raw,mask);
Je t'avais dit que c'était la partie la plus facile.
J'utilise v4l2loopback pour diriger les données de mon outil d'espace utilisateur vers n'importe quel logiciel capable d'ouvrir un périphérique V4L2. Ce n'est pas trop difficile grâce aux bons exemples, mais il y a quelques problèmes, notamment l'espace colorimétrique. Il a fallu de nombreux essais et erreurs pour trouver un format de pixel commun accepté par Firefox, Skype et guvcview, à savoir YUYV. Heureusement, ma webcam peut générer YUYV directement sous forme de données brutes, ce qui me permet d'économiser quelques conversions d'espace colorimétrique.
Le flux de données à travers l’ensemble du programme est à peu près le suivant :
write()
sur un périphérique vidéo virtuel(*) ce sont des paramètres d'entrée obligatoires pour ce modèle
Comme d'habitude : les demandes de tirage sont les bienvenues.
Consultez les problèmes et les demandes d'extraction pour les extensions actuellement discutées/en cours, et consultez également la branche experimental
.
Formats préférés de Firefox : https://searchfox.org/mozilla-central/source/third_party/libwebrtc/webrtc/modules/video_capture/linux/video_capture_linux.cc#142-159
Nous avons été informés que certaines versions packagées d' obs-studio
sont incapables de détecter/utiliser une caméra virtuelle comme fourni par backscrub
. Veuillez vérifier les détails pour trouver des solutions de contournement si cela s'applique à vous.