tensorflow-models/facemesh试用
该工程创建时, facemesh的版本为0.0.4, 编译有问题。
目前facemesh已经升级到0.0.5, 还停止了更新。
从日志上来看, 0.0.4到0.0.5只是修改了一些测试用例和配置。
facemesh的内容转到了face-landmarks-detection。
两者代码基本一致, 只是更加通用, facemesh只是作为一个可选的模型, 并且增加了瞳孔的识别模型。
- 参照demo写出来的最小工程
- 编译说明
- 请先确保安装了node.js, 安装包中应该附带npm
- 执行
node -v
确认版本号, 如v12.18.3 - 执行
npm -v
确认npm的版本号, 如6.14.6 - 安装yarn, 执行
npm install -g yarn
, yarn是替代npm的包管理工具, facemesh使用了yarn - 执行
yarn -v
确认yarn版本号, 如1.22.5 cd facemesh1
- 执行
yarn
, 安装依赖包 - 执行
yarn build
编译 - 执行
yarn watch
调试
- backend
- tfjs-backend-wasm 2.3.0编译会报错
- 编译成功后, 使用webgl, cpu正常, wasm会报错
- 这里使用了cpu
- 如果访问不了tfhub.dev, 找到facemesh.esm.js, 将tfhub.dev替换为storage.googleapis.com/tfhub-tfjs-modules, 或者使用浏览器插件进行重定向
- 如果一切正常, 会在控制台打印predictions对象
- 不使用node.js进行编译, 直接使用已编译的脚本
- tfjs相关脚本来自unpkg.com, 版本2.3.0
- facemesh来自cdn.jsdelivr.net, 版本0.0.4
- 已经修改facemesh中的模型地址指向lib
- 直接打开index.html, 如果一切正常, 会在控制台打印predictions对象
- 根据特征点创建脸部模型
- 三角面的数据来自于demo/triangulation.js
- 保存为Wavefront Obj格式
- OBJ格式中索引是基于1的, 所以要+1
- 使用PlayCanvas显示脸部模型
- 创建了一个平面显示原图, 用于比较
- 为了对齐, 对顶点做了居中的处理
- UV数据没有使用uv_coords.ts内的数据, 直接用顶点的XY/图片的宽高, 贴图也使用原图
- 使用了无光照纯贴图的材质, 如果要使用其他材质还需要创建法线数据
- 演示
- 打开index.html
- 等待片刻, 会进入到3D显示
- 按左右旋转镜头
- 测试图片有两张, 可以把face01改成face02查看
- 可以看到能够重建人脸的前部, 但是后部以及头发、耳朵等部分都无法重建
- 参数化捏脸
- 脸部模型使用多个骨骼进行控制
- 将这些控制转成多个参数
- 通过facemesh获得的特征点计算这些参数, 并应用到模型上, 完成自动捏脸
- 主要参考基于神经网络捏脸
- 借用了其中捏脸模块, 包括模型, 骨骼控制参数, 骨骼控制分组, 捏脸参数
- 该方案是通过神经网络直接生成捏脸参数, 这里靠facemesh的特征点近似模拟
- 相关代码在character-customization文件夹下
- 演示
- 打开index.html
- 右侧[控制]下有两个选项, FaceMesh用于打开/关闭使用facemesh创建的模型, FaceModel用于打开/关闭一个女性脸部模型
- [控制]下方有大量参数可以用于调整脸部模型, 这些值都是[0, 1]的数值, 并且默认都是0.5