【Python】使用Face++的人脸识别detect API进行本地图片情绪识别并存入excel

准备工作

首先,需要在Face++的主页注册一个账号,在控制台去获取API Key和API Secret。

然后在本地文件夹准备好要进行情绪识别的图片/相片。

代码

介绍下所使用的第三方库

——urllib2是使用各种协议完成打开url的一个库

——time是对时间进行处理的一个库,以下代码中其实就使用了sleep()和localtime()两个函数,sleep()是用来让程序暂停几秒的,localtime()是格式化时间戳为本地的时间

——xlwt是对excel进行写入操作的一个库

——os是操作系统的相关功能的一个库,例如用来处理文件和目录之类的

——json (Emmmmmm……我也不知道该怎么解释这个)

——PIL是Python图像处理库

  1 # -*- coding: utf-8 -*-
  2 # version:python2.7.13
  3 # author:Ivy Wong
  4
  5 # 导入相关模块
  6 import urllib2
  7 import time, xlwt, os,json
  8 from PIL import Image
  9
 10 # 使用face++的api识别情绪
 11 def useapi(img):
 12     http_url = ‘https://api-cn.faceplusplus.com/facepp/v3/detect‘
 13     boundary = ‘----------%s‘ % hex(int(time.time() * 1000))
 14     data = []
 15     data.append(‘--%s‘ % boundary)
 16     data.append(‘Content-Disposition: form-data; name="%s"\r\n‘ % ‘api_key‘)
 17     data.append(key)
 18     data.append(‘--%s‘ % boundary)
 19     data.append(‘Content-Disposition: form-data; name="%s"\r\n‘ % ‘api_secret‘)
 20     data.append(secret)
 21     data.append(‘--%s‘ % boundary)
 22     fr = open(img, ‘rb‘)
 23     data.append(‘Content-Disposition: form-data; name="%s"; filename=" "‘ % ‘image_file‘)
 24     data.append(‘Content-Type: %s\r\n‘ % ‘application/octet-stream‘)
 25     data.append(fr.read())
 26     fr.close()
 27     data.append(‘1‘)
 28     data.append(‘--%s‘ % boundary)
 29     data.append(‘Content-Disposition: form-data; name="%s"\r\n‘ % ‘return_attributes‘)
 30     data.append("gender,age,emotion,ethnicity")# 这里可以还可以返回其他参数,具体可以参看face++的api文档
 31     data.append(‘--%s--\r\n‘ % boundary)
 32
 33     http_body = ‘\r\n‘.join(data)
 34     # build http request
 35     req = urllib2.Request(http_url)
 36     # header
 37     req.add_header(‘Content-Type‘, ‘multipart/form-data; boundary=%s‘ % boundary)
 38     req.add_data(http_body)
 39     try:
 40         resp = urllib2.urlopen(req,timeout=5)
 41         qrcont = json.load(resp)
 42     except urllib2.HTTPError as e:
 43         print e.read()
 44     return qrcont
 45
 46
 47 # 将json字典写入excel
 48 # 变量用来循环时控制写入单元格,感觉这种方式有点傻,但暂时想不到优化方法
 49 def writeexcel(img, worksheet, row, files_name):
 50     parsed = useapi(img)
 51     if not parsed[‘faces‘]:
 52         print ‘This picture do not have any face‘
 53     else:
 54         if len(parsed[‘faces‘])<=5: # 由于免费API限制,只能返回5张人脸信息
 55             for list_item in parsed[‘faces‘]:
 56                 # 写入文件名
 57                 filename, extension = os.path.splitext(files_name)
 58                 worksheet.write(row, 0, filename)
 59
 60                 # 写入时间戳
 61                 daystamp, timestamp, hourstamp = gettimestamp(img)
 62                 worksheet.write(row, 1, label=daystamp)
 63                 worksheet.write(row, 2, label=timestamp)
 64                 worksheet.write(row, 3, hourstamp)
 65
 66                 # 写入api返回的数据
 67                 emotion = []
 68                 for key1, value1 in list_item.items():
 69                     if key1 == ‘attributes‘:
 70                         for key2, value2 in value1.items():
 71                             if key2 == ‘age‘:
 72                                 worksheet.write(row, 5, value2[‘value‘])
 73                             elif key2 == ‘emotion‘:
 74                                 for key3, value3 in value2.items():
 75                                     if key3 == ‘sadness‘:
 76                                         worksheet.write(row, 8, value3)
 77                                         emotion.append(value3)
 78                                     elif key3 == ‘neutral‘:
 79                                         worksheet.write(row, 9, value3)
 80                                         emotion.append(value3)
 81                                     elif key3 == ‘disgust‘:
 82                                         worksheet.write(row, 10, value3)
 83                                         emotion.append(value3)
 84                                     elif key3 == ‘anger‘:
 85                                         worksheet.write(row, 11, value3)
 86                                         emotion.append(value3)
 87                                     elif key3 == ‘surprise‘:
 88                                         worksheet.write(row, 12, value3)
 89                                         emotion.append(value3)
 90                                     elif key3 == ‘fear‘:
 91                                         worksheet.write(row, 13, value3)
 92                                         emotion.append(value3)
 93                                     else:
 94                                         worksheet.write(row, 14, value3)
 95                                         emotion.append(value3)
 96                             elif key2 == ‘gender‘:
 97                                 worksheet.write(row, 6, value2[‘value‘])
 98                             elif key2 == ‘ethnicity‘:
 99                                 worksheet.write(row, 7, value2[‘value‘])
