หมายเหตุ : นี่คือไลบรารีการติดตาม ไม่ใช่ โปรแกรมหุ่นกระบอกอวาตาร์แบบสแตนด์อโลน ฉันยังทำงานกับ VSeeFace ซึ่งช่วยให้โมเดล 3 มิติ VRM และ VSFAvatar เคลื่อนไหวได้โดยใช้การติดตาม OpenSeeFace VTube Studio ใช้ OpenSeeFace สำหรับการติดตามเว็บแคมเพื่อสร้างภาพเคลื่อนไหวโมเดล Live2D สามารถดูเรนเดอร์สำหรับเอ็นจิ้น Godot ได้ที่นี่
โปรเจ็กต์นี้ใช้โมเดลการตรวจจับจุดสังเกตใบหน้าโดยใช้ MobileNetV3
เนื่องจากความเร็วในการอนุมาน CPU ของ Pytorch 1.3 บน Windows ต่ำมาก โมเดลจึงถูกแปลงเป็นรูปแบบ ONNX การใช้ onnxruntime สามารถทำงานได้ที่ 30 - 60 fps ติดตามใบหน้าเดียว มีสี่รุ่นซึ่งมีความเร็วแตกต่างกันในการติดตามการแลกเปลี่ยนคุณภาพ
หากใครสงสัย ชื่อนี้เป็นการเล่นสำนวนไร้สาระในทะเลเปิดและเห็นหน้า ไม่มีความหมายที่ลึกซึ้งกว่านี้
คุณสามารถดูวิดีโอตัวอย่างล่าสุดได้ที่นี่ ซึ่งแสดงประสิทธิภาพของโมเดลการติดตามเริ่มต้นภายใต้ระดับเสียงรบกวนและแสงที่แตกต่างกัน
เนื่องจากจุดสังเกตที่ใช้โดย OpenSeeFace แตกต่างเล็กน้อยจากจุดสังเกตที่ใช้โดยวิธีอื่นๆ (ใกล้กับ iBUG 68 โดยมีจุดน้อยกว่าสองจุดที่มุมปากและโครงร่างใบหน้าเสมือน 3 มิติ แทนที่จะเป็นโครงร่างใบหน้าที่เป็นไปตามโครงร่างที่มองเห็นได้) ยากที่จะเปรียบเทียบความถูกต้องเป็นตัวเลขกับวิธีการอื่นๆ ที่พบได้ทั่วไปในวรรณกรรมทางวิทยาศาสตร์ ประสิทธิภาพการติดตามยังได้รับการปรับให้เหมาะสมมากขึ้นสำหรับการสร้างจุดสังเกตที่มีประโยชน์สำหรับการสร้างภาพเคลื่อนไหวแทนตัวมากกว่าการปรับให้เข้ากับภาพใบหน้าทุกประการ ตัวอย่างเช่น ตราบใดที่จุดสังเกตของดวงตาแสดงว่าดวงตาเปิดหรือปิดอยู่ แม้ว่าตำแหน่งของดวงตาจะค่อนข้างไม่อยู่ก็ตาม ก็ยังสามารถมีประโยชน์สำหรับจุดประสงค์นี้ได้
จากการสังเกตโดยทั่วไป OpenSeeFace ทำงานได้ดีในสภาวะที่ไม่เอื้ออำนวย (แสงน้อย สัญญาณรบกวนสูง ความละเอียดต่ำ) และติดตามใบหน้าผ่านท่าโพสศีรษะที่หลากหลายมาก โดยมีตำแหน่งจุดสังเกตที่ค่อนข้างมีความเสถียรสูง เมื่อเปรียบเทียบกับ MediaPipe จุดสังเกตของ OpenSeeFace ยังคงมีเสถียรภาพมากกว่าในสภาวะที่ท้าทาย และแสดงท่าทางปากที่หลากหลายได้อย่างแม่นยำ อย่างไรก็ตาม การติดตามบริเวณดวงตาอาจมีความแม่นยำน้อยลง
ฉันเรียกใช้ OpenSeeFace ในคลิปตัวอย่างจากการนำเสนอวิดีโอสำหรับการสร้างใบหน้า 3 มิติใหม่ด้วย Dense Landmarks โดย Wood และคณะ เพื่อเปรียบเทียบกับ MediaPipe และแนวทางของพวกเขา คุณสามารถดูผลลัพธ์ได้ที่นี่
สามารถดูตัวอย่างโปรเจ็กต์ Unity สำหรับแอนิเมชันอวตารที่ใช้ VRM ได้ที่นี่
การติดตามใบหน้านั้นทำได้โดยสคริปต์ facetracker.py
Python 3.7 มันเป็นโปรแกรมบรรทัดคำสั่ง ดังนั้นคุณควรเริ่มมันด้วยตนเองจาก cmd หรือเขียนไฟล์แบตช์เพื่อเริ่มมัน หากคุณดาวน์โหลดรีลีสและใช้ Windows คุณสามารถเรียกใช้ facetracker.exe
ภายในโฟลเดอร์ Binary
ได้โดยไม่ต้องติดตั้ง Python คุณยังสามารถใช้ run.bat
ภายในโฟลเดอร์ Binary
เพื่อสาธิตพื้นฐานของตัวติดตามได้
สคริปต์จะดำเนินการติดตามอินพุตเว็บแคมหรือไฟล์วิดีโอ และส่งข้อมูลการติดตามผ่าน UDP การออกแบบนี้ยังช่วยให้การติดตามสามารถทำได้บนพีซีที่แยกจากเครื่องที่ใช้ข้อมูลการติดตาม สิ่งนี้มีประโยชน์ในการเพิ่มประสิทธิภาพและเพื่อหลีกเลี่ยงการเปิดเผยภาพจากกล้องโดยไม่ได้ตั้งใจ
คอมโพเนนต์ OpenSee
Unity ที่ให้มาสามารถรับแพ็กเก็ต UDP เหล่านี้และให้ข้อมูลที่ได้รับผ่านช่องสาธารณะที่เรียกว่า trackingData
ส่วนประกอบ OpenSeeShowPoints
สามารถมองเห็นจุดสังเกตของใบหน้าที่ตรวจพบได้ มันยังทำหน้าที่เป็นตัวอย่าง โปรดดูที่เพื่อดูวิธีการใช้ส่วนประกอบ OpenSee
อย่างถูกต้อง ตัวอย่างเพิ่มเติมจะรวมอยู่ในโฟลเดอร์ Examples
แพ็กเก็ต UDP จะได้รับในเธรดแยกต่างหาก ดังนั้นส่วนประกอบใดๆ ที่ใช้ช่อง trackingData
ของส่วนประกอบ OpenSee
ควรคัดลอกช่องนั้นและเข้าถึงสำเนานี้ก่อน เนื่องจากไม่เช่นนั้นข้อมูลอาจถูกเขียนทับระหว่างการประมวลผล การออกแบบนี้ยังหมายความว่าฟิลด์จะอัปเดตต่อไป แม้ว่าคอมโพเนนต์ OpenSee
จะถูกปิดใช้งานก็ตาม
รันสคริปต์ python ด้วย --help
เพื่อเรียนรู้เกี่ยวกับตัวเลือกที่เป็นไปได้ที่คุณสามารถตั้งค่าได้
python facetracker.py --help
การสาธิตง่ายๆ สามารถทำได้โดยการสร้างฉากใหม่ใน Unity โดยเพิ่มวัตถุเกมเปล่าและทั้งคอมโพเนนต์ OpenSee
และ OpenSeeShowPoints
ลงไป ในขณะที่ฉากกำลังเล่น ให้รันตัวติดตามใบหน้าในไฟล์วิดีโอ:
python facetracker.py --visualize 3 --pnp-points 1 --max-threads 4 -c video.mp4
หมายเหตุ : หากมีการติดตั้งการขึ้นต่อกันโดยใช้บทกวี คำสั่งจะต้องดำเนินการจาก poetry shell
หรือต้องนำหน้าด้วย poetry run
วิธีนี้สคริปต์การติดตามจะแสดงภาพการติดตามของตัวเองออกมา ในขณะเดียวกันก็สาธิตการส่งข้อมูลการติดตามไปยัง Unity
ส่วนประกอบ OpenSeeLauncher
ที่รวมอยู่ช่วยให้สามารถเริ่มโปรแกรมติดตามใบหน้าจาก Unity ได้รับการออกแบบมาเพื่อทำงานร่วมกับ pyinstaller ที่สร้างไฟล์ปฏิบัติการที่กระจายอยู่ในบันเดิลรีลีสไบนารี มีฟังก์ชัน API สาธารณะสามฟังก์ชัน:
public string[] ListCameras()
ส่งคืนชื่อของกล้องที่มีอยู่ ดัชนีของกล้องในอาร์เรย์สอดคล้องกับ ID สำหรับฟิลด์ cameraIndex
การตั้งค่า cameraIndex
เป็น -1
จะปิดใช้งานการจับภาพเว็บแคมpublic bool StartTracker()
จะเริ่มตัวติดตาม หากกำลังทำงานอยู่ อินสแตนซ์จะปิดการทำงานและเริ่มต้นอินสแตนซ์ใหม่ด้วยการตั้งค่าปัจจุบันpublic void StopTracker()
จะหยุดตัวติดตาม ตัวติดตามจะหยุดทำงานโดยอัตโนมัติเมื่อแอปพลิเคชันถูกยกเลิกหรือวัตถุ OpenSeeLauncher
ถูกทำลาย คอมโพเนนต์ OpenSeeLauncher
ใช้ออบเจ็กต์งาน WinAPI เพื่อให้แน่ใจว่ากระบวนการลูกของตัวติดตามถูกยกเลิกหากแอปพลิเคชันหยุดทำงานหรือปิดโดยไม่ยุติกระบวนการตัวติดตามก่อน
ควรเพิ่มอาร์กิวเมนต์บรรทัดคำสั่งที่กำหนดเองเพิ่มเติมทีละรายการลงในองค์ประกอบของอาร์เรย์ commandlineArguments
ตัวอย่างเช่น ควรเพิ่ม -v 1
เป็นสององค์ประกอบ โดยหนึ่งองค์ประกอบประกอบด้วย -v
และอีกองค์ประกอบหนึ่งมี 1
ไม่ใช่องค์ประกอบเดียวที่มีทั้งสองส่วน
ส่วนประกอบ OpenSeeIKTarget
ที่รวมอยู่สามารถใช้ร่วมกับ FinalIK หรือโซลูชัน IK อื่นๆ เพื่อสร้างภาพเคลื่อนไหวให้ศีรษะเคลื่อนไหวได้
สามารถเพิ่มส่วนประกอบ OpenSeeExpression
ลงในส่วนประกอบเดียวกันกับส่วนประกอบ OpenSeeFace
เพื่อตรวจจับการแสดงออกทางสีหน้าที่เฉพาะเจาะจง จะต้องมีการสอบเทียบตามผู้ใช้แต่ละราย สามารถควบคุมได้โดยใช้ช่องทำเครื่องหมายใน Unity Editor หรือผ่านวิธีการสาธารณะที่เทียบเท่าซึ่งสามารถพบได้ในซอร์สโค้ด
ในการปรับเทียบระบบนี้ คุณต้องรวบรวมข้อมูลตัวอย่างสำหรับแต่ละนิพจน์ หากกระบวนการจับภาพเร็วเกินไป คุณสามารถใช้ตัวเลือก recordingSkip
เพื่อชะลอความเร็วได้
กระบวนการทั่วไปมีดังนี้:
หากต้องการลบข้อมูลที่บันทึกไว้สำหรับนิพจน์ ให้พิมพ์ชื่อและทำเครื่องหมายที่ช่อง "ล้าง"
หากต้องการบันทึกทั้งโมเดลที่ได้รับการฝึกและข้อมูลการฝึกที่บันทึกไว้ ให้พิมพ์ชื่อไฟล์รวมทั้งเส้นทางแบบเต็มในช่อง "ชื่อไฟล์" และทำเครื่องหมายในช่อง "บันทึก" หากต้องการโหลด ให้ป้อนชื่อไฟล์และทำเครื่องหมายที่ช่อง "โหลด"
--model 3
โมเดลที่เร็วที่สุดและคุณภาพการติดตามต่ำสุดคือ --model 0
--scan-every
เฟรม การทำเช่นนี้อาจทำให้สิ่งต่างๆ ช้าลงได้ ดังนั้นให้ลองตั้งค่า --faces
ให้ไม่สูงกว่าจำนวนใบหน้าจริงที่คุณกำลังติดตาม มีโมเดลแลนด์มาร์คใบหน้าที่ได้รับการฝึกมาแล้วสี่โมเดล การใช้สวิตช์ --model
ทำให้สามารถเลือกพวกมันสำหรับการติดตามได้ ค่า fps ที่กำหนดใช้สำหรับเรียกใช้โมเดลในวิดีโอแบบหน้าเดียวบน CPU คอร์เดี่ยว การลดอัตราเฟรมจะลดการใช้งาน CPU ลงตามระดับที่สอดคล้องกัน
การวัด FPS มาจากการทำงานบน CPU หนึ่งคอร์ของฉัน
ดูตุ้มน้ำหนัก Pytorch สำหรับใช้กับ model.py
ได้ที่นี่ สามารถดูรุ่น ONNX ที่ยังไม่ได้เพิ่มประสิทธิภาพบางรุ่นได้ที่นี่
ตัวอย่างเพิ่มเติม: Results3.png, Results4.png
โมเดลจุดสังเกตค่อนข้างแข็งแกร่งเมื่อเทียบกับขนาดและการวางแนวของใบหน้า ดังนั้นโมเดลการตรวจจับใบหน้าแบบกำหนดเองจึงใช้กรอบขอบเขตที่หยาบกว่าวิธีอื่นๆ มีอัตราส่วนความเร็วต่อความแม่นยำที่ดีสำหรับวัตถุประสงค์ของโครงการนี้
บิวด์ในส่วนรีลีสของที่เก็บนี้มี facetracker.exe
อยู่ในโฟลเดอร์ Binary
ที่สร้างขึ้นโดยใช้ pyinstaller
และมีการขึ้นต่อกันที่จำเป็นทั้งหมด
ในการเรียกใช้งาน อย่างน้อยที่สุดจะต้องวางโฟลเดอร์ models
ไว้ในโฟลเดอร์เดียวกันกับ facetracker.exe
การวางไว้ในโฟลเดอร์พาเรนต์ทั่วไปก็ควรใช้งานได้เช่นกัน
เมื่อทำการแจกจ่าย คุณควรแจกจ่ายโฟลเดอร์ Licenses
ไปด้วยเพื่อให้แน่ใจว่าคุณปฏิบัติตามข้อกำหนดที่กำหนดโดยไลบรารีของบุคคลที่สามบางแห่ง โมเดลที่ไม่ได้ใช้สามารถลบออกจากแพ็คเกจที่แจกจ่ายซ้ำได้โดยไม่มีปัญหา
รุ่นรีลีสประกอบด้วยรุ่นรันไทม์ ONNX แบบกำหนดเองโดยไม่มีการวัดและส่งข้อมูลทางไกล
ไลบรารีที่จำเป็นสามารถติดตั้งได้โดยใช้ pip:
pip install onnxruntime opencv-python pillow numpy
อีกทางหนึ่ง สามารถใช้บทกวีเพื่อติดตั้งการขึ้นต่อกันทั้งหมดสำหรับโปรเจ็กต์นี้ใน env เสมือนที่แยกต่างหาก:
poetry install
ไลบรารีที่จำเป็นสามารถติดตั้งได้โดยใช้ pip:
pip install onnxruntime opencv-python pillow numpy
โมเดลดังกล่าวได้รับการฝึกฝนบนชุดข้อมูล LS3D-W เวอร์ชัน 66 จุด
@inproceedings{bulat2017far,
title={How far are we from solving the 2D & 3D Face Alignment problem? (and a dataset of 230,000 3D facial landmarks)},
author={Bulat, Adrian and Tzimiropoulos, Georgios},
booktitle={International Conference on Computer Vision},
year={2017}
}
มีการฝึกอบรมเพิ่มเติมในชุดข้อมูล WFLW หลังจากลดเหลือ 66 จุด และแทนที่จุดคอนทัวร์และปลายจมูกด้วยจุดที่แบบจำลองทำนายไว้จนถึงจุดนี้ การฝึกอบรมเพิ่มเติมนี้มีขึ้นเพื่อปรับปรุงความเหมาะสมกับดวงตาและคิ้ว
@inproceedings{wayne2018lab,
author = {Wu, Wayne and Qian, Chen and Yang, Shuo and Wang, Quan and Cai, Yici and Zhou, Qiang},
title = {Look at Boundary: A Boundary-Aware Face Alignment Algorithm},
booktitle = {CVPR},
month = June,
year = {2018}
}
สำหรับการฝึกโมเดลการตรวจจับการจ้องมองและการกะพริบนั้น ใช้ชุดข้อมูล MPIIGaze นอกจากนี้ ยังมีการใช้ดวงตาสังเคราะห์ประมาณ 125,000 ดวงที่สร้างขึ้นด้วย UnityEyes ในระหว่างการฝึก
ควรสังเกตว่ามีการใช้ข้อมูลที่กำหนดเองเพิ่มเติมในระหว่างกระบวนการฝึกอบรม และจุดสังเกตอ้างอิงจากชุดข้อมูลดั้งเดิมได้รับการแก้ไขด้วยวิธีบางอย่างเพื่อแก้ไขปัญหาต่างๆ มีแนวโน้มว่าจะเป็นไปไม่ได้ที่จะสร้างแบบจำลองเหล่านี้ด้วยชุดข้อมูล LS3D-W และ WFLW ดั้งเดิมเท่านั้น อย่างไรก็ตาม ข้อมูลเพิ่มเติมไม่สามารถแจกจ่ายต่อได้
แบบจำลองการตรวจจับใบหน้าตามการถดถอยของแผนที่ความร้อนได้รับการฝึกฝนเกี่ยวกับการครอบตัดขนาด 224x224 แบบสุ่มจากชุดข้อมูล WIDER FACE
@inproceedings{yang2016wider,
Author = {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou},
Booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
Title = {WIDER FACE: A Face Detection Benchmark},
Year = {2016}
}
อัลกอริทึมได้รับแรงบันดาลใจจาก:
รหัส MobileNetV3 ถูกนำมาจากที่นี่
สำหรับการฝึกทั้งหมด มีการใช้ Adaptive Wing Loss เวอร์ชันดัดแปลง
สำหรับการตรวจหานิพจน์ จะใช้ LIBSVM
การตรวจจับใบหน้าทำได้โดยใช้โมเดลการตรวจจับใบหน้าแบบถดถอยตามแผนที่ความร้อนแบบกำหนดเองหรือ RetinaFace
@inproceedings{deng2019retinaface,
title={RetinaFace: Single-stage Dense Face Localisation in the Wild},
author={Deng, Jiankang and Guo, Jia and Yuxiang, Zhou and Jinke Yu and Irene Kotsia and Zafeiriou, Stefanos},
booktitle={arxiv},
year={2019}
}
การตรวจจับ RetinaFace ขึ้นอยู่กับการใช้งานนี้ โมเดลที่ได้รับการฝึกล่วงหน้าได้รับการแก้ไขเพื่อลบการตรวจจับจุดสังเกตที่ไม่จำเป็นออก และแปลงเป็นรูปแบบ ONNX ด้วยความละเอียด 640x640
ขอบคุณมากสำหรับทุกคนที่ช่วยฉันทดสอบสิ่งต่างๆ!
รหัสและรุ่นได้รับการเผยแพร่ภายใต้ใบอนุญาต BSD 2-clause
คุณสามารถค้นหาใบอนุญาตของไลบรารีบุคคลที่สามที่ใช้สำหรับบิลด์ไบนารีได้ในโฟลเดอร์ Licenses