Pull to refresh

Ресурсы для получения датасетов изображений, о которых вы могли не знать

Reading time5 min
Views8.7K

Привет, Хабр! Как известно, топливом для машинного обучения являются наборы данных. В качестве источников для получения датасетов, которыми люди обычно пользуются и которые у всех на слуху, являются такие сайты как Kaggle, ImageNet, Google Dataset Search и Visual Genom, но довольно редко встречаю людей, которые для поиска данных используют такие сайты как Bing Image Search и Instagram. Поэтому в этой статье я покажу как легко получить данные с этих источников, написав две небольшие программы на Python.


Bing Image Search


Первое, что нужно сделать это перейти по ссылке нажать кнопку Get API Key и зарегистрироваться с помощью любой из предложенных социальных сетей(Microsoft, Facebook, LinkedIn или GitHub). После того, как процесс регистрации завершится вас перенаправят на страницу Your APIs, которая должна выглядеть подобным образом( то, что замазано, это и есть ваши API ключи) :


1


Переходим к написанию кода. Импортируем необходимые библиотеки :


from requests import exceptions
import requests
import cv2
import os

Дальше нужно указать некоторые параметры: API ключ( нужно выбрать из двух предложенных ключей один), указать условия поиска, максимальное количество изображений на запрос, а также установим конечный URL :


subscription_key = "YOUR_API_KEY"
search_terms = ['girl', 'man']
number_of_images_per_request = 100
search_url = "https://api.cognitive.microsoft.com/bing/v7.0/images/search"

Теперь напишем три небольшие функции, которые:
1) Создают для каждого условия поиска отдельную папку :


def create_folder(name_folder):
    path = os.path.join(name_folder)

    if not os.path.exists(path):
        os.makedirs(path)
        print('------------------------------')
        print("create folder with path {0}".format(path))
        print('------------------------------')

    else:
        print('------------------------------')
        print("folder exists {0}".format(path))
        print('------------------------------')
        return path

2) Возвращает содержимое ответа сервера в JSON :


def get_results():
    search = requests.get(search_url, headers=headers, 
                          params=params)
    search.raise_for_status()
    return search.json()

3) Записывает изображения на диск :


def write_image(photo):
    r = requests.get(v["contentUrl"], timeout=25)
    f = open(photo, "wb")
    f.write(r.content)
    f.close()

Далее мы перебираем изображения и пытаемся загрузить каждое отдельное изображение в выходную папку :


for category in search_terms:
    folder = create_folder(category)
    headers = {"Ocp-Apim-Subscription-Key": subscription_key}
    params = {"q": category, "offset": 0,
              "count": number_of_images_per_request}
    results = get_results()
    total = 0

    for offset in range(0, results["totalEstimatedMatches"],
                        number_of_images_per_request):
        params["offset"] = offset
        results = get_results()

        for v in results["value"]:
            try:
                ext = v["contentUrl"][v["contentUrl"].
                                          rfind("."):]
                photo = os.path.join(category, "{}{}".
                                     format('{}'.format(category)
                                     + str(total).zfill(6), ext))

                write_image(photo)
                print("saving: {}".format(photo))
                image = cv2.imread(photo)
                if image is None:
                    print("deleting: {}".format(photo))
                    os.remove(photo)
                    continue

                total += 1

            except Exception as e:
                if type(e) in EXCEPTIONS:
                    continue

Instagram


Импортируем библиотеки:


from selenium import webdriver
from time import sleep
import pyautogui
from bs4 import BeautifulSoup
import requests
import shutil

Как вы можете видеть, я использую библиотеку selenium, поэтому нужно скачать geckodriver. В инстаграме поиск изображений будем осуществлять по хэштегу, допустим, возьмём хэштег #bird. По данному хэштегу можно найти около 26млн публикаций. Копируем ссылку, которая сформировалась в результате запроса и путь к geckodriver, и вставляем это соответственно в две строчки, которые представлены ниже:


browser=webdriver.Firefox(executable_path='/path/to/geckodriver')
browser.get('https://www.instagram.com/explore/tags/bird/')

Дальше напишем 6 функций, которые:
1) Входит в инстаграм аккаунт. В строчках login.send_keys(' ') и password.send_keys(' ') необходимо вставить свой логин и пароль соответственно:


def enter_in_account():
    button_enter = browser.find_element_by_xpath("//*[@class='sqdOP  L3NKy   y3zKF     ']")
    button_enter.click()
    sleep(2)
    login = browser.find_element_by_xpath("//*[@class='_2hvTZ pexuQ zyHYP']")
    login.send_keys('')
    sleep(1)
    password = browser.find_element_by_xpath("//*[@class='_2hvTZ pexuQ zyHYP']")
    password.send_keys('')
    enter = browser.find_element_by_xpath(
        "//*[@class='                    Igw0E     IwRSH      eGOV_         _4EzTm                                                                                                              ']")
    enter.click()
    sleep(4)
    not_now_button = browser.find_element_by_xpath("//*[@class='sqdOP yWX7d    y3zKF     ']")
    not_now_button.click()
    sleep(2)

2) Находит первый пост и нажимаем на него:


def find_first_post():
    sleep(3)
    pyautogui.moveTo(450, 800, duration=0.5)
    pyautogui.click()

Тут необходимо отметить, что, возможно, из-за того, что у всех разрешение экрана монитора разное, то первый пост может находиться по другим координатам, поэтому в методе moveTo() нужно будет поменять первых два параметра.


3) Получаем ссылку на публикацию и нажимаем на кнопку далее:


def get_url():
    sleep(0.5)
    pyautogui.moveTo(1740, 640, duration=0.5)
    pyautogui.click()
    return browser.current_url

Тут может возникнуть аналогичная проблема, что и в методе выше: кнопка далее может находиться по другим координатам.


4)Получаем html-код исходной страницы:


def get_html(url):
    r = requests.get(url)
    return r.text

5) Получаем URL изображения:


def get_src(html):
    soup = BeautifulSoup(html, 'lxml')
    src = soup.find('meta', property="og:image")
    return src['content']

6) Скачиваем и сохраняем текущее изображение. В переменной filename нужно указать по какому пути будет сохраняться ваше изображение:


def download_image(image_name, image_url):
    filename = 'bird/bird{}.jpg'.format(image_name)
    r = requests.get(image_url, stream=True)

    if r.status_code == 200:
        r.raw.decode_content = True
        with open(filename, 'wb') as f:
            shutil.copyfileobj(r.raw, f)
        print('Image sucessfully Downloaded')

    else:
        print('Image Couldn\'t be retreived')

Заключение


В заключении хотелось бы сказать про недостаток источников и реализации. Что касается самих ресурсов, то изображений с них можно собрать большое количество, но эти данные придётся сортировать, так как изображения не всегда подходят под те критерии поиска, которые вы задали. Что касается реализации, то в получении данных с инстаграма была задействована библиотека pyautogui, которая эмулирует действия пользователя, в результате чего, при выполнении программы вы не сможете задействовать ваш компьютер для решения других задач. Если будут предложения, как написать код лучше, прошу писать в комментарии.
Что касается написания кода, то всё было сделано на Ubuntu 18.04. Исходный код выложил на GitHub.

Tags:
Hubs:
+4
Comments2

Articles

Change theme settings