100                             else:
101                                 pass
102                     elif key1 == ‘face_token‘:
103                         worksheet.write(row, 4, value1)
104                     else:
105                         pass
106                 worksheet.write(row, 15, emotion.index(max(emotion)))
107
108                 # 写入概率最大的情绪,0-neutral,1-sadness,2-disgust,3-anger,4-surprise,5-fear,6-happiness
109                 row += 1
110         else:
111             for list_item in parsed[‘faces‘][0:5]:
112                 # 写入文件名
113                 filename, extension = os.path.splitext(files_name)
114                 worksheet.write(row, 0, filename)
115
116                 # 写入时间戳
117                 daystamp, timestamp, hourstamp = gettimestamp(img)
118                 worksheet.write(row, 1, label=daystamp)
119                 worksheet.write(row, 2, label=timestamp)
120                 worksheet.write(row, 3, hourstamp)
121
122                 # 写入api返回的数据
123                 emotion = []
124                 for key1, value1 in list_item.items():
125                     if key1 == ‘attributes‘:
126                         for key2, value2 in value1.items():
127                             if key2 == ‘age‘:
128                                 worksheet.write(row, 5, value2[‘value‘])
129                             elif key2 == ‘emotion‘:
130                                 for key3, value3 in value2.items():
131                                     if key3 == ‘sadness‘:
132                                         worksheet.write(row, 8, value3)
133                                         emotion.append(value3)
134                                         print ‘1‘
135                                     elif key3 == ‘neutral‘:
136                                         worksheet.write(row, 9, value3)
137                                         emotion.append(value3)
138                                         print ‘2‘
139                                     elif key3 == ‘disgust‘:
140                                         worksheet.write(row, 10, value3)
141                                         emotion.append(value3)
142                                         print ‘3‘
143                                     elif key3 == ‘anger‘:
144                                         worksheet.write(row, 11, value3)
145                                         emotion.append(value3)
146                                         print ‘4‘
147                                     elif key3 == ‘surprise‘:
148                                         worksheet.write(row, 12, value3)
149                                         emotion.append(value3)
150                                         print ‘5‘
151                                     elif key3 == ‘fear‘:
152                                         worksheet.write(row, 13, value3)
153                                         emotion.append(value3)
154                                         print ‘6‘
155                                     else:
156                                         worksheet.write(row, 14, value3)
157                                         emotion.append(value3)
158                                         print ‘7‘
159                             elif key2 == ‘gender‘:
160                                 worksheet.write(row, 6, value2[‘value‘])
161                             elif key2 == ‘ethnicity‘:
162                                 worksheet.write(row, 7, value2[‘value‘])
163                             else:
164                                 pass
165                     elif key1 == ‘face_token‘:
166                         worksheet.write(row, 4, value1)
167                     else:
168                         pass
169                 worksheet.write(row, 15, emotion.index(max(emotion)))
170                 # 写入概率最大的情绪,0-neutral,1-sadness,2-disgust,3-anger,4-surprise,5-fear,6-happiness
171                 row += 1
172                 print ‘Success! The pic ‘ + str(files_name) + ‘ was detected!‘
173
174     return row, worksheet
175
176 # 获取图片大小
177 def imagesize(img):
178     Img = Image.open(img)
179     w, h = Img.size
180     return w,h
181
182 # 获取时间戳
183 def gettimestamp(path):
184     statinfo = os.stat(path)
185     timeinfo = time.localtime(statinfo.st_ctime)
186     daystamp = str(timeinfo.tm_year) + ‘-‘ + str(timeinfo.tm_mon) + ‘-‘ + str(timeinfo.tm_mday)
187     timestamp = str(timeinfo.tm_hour) + ‘:‘ + str(timeinfo.tm_min) + ‘:‘ + str(timeinfo.tm_sec)
188     hourstamp = timeinfo.tm_hour + timeinfo.tm_min / 60.0 + timeinfo.tm_sec / 3600.0
189     return daystamp, timestamp, hourstamp
190
191
192 key = "your_key"
193 secret = "your_secret"
194 path = r"图片文件夹路径"
195 # 注意:由于我是对同一文件夹下的多个文件夹中的图片进行识别,所以这个path是图片所在文件夹的上一级文件夹。文件夹名尽量使用英文与数字,不然可能因为编码问题报错
196
197 # 创建excel
198 workbook = xlwt.Workbook(encoding=‘utf-8‘)
199
200 for root, dirs, files in os.walk(path, topdown=False):
201     for folder in dirs:
202         print ‘Let us start dealing with folder ‘ + folder
203
204         # 创建一个新的sheet
205         worksheet = workbook.add_sheet(folder)
206         # 设置表头
207         title = [‘PhotoID‘, ‘daystamp‘, ‘timestamp‘, ‘hourstamp‘,‘faceID‘, ‘age‘, ‘gender‘, ‘ethnicity‘, ‘sadness‘,
208                  ‘neutral‘,‘disgust‘, ‘anger‘, ‘surprise‘, ‘fear‘, ‘happiness‘, ‘emotion‘]
209         for col in range(len(title)):
210             worksheet.write(0, col, title[col])
211
212         # 遍历每个folder里的图片
213         row = 1
214         for root2, dirs2, files2 in os.walk(path + ‘\\‘ + folder):
215             for files_name in files2:
216                 img = path + ‘\\‘ + folder + ‘\\‘ + files_name
217                 try:
218                     print ‘Now, the program is going to deal with ‘ + folder + ‘ pic‘ + str(files_name)
219                     w,h=imagesize(img)
220                     if w<48 or h<48 or w>4096 or h>4096:#API对图片大小的限制
221                         print ‘invalid image size‘
222                     else:
223                         row, worksheet = writeexcel(img, worksheet, row, files_name)
224
225                 except:
226                     print ‘超过了并发数!等一下!‘
227                     time.sleep(3)
228                     print ‘The program is going to work‘
229                     print ‘Now, the program is going to deal with ‘ + folder + ‘ pic‘ + str(files_name)
230                     row, worksheet = writeexcel(img, worksheet, row, files_name)
231
232
233         workbook.save(‘detactface_facepp_flickr.xls‘)
234         print ‘The current folder is done.‘
235
236 # 保存文件
237 workbook.save(‘detectface.xls‘)
238 print ‘All done!‘

