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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章