wxmp-tensorflow
Die neueste TensorFlow
Engineering-Lösung, die unter dem WeChat-Applet läuft, weist die folgenden Merkmale auf
- Führen Sie balzeface Android √, IOS √ aus
- Führen Sie face-landmarks Android √, IOS √ aus
- Integriertes tfjsPlugin, einfach zu verwenden, keine sekundäre Referenz erforderlich√
- Unterstützung des Wasm-Backends √ Die an tfjs übermittelte PR wurde zusammengeführt
- Führen Sie Posenet aus (Beispiel ist Mobilenet 0,50 Schritt16) √
- Benutzerdefinierte TFJS reduzieren die Paketgröße, Blazeface-Beispiel√
- Führen Sie Handpose aus √
- Führen Sie movenet √ aus
- Führen Sie blazepose-tfjs √ aus
Hinweis: Paddle.js wurde an Baidu-Miniprogramme und WeChat-Miniprogramme angepasst, https://github.com/PaddlePaddle/Paddle.js
Leistungsdaten
Maschine | Modell | FPS | Backend |
---|
iPhone 7 | BlazeFace | 12 | WebGL |
iPhone 7 | BlazeFace | 1 | WASM |
MI 8 | BlazeFace | 20 | WebGL |
MI 8 | BlazeFace | 17 | WASM |
MI 8 | FaceLandMarks | 20 | WebGL |
MI 8 | FaceLandMarks | 10 | WASM |
MI 8 | PoseNet | 20 | WebGL |
MI 8 | PoseNet | 5 | WASM |
MI 8 | HandPose | 14 | WebGL |
MI 8 | HandPose | 1 | WASM |
MI 8 | MoveNet | 14 | WebGL |
MI 8 | MoveNet | 2.5 | WASM |
Hinweis: Das Android WeChat-Applet führt SIMD WASM aus und meldet einen Fehler. Es wird jedoch empfohlen, Webview oder Webview zu verwenden. gl erfüllt zumindest die Standards und es gibt keine Speicherprobleme.
Frage
- Die asynchrone iOS-Version bleibt bei asynchronem Warten hängen, daher wird sie in die synchrone Version geändert, und es kann auch zu anderen Verwendungen von asynchronem Warten kommen (Promise wird unter IOS durch setTimeout simuliert, siehe aktuelle Situation zur JavaScript-Unterstützung des Applets). Unter iOS ist es einfacher, die Initialisierung hängen zu lassen
- wasm ist nur auf Huawei-Handys besser als webgl (2,7 Testergebnisse)
Optimierungserfahrung
- Verwenden Sie FrameAdapter, um Frames dynamisch zu überspringen
- Bevor Sie die Daten offiziell verarbeiten, wärmen Sie einen leeren Frame vor und kompilieren Sie den verwendeten Shader.
- Verwenden Sie das Profil, um benutzerdefinierte TFJs zu generieren und die Paketgröße zu optimieren
- Der ArrayBuffer des WeChat-Applets cameraFrame wird möglicherweise nach Abschluss der Inferenz aktualisiert, sodass zuerst der Hintergrund und dann das Inferenzergebnis gezeichnet werden. Eine andere Lösung besteht darin, beim Abrufen des Kamerarahmens eine Kopie zu erstellen 0~5ms für iPhone7, meist 1ms)
TODO
- Ergebnis: Nach der Verschönerung der Benutzeroberfläche wird die normale Anzeige angezeigt
- face-api.js
- Das Aufwärmen ist verallgemeinert, das Aufwärmen erfolgt basierend auf dem registrierten RegisterKernel
laufen
> 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
Verwenden Sie „custom_tfjs“, um die Paketgröße weiter zu optimieren
Bitte beachten Sie
- [962K -> 347K] TensorflowJS TreeShaking basierend auf Laufzeitergebnissen
- https://github.com/mattsoulanille/tfjs_custom_module_demo
- https://github.com/deepkolos/tfjs-treeshaking-test
tfjs-models async to sync-Methode
Sie müssen nur die asynchrone Methode zum Lesen von Daten ändern, z. B. Tensor.array()
in Tensor.arraySync()
oder Tensor.buffer()
in Tensor.bufferSync()
, und dann async
und await
, Promise.all
und ändern andere Schlüsselwörter Entfernen Sie es einfach
Sponsor
Wenn das Projekt für Sie hilfreich ist oder Anpassungsbedarf besteht, geben Sie gerne ein Trinkgeld.