{"id":33001924,"url":"https://github.com/deepkolos/wxmp-tensorflow","last_synced_at":"2026-03-04T17:05:01.825Z","repository":{"id":37413943,"uuid":"360489362","full_name":"deepkolos/wxmp-tensorflow","owner":"deepkolos","description":"微信小程序下运行最新TensorFlowJS的解决方案","archived":false,"fork":false,"pushed_at":"2022-02-20T11:19:42.000Z","size":9288,"stargazers_count":120,"open_issues_count":4,"forks_count":31,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-07-02T08:17:26.492Z","etag":null,"topics":["blazeface","facemesh","miniprogram","posenet","tensorflow","tensorflowjs","wechat"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deepkolos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-04-22T11:06:38.000Z","updated_at":"2024-06-01T04:15:34.000Z","dependencies_parsed_at":"2022-08-02T20:45:13.158Z","dependency_job_id":null,"html_url":"https://github.com/deepkolos/wxmp-tensorflow","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/deepkolos/wxmp-tensorflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepkolos%2Fwxmp-tensorflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepkolos%2Fwxmp-tensorflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepkolos%2Fwxmp-tensorflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepkolos%2Fwxmp-tensorflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deepkolos","download_url":"https://codeload.github.com/deepkolos/wxmp-tensorflow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deepkolos%2Fwxmp-tensorflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":284672648,"owners_count":27044736,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-11-16T02:00:05.974Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blazeface","facemesh","miniprogram","posenet","tensorflow","tensorflowjs","wechat"],"created_at":"2025-11-13T14:00:24.545Z","updated_at":"2025-11-16T07:00:51.811Z","avatar_url":"https://github.com/deepkolos.png","language":"TypeScript","funding_links":[],"categories":["Demo"],"sub_categories":["可以直接运行成功"],"readme":"# wxmp-tensorflow\n\n微信小程序下运行最新`TensorFlow`的工程解决方案，有以下特点\n\n0. 运行 balzeface 安卓 √，IOS √\n1. 运行 face-landmarks 安卓 √，IOS √\n2. 集成 tfjsPlugin，方便使用，无需二次引用 √\n3. 支持 wasm backend √ 给 tfjs 提的[PR](https://github.com/tensorflow/tfjs/pull/5056)已合并\n4. 运行 posenet (例子是 mobilenet 0.50 stride16) √\n5. custom tfjs 减少包体积 blazeface 例子 √\n6. 运行 handpose √\n7. 运行 movenet √\n8. 运行 blazepose-tfjs √\n\n\u003cimg width=\"120\" src=\"https://upload-images.jianshu.io/upload_images/252050-c99071dc4bf61185.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" /\u003e\n\n\u003e 注: Paddle.js 已适配百度小程序和微信小程序，https://github.com/PaddlePaddle/Paddle.js\n\n### 性能数据\n\n| 机器     | 模型          | FPS | Backend |\n| -------- | ------------- | --- | ------- |\n| IPhone 7 | BlazeFace     | 12  | WebGL   |\n| IPhone 7 | BlazeFace     | 1   | WASM    |\n| MI 8     | BlazeFace     | 20  | WebGL   |\n| MI 8     | BlazeFace     | 17  | WASM    |\n| MI 8     | FaceLandMarks | 20  | WebGL   |\n| MI 8     | FaceLandMarks | 10  | WASM    |\n| MI 8     | PoseNet       | 20  | WebGL   |\n| MI 8     | PoseNet       | 5   | WASM    |\n| MI 8     | HandPose      | 14  | WebGL   |\n| MI 8     | HandPose      | 1   | WASM    |\n| MI 8     | MoveNet       | 14  | WebGL   |\n| MI 8     | MoveNet       | 2.5 | WASM    |\n\n\u003e 注：WASM 为非 SIMD 版，安卓微信小程序运行 SIMD WASM 报错\n\u003e 虽说能跑，但是微信 IOS 上面问题多多，建议能 webview 还是 webview，性能好，gl 起码符合标准也无内存问题\n\n### 问题\n\n0. ios async 版本会卡 async await，所以改为 sync 版本，并且其他用到 async await 也可能出现（IOS 下 Promise 是 setTimeout 模拟的，见[小程序 JavaScript 支持情况](https://developers.weixin.qq.com/miniprogram/dev/framework/runtime/js-support.html)）**目前 ios 下比较容易卡初始化**\n1. wasm 只有在华为手机上比 webgl 好 (2.7 测试的结果)\n\n### 优化经验\n\n0. 使用 FrameAdapter 动态跳帧处理\n1. 正式处理数据前，预热处理一个空白帧，把所用到的 shader 编译\n2. 利用 profile 生成 custom tfjs 优化包大小\n3. 微信小程序 cameraFrame 的 ArrayBuffer 是复用的，可能推理完成后，内容就被更新了，所以先绘制背景，再绘制推理结果，另种解法是拿到相机帧时候复制一份(iPhone7 大概 0~5ms, 大部分是 1ms)\n\n### TODO\n\n0. 结果 UI 美化 done 显示正常\n1. face-api.js\n2. warm up 通用化，根据已注册的 registerKernel 做 warm up\n\n### 运行\n\n```sh\n\u003e pnpm i / npm i / yarn\n\u003e npm run dev\n# 使用小程序开发工具打开，替换appid为测试appid，不校验域名\n\n# 使用custom tfjs编译，例子是仅仅blazeface可用tf + webgl backend 小程序包从 985KB下降到534KB (js大概下降234KB)\n\u003e npm run make-custom\n\u003e npm run build-custom\n```\n\n### 使用 custom_tfjs 进一步优化包大小\n\n请参考\n\n0. [[962K -\u003e 347K] TensorflowJS 基于 Runtime 结果的 TreeShaking](https://juejin.cn/post/6947198156987711524/)\n1. [https://github.com/mattsoulanille/tfjs_custom_module_demo](https://github.com/mattsoulanille/tfjs_custom_module_demo)\n2. [https://github.com/deepkolos/tfjs-treeshaking-test](https://github.com/deepkolos/tfjs-treeshaking-test)\n\n### tfjs-models async 转 sync 方法\n\n只需要把读取数据部分的 async 方法比如`Tensor.array()`改为`Tensor.arraySync()`，或者`Tensor.buffer()`改为`Tensor.bufferSync()`，然后把`async`和`await`，`Promise.all`等关键字去除，即可\n\n## 赞助\n\n如果项目对您有帮助或者有适配需求，欢迎打赏\n\n\u003cimg src=\"https://upload-images.jianshu.io/upload_images/252050-d3d6bfdb1bb06ddd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\" alt=\"赞赏码\" width=\"300\"\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepkolos%2Fwxmp-tensorflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeepkolos%2Fwxmp-tensorflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeepkolos%2Fwxmp-tensorflow/lists"}