使用BodyPix和TensorFlow.js实现Color Pop效果
内容提要
谷歌相片运用程序的一个小功用是彩色弹出作用,但只对一些相片运用此作用。作者发现了一个解决方案,使用Tensorflow.js和BodyPix模型手动实现彩色弹出作用。文章介绍了如何加载图画、运用切割和制造布景灰度的过程,并对不同架构和设置进行了测验。最后,作者总结了BodyPix是一个很好的人物切割模型,并提供了源代码和实时工作版本的链接。
延伸解读
为什么需要手动实现彩色弹出效果
Google Photos的彩色弹出效果虽然出色,但仅对部分它认为容易检测到人物的照片自动应用,用户无法手动选择图片。这限制了功能的实用性。作者因此探索使用TensorFlow.js和BodyPix模型在浏览器中手动实现该效果,让用户能自主控制并应用于任意包含人物的图片,弥补了官方功能的不足。
BodyPix模型架构选择:精度与速度的权衡
BodyPix提供MobileNet和ResNet两种架构。MobileNet速度更快但精度较低,ResNet精度更高但速度较慢。作者测试发现,在单人、多人和背面等场景下,ResNet的切割效果均优于MobileNet,但耗时更长。因此,若追求实时性可选用MobileNet,若追求高质量切割则推荐ResNet。
实现彩色弹出的关键技术步骤
实现过程主要分为两步:首先使用BodyPix的segmentPerson()生成人物切割图,该图是一个Uint8Array,其中1表示人物像素,0表示背景;然后通过Canvas的getImageData()获取原始像素,遍历每个像素,若切割图为0则计算灰度值并替换RGB,否则保留原色,最后用putImageData()绘制回画布,从而突出主体并灰度化背景。
实际测试中的表现与局限
作者在单人、多人和人物背面等场景下测试了MobileNet和ResNet。两者均能检测到人物,但ResNet切割更精确。然而,在多人场景中,由于衣物颜色与背景相近,两者都未能完美分割垫子等部分。这表明BodyPix虽能处理复杂场景,但在某些边缘情况下仍有误判,需根据具体图片调整参数或后期处理。
Q&A
如何使用TensorFlow.js和BodyPix实现彩色弹出效果?
通过创建遮罩切割图像中的人物,并将背景灰度化来实现彩色弹出效果。
BodyPix模型的主要功能是什么?
BodyPix模型用于人物切割和姿势检测,能够快速检测图像中的人。
在实现彩色弹出效果时,选择不同的架构有什么影响?
选择ResNet架构可以提高切割精度,但速度较慢;而MobileNet速度较快但精度较低。
如何在HTML Canvas中加载图像并操作像素数据?
使用HTML Canvas的getImageData()函数读取像素数据,并通过putImageData()函数将处理后的数据绘制回画布。
测试中ResNet和MobileNet的表现如何?
测试表明,ResNet在切割精度上优于MobileNet,但速度较慢,适合需要高精度的场景。
如何使用segmentPerson()函数进行人物切割?
segmentPerson()函数接受Canvas元素作为输入,并生成切割地图,快速进行人物切割。