大数据人脸分析案例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据人脸分析案例相关的知识,希望对你有一定的参考价值。

参考技术A

大数据人脸分析案例

  大数据人脸分析案例,随着社会科技的不断发展,人工技能,人脸识别技术也不断普及到各个领域。人脸识别技术可以在大数据的环境下,极大发挥其强大的作用。下文分享有关大数据人脸分析的内容。

  大数据人脸分析案例1

   基于特征的方法和基于图像的方法

   1、基于特征的方法

  技术:基于特征的方法试图找到人脸的不变特征进行检测。其基本思想是基于人类视觉可以毫不费力地检测不同姿势和光照条件下的人脸的观察,因此必须有尽管存在这些变化的属性或特征是一致的。当前已经提出了广泛的方法来检测面部特征,然后推断面部的存在。

  示例:边缘检测器通常会提取人脸特征,例如眼睛、鼻子、嘴巴、眉毛、肤色和发际线。基于提取的特征,建立统计模型来描述它们之间的关系并验证人脸在图像中的存在。

   优点:易于实施,传统方法

  缺点:基于特征的算法的一个主要问题是图像特征可能会由于光照、噪声和遮挡而严重损坏。此外,人脸的特征边界会被弱化,阴影会导致强边缘,这使得感知分组算法无用。

   2、基于图像的方法

  技术:基于图像的方法尝试从图像中的示例中学习模板。因此,基于外观的方法依靠机器学习和统计分析技术来找到“人脸”和“非人脸”图像的相关特征。学习的特征是以分布模型或判别函数的形式应用于人脸检测任务。

  示例:基于图像的方法包括神经网络 (CNN)、支持向量机 (SVMi) 或 Adaboost。

   优点:性能好,效率更高

  缺点:难以实施。 为了计算效率和检测效率,通常需要降维。这意味着通过获得一组主要特征来考虑降低特征空间的维数,保留原始数据的有意义的属性。

   人脸检测方法

  已经引入了多种人脸检测技术。

  1、开始阶段:人脸检测自 90 年代出现以来一直是一个具有挑战性的研究领域。

  2000 年之前,尽管有很多研究,但直到 Viola 和 Jones 提出里程碑式的工作,人脸识别的实际性能还远不能令人满意。 从 Viola—Jones 的开创性工作(Viola and Jones 2004)开始,人脸检测取得了长足的进步。

  Viola and Jones 开创性地使用 Haar 特征和 AdaBoost 来训练一个有希望的准确度和效率的人脸检测器(Viola and Jones 2004),这启发了之后有几种不同的方法。 然而,它有几个严重的缺点。首先,它的特征尺寸比较大。另外,它不能有效地处理非正面人脸和框外人脸。

  2、早期阶段——机器学习:早期的方法主要集中在与计算机视觉领域的专家一起提取不同类型的手工特征,并训练有效的分类器以使用传统的机器学习算法进行检测。

  这些方法的局限性在于它们通常需要计算机视觉专家来制作有效的特征,并且每个单独的组件都单独优化,使得整个检测流程往往不是最佳的。

  为了解决第一个问题,人们付出了很多努力来提出更复杂的特征,如 HOG(定向梯度直方图)、SIFT(尺度不变特征变换)、sURF(加速鲁棒特征)和 ACF(聚合通道特征)。检测的鲁棒性,已经开发了针对不同视图或姿势分别训练的多个检测器的组合。然而,此类模型的训练和测试通常更耗时,并且检测性能的提升相对有限。3

  3、最新技术 — 深度学习:近年来,使用深度学习方法,尤其是深度卷积神经网络 (CNN) 的人脸识别取得了显着进展,在各种计算机视觉任务中取得了显显著的成功。

  与传统的计算机视觉方法相比,深度学习方法避免了手工设计的不足,并主导了许多著名的基准评估,例如 lmageNet大规模视觉识别挑战 (ILSVRC)。

  最近,研究人员应用了 Faster R—CNN,这是最先进的通用对象检测器之一,并取得了可喜的成果。此外,CNN 级联、区域提议网络(RPN)和 Faster R—CNN 联合训练实现了端到端的优化,以及人脸检测基准,如 FDDB(人脸数据库)等。

   主要挑战

  人脸检测面临的困难是降低人脸识别准确率和检测率的原因。

  这些挑战是复杂的背景、图像中的人脸过多、奇怪的表情、光照、分辨率较低、人脸遮挡、肤色、距离和方向等。

  不寻常的面部表情:图像中的人脸可能会显示出意外或奇怪的面部表情。

  照明度:某些图像部分可能具有非常高或非常低的照明度或阴影。

  皮肤类型:检测不同人脸颜色的人脸检测具有挑战性,需要更广泛的训练图像多样性。

  距离:如果到相机的距离太远,物体尺寸(人脸尺寸)可能太小。

  朝向:人脸方向和相机的角度会影响人脸检测率。

  复杂的背景: 场景中的大量对象会降低检测的准确性和速度。

  一张图像中有很多人脸:一张包含大量人脸的图像对于准确检测率来说非常具有挑战性。

  人脸遮挡:人脸可能会被眼镜、围巾、手、头发、帽子等物体部分遮挡,影响检测率。

  低分辨率:低分辨率图像或图像噪声会对检测率产生负面影响。

   人脸检测应用场景

  人群监控:人脸检测用于检测经常光顾的公共或私人区域的人群。

  人机交互: 多个基于人机交互的系统使用面部识别来检测人类的存在。

  摄影:最近的一些数码相机使用面部检测进行自动对焦等等。

  面部特征提取:可以从图像中提取鼻子、眼睛、嘴巴、肤色等面部特征。 、

  性别分类: 通过人脸检测方法检测性别信息。

  人脸识别:从数字图像或视频帧中识别和验证一个人。

  营销:人脸检测对于营销、分析客户行为或定向广告变得越来越重要。

  出勤:面部识别用于检测人类的出勤情况, 它通常与生物识别检测结合用于访问管理,如智能门禁。

  大数据人脸分析案例2

  2014年前后,随着大数据和深度学习的发展,神经网络备受瞩目,深度学习的出现使人脸识别技术取得了突破性进展。深度学习是机器学习的一种,其概念源于人工神经网络的研究,通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

  区别于传统的浅层学习,深度学习的不同在于一方面通常有5层以上的\'多层隐层节点,模型结构深度大;另一方面利用大数据来学习特征,明确了特征学习的重要性。

  随着深度卷积神经网络和大规模数据集的最新发展,深度人脸识别取得了显著进展,基于深度学习的人脸识别技术可以通过网络自动学习人脸面部特征,从而提高人脸检测效率。

  从人脸表达模型来看,可细分为2D人脸识别和3D人脸识别。基于2D的人脸识别通过2D摄像头拍摄平面成像,研究时间相对较长,在多个领域都有使用,但由于2D信息存在深度数据丢失的局限性,收集的信息有限,安全级别不够高,在实际应用中存在不足。

  早在2019年,就有小学生手举照片“攻破”了快递柜的人脸识别系统。基于3D的人脸识别系统通过3D摄像头立体成像,由两个摄像头、一个红外线补光探头和一个可见光探头相互配合形成3D图像,能够准确分辨出照片、视频、面具等逼真的攻击手段。

  根据使用摄像头成像原理,目前3D人脸识别主要有三种主流方案,分别是3D结构光方案(Structured Light)、时差测距技术3D方案(Time Of Flight,TOF)和双目立体成像方案(Stereo System)。基于3D结构光的人脸识别已在一些智能手机上实际应用,比如HUAWEI Mate 20 Pro、iPhone X。

  2009年微软推出的Kinect(Xbox 360体感周边外设)则采用了TOF方式获取3D数据,颠覆了游戏的单一操作,为人机体感交互提供了有益探索。双目立体成像方案基于视差原理,通过多幅图像恢复物体的三维信息,由于对相机焦距、两个摄像头平面位置等要求较高,应用范围相对于3D结构光和TOF方案较窄。

  除了能够准确识人,精准判断捕捉到的人脸是真实的也至关重要。活体检测技术能够在系统摄像头正确识别人脸的同时,验证用户是本人而不是照片、视频等常见攻击手段。目前活体检测分为三种,分别是配合式活体检测、静默活体检测和双目活体防伪检测。

  其中,配合式活体检测最为常见,比如在银行“刷脸”办理业务、在手机端完成身份认证等应用场景,通常需要根据文字提示完成左看右看、点头、眨眨眼等动作,通过人脸关键点定位和人脸追踪等技术,验证用户是否为真实活体本人。

  人脸与人体的其他生物特征(如指纹、虹膜等)一样与生俱来,它的唯一性和不易被复制的良好特性为身份鉴别提供了必要的前提。随着大数据和深度学习的不断发展,人脸识别效率显著提升,为远程办理业务的身份认证环节提供了可靠保障。

  但与此同时,人脸信息保护、隐私安全等问题也应引起重视。随着《个人信息保护法》《数据安全法》及相关司法解释的出台,国家相关部门以及各种机构对个人信息安全问题的重视,有利于引导人脸识别技术的发展方向,为促进行业高质量发展、创造高品质数字生活提供有力支撑。

  大数据人脸分析案例3

   人脸识别的应用场景在大范围扩展:

  金融领域:远程银行开户、身份核验、保险理赔和刷脸支付等。人脸识别技术的接入,能有效提高资金交易安全的保障,也提高了金融业务中的便捷性。

  智慧安防领域则是为了视频结构化、人物检索、人脸布控、人群统计等软硬件一体形态产品提供基础支撑,重点应用于犯罪人员的识别追踪、失踪儿童寻找、反恐行动助力等场景。实现重点人员的识别及跟踪,在公安应用场景中达到事前预警、事中跟踪、事后快速处置的目的。

  交通领域主要包括1:1人脸验证和1:N人脸辨识,目前利用人脸核验验证技术的刷脸安检已进入普遍应用阶段,在高铁站、普通火车站和机场皆已大面积推广。

  而应用1:N人脸比对技术的刷脸支付主要落地在地铁公交等市内交通,这种技术能够极大提高通勤人员的出行效率,释放大量的人力资源,提升出行体验。同时,人脸识别可以对交通站点进行人流监测,根据人员出行规律预测人流高峰,提前做好疏导预案。

  民生政务方面,人脸识别在政务系统的落地,提升了民众的办事效率,公民可以不用窗口排队,实现自助办事,节省了因人工效率低下产生的耗时。部分政务还可以通过在线人脸识别验证,在移动端线上办理,减轻了“办事来回跑、办事地点远、办事点分散”的困扰。

  智能家居方面,主要应用在安全解锁和个性化家居服务两个场景。

  在线教育领域则是通过人脸识别查验学员身份,避免一账号多个人使用,给网校造成损失,另一用途是帮助在线课堂老师了解学生学习状态,弥补网络授课相较于传统授课在师生交流环节上的不足。

  商业领域,利用人脸识别功能实现各种极具创意的互动营销活动。

  凡事都有两面。即便拥有以上优势,因人脸暴露度较高,相比对其他生物特征数据更容易实现被动采集,这也意味着人脸信息的数据更容易被窃取,不仅可能侵犯个人隐私,还会带来财产损失。大规模的数据库泄露还会对一个族群或国家带来安全风险。

  在南方都市报个人信息保护研究中心发布的《人脸识别应用公众调研报告(2020)》中,其对两万份调研报告进行统计,问卷中就“便捷性”与“安全性”设置了量表题,请受访者分别依据前述10大类场景中的使用感受进行打分。

  1分为最低分,5分为最高分。结果显示,在安全性感受方面,受访者给出的分数则明显偏低,体现出他们对安全风险的忧虑态度。

