AI, cours pratique. Collection et recherche d'images


Cet article décrit les méthodes utilisées pour collecter des données d'image dans un projet musical avec un diaporama. Il y avait des limitations qui nous ont obligés à utiliser la base de données d'images existante, plutôt que des images prises à partir de Flickr. Cependant, cet article décrit les deux approches afin que le lecteur puisse apprendre à extraire des données à l'aide de l'API Flickr.

De plus, la qualité d'une partie importante des images collectées avec Flickr étant faible, il a été décidé d'utiliser des images provenant de bases de données d'images existantes. En particulier, des images ont été collectées dans trois bases de données pour des recherches psychologiques.

Rappelons qu'au départ, les ensembles de données suivants ont été sélectionnés pour ce projet:

  1. Un ensemble de données de formation contenant 7000 images émotionnellement colorées de Flickr pour un algorithme d'extraction d'émotion.
  2. Un ensemble de données de formation contenant les œuvres de Bach pour l'algorithme d'achèvement de la mélodie.
  3. Un ensemble de mélodies qui servent de modèles pour moduler les émotions.

Vous devez maintenant collecter les ensembles de données. Comme indiqué dans l'article, la quantité de travail requise pour cela varie considérablement en fonction de l'ensemble de données sélectionné.

Capture d'image


Ce projet nécessitait un ensemble d'images qui évoquaient sept émotions différentes: bonheur, tristesse, peur, anxiété, admiration, détermination, colère. Pour la collection d'images, il a été décidé d'utiliser Flickr, un site de partage de photos populaire, en raison de sa taille et de la licence de Creative Commons *.

La recherche manuelle de 7000 images sur Flickr est une tâche ardue. Heureusement, Flickr possède une API qui fournit un ensemble de méthodes qui facilitent l'échange de données avec Flickr dans un langage de programmation. Cependant, avant d'utiliser l'API pour collecter des images, il est important de savoir quoi rechercher afin d'évoquer des émotions pertinentes. Pour déterminer la liste des termes de recherche, une tâche a été utilisée sur la plateforme Amazon Mechanical Turk *.

API Flickr


Pour utiliser les méthodes proposées par l'API Flickr, vous devrez créer un compte Flickr et demander une clé API. Pour ce faire, vous devez disposer d'un compte Flickr ou Yahoo! *. Ensuite, vous devez suivre ce lien et obtenir la clé.


Capture d'écran de www.flickr.com/services/apps/create/apply

Le processus de traitement d'une demande de clé non commerciale est assez simple. Il comprend une description de l'utilisation prévue et l'acceptation des conditions d'utilisation. La clé API est une mesure de sécurité et est utilisée pour empêcher une mauvaise utilisation de l'API. Dans les méthodes fournies par l'API, il s'agit d'un paramètre obligatoire.

Après avoir reçu la clé API, vous pouvez télécharger et installer la boîte à outils API pour l'un des langages de programmation de The App Garden . Ce projet utilise l'API Flickr PythonI de Beej , qui peut être utilisée avec le langage Python 3. Vous devez suivre le guide d'installation de l' API Flickr.

Le code utilisé pour télécharger les images est indiqué ci-dessous. Fondamentalement, la fonction de marche API est utilisée ici, qui recherche une image par balise. Les balises sont stockées dans un fichier .txt et sont répertoriées une par ligne. Si une image est trouvée, son URL est créée à partir du modèle dans la batterie {farm-id} .staticflickr.com / {server-id} / {id} _ {secret} .jpg , où le contenu des accolades est remplacé par des attributs d'image. Ensuite, les 30 premières images de chaque balise (triées par pertinence) sont extraites et organisées en dossiers, en fonction de l'émotion et des conditions de recherche.

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) 

Pour utiliser ce code, vous devez cloner le référentiel à l'aide du lien de GitHub . Après cela, suivez les instructions du fichier README. Vous devez remplacer les paramètres api_key et api_secret par les clés API reçues sur Flickr. Comme mentionné ci-dessus, ce script ne fonctionne que sur Python 3.

Après l'exécution du programme, le dossier ressemble à ceci:




Un ensemble de données issues des résultats de recherche sur Flickr.

Au total, environ 8800 images ont été collectées. Plus d'images ont été reçues que nécessaire, car nous avions prévu de supprimer certaines des images de faible qualité qui ne peuvent pas être utilisées. L'étape suivante consistait à rechercher ces images.

Sélection d'images


La qualité des images collectées était différente. Certaines conditions de recherche, par exemple, les fleurs (illustrées sur la figure) ont donné des images utilisables de haute qualité. Cependant, des conditions de recherche moins spécifiques ont souvent produit des images complètement inutilisables. Par exemple, une image d'un gâteau avec une merveille * a été obtenue à partir de l'étiquette miracle (en raison de l'émotion de la crainte), et une image du chou d'Ambitious Farms a été trouvée à partir de l'étiquette ambitieuse (en raison de l'émotion de la détermination).


