AI,实践课程。 图像采集与研究


本文讨论了使用幻灯片放映在音乐项目中收集图像数据的方法。 局限性迫使我们不得不使用现有的图像数据库,而不是从Flickr获取的图像。 但是,本文讨论了这两种方法,以便读者可以学习如何使用Flickr API提取数据。

此外,由于使用Flickr收集的大部分图像质量较低,因此决定使用现有图像数据库中的图像。 特别是,从三个数据库收集了图像进行心理研究。

回想一下,最初为该项目选择了以下数据集:

  1. 一个训练数据集,其中包含7000张来自Flickr的情感彩色图像,用于情感提取算法。
  2. 包含Bach作品的旋律完成算法的训练数据集。
  3. 一组曲调,用作调节情绪的模板。

现在您需要收集数据集。 如文章中将显示的那样,所需的工作量将根据所选的数据集而有很大不同。

影像撷取


这个项目需要一组能够唤起七种不同情感的图像:幸福,悲伤,恐惧,焦虑,敬畏,决心,愤怒。 对于图像收集,由于其大小和Creative Commons *的许可,因此决定使用流行的照片共享网站Flickr。

手动在Flickr中搜索7000张图像是一项艰巨的任务。 幸运的是,Flickr拥有一个API ,该API提供了一组方法,可以轻松地以编程语言与Flickr交换数据。 但是,在使用API​​收集图像之前,重要的是要知道要寻找什么才能引起相关的情绪。 为了确定搜索词列表,在Amazon Mechanical Turk *平台上使用了一个任务。

Flickr API


要使用Flickr API提供的方法,您将需要创建一个Flickr帐户并请求一个API密钥。 为此,您必须具有Flickr或Yahoo! *帐户。 接下来,您需要点击此链接并获取密钥。


www.flickr.com/services/apps/create/apply的屏幕截图

处理非商业密钥的应用程序的过程非常简单。 它包括预期用途的说明和使用条款的接受。 API密钥是一种安全措施,用于防止滥用API。 在API提供的方法中,它是必需的参数。

收到API密钥后,您可以从The App Garden下载并安装其中一种编程语言的API工具包。 该项目使用Beej的PythonI Flickr API (可与Python 3语言一起使用),您必须遵循Flickr API 安装指南

下面显示了用于下载图像的代码。 基本上,这里使用了API walk功能,该功能通过标签搜索图像。 标签存储在.txt文件中,每行列出一个。 如果找到图像,则从 {farm-id} .staticflickr.com / {server-id} / {id} _ {secret} .jpg处的模板创建URL,其中大括号的内容将替换为图像属性。 然后,根据情感和搜索条件,提取每个标签的前30个图像(按相关性排序)并将其组织到文件夹中。

import flickrapi import urllib.request import os project_path = '/path/to/your/project' photos_per_tag = 30 filenames = ['Awe.txt', 'Happiness.txt', 'Fear.txt', 'Determination.txt', 'Anxiety.txt', 'Tranquility.txt', 'Sadness.txt'] def download_files(flickr, t, category, num_photos): # Downloads the files of a specific tag os.mkdir(t) os.chdir(t) s = [] for photo in flickr.walk(tag_mode='all', sort='relevance', tags=t, license=4, per_page=50): url = 'https://farm{}.staticflickr.com/{}/{}_{}.jpg'.format(photo.get('farm'), photo.get('server'), photo.get('id'), photo.get('secret')) s.append(url) if len(s) == num_photos: break for i in range(len(s)): filename = '{}_{}_{}.jpg'.format(category, t, str(i)) urllib.request.urlretrieve(s[i], filename) os.chdir(os.path.join(project_path, category)) if __name__ == '__main__': # Creates flickr object # These keys should be requested from flickr api_key = u'xxxxxxxxxxxx' api_secret = u'xxxxxxxxxxx' flickr = flickrapi.FlickrAPI(api_key, api_secret) # Runs the program, cycles through the emotions and downloads the images for each tag. os.chdir(project_path) for fname in filenames: categ = fname[:-4] with open(fname, 'r') as f: tags = f.read().splitlines() os.mkdir(categ) os.chdir(categ) for t in tags: download_files(flickr, t, categ, photos_per_tag) os.chdir(project_path) 

要使用此代码,您需要使用GitHub上的链接克隆存储库。 之后,请按照README文件中的说明进行操作。 您必须用Flickr上收到的API密钥替换api_key和api_secret参数。 如上所述,此脚本仅适用于Python 3。

程序运行后,文件夹如下所示:




来自Flickr上搜索结果的一组数据。

总共收集了约8800张图像。 由于我们计划丢弃一些无法使用的低质量图像,因此收到的图像超出了要求。 下一步是搜索这些图像。

图像选择


所收集图像的质量不同。 一些搜索条件,例如花朵(如图所示)提供了可用的高质量图像。 但是,不太具体的搜索条件通常会产生完全无法使用的图像。 例如,从奇迹标签(由于敬畏情绪)获得了带有神奇女人*的蛋糕的图像,而从雄心勃勃的标签(由于决心的情绪)获得了来自雄心勃勃农场的卷心菜图像。