图解大数据 | 综合案例-使用Spark分析挖掘音乐专辑数据

文娱影音是目前大数据与AI应用最广泛的场景之一,本案例以音乐专辑发行数据为背景,讲解使用pyspark对HDFS存储的数据进行处理数据分析的过程,并且对分析结果做了可视化呈现。

作者:韩信子@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/84
本文地址http://www.showmeai.tech/article-detail/178
声明:版权所有,转载请联系平台与作者并注明出处

引言

文娱影音是目前大数据与AI应用最广泛的场景之一,本案例以音乐专辑发行数据为背景,讲解使用pyspark对HDFS存储的数据进行处理数据分析的过程,并且对分析结果做了可视化呈现。

1.实验环境

  • (1)Linux: Ubuntu 16.04
  • (2)Python: 3.8
  • (3)Hadoop:3.1.3
  • (4)Spark: 2.4.0
  • (5)Web框架:flask 1.0.3
  • (6)可视化工具:Echarts
  • (7)开发工具:Visual Studio Code

为了支持Python可视化分析,大家可以运行如下命令安装Flask组件:

sudo apt-get install python3-pip
pip3 install flask

2.实验数据集

1)数据集说明

数据集和源代码下载
链接:https://pan.baidu.com/s/1C0VI6w679izw1RENyGDXsw
提取码:show