成果

最后生成的excel大概是这个样子。

其中emotion就是概率最大的情绪,0-neutral,1-sadness,2-disgust,3-anger,4-surprise,5-fear,6-happiness。

探讨

在我自己运行过程中发现了一个问题,由于使用的是免费API,有并发限制,多次超过并发数,urlopen就会返回403。于是try失败,运行except,return时无定义的qrcont而报错。

1     try:
2         resp = urllib2.urlopen(req,timeout=5)
3         qrcont = json.load(resp)
4     except urllib2.HTTPError as e:
5         print e.read()
6     return qrcont

这就非常尴尬了,所以目前基本上都是大晚上在用这个代码跑……不知看到的各位有何高见?

原文地址:https://www.cnblogs.com/IvyWong/p/8989718.html

时间: 2024-10-07 16:55:04

【Python】使用Face++的人脸识别detect API进行本地图片情绪识别并存入excel的相关文章

Tesseract-OCR-v5.0中文识别,训练自定义字库,提高图片的识别效果

1,下载安装Tesseract-OCR 安装,链接地址https://digi.bib.uni-mannheim.de/tesseract/ ? 2,安装成功 tesseract -v 注意:安装后,要添加系统环境变量 ? 3,cmd指定目录到 cd C:\Work\BlogsTest\TestPic,要识别图片的文件夹 识别:tesseract test.png result -l chi_sim ? 识别成功的效果,result.txt文件会自动生成 ? 要注意:Tesseract-OCR的

pytesseract在识别只有一个数字的图片时识别不出来

大家好,近期在做自动化测试时,遇到了一个问题需要通过识别图片来实现,遂用到了pytesseract模块和tesseract-ocr这个工具.在使用过程中发现,识别带有数字的图片时,如果这个图片上仅有一个数字,则识别不出来,如下图.若识别2个数字以上的图片则可以识别出来,如下图.(2个数字有时可以识别,有时不行.)两种图片的运行结果如下图.这个问题出现的时候就一脸懵逼了,就怕这种"偶现"的问题,因为我是第一次用tesseract-ocr,在网上找了一下午也没有找到结果,最后加了一个tes