图片不合适。

鼓励任何打算使用Flickr API搜索图像的人使用特定的名词作为搜索词。 从它们中找到的图像比使用形容词或抽象名词要好得多。 例如,当搜索敬畏图像时,应使用诸如海洋或大峡谷之类的搜索词,而不要使用敬畏或奇迹。

在查看图像后,该团队得出结论,超过40%的图像不可用。 结果,修改了选择数据集的方法。 在讨论了许多可能性之后,例如将图像集限制为具有相关情绪的脸部,决定使用心理学研究中常用的现有数据库中的图像(日内瓦情感PicturE数据库( GAPED ),开放情感标准化图像集( OASIS )和图像)情绪激发刺激( ISEE )。

尽管现有数据库中的图像比新数据集中的图像具有更少的多样性,但是由于更高的图像质量和有关参数信息的可用性而选择使用现有数据库。 拥有有关参数的信息是一个巨大的优势,因为这消除了使用Amazon Mechanical Turk进行注释的需求,从而大大降低了成本。

资料来源


新数据集的数据收集过程要简单得多。 特别是,Amazon Mechanical Turk和Flickr API不再需要步骤。 GAPED和OASIS数据集(包括参数标记)可从Internet上下载。 在给作者发电子邮件要求访问后,ISEE数据集变得可用。 如果对数据集的下载说明不甚了解,很可能是Google搜索*可以帮助您找到可以直接请求访问数据集的作者的联系人。

为此项目创建了两个数据集。 第一个使用Flickr API通过情感标签加载图像,第二个使用心理学研究中现有数据库的汇编。 这些数据集各有利弊。 然而,由于图像质量,标记参数的存在和成本等优势,该项目选择了第二个。

直接用于收集数据的方法取决于所需的数据。 但是,本文介绍的过程和方法可能对许多项目有用。

现在已经创建了数据集,该项目准备执行以下步骤-研究和初步数据处理。

图像数据探索


由于使用Flickr收集的大部分图像质量较低,因此决定使用现有图像数据库中的图像。 特别是,从三个数据库收集了图像进行心理研究。 每个图像都包括从几位艺术家那里收集的(不)愉快程度和强度的等级信息。 这些数据库中的1986年图像分为4类。 这些类别涵盖了87%的图像,包括34%的动物,28%的人,13%的场景和12%的物体。 其余的13%被归类为其他。

动物



来自“动物”类别的图像示例

如上所示,大约三分之一的图像包含动物-孤立的动物或与其他动物一起的动物。 在这些示例中,从左到右移动时,愉悦感的等级会提高。 鬣狗吃它们的猎物和蟑螂的不愉快图像会以诸如恐惧,悲伤和厌恶之类的情绪引起反应。

相反,右侧的图像-睡觉的猫,微笑的狗-可能引起同情和幸福。



人物类别的示例图像

图像的“人物”类别包括个人和人群的图像,而人群的图像通常包含更多的上下文信息。 例如,游行乐队的图像似乎是在球迷拥挤的体育场的背景下拍摄的,这表明该图像是在体育比赛中的表演中拍摄的。 相反,愤怒的女人的形象被剥夺了背景信息-观看者没有机会发现或猜测她愤怒的原因。 应该注意的是,并非所有由多人或多人组成的图像都具有附加信息。

例如,一个人躺在地板上排成一列,有明显的伤痕和沾满鲜血的衣服的形象,并不能使人们知道正在发生的事情。 然而,即使缺乏信息,与人的图像也会引起各种情感反应。

场景


一组图像的“场景”类别包括各种场景-从人造结构和物体到自然甚至空间场景。


场景类别中的示例图像

对象



来自“对象”类别的样本图像

图像集的“对象”类别包括聚焦在一个对象上的图像,如上面的示例所示。 这些图像中没有情境,尤其是与图像集中的其他类别进行比较时。

杂项



杂类图片的示例

最后,图像的子集保留在集合中,无法分配给四个类别中的任何一个。 通常,如示例中所示,这些图像是具有多个对象的场景,但是没有“场景”类别的图像的典型上下文。 通常,这类图像的评级为中性-他们既不愉快也不令人不愉快。

图像数据库的情感类别


为了确定图像数据库的情绪类别,我们依赖于日内瓦情感图片数据库(GAPED)和开放情感标准化图像集(OASIS)中每幅图像的规范主观重要性等级。 由于GAPED使用的Likert量表的范围是0到100,OASIS使用的Likert量表的范围是1到7,因此应用了线性变换,将所有评分从0变为100的连续范围。然后研究了两种潜在的情绪分类规则。