Images inappropriées.

Quiconque envisage d'utiliser l'API Flickr pour rechercher des images est encouragé à utiliser des noms spécifiques comme termes de recherche. Les images trouvées sont bien meilleures que l'utilisation d'adjectifs ou de noms abstraits. Par exemple, lorsque vous recherchez des images de crainte, vous devez utiliser des termes de recherche tels que l'océan ou le Grand Canyon, plutôt que crainte ou miracle.

Après avoir visionné les images, l'équipe a conclu que plus de 40% des images étaient inutilisables. En conséquence, l'approche de sélection d'un ensemble de données a été révisée. Après avoir discuté d'un certain nombre de possibilités, telles que la limitation de l'ensemble d'images à des visages ayant des émotions pertinentes, il a été décidé d'utiliser des images de bases de données existantes qui sont couramment utilisées dans la recherche psychologique (Geneva Affective PicturE Database ( GAPED ), Open Affective Standardized Image Set ( OASIS ) et Image Stimuli for Emotion Elicitation ( ISEE )).

Malgré le fait que les images dans les bases de données existantes sont moins diverses qu'elles ne pourraient l'être dans le nouvel ensemble de données, le choix a été fait en faveur des bases de données existantes en raison de la meilleure qualité d'image et de la disponibilité des informations sur les paramètres. Avoir des informations sur les paramètres est un énorme avantage, car cela élimine le besoin d'annotation à l'aide d'Amazon Mechanical Turk, ce qui réduit considérablement le coût.

Source de données


Le processus de collecte de données pour le nouvel ensemble de données était beaucoup plus simple. En particulier, les étapes n'étaient plus nécessaires avec Amazon Mechanical Turk et l'API Flickr. Les jeux de données GAPED et OASIS (y compris le balisage des paramètres) peuvent être téléchargés sur Internet. L'ensemble de données ISEE est devenu disponible après un e-mail à l'auteur demandant l'accès. Si les instructions de téléchargement des jeux de données ne sont pas bien comprises, une recherche Google * vous aidera probablement à trouver des contacts d'auteurs qui peuvent directement demander l'accès aux jeux de données.

Deux ensembles de données ont été créés pour ce projet. Le premier a utilisé l'API Flickr pour charger des images à l'aide de balises d'émotion, le second était une compilation de bases de données existantes utilisées dans la recherche psychologique. Chacun de ces ensembles de données a ses avantages et ses inconvénients; cependant, le second a été choisi pour le projet - grâce à des avantages tels que la qualité de l'image, la présence de paramètres étiquetés et le coût.

La méthode utilisée pour collecter directement les données dépend des données requises. Toutefois, les processus et méthodes décrits dans cet article sont susceptibles d'être utiles pour de nombreux projets.

Maintenant que les ensembles de données sont créés, le projet est prêt à effectuer les étapes suivantes - recherche et traitement préliminaire des données.

Exploration de données d'images


La qualité d'une partie importante des images collectées avec Flickr étant faible, il a été décidé d'utiliser des images provenant de bases de données d'images existantes. En particulier, des images ont été collectées dans trois bases de données pour des recherches psychologiques. Chaque image comprend des informations de notation pour (non) l'agrément et l'intensité, collectées auprès de plusieurs artistes. Les images de 1986 de ces bases de données ont été divisées en 4 catégories. Ces catégories couvraient 87% des images et comprenaient 34% d'animaux, 28% de personnes, 13% de scènes et 12% d'objets. Les 13% restants ont été classés comme divers.

Les animaux



Exemples d'images de la catégorie "Animaux"

Environ un tiers des images contiennent des animaux - isolés ou avec d'autres animaux, comme indiqué ci-dessus. Dans ces exemples, en se déplaçant de gauche à droite, la note d'agrément augmente. Des images désagréables d'hyènes mangeant leurs proies et leurs cafards peuvent provoquer une réponse sous la forme d'émotions telles que: la peur, la tristesse et le dégoût.

Les images de droite - un chat endormi, un chien souriant - au contraire, peuvent provoquer sympathie et bonheur.

Les gens



Exemples d'images de la catégorie Personnes

La catégorie d'images Personnes comprend des images d'individus et de groupes de personnes, tandis que les images de groupes de personnes contiennent souvent des informations plus contextuelles. Par exemple, l'image de la fanfare semble avoir été prise dans le contexte d'un stade rempli de fans, ce qui suggère que l'image a été prise lors d'une performance sportive. L'image d'une femme en colère, au contraire, est privée de contexte - le spectateur n'a pas la possibilité de découvrir ou de deviner la raison de sa colère. Il convient de noter que toutes les images avec de nombreuses personnes ou avec des groupes ne contiennent pas d'informations supplémentaires.

