查看原文
其他

案例 | 通过R对照片进行情绪分析

2016-11-06 王亨 R语言中文社区

      R中允许以结构化的方式分析人脸。 注意,必须创建一个帐户来使用Face API。
      该示例引用了一个简单的
:使用的是现任美国总统奥巴马的照片;如下

需要加载的包有: httr, XML, stringr, ggplot2.

# 加载相关包 
library("httr")#链接API 
library("XML")#爬取网页数据 
library("stringr")#字符串处理 
library("ggplot2")#绘图使用  
# Define image source 
img.url     = 'https://www.whitehouse.gov/sites/whitehouse.gov/files/images/first-family/44_barack_obama[1].jpg'  
# Define Microsoft API URL to request data 
URL.emoface = 'https://api.projectoxford.ai/emotion/v1.0/recognize'  
# Define access key (access key is available via: https://www.microsoft.com/cognitive-services/en-us/emotion-api) 
emotionKEY = 'XXXX' # 在此处输入你获取的key  
# Define image 
mybody = list(url = img.url)  
# Request data from Microsoft 
faceEMO = POST( 
  url = URL.emoface, 
  content_type('application/json'), add_headers(.headers = c('Ocp-Apim-Subscription-Key' = emotionKEY)), 
  body = mybody, 
  encode = 'json' 
)  
# Show request results (if Status=200, request is okay) 
faceEMO  
# Reuqest results from face analysis 
Obama = httr::content(faceEMO)[[1]] 
Obama 
# Define results in data frame 
o<-as.data.frame(as.matrix(Obama$scores))  
# Make some transformation 
o$V1 <- lapply(strsplit(as.character(o$V1 ), "e"), "[", 1) 
o$V1<-as.numeric(o$V1) 
colnames(o)[1] <- "Level"  
# Define names 
o$Emotion<- rownames(o)  
# Make plot 
ggplot(data=o, aes(x=Emotion, y=Level)) + 
  geom_bar(stat="identity") 

下面就是对这张照片的情感分析图。


#人脸检测 
#############################################################
# Define image source 
img.url = 'https://www.whitehouse.gov/sites/whitehouse.gov/files/images/first-family/44_barack_obama[1].jpg' 
  
# Define Microsoft API URL to request data 
faceURL = "https://api.projectoxford.ai/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=true&returnFaceAttributes=age" 
  
# Define access key (access key is available via: https://www.microsoft.com/cognitive-services/en-us/face-api) 
faceKEY = 'a868182e859c4458953f69dab084f5e8' 
  
# Define image 
mybody = list(url = img.url) 
  
# Request data from Microsoft 
faceResponse = POST( 
  url = faceURL,  
  content_type('application/json'), add_headers(.headers = c('Ocp-Apim-Subscription-Key' = faceKEY)), 
  body = mybody, 
  encode = 'json' 

  
# Show request results (if Status=200, request is okay) 
faceResponse 
  
# Reuqest results from face analysis 
ObamaR = httr::content(faceResponse)[[1]] 
  
# Define results in data frame 
OR<-as.data.frame(as.matrix(ObamaR$faceLandmarks)) 
  
# Make some transformation to data frame 
OR$V2 <- lapply(strsplit(as.character(OR$V1), "\\="), "[", 2) 
OR$V2 <- lapply(strsplit(as.character(OR$V2), "\\,"), "[", 1) 
colnames(OR)[2] <- "X" 
OR$X<-as.numeric(OR$X) 
  
OR$V3 <- lapply(strsplit(as.character(OR$V1), "\\y = "), "[", 2) 
OR$V3 <- lapply(strsplit(as.character(OR$V3), "\\)"), "[", 1) 
colnames(OR)[3] <- "Y" 
OR$Y<-as.numeric(OR$Y) 
  
OR$V1<-NULL 
OR 
结果如下:
 是他脸部的特征值:
                        X     Y 
pupilLeft           475.4 158.6 
pupilRight          590.6 157.3 
noseTip             534.4 227.7 
mouthLeft           460.8 273.7 
mouthRight          603.6 268.2 
eyebrowLeftOuter    425.2 154.8 
eyebrowLeftInner    508.4 142.3 
eyeLeftOuter        458.6 162.6
eyeLeftTop          473.6 153.8 
eyeLeftBottom       475.9 164.9 
eyeLeftInner        492.8 162.0 
eyebrowRightInner   552.3 141.4 
eyebrowRightOuter   636.0 156.2 
eyeRightInner       571.7 159.9 
eyeRightTop         588.1 152.5 
eyeRightBottom      587.4 163.9 
eyeRightOuter       605.5 161.5 
noseRootLeft        511.2 163.4 
noseRootRight       551.2 163.0 
noseLeftAlarTop     503.1 204.6 
noseRightAlarTop    559.2 201.6 
noseLeftAlarOutTip  485.3 226.9 
noseRightAlarOutTip 580.5 224.1 
upperLipTop         530.9 264.3 
upperLipBottom      532.1 272.5 
underLipTop         530.3 305.1 
underLipBottom      532.5 318.6

提示:点击“阅读原文”查看作者原文!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存