首先,从直觉上讲,最好根据愉悦程度对图像进行排序,然后根据评分等级将其分为三部分,以便评分为0-33.33的图像表示否定类别,评分为33.33-66.67的图像为中性,以及评分66.67–100-正面类别。 为了实现将此规则分为三类,使用了Python代码:

 import os import shutil import csv def organizeFolderGAPED(original, pos, neg, neut): #      GAPED    #        dict = {} files = os.listdir(original) for file in files: if '.txt' in file: with open(os.path.join(original, file), 'r') as f: for l in f: l = l.split() dict[l[0][:-4]] = l[1] #        pos/neg/neut      for roots, dirs, files, in os.walk(original): for file in files: if '.bmp' in file: if float(dict[file[:-4]]) < 100/3: shutil.copy(os.path.join(roots, file), neg) elif float(dict[file[:-4]]) > 200/3: shutil.copy(os.path.join(roots, file), pos) else: shutil.copy(os.path.join(roots, file), neut) def organizeFolderOASIS(original, pos, neg, neut): #      GAPED    #        dict = {} with open('/Users/harrys/Desktop/OASIS.csv') as file: reader = csv.reader(file) for row in reader: dict[row[1]] = row[4] #        pos/neg/neut       for roots, dirs, files, in os.walk(original): for file in files: if '.jpg' in file: if (float(dict[file[:-4]])-1)*100/6 < 100/3: shutil.copy(os.path.join(roots, file), neg) elif (float(dict[file[:-4]])-1)*100/6 > 200/3: shutil.copy(os.path.join(roots, file), pos) else: shutil.copy(os.path.join(roots, file), neut) if __name__ == '__main__' : gaped = 'path/to/your/project/directory/GAPED' oasis = 'path/to/your/project/directory/Oasis' pos = 'path/to/your/project/directory/Positive' neg = 'path/to/your/project/directory/Negative' neut = 'path/to/your/project/directory/Neutral' organizeFolderOASIS(oasis, pos, neg, neut) organizeFolderGAPED(gaped, pos, neg, neut) 

这种方法使我们可以将数据库分为以下几类:417个负像,774个中性像和442个正像。 在这种方法中,将不满意​​的图像按等比例分为三类,其等级未达到阈值,被分类为中性; 例如,尸体,哭泣的孩子,墓地的图像被分类为中性。 尽管这些图像不如负面图像中的其他图像那么令人不快,但人们对它们的中立性表示怀疑。

因此,决定根据数据的正态分布应用优化的分类规则,并改善将参数分为情感类别的方法。 值0–39分配给否定类别,值40–60分配给中性类别,值61–100分配给正类别。 为了实现此规则,使用了Python代码:

 import os import shutil import csv def organizeFolderGAPED(original, pos, neg, neut): #      GAPED    #        dict = {} files = os.listdir(original) for file in files: if '.txt' in file: with open(os.path.join(original, file), 'r') as f: for l in f: l = l.split() dict[l[0][:-4]] = l[1] #        pos/neg/neut      for roots, dirs, files, in os.walk(original): for file in files: if '.bmp' in file: if float(dict[file[:-4]]) < 40: shutil.copy(os.path.join(roots, file), neg) elif float(dict[file[:-4]]) > 60: shutil.copy(os.path.join(roots, file), pos) else: shutil.copy(os.path.join(roots, file), neut) def organizeFolderOASIS(original, pos, neg, neut): #      GAPED    #        dict = {} with open('path/to/your/project/directory/OASIS.csv') as file: reader = csv.reader(file) for row in reader: dict[row[1]] = row[4] #        pos/neg/neut       for roots, dirs, files, in os.walk(original): for file in files: if '.jpg' in file: if (float(dict[file[:-4]])-1)*100/6 < 40: shutil.copy(os.path.join(roots, file), neg) elif (float(dict[file[:-4]])-1)*100/6 > 60: shutil.copy(os.path.join(roots, file), pos) else: shutil.copy(os.path.join(roots, file), neut) if __name__ == '__main__' : gaped = 'path/to/your/project/directory/GAPED' oasis = 'path/to/your/project/directory/Oasis' pos = 'path/to/your/project/directory/Positive' neg = 'path/to/your/project/directory/Negative' neut = 'path/to/your/project/directory/Neutral' organizeFolderOASIS(oasis, pos, neg, neut) organizeFolderGAPED(gaped, pos, neg, neut) 

使用此分类规则,将40–60–40 567幅正面图像评为比502幅中性图像更有趣,而564幅负面图像被评为比中性图像更不愉快。 因此,保持了情感类别的目标值,并且改善了按类别的图像分布。 下图说明了与每个类别相关的愉快程度。 色散图上胡须的不同长度表明,与中性类别相比,在哪个情感类别(正面或负面)中有更大的等级范围。


每个情感类别的平均愉快程度

我们得出的结论是,该分类规则足以根据情感对图像进行分类。 关于图像数据库参数的类别,表示每个情绪类别的图像的类型如下所示。 应该注意的是,每个参数类别(动物,人,场景,物体,其他)都在每个情感类别中表示。

情绪类别1:负面

情绪类别2:中立

情绪类别3:正面

总结一下。 我们使用从0到100的规范显着性等级将图像数据库分为中性,消极和积极情绪类别,将0-39赋予消极,40-60赋予中立,以及61-100赋予积极。 图像被适当地分配到这些情感类别中。 最后,每个情感类别都包括动物,人物,场景,物体等的图像。

Source: https://habr.com/ru/post/zh-CN413839/


All Articles