Java基础、中级、高级、架构面试资料

揭秘人工智能面相(看相、算命)原理以及实现

业余杂谈 herman 28808浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

最近朋友圈里有很多人在转发一个非常火的人工智能面相小程序,我看了一下它非常火的原因可能是“人工智能”这个流行词。试着从码农的角度去还原它的实现原理,分析它的实现过程。

人们都说千人千面,世界上没有一张相同的面孔。那么面相小程序是如何做到的呢?人工智能在哪里呢?算命先生又是依据什么来算命的呢?

想到了这些,我就去谷歌,去寻找人们是如何算命的!

发现所谓的算命,其实就是人们根据面相十二宫,手相的一些特征来推测。

面相12宫位

所谓的人工智能面相、看相、算命呢?就是根据上面这些宫位给你计算一个分数。分数高的面相就好!

人工智能智能面相原理

每一个宫位都有解释,每一个宫位都代表一种命运。有的代表财运,有的代表婚姻,有的代表事业,有的代表疾病等。

一些面相老手,还能给你扯更复杂的宫位。

看相原理

另外我在知识星球中听人说,淘宝上一些面相的店铺,一天收入可能在上万元。看来有钱人面相的还不在少数啊。

人工智能面相可能戳中了不少人的泪点,让它火了起来。

它虽然火了,但是面相的店铺生意可能就会一落千丈吧。所以也就有人喜欢有人忧愁。

那么说了这么多,用代码怎么来实现呢?

面相算法

上面这个图片来源于网络,是面相算法中的一种。大致也就是根据宫位来算。

面相、看相、算命算法

给每个位置标记上坐标。用代码获取五官之大小,形状,分暗等图像空间。这里面设计到一个人脸识别技术,大家可以网上看看相关的论文或技术实现。

其实我对人工智能还不算了解,相关的内容大家可以参考国内的、国外的一些技术论文,还有一些开源产品。

通过人脸识别技术,可以得到下面的这些宫位要素信息。

  • 可以在人脸上找到影响巨大的部位宫位

  • 可以获取宫位的坐标,从而计算各宫位的相对位置大小和比例

  • 可以获取五官的位置和大小,根据其占人脸之比例分析

  • 可以获取各宫位的颜色明暗,通过技术处理去掉相处之中的反光,然后使用直方图分析各部位和人脸的明暗关系,印堂发暗是可以比人眼更准确的分析得到

说白了,就是通过人工智能、机器学习给你画像。最后给你的画像打分。

贴一段简单的代码:

 if (bPic) {
    Paint p = new Paint();
    p.setColor(Color.RED);
    //p.setStyle(Paint.Style.FILL_AND_STROKE);
    p.setStyle(Paint.Style.STROKE);
    Path path = new Path();
    path.moveTo((int) (landmarks.get(48).x * resizeRatio), (int) (landmarks.get(48).y * resizeRatio));
    for (int i = 48 + 1; i < landmarks.size(); i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);

    path.reset();
    path.moveTo((int) (landmarks.get(17).x * resizeRatio), (int) (landmarks.get(17).y * resizeRatio));
    for (int i = 17 + 1; i < 22; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);

    path.reset();
    path.moveTo((int) (landmarks.get(22).x * resizeRatio), (int) (landmarks.get(22).y * resizeRatio));
    for (int i = 22 + 1; i < 27; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);

    path.reset();
    path.moveTo((int) (landmarks.get(36).x * resizeRatio), (int) (landmarks.get(36).y * resizeRatio));
    for (int i = 36 + 1; i < 42; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);

    Path path3 = new Path();
    path3.moveTo((int) (landmarks.get(42).x * resizeRatio), (int) (landmarks.get(42).y * resizeRatio));
    for (int i = 42 + 1; i < 48; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path3.lineTo(pointX1, pointY1);
    }
    path3.close();
    canvas.drawPath(path3, p);

    path.reset();
    path.moveTo((int) (landmarks.get(27).x * resizeRatio), (int) (landmarks.get(27).y * resizeRatio));
    for (int i = 31; i < 36; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);

    path.reset();
    path.moveTo((int) (landmarks.get(1).x * resizeRatio), (int) (landmarks.get(1).y * resizeRatio));
    for (int i = 2; i < 17; i++) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    for (int i = 26; i > 16; i--) {
        int pointX1 = (int) (landmarks.get(i).x * resizeRatio);
        int pointY1 = (int) (landmarks.get(i).y * resizeRatio);
        path.lineTo(pointX1, pointY1);
    }
    path.close();
    canvas.drawPath(path, p);
}

实际上的算法和用法,比着复杂多了,我这里只是一个 Canvas 画图,献丑了。

大自然神秘莫测,玄妙无比。一切看似没有规律,又胜似联系不断。掌握了各种规律,就掌握了事物的发展过程。

人工智能或者机器学习,就是通过不断的练习去寻找大自然的某种规律。

会人工智能,或者对人工智能感兴趣的朋友,可以通过下面的参考资料,自己去实现一个面相程序!

参考资料

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 揭秘人工智能面相(看相、算命)原理以及实现