Python调用腾讯优图进行人脸检测分析,并可视化

opexcel.py

import xlrd
import xlwt
from xlutils.copy import copy
class Operatingexcel():
    def get_excel_dic(self,filename,sheetname):
        # filename 文件名
        # sheetname 表单名
        # 返回字典格式
        dic = {}
        data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
        table = data.sheet_by_name(sheetname)
        for i in range(1, table.nrows):
            for y in range(len(table.row_values(0))):
                if table.row_values(i)[y] != "":
                    dic.setdefault(table.row_values(0)[y], []).append(table.row_values(i)[y])
        return dic

    def get_excel_list(self,filename,sheetname):
        # filename 文件名
        # sheetname 表单名
        # 返回列表格式
        list = []
        data = xlrd.open_workbook(filename, 'r', encoding_override='utf-8')
        table = data.sheet_by_name(sheetname)
        for y in range(table.nrows):
            for x in range(len(table.row_values(0))):
                if table.row_values(y)[x] != "":
                    list.append(table.row_values(y)[x])
        return list

    def set_excel_dic(self,dic,filename,sheet_index,start_r):
        # filename 文件名
        # sheet_index第几个工作表格
        # start_r那一列

        x = start_r
        for k in dic.keys():
            list = []
            list.append(k)
            for v in dic[k]:
                list.append(v)
            self.set_excel_list(list,filename,sheet_index,x)
            x = x + 1

    def set_excel_list(self,list,filename,sheet_index,start_r):
        # filename 文件名
        # sheet_index第几个工作表格
        # start_r那一列

        # 读取excel文件
        r_xls = xlrd.open_workbook(filename)
        # 将xlrd的对象转化为xlwt的对象
        excel = copy(r_xls)
        table = excel.get_sheet(sheet_index)
        for y in range(len(list)):
            table.write(y,start_r,str(list[y]))
        excel.save(filename)

Draw.py

from pyecharts.charts import Pie
from pyecharts import options as opts
from pyecharts.charts import Line
class Draw():
    def drawpie(attr,value,name):
        list1 = [list(z) for z in zip(attr,value)]
        # 图表初始化配置
        init_opts = opts.InitOpts(page_title=name)

        pie = Pie(init_opts=init_opts)
        # 标题配置
        title = opts.TitleOpts(title=name,
                               pos_left='center')
        # 图例配置
        legend_opts = opts.LegendOpts(orient="vertical",
                                      pos_top="20%",
                                      pos_left="15%")

        # 工具箱配置
        # feature = opts.ToolBoxFeatureOpts(save_as_image=True, restore=True, data_view=True, data_zoom=True)
        # 工具箱配置
        toolbox_opts = opts.ToolboxOpts(orient="vertical",
                                        pos_top="25%",
                                        pos_right="15%"
                                        )

        pie.set_global_opts(title_opts=title,
                            legend_opts=legend_opts,
                            toolbox_opts=toolbox_opts
                            )
        # 标签配置项
        pie.add("",
                list1,
                radius=[30, 75],
                center=['50%', '70%'],
                rosetype="area",
                label_opts=opts.LabelOpts(
                    position="outside",
                    formatter="{b|{b}: }{c}  {per|{d}%}  ",
                    background_color="#eee",
                    border_color="#aaa",
                    border_width=1,
                    border_radius=4,
                    rich={
                        "a": {"color": "#999", "lineHeight": 22, "align": "center"},
                        "abg": {
                            "backgroundColor": "#e3e3e3",
                            "width": "100%",
                            "align": "right",
                            "height": 22,
                            "borderRadius": [4, 4, 0, 0],
                        },
                        "hr": {
                            "borderColor": "#aaa",
                            "width": "100%",
                            "borderWidth": 0.5,
                            "height": 0,
                        },
                        "b": {"fontSize": 16, "lineHeight": 33},
                        "per": {
                            "color": "#eee",
                            "backgroundColor": "#334455",
                            "padding": [2, 4],
                            "borderRadius": 2,
                        },
                    },
                ),

         )

        pie.render('{0}.html'.format(name))
    # 趋势图
    def drawline(list1,list4,name):

        # 图表初始化配置
        init_opts = opts.InitOpts(page_title=name)

        line = Line(init_opts=init_opts)
        # 标题配置
        title = opts.TitleOpts(title=name,
                               pos_left="10%")
        # 图例配置
        legend_opts = opts.LegendOpts(orient="horizontal",
                                      pos_top="5%",
                                      pos_right="15%")

        # 工具箱配置
        # feature = opts.ToolBoxFeatureOpts(save_as_image=True, restore=True, data_view=True, data_zoom=True)
        # 工具箱配置
        toolbox_opts = opts.ToolboxOpts(orient="vertical",
                                        pos_bottom="15%",
                                        pos_left="90%",
                                        )

        line.set_global_opts(title_opts=title,
                             legend_opts=legend_opts,
                             toolbox_opts=toolbox_opts,
                             yaxis_opts=opts.AxisOpts(name="单位:岁",
                                                      # axislabel_opts=opts.LabelOpts(formatter="{value}例",
                                                    ),
                             xaxis_opts=opts.AxisOpts(name="日期"),
                            datazoom_opts = opts.DataZoomOpts(orient="vertical"),
                             )
        line.add_xaxis(list4, )
        line.add_yaxis(name, list1, is_smooth=True, linestyle_opts=opts.LineStyleOpts(color="#E83132", width="4"))
        line.render('{0}.html'.format(name))

