wxmp-tensorflow
La última solución de ingeniería TensorFlow
que se ejecuta bajo el subprograma WeChat tiene las siguientes características
- Ejecute balzeface Android √, IOS √
- Ejecute face-marks Android √, IOS √
- TFJSPlugin integrado, fácil de usar, sin necesidad de referencia secundaria√
- Soporte de backend de wasm √ El PR enviado a tfjs se ha fusionado
- Ejecute posenet (el ejemplo es mobilenet 0.50 stride16) √
- tfjs personalizados reducen el tamaño del paquete ejemplo de blazeface√
- Ejecutar pose manual √
- Ejecutar movenet √
- Ejecute blazepose-tfjs √
Nota: Paddle.js se ha adaptado a los miniprogramas de Baidu y a los miniprogramas de WeChat, https://github.com/PaddlePaddle/Paddle.js
Datos de rendimiento
máquina | Modelo | FPS | backend |
---|
iPhone 7 | BlazeFace | 12 | WebGL |
iPhone 7 | BlazeFace | 1 | WASM |
MI 8 | BlazeFace | 20 | WebGL |
MI 8 | BlazeFace | 17 | WASM |
MI 8 | CaraTierraMarcas | 20 | WebGL |
MI 8 | CaraTierraMarcas | 10 | WASM |
MI 8 | Posenet | 20 | WebGL |
MI 8 | Posenet | 5 | WASM |
MI 8 | Pose de mano | 14 | WebGL |
MI 8 | Pose de mano | 1 | WASM |
MI 8 | MoveNet | 14 | WebGL |
MI 8 | MoveNet | 2.5 | WASM |
Nota: WASM es una versión que no es SIMD. El subprograma WeChat de Android ejecuta SIMD WASM e informa un error. Aunque puede ejecutarse, hay muchos problemas con WeChat e IOS. Se recomienda utilizar webview o webview. gl al menos cumple con los estándares y no hay problemas de memoria.
pregunta
- La versión asíncrona de iOS se bloqueará con async await, por lo que se cambiará a la versión sincronizada, y también pueden ocurrir otros usos de async await (La promesa en IOS se simula mediante setTimeout, consulte la situación de soporte de JavaScript del subprograma actualmente ). Es más fácil que la inicialización se atasque en iOS.
- wasm es mejor que webgl solo en teléfonos móviles Huawei (resultados de prueba 2,7)
Experiencia de optimización
- Utilice FrameAdapter para omitir fotogramas dinámicamente
- Antes de procesar formalmente los datos, precaliente un marco en blanco y compile el sombreador utilizado.
- Utilice el perfil para generar tfjs personalizados para optimizar el tamaño del paquete
- El ArrayBuffer del marco de cámara del subprograma WeChat se reutiliza. Tal vez una vez completada la inferencia, el contenido se actualice, por lo que primero se dibuja el fondo y luego se dibuja el resultado de la inferencia. Otra solución es hacer una copia al obtener el marco de la cámara (. alrededor de 0 ~ 5 ms para iPhone7, principalmente 1 ms)
HACER
- Resultado: el embellecimiento de la interfaz de usuario realizado muestra una visualización normal
- cara-api.js
- El calentamiento es generalizado y se realiza en función del registro registradoKernel.
correr
> 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
Utilice custom_tfjs para optimizar aún más el tamaño del paquete
Por favor consulte
- [962K -> 347K] TensorflowJS TreeShaking basado en los resultados del tiempo de ejecución
- https://github.com/mattsoulanille/tfjs_custom_module_demo
- https://github.com/deepkolos/tfjs-treeshaking-test
tfjs-models asíncrono para sincronizar el método
Simplemente cambie el método asíncrono de lectura de datos, como Tensor.array()
a Tensor.arraySync()
, o cambie Tensor.buffer()
a Tensor.bufferSync()
, y luego cambie async
y await
, Promise.all
y otras palabras clave solo retíralo
patrocinador
Si el proyecto le resulta útil o tiene necesidades de adaptación, no dude en darnos una propina.