一、环境准备

首先得把TFJS安排上。直接用npm安装或者CDN引入都行,我习惯用npm:

如果是用脚本标签直接引,记得把下面这行扔进head:

二、搞个预训练模型

从头训练模型属于想不开,直接上现成的MobileNet。这玩意儿又小又快,特别适合前端场景:

注意这个0.25是宽度乘数,数值越小模型越轻量。224是输入图片尺寸,必须resize到这个大小。

三、图片预处理

用户上传的图片五花八门,得统一处理才能喂给模型:

这里用了最近邻插值,虽然效果没双线性好,但速度更快。实际业务中可以根据效果调整。

四、执行推理

把处理好的数据扔进模型就行:

这里最容易忘的是dispose(),不手动释放内存分分钟爆掉。

五、解析结果

模型输出是1000个类别的概率数组,需要映射到实际标签:

六、完整流程串起来

最后把这些步骤组装起来:

七、踩坑记录

内存泄漏最要命,每个tensor操作完记得dispose

模型加载比较慢,可以考虑用IndexedDB缓存

大模型会卡界面,建议放Web Worker里跑

移动端注意模型体积,超5MB就要考虑优化

八、优化技巧

用GraphModel比LayersModel快不少

开启SIMD加速:

图片压缩后再处理,省内存又提速

现在我这功能已经上线了,用户上传图片秒出标签。虽然准确率比不上服务端大模型,但对大部分场景够用了。最关键的是省了服务器成本,产品经理终于不再追着我问“为什么这个需求要排期两周”了。

前端机器学习还有很多玩法,比如用PoseNet做姿态检测,用BodyPix搞人像分割。下次再和大家分享怎么用这些技术做虚拟试衣间,有兴趣的兄弟可以关注下。

更多推荐