(หรือโครงการเดิมชื่อ DeepBackSub)
(เครดิตสำหรับพื้นหลังที่สวยงามของ Mary Sabell และ PhotoFunia)
backscrub ได้รับอนุญาตภายใต้ Apache License 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-ing/zoom-ing/webrtc-ing ตลอดเวลา ฉันรู้สึกรำคาญเล็กน้อยที่ต้องแสดงโฮมออฟฟิศที่ยุ่งวุ่นวายของฉันให้โลกเห็นอยู่เสมอ Skype มีฟีเจอร์ "พื้นหลังเบลอ" แต่หลังจากนั้นสักพักก็เริ่มน่าเบื่อ (และเป็นส่วนตัวน้อยกว่าที่ฉันต้องการเป็นการส่วนตัว) Zoom มีการทดแทนพื้นหลังบางอย่างในตัว แต่ฉันไม่ได้แตะต้องซอฟต์แวร์นั้นด้วย bargepole (และคุณสมบัตินั้นยังไม่พร้อมใช้งานบน Linux) ดังนั้นฉันจึงตัดสินใจที่จะพิจารณาวิธีการปรับใช้ของตัวเองโดยไม่ต้องพึ่งซอฟต์แวร์การประชุมทางวิดีโอใดๆ เพื่อรองรับสิ่งนี้
Shebang ทั้งหมดนี้เกี่ยวข้องกับสามขั้นตอนหลักที่มีความยากต่างกันไป:
ก่อนหน้านี้ฉันเคยทำงานมากกับกล้องจับระยะชัดลึก รวมถึงการแบ่งส่วนพื้นหลังด้วย (ดู SurfaceStreams) ดังนั้นฉันจึงหยิบกล้อง RealSense ที่เหลือจากแล็บมาลองใช้งาน อย่างไรก็ตาม ข้อมูลเชิงลึกในสภาพแวดล้อมสำนักงานที่รกนั้นค่อนข้างมีเสียงรบกวน และไม่ว่าฉันจะปรับแต่งการตั้งค่ากล้องอย่างไร ก็ไม่สามารถสร้างข้อมูลเชิงลึกสำหรับเส้นผมของฉันได้...? ฉันดูเหมือนพระภิกษุในยุคกลางที่ถูกสับศีรษะออก ดังนั้น ... ต่อไป
ดูhttps://docs.opencv.org/3.4/d1/dc5/tutorial_พื้นหลัง_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 FPS ซึ่งช้ามากจริงๆ ดังนั้นฉันจึงสร้างเวอร์ชัน C++ ซึ่งจัดการ 10 FPS โดยไม่มีการเพิ่มประสิทธิภาพมือมากเกินไป ดีพอแล้ว.
ฉันยังได้ทดสอบรุ่น Body-Pix เวอร์ชันแปลง TFLite ด้วย แต่ผลลัพธ์ที่ได้ไม่ได้แตกต่างไปจาก DeepLab มากนักสำหรับกรณีการใช้งานนี้
เมื่อเร็วๆ นี้ Google ได้เปิดตัวโมเดลที่ได้รับการฝึกอบรมมาโดยเฉพาะสำหรับการแบ่งกลุ่มบุคคลที่ใช้ใน Google Meet สิ่งนี้มีประสิทธิภาพที่ดีกว่า DeepLab มากทั้งในแง่ของความเร็วและความแม่นยำ ดังนั้นตอนนี้จึงเป็นค่าเริ่มต้น จำเป็นต้องมีการดำเนินการแบบกำหนดเองหนึ่งรายการจากเฟรมเวิร์ก MediaPipe แต่นั่นค่อนข้างง่ายที่จะรวมเข้าด้วยกัน ขอบคุณ @jiangjianping สำหรับการชี้ให้เห็นสิ่งนี้ในปัญหาที่เกี่ยวข้อง
โดยพื้นฐานแล้วนี่เป็นโค้ดหนึ่งบรรทัดที่มี OpenCV: bg.copyTo(raw,mask);
บอกคุณแล้วว่านั่นเป็นส่วนที่ง่าย
ฉันใช้ v4l2loopback เพื่อไพพ์ข้อมูลจากเครื่องมือ Userspace ของฉันไปยังซอฟต์แวร์ใดๆ ที่สามารถเปิดอุปกรณ์ 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
เวอร์ชัน snap package บางเวอร์ชันไม่สามารถตรวจจับ/ใช้งานกล้องเสมือนได้ ตามที่ backscrub
ให้มา โปรดตรวจสอบรายละเอียดสำหรับวิธีแก้ปัญหาหากสิ่งนี้ใช้ได้กับคุณ