你买到了女朋友喜欢的口红色号了吗? - Python实战

发表于:2019-1-04 10:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:DJun    来源:好想学Python

#
Python
分享:
  办公室闲聊时间,只听一位女同事锤着桌子向另一位女同事吐槽道:“能分清口红色号的直男,不存在的!!”“‘死亡芭比粉’,我男朋友他送我的口红色号竟然真的是‘死亡芭比粉’!!”
  就在这天,笔者听到这位女同事吐槽的时候,陷入了思考。
  早前就听说,“死亡芭比粉”是对口红有深刻误解的“钢铁直男”送异性首选色号~满天飞的“口红色号”段子也足以证明女生并不喜欢男生为自己挑口红礼物时,即使是买的知名品牌也难以接受与自己“水火不容”的色号吧!
  (图片来源网络)
  笔者联想到之前在知乎上看过一位大神grapeot的文章,是用深度学习工具Caffe撸了一个“斗图机器人”,大致原理是先收集一些表情包抽取特征放入数据库,然后机器人接收到对方发来的表情包时对收到的图也抽取特征,然后“在数据库里面找最近邻,做一些简单的dedup”,把最终从库里取出的表情包发回,“效果意外地好”“在一些不知情的群里面跟人直接斗起来了”。哈哈,还挺有意思的!
  他的思路方法主要是“抽取特征”“找最近邻”两大点。
  (“斗图机器人”的大致思路)
  头上闪现一个亮亮的大灯泡。试想一下,借鉴“抽取特征”“找最近邻”这样的整体思路,我们似乎可以这样做:预先通过爬虫从品牌官网爬取一些口红产品以及对应的色号,取色号颜色作为“特征”,再从明星图片的唇色取色作为“特征”,然后通过“找最近邻”,匹配到跟明星使用的口红颜色最为接近的口红产品。
  这思路想起来还挺棒的,或许可以人工智能方式帮直男朋友们买到明星款口红产品送给心爱的她!
  (“口红色号查询”的构思)
  二话不说,笔者开始动手尝试具体实现。
  即将实践的这个项目,笔者将它大致分解成这几部分:
  ① 从品牌官网获取产品、色号资料:
  用Python写爬虫,读取色号SKU的样图颜色作为特征,存入数据库;
  ② 找一个颜色在已知颜色中最为相似的颜色:
  即颜色特征之间“找最近邻”,将颜色特征分解为R(红)、G(绿)、B(蓝)三个分量,其对应色号名称如“N°3 蜜桃唇语”作为分类标签(目标值),通过Python,使用机器学习中的KNN最近邻算法来作训练和预测前N个结果;
  ③ 从明星图片唇色取色:
  用谷歌浏览器插件ColorZilla,对网络搜索找到的图片进行取色;
  ④ 便捷的查询功能:
  用Python编写Web后端程序,用ColorZilla插件取色后,通过开源词典GoldenDict作为前端,向后端发起查询,得到结果。
  总的来说:
  ① 爬虫部分,通常是优先考虑使用requests、lxml模块,人工分析网页HTML结构,找规律,筛选出所需数据;
  ② 图片取色用PIL(pillow)来做;
  ③ KNN最近邻算法考虑交给sklearn(scikit-learn)来做,简单易操作;
  ④ Web后端就交给Flask吧,对于这类小需求实现成本越低越好。
  接下来是动手时间啦,一边分析,一边开发项目程序。(文末附上项目GitHub地址)
  01【爬虫】获取产品、色号资料
  这里选取了国际知名品牌“以纯”(别打~笔者知道是YSL~)的官网作例子,网页结构规整,而且有我们最为需要的,色号样图(就是一排的一小格一小格色块那种)。
  通过色号样图我们可以轻松地获取不同色号SKU对应的颜色值(形式为“#xxxxxx”,即#号开头的六位16进制数字)~
  (YSL官网,唇部-唇膏 页面)
  观察到我们需要关注的 彩妆-唇部 大分类下面,唇膏、唇釉、唇油、唇颊霜 这些小分类的产品列表界面都是一样的,而且每个小分类的页面数都只有1页,我们通过同样的方式爬取这几个URL的页面就可以了~
  具体的做法可以进入文末提供的项目地址,在MLSCMain.py中找到答案。
  需要留意的几点:
  ① 浏览器看到的是渲染后的页面,requests获取到的是未经渲染的页面:
  两者的HTML结构上可能会有差别,通常在网页上得到元素路径后,还要在requests获取到的HTML上做验证和调整;
  ② 数据储存的“大结构”需要仔细考虑:
  这里的目标是寻找相似的产品对应的色号,笔者选择了JSON、SQLite两种形式进行对比,觉得SQLite更为实用,其实不需要限制在SQLite上,其他的关系型数据库也可以,将产品和色号等信息压缩到同一张表,方便做KNN,也方便预测结果回查;
  ③ RGB与“颜色值”间的转换:
  #号开头的颜色值,后面的六位16进制数字其实是分别由R、G、B三个通道的16进制值拼接而成,通过PIL可以直接得到RGB三个10进制数值,简单转换就可以得到#号开头的颜色值了,存到数据库也只需要一个字段,虽然查询时ColorZilla能直接pick到的也是#号开头的颜色值,但是KNN需要用到的是RGB三个数字,在使用KNN的地方再转换回去即可;
  ④ 彩妆-唇部 下面不同小分类可能会重复出现某款产品:
  因为总共要爬的也就4个页面,可以考虑在全部爬完后,再做去重操作,去重后再储存入库。
  02【机器学习】找相似颜色
  对“机器学习”的入门,我们可以简单地将机器学习的操作理解为,往算法“黑盒子”进行训练数据和待预测数据的输入,从“黑盒子”得到预测结果。
  就好比一个人跟另一个不知道苹果形状的人描述,拿了几张苹果的照片举例,说苹果是这般这般的形状,那么这个人往后看到苹果的实物或者照片,通过形状规律推测出它可能是苹果。
  通过sklearn这款利器,选用其中的KNeighborsClassifier作为“黑盒子”,我们可以非常方便地实现“找相似颜色”这一目的。不添加复杂的调校参数的前提下,跟它相关的代码可以控制在10行以内。
  具体的做法可以进入文末提供的项目地址,在MLSWebMain.py中找到答案。
  03【取色】从明星图片唇色取色
  我们想找明星款色号,最简单的方式是打开浏览器,转到搜索引擎输入关键词搜索得到了。取色可以在浏览器上通过插件来实现,笔者用的是谷歌浏览器,在“chrome网上应用店”中找到了ColorZilla这款。
  (ColorZilla 扩展程序信息)
  插件使用方法极其简单,点击工具栏图标,往网页上要吸取颜色的地方点击一下,浮动条会提示对应的颜色值已复制。
  (颜色已被复制到剪贴板!)
  04【查询】便捷的查询功能
  前些天遇见了GoldenDict这款开源词典软件,它给了我非常好的程序设计灵感,笔者已经将它应用在公司内部的项目中。
  软件支持屏幕取词,支持“网络词典”,即从指定URL请求数据,获取结果显示在软件界面中。
  (词典设置界面)
  上图没有马赛克的部分,除了上半部分软件自带的网络词典URL外,还有下半部分没打码的两项,一项是海词的URL,一项是本项目测试使用的URL。
  我们在浏览器中进入海词的页面时,可以观察到,查询词被放在了最右斜杠的右边。
  『 dict.cn/test 』
  (海词的URL示例)
  按照GoldenDict的设置说明,只要将查询词替换为占位符“%GDWORD%”,软件就可以在我们查词的时候自动把词放入占位符中帮我们查询。
  改成应用在我们的项目上也是同样方式的,我们自己定一个route就可以实现了。这在Flask中都能轻松快速地解决。
  『 127.0.0.1:9992/search?kw=%2523B03C79 』
  (我们的URL示例)
  还有一个问题就是,直接在网址上输入#号这个特殊符号,会被解析为其他意义,所以图上的网址如果是kw=#B03C79,就查不到数据了,要把#号quote成这串“%2523”才行,或者后端设计成可以直接处理不带#号的六位16进制数也是可以的。
  当然我们使用GoldenDict的话,#号是会自动quote的,不需要考虑自己转换。
  把KNN和Flask的代码写在一块,包含格式化的空行总共不到200行。具体的做法可以进入文末提供的项目地址,在MLSWebMain.py中找到答案。
  这部分代码在本地测试ok后,还可以部署到自己的VPS上,随时随地使用更方便~
  05【效果演示】当当,最终效果出来啦
  先是在YSL官网上对色号样图取色进行测试,验证得知100%匹配正确,这里不再截图了。来看看在网络图片上的测试吧~
  (从图上绿圈中某点取色得到的预测前5相似结果-1)
(从图上绿圈中某点取色得到的预测前5相似结果-2)
  找了一张全智贤剧照和口红产品图P在一起的图片,分别在图上用绿色圈出来的地方进行测试。然后发现匹配到的相似色号的产品,竟然跟原图上的两款产品图都是不同款产品,哭唧唧~
  (聊天截图-1)
  (聊天截图-2)
  然后发消息向老婆大人求教,得知因为唇膏、嘴唇都是立体的,有高光和阴影,取色都会受到影响,而且还有一个非常玄学的“在不同嘴上显现不同的颜色”的问题,emmmmmmm~
  毕竟做KNN的训练数据的量就摆在那里了,也没有应用深度学习,很难处理那些复杂又玄学的问题的~好在只要来源图片取到的颜色不是“死亡芭比粉”,程序推荐的相似颜色也几乎不会出现“死亡芭比粉”,算是勉强解决了直男挑口红色号的需求?哈哈哈(尴尬笑)
  懂一些绘画知识的她跟我提建议:可以考虑取高光颜色与阴影颜色之间最居中的那个颜色,作为查找相近颜色的依据。方法听起来不错,不过笔者还没有进一步实现和测试验证。你们怎么看?

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号