本案例的数据集来自于Kaggle平台,数据名称albums.csv,包含了10万条音乐专辑的数据(大家可以通过上述百度网盘地址下载)。主要字段说明如下:

  • album_title:音乐专辑名称
  • genre:专辑类型
  • year_of_pub: 专辑发行年份
  • num_of_tracks: 每张专辑中单曲数量
  • num_of_sales:专辑销量
  • rolling_stone_critic:滚石网站的评分
  • mtv_critic:全球最大音乐电视网MTV的评分
  • music_maniac_critic:音乐达人的评分

2)上传数据至HDFS

(1)启动Hadoop中的HDFS组件,在命令行运行下面命令

/usr/local/hadoop/sbin/start-dfs.sh

(2)在hadoop上登录用户创建目录,在命令行运行下面命令

hdfs dfs -mkdir -p /user/hadoop

(3)把本地文件系统中的数据集albums.csv上传到分布式文件系统HDFS中

hdfs dfs -put albums.csv

3.pyspark数据分析

1)建立工程文件

(1)创建文件夹code
(2)在code下创建project.py文件
(3)在code下创建static文件夹,存放静态文件
(4)在code/static文件夹下面创建data目录,存放分析生成的json数据

2)进行数据分析

本文对音乐专辑数据集albums.csv进行了一系列的分析,包括:

(1)统计各类型专辑的数量
(2)统计各类型专辑的销量总数
(3)统计近20年每年发行的专辑数量和单曲数量
(4)分析总销量前五的专辑类型的各年份销量
(5)分析总销量前五的专辑类型,在不同评分体系中的平均评分

3)代码实现

project.py代码如下:

from pyspark import SparkContext
from pyspark.sql import SparkSession
import json

#统计各类型专辑的数量(只显示总数量大于2000的十种专辑类型)
def genre(sc, spark, df):
    #按照genre字段统计每个类型的专辑总数,过滤出其中数量大于2000的记录
    #并取出10种类型用于显示
    j = df.groupBy(\'genre\').count().filter(\'count > 2000\').take(10)
    #把list数据转换成json字符串,并写入到static/data目录下的json文件中
    f = open(\'static/data/genre.json\', \'w\')
    f.write(json.dumps(j))
    f.close()

#统计各个类型专辑的销量总数
def genreSales(sc, spark, df):
    j = df.select(\'genre\', \'num_of_sales\').rdd\\
        .map(lambda v: (v.genre, int(v.num_of_sales)))\\
            .reduceByKey(lambda x, y: x + y).collect()
    f = open(\'static/data/genre-sales.json\', \'w\')
    f.write(json.dumps(j))
    f.close()

#统计每年发行的专辑数量和单曲数量
def yearTracksAndSales(sc, spark, df):
    #把相同年份的专辑数和单曲数量相加,并按照年份排序
    result = df.select(\'year_of_pub\', \'num_of_tracks\').rdd\\
        .map(lambda v: (int(v.year_of_pub), [int(v.num_of_tracks), 1]))\\
            .reduceByKey(lambda x, y: [x[0] + y[0], x[1] + y[1]])\\
                .sortByKey()\\
                .collect()

    #为了方便可视化实现,将列表中的每一个字段分别存储
    ans = 
    ans[\'years\'] = list(map(lambda v: v[0], result))
    ans[\'tracks\'] = list(map(lambda v: v[1][0], result))
    ans[\'albums\'] = list(map(lambda v: v[1][1], result))
    f = open(\'static/data/year-tracks-and-sales.json\', \'w\')
    f.write(json.dumps(ans))
    f.close()

#取出总销量排名前五的专辑类型
def GenreList(sc, spark, df):
    genre_list = df.groupBy(\'genre\').count()\\
        .orderBy(\'count\',ascending = False).rdd.map(lambda v: v.genre).take(5)
    return genre_list


#分析总销量前五的类型的专辑各年份销量
def GenreYearSales(sc, spark, df, genre_list):
    #过滤出类型为总销量前五的专辑,将相同类型、相同年份的专辑的销量相加,并进行排序。
    result = df.select(\'genre\', \'year_of_pub\', \'num_of_sales\').rdd\\
        .filter(lambda v: v.genre in genre_list)\\
            .map(lambda v: ((v.genre, int(v.year_of_pub)), int(v.num_of_sales)))\\
                .reduceByKey(lambda x, y: x + y)\\
                    .sortByKey().collect()

    #为了方便可视化数据提取,将数据存储为适配可视化的格式
    result = list(map(lambda v: [v[0][0], v[0][1], v[1]], result))
    ans = 
    for genre in genre_list:
        ans[genre] = list(filter(lambda v: v[0] == genre, result))
    f = open(\'static/data/genre-year-sales.json\', \'w\')
    f.write(json.dumps(ans))
    f.close()

#总销量前五的专辑类型,在不同评分体系中的平均评分
def GenreCritic(sc, spark, df, genre_list):
    #过滤出类型为总销量前五的专辑,将同样类型的专辑的滚石评分、mtv评分,音乐达人评分分别取平均
    result = df.select(\'genre\', \'rolling_stone_critic\', \'mtv_critic\', \'music_maniac_critic\').rdd\\
        .filter(lambda v: v.genre in genre_list)\\
        .map(lambda v: (v.genre, (float(v.rolling_stone_critic), float(v.mtv_critic), float(v.music_maniac_critic), 1)))\\
        .reduceByKey(lambda x, y : (x[0] + y[0], x[1] + y[1], x[2] + y[2], x[3] + y[3]))\\
        .map(lambda v: (v[0], v[1][0]/v[1][3], v[1][1]/v[1][3], v[1][2]/v[1][3])).collect()

    f = open(\'static/data/genre-critic.json\', \'w\')
    f.write(json.dumps(result))
    f.close()


#代码入口

if __name__ == "__main__":
    sc = SparkContext( \'local\', \'test\')
    sc.setLogLevel("WARN")
    spark = SparkSession.builder.getOrCreate()
    file = "albums.csv"
    df = spark.read.csv(file, header=True)  #dataframe

    genre_list = GenreList(sc, spark, df)

    genre(sc, spark, df)
    genreSales(sc, spark, df)
    yearTracksAndSales(sc, spark, df)
    GenreYearSales(sc, spark, df, genre_list)
    GenreCritic(sc, spark, df, genre_list)

4)代码运行

(1)在Ubuntu终端窗口中,用 hadoop 用户登录,在命令行运行 su hadoop,并输入用户密码。
(2)进入代码所在目录。
(3)为了能够读取HDFS中的 albums.csv 文件,在命令行运行:

/usr/local/hadoop/sbin/start-dfs.sh

(4)在命令行运行:

spark-submit project.py

4.可视化实现

=======

本案例的可视化基于Echarts实现,实现的可视化页面部署在基于flask框架的web服务器上。

1)相关代码结构

(1)在code目录下新建 VisualizationFlask.py 文件,存放 Flask 应用。
(2)在code目录下新建一个名为 templates 的文件夹,存放 html文件。
(3)在 code/static 目录下新建一个名为 js 的文件夹,存放 js 文件。

2)建立Flask应用

在SparkFlask.py文件中复制以下代码:

from flask import render_template
from flask import Flask
# from livereload import Server

app = Flask(__name__)

@app.route(\'/\')
def index():
    #使用 render_template() 方法来渲染模板
    return render_template(\'index.html\')

@app.route(\'/<filename>\')
def req_file(filename):
    return render_template(filename)

if __name__ == \'__main__\':   
    app.DEBUG=True#代码调试立即生效
    app.jinja_env.auto_reload = True#模板调试立即生效
app.run()#用 run() 函数来让应用运行在本地服务器上

3)下载js文件

(1)在网站上下载jQuery(https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js),将其另存为 jquery.min.js 文件,保存在 code/static/js 目录下。
(2)在官网下载界面下载Echarts(https://echarts.apache.org/zh/download.html),将其另存 echarts-gl.min.js 文件,保存在 code/static/js 目录下。

4)Echarts可视化

(1)在code/templates目录下新建index.html文件。复制以下代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Music</title>
</head>

<body>
    <h2>音乐专辑分析</h2>
    <ul >
        <li><a href="genre.html">各类型专辑的数量统计图</a></li>
        <li><a href="genre-sales.html">各类型专辑的销量统计图</a></li>
        <li><a href="year-tracks-and-sales.html">近20年每年发行的专辑数量和单曲数量统计图</a></li>
        <li><a href="genre-year-sales.html">总销量前五的专辑类型的各年份销量分析图</a></li>
        <li><a href="genre-critic.html">总销量前五的专辑类型的评分分析图</a></li>
    </ul>
</body>
</html>

index.html为主页面,显示每一个统计分析图所在页面的链接。点击任意一个链接,即可跳转到相应页面。

(2)在code/templates目录下新建genre.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <a href="/">Return</a>
    <br>
    <br>
    <div id="genre" ></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre.json", d => 
            _data = d.map(v => (
                name: v[0],
                value: v[1]
            ))
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById(\'genre\'), \'light\');

            // 指定图表的配置项和数据
            option = 
                title: 
                    text: \'各类型专辑的数量统计图\',
                    subtext: \'从图中可以看出Indie类型的专辑数量最多。\',
                    // x: \'center\'
                    x: \'left\'
                ,
                tooltip: 
                    trigger: \'item\',
                    formatter: "a <br/>b : c (d%)"
                ,
                legend: 
                    x: \'center\',
                    y: \'bottom\',
                    data: d.map(v => v[0])
                ,
                toolbox: 
                    show: true,
                    feature: 
                        mark:  show: true ,
                        dataView:  show: true, readOnly: false ,
                        magicType: 
                            show: true,
                            type: [\'pie\', \'funnel\']
                        ,
                        restore:  show: true ,
                        saveAsImage:  show: true 
                    
                ,
                calculable: true,
                series: [
                    
                        name: \'半径模式\',
                        type: \'pie\',
                        radius: [30, 180],
                        center: [\'50%\', \'50%\'],
                        roseType: \'radius\',
                        label: 
                            normal: 
                                show: false
                            ,
                            emphasis: 
                                show: true
                            
                        ,
                        lableLine: 
                            normal: 
                                show: false
                            ,
                            emphasis: 
                                show: true
                            
                        ,
                        data: _data
                    
                ]
            ;

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        )
    </script>
</body>
</html>

这个通过读取 code/static/data/genre.json 中的数据,画出玫瑰图,显示各类型专辑的数量。

(3)在code/templates目录下新建genre-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-sales" ></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-sales.json", d => 
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById(\'genre-sales\'), \'light\');

            var dataAxis = d.map(v => v[0]);
            var data = d.map(v => parseInt(v[1])/1e6);

            option = 
                title: 
                    text: \'各类型专辑的销量统计图\',
                    subtext: \'该图统计了各个类型专辑的销量和,从图中可以看出 Indie 类型的专辑销量最高,将近 47 亿。Pop 类型的专辑销量排在第二,约为39亿。\',
                    x: \'center\',
                    // bottom: 10
                    padding: [0, 0, 15, 0]
                ,
                color: [\'#3398DB\'],
                tooltip: 
                    trigger: \'axis\',
                    axisPointer:             // 坐标轴指示器,坐标轴触发有效
                        type: \'shadow\'        // 默认为直线,可选为:\'line\' | \'shadow\'
                    
                ,
                grid: 
                    left: \'3%\',
                    right: \'4%\',
                    bottom: \'3%\',
                    containLabel: true
                ,
                xAxis: [
                    
                        type: \'category\',
                        data: dataAxis,
                        axisTick: 
                            show: true,
                            alignWithLabel: true,
                            interval: 0
                        ,
                        axisLabel: 
                            interval: 0,
                            rotate: 45,
                        
                    
                ],
                yAxis: [
                    
                        type: \'value\',
                        name: \'# Million Albums\',
                        nameLocation: \'middle\',
                        nameGap: 50 
                    
                ],
                series: [
                    
                        name: \'直接访问\',
                        type: \'bar\',
                        barWidth: \'60%\',
                        data: data
                    
                ]
            ;

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        )
    </script>
</body>
</html>

这个通过读取 code/static/data/genre-sales.json 中的数据,画出柱状图,显示各类型专辑的销量总数。

(4)在code/templates目录下新建year-tracks-and-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="canvas" ></div>
    <script type="text/javascript">
        $.getJSON("static/data/year-tracks-and-sales.json", d => 
            console.log(d)
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById(\'canvas\'), \'light\');

            var colors = [\'#5793f3\', \'#d14a61\', \'#675bba\'];

            option = 
                title: 
                    text: \'近20年的专辑数量和单曲数量的变化趋势\',
                    padding: [1, 0, 0, 15]
                    // subtext: \'该图显示了从2000年到2019年发行的专辑数量和单曲数量的变化趋势,从图中可以看出,专辑数量变化很小,基本稳定在5000左右;单曲数量有轻微的波动,大概为专辑数量的10倍。\'
                ,
                tooltip: 
                    trigger: \'axis\'
                ,
                legend: 
                    data: [\'单曲数量\', \'专辑数量\'],
                    padding: [2, 0, 0, 0]
                ,
                toolbox: 
                    show: true,
                    feature: 
                        dataZoom: 
                            yAxisIndex: \'none\'
                        ,
                        dataView:  readOnly: false ,
                        magicType:  type: [\'line\', \'bar\'] ,
                        restore: ,
                        saveAsImage: 
                    
                ,
                xAxis: 
                    type: \'category\',
                    boundaryGap: false,
                    data: d[\'years\'],
                    boundaryGap: [\'20%\', \'20%\']
                ,
                yAxis: 
                    type: \'value\',
                    // type: \'log\',
                    axisLabel: 
                        formatter: \'value\'
                           
                ,
                series: [
                    
                        name: \'单曲数量\',
                        type: \'bar\',
                        data: d[\'tracks\'],
                        barWidth: 15,
                    ,
                    
                        name: \'专辑数量\',
                        type: \'bar\',
                        data: d[\'albums\'],
                        barGap:  \'-100%\',
                        barWidth: 15,
                    
                ]
            ;

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        )
    </script>
</body>
</html>

这个通过读取 code/static/data/ year-tracks-and-sales.json 中的数据,画出柱状图,显示近20年每年发行的专辑数量和单曲数量。

(5)在code/templates目录下新建genre-year-sales.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-year-sales" ></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-year-sales.json", d => 
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById(\'genre-year-sales\'), \'light\');
            option = 
                legend: ,
                tooltip: 
                    trigger: \'axis\',
                    showContent: false
                ,
                dataset: 
                    source: [
                        [\'year\', ...d[\'Indie\'].map(v => `$v[1]`)],
                        ...[\'Indie\', \'Pop\', \'Rap\', \'Latino\', \'Pop-Rock\'].map(v => [v, ...d[v].map(v1 => v1[2])])
                    ]
                ,
                xAxis:  type: \'category\' ,
                yAxis:  gridIndex: 0 ,
                grid:  top: \'55%\' ,
                series: [
                     type: \'line\', smooth: true, seriesLayoutBy: \'row\' ,
                     type: \'line\', smooth: true, seriesLayoutBy: \'row\' ,
                     type: \'line\', smooth: true, seriesLayoutBy: \'row\' ,
                     type: \'line\', smooth: true, seriesLayoutBy: \'row\' ,
                     type: \'line\', smooth: true, seriesLayoutBy: \'row\' ,
                    
                        type: \'pie\',
                        id: \'pie\',
                        radius: \'30%\',
                        center: [\'50%\', \'25%\'],
                        label: 
                            formatter: \'b: @2000 (d%)\' //b是数据名,d是百分比
                        ,
                        encode: 
                            itemName: \'year\',
                            value: \'2000\',
                            tooltip: \'2000\'
                        
                    

                ]
            ;

            myChart.on(\'updateAxisPointer\', function (event) 
                var xAxisInfo = event.axesInfo[0];
                if (xAxisInfo) 
                    var dimension = xAxisInfo.value + 1;
                    myChart.setOption(
                        series: 
                            id: \'pie\',
                            label: 
                                formatter: \'b: @[\' + dimension + \'] (d%)\'
                            ,
                            encode: 
                                value: dimension,
                                tooltip: dimension
                            
                        
                    );
                
            );

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);

        )
    </script>
</body>
</html>

这个通过读取 code/static/data/ genre-year-sales.json 中的数据,画出扇形图和折线图,分别显示不同年份各类型专辑的销量占总销量的比例,和总销量前五的专辑类型的各年份销量变化。

(6)在code/templates目录下新建genre-critic.html文件。复制以下代码:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="static/js/echarts-gl.min.js"></script>
    <script src="static/js/jquery.min.js"></script>
</head>

<body>
    <a href="/">Return</a>
    <br>
    <br>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="genre-critic" ></div>
    <script type="text/javascript">
        $.getJSON("static/data/genre-critic.json", d => 
            console.log(d);

            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById(\'genre-critic\'), \'light\');
            option = 
                legend: ,
                tooltip: ,
                dataset: 
                    source: [
                        [\'genre\', ...d.map(v => v[0])],
                        [\'rolling_stone_critic\', ...d.map(v => v[1])],
                        [\'mtv_critic\', ...d.map(v => v[2])],
                        [\'music_maniac_critic\', ...d.map(v => v[3])]
                    ]
                ,
                xAxis: [
                     type: \'category\', gridIndex: 0 ,
                     type: \'category\', gridIndex: 1 
                ],
                yAxis: [
                     gridIndex: 0 , min: 2.7,
                     gridIndex: 1 , min: 2.7
                ],
                grid: [
                     bottom: \'55%\' ,
                     top: \'55%\' 
                ],
                series: [
                    // These series are in the first grid.
                     type: \'bar\', seriesLayoutBy: \'row\' , barWidth: 30,
                     type: \'bar\', seriesLayoutBy: \'row\' , barWidth: 30,
                     type: \'bar\', seriesLayoutBy: \'row\' , barWidth: 30 ,
                    // These series are in the second grid.
                     type: \'bar\', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35,
                     type: \'bar\', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35,
                     type: \'bar\', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35,
                     type: \'bar\', xAxisIndex: 1, yAxisIndex: 1 , barWidth: 35
                ]
            ;

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
        )
</script>
</body>
</html>

这个通过读取 code/static/data/ genre-critic.json 中的数据,画出柱形图,显示总销量前五的专辑类型,在不同评分体系中的平均评分。

5)web程序启动

① 在另一个Ubuntu终端窗口中,用 hadoop 用户登录,在命令行运行su hadoop,并输入用户密码。
② 进入代码所在目录。
③ 在命令行运行如下命令:

spark-submit VisualizationFlask.py

④ 在浏览器打开 http://127.0.0.1:5000/,可看到如下界面:

(1)各类型专辑的数量统计图

从图中可以看出Indie类型的专辑数量最多。

(2)各类型专辑的销量统计图

该图统计了各个类型专辑的销量和,从图中可以看出Indie类型的专辑销量最高,将近47亿。Pop类型的专辑销量排在第二,约为39亿。

(3)近20年每年发行的专辑数量和单曲数量统计图

(4)总销量前五的专辑类型的各年份销量分析图

(5)总销量前五的专辑类型的评分分析图

5.参考资料

ShowMeAI相关文章推荐

ShowMeAI系列教程推荐

以上是关于大数据人脸分析案例的主要内容,如果未能解决你的问题,请参考以下文章

利用opencv带你玩转人脸识别-下篇(人脸录入,数据训练,人脸识别小案例快速入门)

MATLAB教程案例31基于matlab的人脸检测相关算法的仿真与分析——肤色模型与形态学图像处理方法

AI人脸检测/行为识别智能分析网关8大智慧应用场景分析

案例分析:大数据平台技术方案及案例(ppt)

人脸识别完整项目实战:完整项目案例运行演示

大数据技术丛书《数据挖掘实用案例分析》