Par exemple, l'image d'hommes allongés en ligne sur le sol, avec des blessures visibles et des vêtements ensanglantés, ne donne pas une idée de ce qui se passe. Néanmoins, même avec un tel manque d'information, les images avec les gens provoquent diverses réactions émotionnelles.

Scènes


La catégorie «Scènes» d'un ensemble d'images comprend une variété de scènes - des structures et objets artificiels aux scènes de la nature et même de l'espace.


Exemples d'images de la catégorie Scènes

Les objets



Exemples d'images de la catégorie Objets

La catégorie «Objets» de l'ensemble d'images comprend des images focalisées sur un objet, comme illustré dans les exemples ci-dessus. Il n'y a pas de contexte situationnel dans ces images, en particulier par rapport aux autres catégories de l'ensemble d'images.

Divers



Exemples d'images de la catégorie Divers

Enfin, un sous-ensemble d'images est resté dans l'ensemble qui n'a pu être attribué à aucune des quatre catégories. Souvent, comme le montrent les exemples, ces images étaient des scènes avec plusieurs objets, mais sans le contexte typique des images de la catégorie Scènes. Ce type d'image, en règle générale, contenait une note neutre - ils n'étaient ni agréables ni désagréables.

Catégories d'émotions pour la base de données d'images


Pour identifier les catégories d'émotions pour la base de données d'images, nous nous sommes appuyés sur des évaluations de signification subjective normative qui accompagnent chaque image dans la base de données affective PicturE de Genève (GAPED) et l'Open Affective Standardized Image Set (OASIS). Étant donné que GAPED a utilisé l'échelle de Likert de 0 à 100 et OASIS a utilisé l'échelle de Likert de 1 à 7, une transformation linéaire a été appliquée qui a amené toutes les évaluations sur une échelle continue de 0 à 100. Ensuite, deux règles potentielles pour catégoriser les émotions ont été étudiées.

Premièrement, il est intuitivement souhaitable de trier les images selon le niveau d'agrément, puis de les diviser en trois parties selon l'échelle de notation, de sorte que les images avec des notes de 0 à 33,33 représentent la catégorie négative, avec des notes de 33,33 à 66,67 neutres, et avec des notes de 66,67 à 100 - une catégorie positive. Pour implémenter cette règle de division en trois catégories, du code Python a été utilisé:

 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) 

Cette approche nous a permis de diviser la base de données en catégories: 417 images négatives, 774 neutres et 442 positives. Dans cette approche, la division en trois catégories dans des proportions égales d'images désagréables, dont la note n'a pas atteint la valeur seuil, a été classée comme neutre; par exemple, des images d'un cadavre, d'un enfant qui pleure, des cimetières ont été classés comme neutres. Bien que ces images soient moins désagréables que d'autres dans la catégorie négative, des doutes ont surgi quant à leur neutralité.

Par conséquent, il a été décidé d'appliquer une règle de catégorisation optimisée basée sur la distribution normale des données, ainsi que d'améliorer la séparation des paramètres en catégories émotionnelles. Les valeurs 0 à 39 ont été attribuées à la catégorie négative, 40 à 60 à la catégorie neutre et 61 à 100 à la catégorie positive. Pour implémenter cette règle, du code Python a été utilisé:

 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) 

Avec cette règle de catégorisation, 40 à 60 à 40 567 images positives ont été jugées plus agréables que 502 neutres et 564 images négatives ont été jugées moins agréables que neutres. Ainsi, la valeur cible des catégories émotionnelles a été maintenue et la répartition des images par catégorie a été améliorée. La figure ci-dessous illustre le niveau d'agrément associé à chacune des catégories. Les différentes longueurs des moustaches sur le diagramme de dispersion indiquent dans quelle catégorie émotionnelle (positive ou négative) il y a une plus grande gamme de notes par rapport à la catégorie neutre.


Notes d'agrément moyennes pour chacune des catégories émotionnelles

Nous concluons que cette règle de catégorisation est suffisante pour classer les images en fonction des émotions. Concernant les catégories de paramètres de la base de données d'images, les types d'images représentant chacune des catégories émotionnelles sont indiqués ci-dessous. Il est à noter que chaque catégorie de paramètres (animaux, personnes, scènes, objets, divers) est représentée dans chacune des catégories émotionnelles.

Catégorie émotionnelle 1: négative

Catégorie émotionnelle 2: neutre

Catégorie émotionnelle 3: positive

Pour résumer. Nous avons divisé la base de données d'images en catégories émotionnelles neutres, négatives et positives en utilisant des notations de signification normative dans la plage de 0 à 100, en attribuant de 0 à 39 à négatif, de 40 à 60 à neutre et de 61 à 100 à positif. Les images ont été correctement réparties dans ces catégories émotionnelles. Enfin, chaque catégorie émotionnelle comprenait des images d'animaux, de personnes, de scènes, d'objets, etc.

Source: https://habr.com/ru/post/fr413839/


All Articles