美文网首页
PRO-002:统计分析微信头像使用人脸的情况

PRO-002:统计分析微信头像使用人脸的情况

作者: 杨强AT南京 | 来源:发表于2018-11-05 18:02 被阅读71次

    本这主题的目标:
    (1)了解数据采集的方式的多样性(微信数据采集)。
    (2)了解简单的人工智能处理技术称为未来开发技术的常态应用技术。
    (3)了解数据可视化也是Python的强项之一。


    一、程序结构

    1. 程序功能

      我们的目标简单实现,登录到微信,下载所有好友头像,并进行头像的人脸识别,把产生的统计数据可视化出来。
      核心功能就是:
       |-好友头像下载(downloadFriendsFaces)
       |-好友头像人脸识别(recognize)
       |-好友头像识别统计数据可视化(visualPie)

    2. 程序的核心对象与类

      我们可以把这三个核心的功能,交给三个对象去完成。
       |-微信数据采集模块(DataFromWebchat)
       |-图像几何人工智能识别模块(AiR)
       |-数据可视化模块(VisualData)

    3. 对象的责任分配

      简单分析下上述三个模块之间的数据关系,可以实现如下程序结构:
      (1)DataFromWebchat模块

    #coding=utf-8
    import matplotlib
    class DataFromWebchat:
        def __init__(self,facedir):
            #初始化存放目录
            pass
        def downloadFriendsFaces(self):
            pass
            print("download")
            #login
            #获取好友列表
            #下载好友头像
    

      (2)AiR模块

    class AiR:
        def __init__(self,facedir):
            #分类器初始化
            #图像目录
            pass
        def recognize(self):
            sum=0
            isface=0
            print("recognize")
            return (sum,isface)
    

      (3)VisualData模块

    class VisualData:
        def __init__(self):
            pass
            #初始化绘制环境
        def visualPie(self,data):
            pass
            print("Pie")
    

      (4)三个模块最终实现的业务逻辑关系的AnalysisApp模块

    FACEDIR="./faces"
    class AnalysisApp:
        data=DataFromWebchat(FACEDIR)
        ai = AiR(FACEDIR)
        visual=VisualData()
    
        def analysis(self):
            print("analysis")
            self.data.downloadFriendsFaces()
            sum,isfaces=self.ai.recognize()
            self.visual.visualPie((isfaces,sum-isfaces))
    

      (5)启动系统

    app=AnalysisApp()
    app.analysis()
    
    

    二、程序实现

    1、引用的模块

    import cv2
    import matplotlib.pyplot as plt
    import matplotlib.font_manager
    import itchat
    import os
    import sys
    

    2. 用Python程序获取所有微信好友;

      (1)构造器与数据

        def __init__(self,facedir):
            #初始化存放目录
            self.facedir=facedir
    

      (1)登录

            #登录
            print("开始登录.....")
            itchat.auto_login(hotReload=True)
    

      (2)获取好友列表

            #获取好友列表
            print("开始获取好友列表.....")
            friends=itchat.get_friends()
    

      (3)了解好友的信息结构
      好友信息是一个list列表,使用for... in可以实现遍历。每个用户是一个字典,字典很多字段,其中有一个是userName,这个可以用来获取用户头像。其他信息都可以直接在指点获取,微信头像的图像是单独存放的,所以获取方式需要单独的API。

            for friend in  friends:
                username=friend['UserName']
    

    3. 获取微信好友头像等信息;

      (1)获取头像

                faceData = itchat.get_head_img(userName=username)
    

      (2)保存头像
      头像文件名使用流水编号(采用5位数字来格式化文件名),文件读写采用二进制字节读写模式。

            for friend in  friends:
                username=friend['UserName']
                #获取图像并保存
                filename=self.facedir+"face%05d.png"%(counter)
                with open(filename,"wb") as fd:
                    faceData = itchat.get_head_img(userName=username)
                    fd.write(faceData)
                counter+=1
    

      (3)完整的微信用户头像数据采集模块如下:

    class DataFromWebchat:
        def __init__(self,facedir):
            #初始化存放目录
            self.facedir=facedir
            pass
        def downloadFriendsFaces(self):
            #登录
            print("开始登录.....")
            itchat.auto_login(hotReload=True)
            #获取好友列表
            print("开始获取好友列表.....")
            friends=itchat.get_friends()
            #下载好友头像
            counter=0
            print("开始下载好友头像.....")
            for friend in  friends:
                print(".",end="")
                if (counter+1)%60==0:
                    print()
                sys.stdout.flush()
                username=friend['UserName']
                #获取图像并保存
                filename=self.facedir+"face%05d.png"%(counter)
                with open(filename,"wb") as fd:
                    faceData = itchat.get_head_img(userName=username)
                    fd.write(faceData)
                counter+=1
                #下面是为了提高测试速度,正是运行可以注释掉
                #if counter>=50:
                #    break
            print("")
            print("好友头像下载完毕!")
    

    4、使用Python对微信好友头像识别分类;

      (1)构建一个人脸分类器

          self.classfier=cv2.CascadeClassifier(
                "haarcascade_frontalface_alt2.xml")
    

      (2)循环识别头像图像中的人脸

        def recognize(self):
            files=os.listdir(self.facesdir)
            for file in files:
                file=self.facesdir+file
                if os.path.splitext(file)[1]==".png":
                    #开始识别
                    img=cv2.imread(file)
                    faces=self.classfier.detectMultiScale(img,scaleFactor=1.1,minNeighbors=5)
                    if len(faces)>0:
                        print(file)
                        self.isfaces+=1
                    self.sum+=1
            return (self.sum,self.isfaces)
    

      (3)完整的头像人脸识别分析模块代码如下:

    class AiR:
        def __init__(self,facedir):
            #分类器初始化
            self.classfier=cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
            #图像目录
            self.facedir=facedir
        def recognize(self):
            sum=0
            isface=0
            #遍历图像目录逐个识别
            print("开始识别好友头像是否是人脸.....")
            files=os.listdir(self.facedir)
            for file in files:
    
                if (sum+1)%60==0:
                    print()
                file=self.facedir + file
                if os.path.splitext(file)[1] == ".png":
                    img=cv2.imread(file)
                    faces=self.classfier.detectMultiScale(image=img,scaleFactor=1.2,minNeighbors=5)
                    if len(faces)>0:
                        isface+=1
                        print("\033[32m.\033[0m", end="")
                    else:
                        print("\033[31mx\033[0m", end="")
                    sys.stdout.flush()
                    sum+=1
            print()
            print("头像识别完毕!")
            return (sum,isface)
    

    5、微信分析结果可视化;

      (1)可视化的初始化与汉字字体处理

        def __init__(self):
            #环境设置
            plt.figure(figsize=(8,5),dpi=80)
            plt.axes(aspect=1)
    

      (2)可视化参数设置

        def visualPie(self,data):
            sum=data[0]
            isfaces=data[1]
            pie=plt.pie((100.0*isfaces/sum,100.0*(sum-isfaces)/sum),
                        labels=("is face","not face"),
                        colors=("red","gray"),
                        labeldistance=1.1,
                        autopct="%5.2f%%",
                        shadow=False,
                        startangle=0,
                        pctdistance=0.6)
            plt.title("webchat faces analysis")
            plt.show()
    

      (3)完整的可视化模块代码如下:

    class VisualData:
        def __init__(self):
            #初始化绘制环境
            self.font = matplotlib.font_manager.FontProperties(fname="msyh.ttf")
            plt.figure(figsize=(8, 5), dpi=80)
            plt.axes(aspect=1)
    
        def visualPie(self,data):
            sum=data[0]
            isfaces=data[1]
            print("数据分析可视化!")
            pie=plt.pie((100.0*isfaces/sum,100.0*(sum-isfaces)/sum),   #绘制数据
                    labels=("使用人脸做头像","不使用人脸做头像"),  # 性别展示标签
                    colors=("red","gray"),  # 饼图区域配色
                    labeldistance=1.1,  # 标签距离圆点距离
                    autopct='%5.2f%%',  # 饼图区域文本格式
                    shadow=False,  # 饼图是否显示阴影
                    startangle=0,  # 饼图起始角度
                    pctdistance=0.6,  # 饼图区域文本距离圆点距离
                )
            for item in pie[1]:
                item.set_fontproperties(self.font)
            plt.title('微信好友使用人脸头像情况(总数=%d)'%data[0],fontproperties=self.font)
            plt.show()
    

    6. 运行结构

      (1)终端输出

    微信图像采集与识别输出

      (2)可视化结果

    微信好友头像使用人像的分析结果

      (3)下载的微信好友头像

    微信好友头像下载目录列表

    资源

     1. 本主题的代码下载:
       |-文件名:"webchat_ana_1.py"
       |-下载地址:https://github.com/QiangAI/PythonProject

    相关文章

      网友评论

          本文标题:PRO-002:统计分析微信头像使用人脸的情况

          本文链接:https://www.haomeiwen.com/subject/npcxxqtx.html