wxmp-tensorflow
La dernière solution d'ingénierie TensorFlow
exécutée sous l'applet WeChat présente les caractéristiques suivantes
- Exécutez balzeface Android √, IOS √
- Exécutez des repères de visage Android √, IOS √
- tfjsPlugin intégré, facile à utiliser, pas besoin de référence secondaire√
- Prise en charge du backend wasm √ Le PR soumis à tfjs a été fusionné
- Exécutez posenet (par exemple mobilenet 0,50 stride16) √
- Les tfj personnalisés réduisent la taille du paquet, exemple Blazeface√
- Courez handpose √
- Exécutez movenet √
- Exécutez blazepose-tfjs √
Remarque : Paddle.js a été adapté aux mini-programmes Baidu et aux mini-programmes WeChat, https://github.com/PaddlePaddle/Paddle.js
Données de performances
machine | Modèle | FPS | Back-end |
---|
iPhone7 | BlazeVisage | 12 | WebGL |
iPhone7 | BlazeVisage | 1 | WASM |
MI8 | BlazeVisage | 20 | WebGL |
MI8 | BlazeVisage | 17 | WASM |
MI8 | FaceLandMarques | 20 | WebGL |
MI8 | FaceLandMarques | 10 | WASM |
MI8 | PoseNet | 20 | WebGL |
MI8 | PoseNet | 5 | WASM |
MI8 | Pose de la main | 14 | WebGL |
MI8 | Pose de la main | 1 | WASM |
MI8 | DéplacerNet | 14 | WebGL |
MI8 | DéplacerNet | 2.5 | WASM |
Remarque : WASM est une version non SIMD. L'applet Android WeChat exécute SIMD WASM et signale une erreur. Bien qu'elle puisse fonctionner, il existe de nombreux problèmes avec WeChat et IOS. Il est recommandé d'utiliser webview ou webview. gl répond au moins aux normes et il n'y a aucun problème de mémoire.
question
- La version asynchrone d'iOS sera bloquée avec async wait, elle est donc remplacée par la version sync, et d'autres utilisations de async wait peuvent également se produire (la promesse sous IOS est simulée par setTimeout, voir la situation de prise en charge de l'applet JavaScript actuellement ). plus facile de bloquer l'initialisation sous iOS
- wasm est meilleur que webgl uniquement sur les téléphones mobiles Huawei (résultats de test 2,7)
Expérience d'optimisation
- Utilisez FrameAdapter pour sauter dynamiquement des images
- Avant de traiter formellement les données, préchauffez une image vierge et compilez le shader utilisé.
- Utiliser le profil pour générer des tfj personnalisés afin d'optimiser la taille du package
- L'ArrayBuffer de l'applet WeChat cameraFrame est réutilisé. Peut-être qu'une fois l'inférence terminée, le contenu est mis à jour, donc l'arrière-plan est dessiné en premier, puis le résultat de l'inférence est dessiné. Une autre solution consiste à faire une copie lors de l'obtention du cadre de la caméra (à propos). 0 ~ 5 ms pour iPhone7, principalement 1 ms)
FAIRE
- Résultat : l'embellissement de l'interface utilisateur effectué affiche un affichage normal
- face-api.js
- l'échauffement est généralisé, l'échauffement est effectué sur la base du registre enregistréKernel
courir
> 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
Utilisez custom_tfjs pour optimiser davantage la taille du package
Veuillez vous référer à
- [962K -> 347K] TensorflowJS TreeShaking basé sur les résultats de l'exécution
- https://github.com/mattsoulanille/tfjs_custom_module_demo
- https://github.com/deepkolos/tfjs-treeshaking-test
tfjs-models asynchrone pour synchroniser la méthode
Il vous suffit de modifier la méthode asynchrone de lecture des données, telle que Tensor.array()
en Tensor.arraySync()
, ou Tensor.buffer()
en Tensor.bufferSync()
, puis de modifier async
et await
, Promise.all
et autres mots-clés Supprimez-le simplement
parrainer
Si le projet vous est utile ou nécessite une adaptation, n'hésitez pas à laisser un pourboire.