(أو المشروع المعروف سابقًا باسم DeepBackSub)
(الاعتمادات على الخلفيات الجميلة لماري سابيل وفوتو فونيا)
تم ترخيص backscrub بموجب ترخيص Apache 2.0. راجع ملف الترخيص للحصول على التفاصيل.
تثبيت التبعيات ( 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
بعد ذلك، قم بتشغيل backscrub (-d -d للتصحيح الكامل، -c لجهاز الالتقاط، -v للجهاز الظاهري، -b لخلفية الشاشة):
./backscrub -d -d -c /dev/video0 -v /dev/video10 -b ~/wallpapers/forest.jpg
تحتاج بعض الكاميرات (مثل Logitec Brio
) إلى تحويل مصدر الفيديو إلى MJPG
عن طريق تمرير -f 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
)في هذه الأوقات الحديثة، حيث يجلس الجميع في المنزل ويتحدثون عبر Skype/التكبير/التصغير/webrtc طوال الوقت، كنت منزعجًا بعض الشيء من إظهار مكتبي المنزلي الفوضوي للعالم دائمًا. يحتوي 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.5 إطارًا في الثانية تقريبًا، وهو بطيء جدًا حقًا، لذلك قمت بإنشاء إصدار C++ يمكنه إدارة 10 إطارات في الثانية دون إجراء الكثير من عمليات تحسين اليد. جيد بما فيه الكفاية.
لقد اختبرت أيضًا نسخة محولة إلى TFLite من نموذج Body-Pix، لكن النتائج لم تكن مختلفة كثيرًا عن 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
. يرجى التحقق من تفاصيل الحلول البديلة إذا كان هذا ينطبق عليك.