统计人脸.py

"""
author:魏振东
date:20200331
func:腾讯优图人脸识别
"""
import TencentYoutuyun
import os
from tencent.Draw import Draw
from opdata.opexcel import Operatingexcel

# 输入路径返回有效数据
def youtu(image_path):
    appid = '10151047'
    secret_id = 'AKID59AA4pi1Sis5GIS2tdCe1b7W2T2asTjr'
    secret_key = 'N5mMxsiO6zjIk7Kj3DIPPLG4mOvOjvpk'
    userid = '924271966'
    end_point = TencentYoutuyun.conf.API_YOUTU_END_POINT  # 优图开放平台
    youtu = TencentYoutuyun.YouTu(appid, secret_id, secret_key, userid, end_point)

    req = youtu.DetectFace(image_path=image_path, mode=0, data_type=0)
    return req

# 以字典形式返回有效数据,以及所有图片的长度
def youtu_face():
    # 获取所有文件名称
    imgs = os.listdir("img")
    dic_face = {}
    # 分析人脸,并把人脸数据存储到字典中
    for i in imgs:
        path = "img/{0}".format(i)
        req = youtu(path)
        if req["face"] != [] and req["face"][0] != {}:
            dic_face.setdefault("人脸", []).append(req)
    return dic_face["人脸"],len(imgs)

# gender	Int	性别[0/(female)~100(male)]
def data_gender(list):
    female = 0
    male = 0
    for i in list:
        if int(i)>=50:
            male = male + 1
        else:
            female = female + 1
    return female,male

# glasses	Int	眼镜[0不戴眼镜 1戴眼镜 2戴墨镜] 注:替代原glass(Bool)字段
def data_glasses(list):
    glasses0 = 0
    glasses1 = 0
    glasses2 = 0
    for i in list:
        if int(i)==0:
            glasses0 =  glasses0 + 1
        elif int(i)==0:
            glasses1 = glasses1 + 1
        else:
            glasses2 = glasses2 + 1
    return glasses0,glasses1,glasses2


if __name__ == '__main__':
    d = Draw
    og = Operatingexcel()
    dic_face,len_img = youtu_face()

    """"下载一些图片,包括人像,动物,花朵还有你自己的相片,编程实现识别识别人像,统计人像图片的个数,用饼状图表示占比。"""
    attr = ['人像', '非人像']
    value = [len(dic_face), len_img-len(dic_face)]
    d.drawpie(attr, value,"人像比例")


    # 因为每次分析数据比较麻烦,所以吧数据保存到excel中
    # dict = {}
    # for i in dic_face:
    #     dict.setdefault("性别", []).append(i["face"][0]["gender"])
    #     dict.setdefault("年龄", []).append(i["face"][0]["age"])
    #     dict.setdefault("微笑", []).append(i["face"][0]["expression"])
    #     dict.setdefault("魅力", []).append(i["face"][0]["beauty"])
    #     dict.setdefault("眼镜", []).append(i["face"][0]["glasses"])
    # print(dict)
    # 保存到文件中
    # og.set_excel_dic(dict, "统计信息.xlsx", 0, 0)

    """"对文件夹中的人像图片,测颜值、是否带帽子、戴眼镜等属性并输出。"""
    dicc = og.get_excel_dic("统计信息.xlsx", "Sheet1")

    """性别比例饼状图"""
    female,male = data_gender(dicc["性别"])
    attr = ['female', 'male']
    value = [female, male]
    d.drawpie(attr, value,"男女比例饼状图")

    """"年龄折线图"""
    l = [str(x) for x in range(len(dicc["年龄"]))]
    d.drawline(list1=dicc["年龄"],list4=l,name="年龄折线图")

    """微笑人数饼图"""
    female,male = data_gender(dicc["微笑"])
    attr = ['笑', '不笑']
    value = [female, male]
    d.drawpie(attr, value,"微笑人数饼图")

    """魅力值折线图"""
    l = [str(x) for x in range(len(dicc["魅力"]))]
    d.drawline(list1=dicc["魅力"],list4=l,name="魅力值")

    """"眼镜饼状图"""
    glasses0,glasses1,glasses2 = data_glasses(dicc["眼镜"])
    attr = ['不戴眼镜', '戴眼镜', '戴墨镜']
    value = [glasses0,glasses1,glasses2]
    d.drawpie(attr, value,"眼镜饼状图")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://github.com/lofxve/youtu

发布了39 篇原创文章 · 获赞 41 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wei_zhen_dong/article/details/105229167