J'ai collecté des images à l'aide de l'API bing Image Search pour le Deep Learning dans TensorFlow. Nous rendons possible la collecte d'un grand nombre d'images. Je cours dans l'environnement suivant.
type | version | Remarques |
---|---|---|
OS | Windows10 | Pro 64 bit |
Anaconda | Anaconda 4.4.0 | Je crée un environnement virtuel sur Anaconda |
Python | 3.5 | Parce qu'il coexiste avec TensorFlow, 3.5 |
demande la bibliothèque | 2.18.4 | Je l'utilise pour appeler l'API Bing * Je l'ai utilisé par manque de compétences et de connaissances de l'auteur, mais cela devrait être possible même si je ne l'utilise pas |
API | Bing Image Search API v5 | J'utilise la v5 car je n'ai pas encore publié la v7. Je ne l'ai pas comparé avec Google. |
Tout d'abord, exécutez le programme sans paramètres.
python get_images_via_bing_20170822.py
La progression est affichée de cette manière. Les deux lignes "Obtenir 3 images à partir du décalage X" s'affichent car l'API Bing Image Search est appelée deux fois. En effet, les spécifications de l'API vous permettent de récupérer jusqu'à 150 résultats de recherche en un seul appel, vous pouvez donc appeler plusieurs fois afin de pouvoir récupérer un grand nombre de résultats.
Des chats mignons ont été rassemblés dans le dossier.
Essayez d'exécuter le programme avec des paramètres. Obtenez 80 résultats une fois avec le terme de recherche "chat".
python get_images_via_bing_20170822.py --query "cat" --call_count 1 --image_count 80
"Type de fichier non enregistré:" n'acquiert pas de types d'image autres que jpeg et png, et affiche uniquement ce fait dans le journal.
Il recueille les coups: smile_cat:
Cliquez sur le lien «Compte gratuit» sur la page Azure Cognitive Service (https://azure.microsoft.com/en-us/services/cognitive-services/).
Cliquez sur le lien "Commencer gratuitement"
J'avais un compte, alors je suis allé m'inscrire. Après cela, je mets mes informations personnelles (la mémoire est ambiguë).
Un e-mail de bienvenue sera envoyé à l'adresse e-mail de votre compte, cliquez donc sur le lien, puis accédez à l'écran du portail. Cliquez sur l'icône «+» et cliquez sur «créer» dans les API de recherche Bign.
Créé en sélectionnant la version gratuite des API Bing Search.
Cliquez sur "Afficher les clés d'accès" dans Gérer les clés et notez les clés. Deux sont affichés, mais il semble que l'un ou l'autre fonctionne bien (j'utilise le premier et le second n'est pas confirmé).
Je l'ai installé car il n'y avait aucune demande dans mon environnement. Ignorez ceux qui l'ont déjà installé. De plus, comme mentionné au début, je pense que cela peut être réalisé sans cela. Installez-le dans l'environnement virtuel d'Anaconda "tensorflow121". Démarrez le terminal à partir d'Anaconda Navigator.
Les deux installés avec pip. Je n'ai rien fait de particulièrement difficile.
pip install requests
Je l'ai fait comme ça.
--image_count: nombre de fichiers image acquis par un appel d'API Bing --call_count: Nombre d'appels d'API Bing dans une exécution de programme (nombre total d'images acquises par image_count x call_count) --off_set_start: Où appeler pendant un appel --output_path: répertoire de sortie de l'image --query: terme de recherche
Veuillez réécrire la partie «Veuillez saisir votre clé d'abonnement ici» du code ci-dessous avec la clé d'abonnement créée dans le portail Azure.
import argparse, requests, urllib.parse, os, io, imghdr
#Paramètres de base du modèle
FLAGS = None
#point final
kEndPoint = 'https://api.cognitive.microsoft.com/bing/v5.0/images/search'
#en-tête de requête http
kHeaders = { 'Ocp-Apim-Subscription-Key': 'Entrez votre clé d'abonnement ici' }
#Obtenir une liste d'URL d'image pour les résultats de recherche
def GetImageUrls():
print('Start getting %d images from offset %d' % (FLAGS.image_count, FLAGS.off_set_start ))
image_list = []
#Étant donné que la limite de l'API bing est de 150, boucle et appel_Obtenez le nombre de fois
for step in range(FLAGS.call_count):
#Obtenir un décalage
off_set = FLAGS.off_set_start + step * FLAGS.image_count
#Paramètres de requête http
params = urllib.parse.urlencode({
'count': FLAGS.image_count,
'offset': off_set,
'imageType':'Photo',
'q': FLAGS.query,
})
# 'mkt': 'ja-JP',
#appel API Bing
res = requests.get(kEndPoint, headers=kHeaders, params=params)
if step == 0:
print('Total Estimated Mathes: %s' % res.json()['totalEstimatedMatches'])
vals = res.json()['value']
print('Get %d images from offset %d' % (len(vals), off_set))
#Stocker l'URL de l'image résultante
for j in range(len(vals)):
image_list.append(vals[j]["contentUrl"])
return image_list
#Obtenir une image et enregistrer localement
def fetch_images(image_list):
print('total images:%d' % len(image_list))
for i in range(len(image_list)):
#Sortie de progression pour 100 cas
if i % 100 == 0:
print('Start getting and saving each image:%d' % i)
try:
#Acquisition d'image
response = requests.get(image_list[i], timeout=5 )
#Puisqu'une erreur peut survenir en fonction de la source d'acquisition, connectez-vous et continuez
except requests.exceptions.RequestException:
print('%d:Error occurs :%s' % (i, image_list[i]))
continue
#Filtrer par type d'image
with io.BytesIO(response.content) as fh:
image_type = imghdr.what(fh)
if imghdr.what(fh) != 'jpeg' and imghdr.what(fh) != 'png':
print('Not saved file type:%s' % imghdr.what(fh))
continue
#Enregistrer l'image localement
with open('{}/image.{}.{}'.format(FLAGS.output_path, str(i), imghdr.what(fh)), 'wb') as f:
f.write(response.content)
#Passer si courir directement(Importé et ne passe pas à l'exécution)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'--image_count',
type=int,
default=3,
help='collection number of image files per api call.'
)
parser.add_argument(
'--call_count',
type=int,
default=2,
help='number of api calls.'
)
parser.add_argument(
'--off_set_start',
type=int,
default=0,
help='offset start.'
)
parser.add_argument(
'--output_path',
type=str,
default='./images',
help='image files output directry.'
)
parser.add_argument(
'--query',
type=str,
default='Chat',
help='search query.'
)
#Acquisition et exécution des paramètres
FLAGS, unparsed = parser.parse_known_args()
fetch_images(GetImageUrls())
Je n'ai pas eu assez de temps pour faire ce qui suit: J'abandonne parce que cela semble prendre du temps pour les débutants en Python.
--Une fonction qui se termine automatiquement lorsque le nombre total de résultats de recherche est atteint: vous pouvez coder normalement, mais c'est gênant ...
Cette fois, je publierai le site référencé sous forme de lien.
site | commentaire |
---|---|
Outil de test officiel | J'ai fait le code en regardant ici |
Document officiel de l'API | J'ai évoqué les paramètres qui pourraient être utilisés Au fait, où est passé OData? |
Collectez automatiquement des images à l'aide de l'API Bing Image Search | J'ai utilisé beaucoup d'informations sur l'API Bing |
L'histoire de la migration de l'API Bing Search v2 vers la v5 | J'ai surtout évoqué la logique de la partie acquisition d'image |
bing_image_getter.py | J'ai d'abord changé en fonction de cette source |
Recommended Posts