第二十三节:scrapy爬虫识别验证码(二)图片验证码识别

图片验证码基本上是有数字和字母或者数字或者字母组成的字符串,然后通过一些干扰线的绘制而形成图片验证码. 例如:知网的注册就有图片验证码 首先我们需要获取验证码图片,通过开发者工具我们可以得到验证码url链接 其次就是通过Pillow类库和tesserocr进行识别,代码如下: 1 # -*- coding:utf-8 -*- 2 import tesserocr 3 from PIL import Image 4 import requests 5 6 # 通过url链接获取验证码图片,并写入本

用图片文字识别软件 复制微信小助手的开票信息

微信目前有开票小助手的功能,可以保存开票信息,客户经常会发微信开票小助手里的截图,附带有个二维码,这边可以扫描二维码获取抬头,虽然听说有用二维码极速开票的,对于这个不清楚,也不打算了解,本人还是用的传统方式,开票信息也不算多,最多也就四条.刚开始的时候,如果客户发这种图,我会直接对照着手打,因为数据不是很多,如果不是很忙,没有其他事情,下单的时候还没给快递打电话,手打之后在一个个对照一下,确认后打出来,再对照一下,也没什么问题.后来,客户由于有时候下午下单,时间有时候比较晚,已经给顺丰打电话了,

职场专业图片文字识别的方法,你知道吗

在职场中又一个专业的图片文字识别方法,工作不是经常整理图片文字的员工不知道,那就是使用一下专业的OCR文字识别软件,在加上专业的操作方法,就可以快速的把图片上的文字识别出来了.在平时生活中实现图片文字识别的方法不是很好用,而且操作步骤很繁琐,下面小编就分享一个专业的图片文字识别方法.工具和原料:1:带有文字的图片:2:OCR文字识别工具.操作方法:第一步:[打开OCR软件]:在电脑上打开文字识别软件,大家可以通过浏览器搜索关键词"迅捷OCR文字识别软件"找到OCR软件.第二步:[极速识

使用电脑实现图片文字识别的方法

电脑是我们常用的办公工具之一,在职场中,唯独不可缺少的就是电脑,整理一些文件和处理一些工作,我们都需要在电脑上进行,那么我们如何在电脑上实现图片文字识别呢,知道方法的人很简单,只需要在电脑上准备一个工具,便可以轻松的完成,下面小编分享一个简单而又高效的方法.使用工具:迅捷OCR文字识别工具:操作方法:第一步:在电脑上运行OCR文字识别软件,不知道在哪下的朋友,可以打开百度或者是软件管家上面下载: 第二步:点击左边功能栏中的极速识别功能,进入图片文字识别界面:第三步:点击上面的添加文件按钮,将需要

python三步实现人脸识别

原文地址https://www.toutiao.com/a6475797999176417550 Face Recognition软件包 这是世界上最简单的人脸识别库了.你可以通过Python引用或者命令行的形式使用它,来管理和识别人脸. 该软件包使用dlib中最先进的人脸识别深度学习算法,使得识别准确率在<Labled Faces in the world>测试基准下达到了99.38%. 它同时提供了一个叫face_recognition的命令行工具,以便你可以用命令行对一个文件夹中的图片进

python之OpenCv(四)---人脸识别

对特定图像进行识别,最关键的是要有识别对象的特征文件.OpenCV已经内置了人脸识别特征文件,我们只要使用OpenCV的CascadeClassifier类即可进行识别. 语法: https://github.com/opencv/opencv.git 在这里可以下载特征文件,在data目录下 识别对象变量 = cv2.CascadeClassifier(特征文件).. 识别对象 识别结果变量 = 识别对象变量.detectMultiScale(图片,参数1,参数2,...) 参数有: 1.sc

C++开发人脸性别识别教程(12)——添加性别识别功能

经过之前几篇博客的讲解,我们已经成功搭建了MFC应用框架,并实现了基本的图像显示和人脸检测程序,在这篇博文中我们要向其中添加性别识别代码. 关于性别识别,之前已经专门拿出两篇博客的篇幅来进行讲解,这里不再赘述,具体参见:C++开发人脸性别识别教程(5)——通过FaceRecognizer类实现性别识别和C++开发人脸性别识别教程(6)——通过SVM实现性别识别. 一.分类器训练 在进行人脸性别识别之前需要训练性别识别的分类器,而分类器的训练过程是相对耗时的(大约五分钟),因此这里我们采用离线训练