wxmp-tensorflow
โซลูชันทางวิศวกรรม TensorFlow
ล่าสุดที่ทำงานภายใต้แอปเพล็ต WeChat มีลักษณะดังต่อไปนี้
- เรียกใช้ balzeface Android √, IOS √
- เรียกใช้จุดสังเกตใบหน้า Android √, IOS √
- tfjsPlugin ในตัว ใช้งานง่าย ไม่ต้องมีการอ้างอิงรอง√
- สนับสนุนแบ็กเอนด์ Wasm √ รวม PR ที่ส่งไปยัง tfjs แล้ว
- เรียกใช้posenet (ตัวอย่างคือ mobilenet 0.50 stride16) √
- tfjs แบบกำหนดเองลดขนาดแพ็คเกจตัวอย่างหน้าลุกไหม้√
- เรียกใช้แฮนด์โพส √
- เรียกใช้ Movenet √
- เรียกใช้ blazepose-tfjs √
หมายเหตุ: Paddle.js ได้รับการปรับให้เข้ากับมินิโปรแกรม Baidu และมินิโปรแกรม WeChat https://github.com/PaddlePaddle/Paddle.js
ข้อมูลประสิทธิภาพ
เครื่องจักร | แบบอย่าง | เฟรมต่อวินาที | แบ็กเอนด์ |
---|
ไอโฟน 7 | BlazeFace | 12 | WebGL |
ไอโฟน 7 | BlazeFace | 1 | WASM |
มิชิแกน 8 | BlazeFace | 20 | WebGL |
มิชิแกน 8 | BlazeFace | 17 | WASM |
มิชิแกน 8 | เฟซแลนด์มาร์ค | 20 | WebGL |
มิชิแกน 8 | เฟซแลนด์มาร์ค | 10 | WASM |
มิชิแกน 8 | โพเซ่เน็ต | 20 | WebGL |
มิชิแกน 8 | โพเซ่เน็ต | 5 | WASM |
มิชิแกน 8 | แฮนด์โพส | 14 | WebGL |
มิชิแกน 8 | แฮนด์โพส | 1 | WASM |
มิชิแกน 8 | มูฟเน็ต | 14 | WebGL |
มิชิแกน 8 | มูฟเน็ต | 2.5 | WASM |
หมายเหตุ: WASM เป็นเวอร์ชันที่ไม่ใช่ SIMD แอปเพล็ต Android WeChat รัน SIMD WASM และรายงานข้อผิดพลาด แม้ว่าจะสามารถทำงานได้ แต่มีปัญหามากมายกับ WeChat และ IOS ขอแนะนำให้ใช้ประสิทธิภาพที่ดี gl เป็นไปตามมาตรฐานเป็นอย่างน้อยและไม่มีปัญหาด้านหน่วยความจำ
คำถาม
- เวอร์ชัน async ของ iOS จะติดอยู่กับ async await ดังนั้นจึงเปลี่ยนเป็นเวอร์ชันการซิงค์ และอาจใช้งาน async อื่น ๆ ได้เช่นกัน (สัญญาภายใต้ IOS ถูกจำลองโดย setTimeout ดูสถานการณ์การรองรับแอปเพล็ต JavaScript ในปัจจุบัน ) ง่ายกว่าที่จะเริ่มต้นติดค้างอยู่ใน iOS
- Wasm ดีกว่า webgl เฉพาะบนโทรศัพท์มือถือ Huawei เท่านั้น (ผลการทดสอบ 2.7)
ประสบการณ์การเพิ่มประสิทธิภาพ
- ใช้ FrameAdapter เพื่อข้ามเฟรมแบบไดนามิก
- ก่อนประมวลผลข้อมูลอย่างเป็นทางการ ให้อุ่นเฟรมเปล่าก่อนและรวบรวมเชเดอร์ที่ใช้
- ใช้โปรไฟล์เพื่อสร้าง tfjs ที่กำหนดเองเพื่อปรับขนาดแพ็คเกจให้เหมาะสม
- ArrayBuffer ของแอปเพล็ต WeChat CameraFrame อาจถูกนำมาใช้ซ้ำ หลังจากการอนุมานเสร็จสิ้น เนื้อหาจะได้รับการอัปเดต ดังนั้นพื้นหลังจึงถูกวาดก่อน จากนั้นจึงวาดผลลัพธ์การอนุมานอีกวิธีหนึ่งคือทำสำเนาเมื่อได้รับเฟรมของกล้อง (ประมาณ 0~5ms สำหรับ iPhone7 ส่วนใหญ่เป็น 1ms)
สิ่งที่ต้องทำ
- ผลลัพธ์: การปรับแต่ง UI เสร็จสิ้นจะแสดงการแสดงผลตามปกติ
- ใบหน้า api.js
- การอุ่นเครื่องเป็นแบบทั่วไป การอุ่นเครื่องเสร็จสิ้นตาม registerKernel ที่ลงทะเบียนไว้
วิ่ง
> pnpm i / npm i / yarn
> npm run dev
# 使用小程序开发工具打开,替换appid为测试appid,不校验域名
# 使用custom tfjs编译,例子是仅仅blazeface可用tf + webgl backend 小程序包从 985KB下降到534KB (js大概下降234KB)
> npm run make-custom
> npm run build-custom
ใช้ custom_tfjs เพื่อเพิ่มประสิทธิภาพขนาดแพ็คเกจเพิ่มเติม
โปรดดูที่
- [962K -> 347K] TensorflowJS TreeShaking ตามผลลัพธ์รันไทม์
- https://github.com/mattsoulanille/tfjs_custom_module_demo
- https://github.com/deepkolos/tfjs-treeshaking-test
tfjs-models async เพื่อซิงค์วิธีการ
คุณจะต้องเปลี่ยนวิธีการอ่านข้อมูลแบบอะซิงก์เท่านั้น เช่น Tensor.array()
เป็น Tensor.arraySync()
หรือ Tensor.buffer()
เป็น Tensor.bufferSync()
จากนั้นเปลี่ยน async
และ await
, Promise.all
และ คำหลักอื่นๆ เพียงลบออก
สปอนเซอร์
หากโครงการนี้เป็นประโยชน์กับคุณหรือมีความต้องการในการปรับตัว โปรดให้ทิป