引言
七夕佳节到,如何为女友挑选最合适的口红色号?
用口红搜索神器,上传自拍,即刻获得最适合人像肤色的口红!Jina 的神经搜索带来最佳彩妆选择!
Jina 社区资深用户,先思科技 CEO 西门良,近日为解决七夕送礼这一世纪难题,使用 Jina 神经搜索框架开发了口红搜索神器。让我们来看一看这个项目是如何从构思到落地的吧!内附链接,快来上传照片试试看!
开发背景
每年一到情人节、纪念日、女朋友生日,我都会因为挑选礼物发愁,而买口红看似简单,其实是个无底深坑。一不小心买错色号,很容易就变成了网上的素材。如果说有这样一个神器,只需要上传照片就能返回合适女友的口红...
分析设计
那么从一张照片里面,提取哪些信息是对搜索口红有帮助的呢?我想到每次女友在化妆品柜台试色时,会把口红涂抹到手背或者小臂上,反复比对确认肤色和口红的颜色是否搭配。
也就是说,最重要的是找到口红和肤色之间的关系,即什么样的口红适合什么样的肤色。因此,只要把口红和肤色信息从试色视频中挨个提取出来,找到肤色相近的人都在用什么样的口红。就可以让大数据帮忙做购买决策,以找到最合适的口红。
口红数据库
由于试色视频的拍摄手法不尽相同,于是使用了谷歌的 MediaPipe 的面部特征点映射算法,在人脸的 3D 模型上定义了468 个特征点,通过机器学习技术,把这些特征点映射到一张 2D 的图片上。只要试色图有全脸,就可以稳定地找到脸颊、嘴唇和下巴,从而抓取到这些关键部位的像素点。
模型结构概述¹
抓取到像素点之后,使用 KMeans 聚类算法提炼出具有代表性的肤色和唇色各 20 个。由于默认的 RGB 参数不能直观并完整表示地唇色,需要转换为能够表示色调、饱和度、亮度的 HSV。通过把这 20 个颜色的分布,放到直方图里面,不难发现,口红的色调参数基本集中在一个地方。当口红颜色越粉,色调就会更偏向于蓝紫色;当口红颜色越橙,色调就会更偏向于橙黄色。
左右滑动 色调、饱和度、亮度
最后,把颜色分布的直方图转换成向量,就能计算出两个向量之间的相似度。把算法搞明白了,可以说是成功了 80%。但是我这二十年的工作经验告诉我,这最后的 20%,往往需要花费 80% 的时间。这时,Jina 全家桶给了我很多惊喜。
传统搜索 vs 神经搜索
作为 Elasticsearch 认证工程师,我对传统搜索引擎的搭建已经非常熟悉了。传统的图片搜索,更多是把图片和对应的文字标签进行关联,以实现从文本到图片的搜索。
而神经搜索能几乎像人类一样“看懂”图片里面到底有什么。“万物皆可 embedding”,任何事物都能通过一个向量得以描绘,而计算机将 AI 模型返回的向量,进行比对和分析,从而找出相似的结果。
Jina 使用体验
Jina 全家桶中提供的 DocArray 是一个非常灵活的数据容器,既能把文字和数字同时放进去,也能把图片、声音等二进制文件转换成 NumPy 数组存放进去,可以用效率最高的方式存放或者传输到前端。
此外,DocArray 提供了高效的向量搜索方法,可以在秒级时间内完成百万级别的向量搜索。通过 DocArray 我可以在 Python 里面快速构建一个口红类,并且把 Notebook 里面的算法运行结果存放到这个类里面,在代码里面的搜索和调取就很人性化了。
至于 Jina 框架本身,它更是一个专门为工程师量身打造的 AI 框架。很多机器学习库对硬件的要求很高,需要上 GPU 的机器才能够正常工作,但可能我们只需要在其中一个步骤需要 GPU,剩余步骤 CPU 就能解决。通过 Jina,我就可以把算法的每一步,分别拆解到一个个 Executor 执行器之中,在执行的时候,Jina 可以按照预设的步骤调用这些部署在云端服务器上的执行器,最后把结果组装到一起返回,这就是云原生技术。
在本项目中,我创建了两个Executor,分别是s3_downloader
和FaceMesher
。我后续也会把本项目中里的两个 Executor 上传到 Jina Hub(可复用组件分享平台,有各种由社区成员分享的 Executor),分享给大家使用。
开发过程中遇到的一些问题,也在 Jina 社区的支持下,得到了快速地响应。我在项目最后的 20% 阶段可以说是相当顺畅的,很快就实现了这个口红搜索引擎。
项目演示
项目演示图
除了上图所示的肤色搜索之外,我也实现了基于唇色的搜索。当你想知道刘亦菲的唇色可以用什么口红复现,可以截取剧照来搜索,找到该妆容对应的相似款。
Repo: https://github.com/lhr0909/lipstick-db
在线使用: https://lipstick-db.senses.chat/
Jina Hub: https://hub.jina.ai/ 或阅读原文
开发者感想
Q(社区助手小J):西门良你好,在本次项目开发过程中,你觉得 Jina 的使用体验如何?
A(西门良): 整体还是那句话,我们团队是会一直使用 Jina 的,用来封装我们的 ML Pipeline。因为我们一直在想怎么把 AI 模型加入到我们的核心产品里面,而 Jina 就是一个非常好的容器,让我们可以很快地调度这些 AI 模型。不使用 Jina 的话,我们就需要想怎么把这些 AI 模型再蒸馏,使用原生的深度学习推理框架,再去实现。但有了 Jina 后,我只需要把它封装起来,再部署就可以了。对于我们上线的速度,以及这个整个方案的健壮度,都是很强的提升。
Q(社区助手小J):在这个项目的开发过程中,Jina 是怎样具体帮助到你的呢?
A(西门良): 在了解 Jina 之前,还是需要做很多手写的内容。比如首先用 Transformers 做一个服务,接着再封装一个 REST 服务。使用 Jina 之后,这一块可以省掉的。初期需要快速落地的话,把模型 finetuner 后,就能直接用 Jina 来服务了。整个开发流程就缩短了很多,因为 Jina 本身提供的功能和性能上都是比较有保证的。
能够快速地帮助 AI 技术工程化,帮助 AI 模型落地的工具在市面上是相当少见的。Jina 刚好填补了这个部分的空缺。因为很多的 ML pipeline 并没有专门的团队去把这些 PyTorch 模型蒸馏,再上线,其实都不太容易用。而通过 Jina 就能很快做出来。总的来说,Jina 能够让看起来复杂的这些 AI 的 Application 变得更加 Approachable。
参考资料
[1]."Face Mesh". 2022.MediaPipe. https://google.github.io/mediapipe/solutions/face_mesh.
官网:Jina.ai
社区:Slack.jina.ai 开源代码:Github.com/Jina-ai更多精彩内容(点击图片阅读)