100 строк кода: Сервис для определения породы собак (Или как заткнуть за пояс Microsoft)

1 Star2 Stars (2 votes, average: 5,00 out of 5)
Загрузка...

Не так давно компания Microsoft разработала сервис what-dog.net для определения породы собак на основе искусственного интеллекта. Протестировав его на фотографии бигля (beagle), мы получили не совсем правильный ответ…

Возможно, в последе время вы слышали о стартапе Diffbot, который также специализируется на искусственном интеллекте. В сегодняшней статье мы создадим аналог сервиса what-dog.net от Microsoft, используя технологию Diffbot, и узнаем, кто лучше справляется с задачей определения породы наших любимцев.

Мы разработаем простейшее однофайловое приложение, позволяющее пользователю загружать изображения собак и выводящее информацию о породе.

Что нам потребуется?

Чтобы воспроизвести все этапы данного руководства, необходимо зарегистрироваться на diffbot.com и получить бесплатный 14-дневный токен (если у вас еще нет аккаунта).

Для установки клиента мы используем файл composer.json со следующим содержимым:

{

    "require": {

        "swader/diffbot-php-client": "^2",

        "php-http/guzzle6-adapter": "^1.0"

    },

    "minimum-stability": "dev",

    "prefer-stable": true,

    "require-dev": {

        "symfony/var-dumper": "^3.0"

    }

}

Затем выполняем команду composer install.

Здесь присутствует директива minimum-stability, поскольку часть пакета Puli все еще находится на стадии бета, при этом он является зависимостью проекта PHP-HTTP. Директива prefer-stable гарантирует, что используется самая последняя стабильная версия пакета, если доступна. Кроме того, нам необходим HTTP-клиент. Мы выбрали Guzzle6, хотя Diffbot поддерживает работу с любым современным HTTP-клиентом посредством Httplug, поэтому вы может использовать любой вариант на свое усмотрение.

После установки этих компонентов мы можем создать файл index.php, который будет содержать всю логику нашего приложения. Для начала необходимо написать следующее:

<?php



require 'vendor/autoload.php';



$token = 'my_token';

Загрузка изображений

Давайте создадим простую форму загрузки перед PHP-кодом в файле index.php:

<form action="/" method="post" enctype="multipart/form-data">

    <h2>Please either paste in a link to the image, or upload the image directly.</h2>

    <h3>URL</h3>

    <input type="text" name="url" id="url" placeholder="Image URL">

    <h3>Upload</h3>

    <input type="file" name="file" id="file">

    <input type="submit" value="Analyze">

</form>



<?php



...

Мы концентрируемся на PHP, поэтому не применяем CSS. Не обращайте внимания на внешний вид.

Для хранения изображений мы будем использовать Imgur. Благодаря этому, нашему приложению не понадобится хостинг, чтобы работать с Diffbot (изображения будут публичными, даже если само приложение не будет таковым, что позволит нам сэкономить на хостинге). Первым делом давайте зарегистрируем наше приложение на Imgur по этой ссылке:

В результате мы получим идентификатор клиента и секретный ключ. Нам понадобится только идентификатор клиента (анонимные загрузки), который мы укажем в файле index.php:

$token = 'my_token';

$imgur_client = 'client';

Анализ изображений

Так как же мы будем анализировать изображения?

Согласно документации, Diffbot Image API принимает URL-адрес ресурса и сканирует его на предмет изображений. Затем все найденные изображения анализируются, и возвращается некоторая информация о них.

Нас интересуют теги, которые Diffbot присваивает изображениям. Массив tags представляет собой массив JSON-объектов, каждый из которых содержит имя тега (label) и ссылку (uri) на соответствующую страницу на dbpedia.org. В данном руководстве ссылки нам не понадобятся. Массив tags имеет следующий вид:

"tags": [

        {

          "id": 4368,

          "label": "Beagle",

          "uri": "http://dbpedia.org/resource/Beagle"

        },

        {

          "id": 2370241,

          "label": "Treeing Walker Coonhound",

          "uri": "http://dbpedia.org/resource/Treeing_Walker_Coonhound"

        }

      ]

Если Diffbot присвоил изображению только один тег, тогда в массиве будет присутствовать только один объект. По умолчанию Diffbot возвращает до 5 тегов для каждого проанализированного элемента. Соответственно, каждое изображение может иметь до 5 тегов, причем они не обязательно должны иметь прямую связь. Например, изображению, где присутствует обувь, может быть присвоен как тег «Nike», так и тег «shoe».

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

Обработка формы

Для обработки формы мы добавим следующую базовую логику:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    if (isset($_FILES['file']['tmp_name']) && !empty($_FILES['file']['tmp_name'])) {

        $filename = $_FILES['file']['tmp_name'];



        $c = new Client();

        $response = $c->request('POST', 'https://api.imgur.com/3/image.json', [

            'headers' => [

                'authorization' => 'Client-ID ' . $imgur_client

            ],

            'form_params' => [

                'image' => base64_encode(fread(fopen($filename, "r"),

                    filesize($filename)))

            ]

        ]);



        $body = json_decode($response->getBody()->getContents(), true);

        $url = $body['data']['link'];

        if (empty($url)) {

            echo "<h2>Upload failed</h2>";

            die($body['data']['error']);

        }

    }



    if (!isset($url) && isset($_POST['url'])) {

        $url = $_POST['url'];

    }



    if (!isset($url) || empty($url)) {

        die("That's not gonna work.");

    }



    $d = new Swader\Diffbot\Diffbot($token);

    /** @var Image $imageDetails */

    $imageDetails = $d->createImageAPI($url)->call();

    $tags = $imageDetails->getTags();



    echo "<img width='500' src='{$url}'>";



    switch (count($tags)) {

        case 0:

            echo "<h4>We couldn't figure out the breed :(</h4>";

            break;

        case 1:

            echo "<h4>The breed is probably " . labelSearchLink($tags[0]['label']) . "</h4>";

            echo iframeSearch($tags[0]['label']);

            break;

        default:

            echo "<h4>The breed could be any of the following:</h4>";

            echo "<ul>";

            foreach ($tags as $tag) {

                echo "<li>" . labelSearchLink($tag['label']) . "</li>";

            }

            echo "</ul>";

            echo iframeSearch($tags[0]['label']);

            break;

    }

}

Если пользователь выбрал файл для загрузки, изображение загружается на Imgur, а затем URL-адрес, возвращенный Imgur, передается для обработки Diffbot. Если пользователь указал в форме URL-адрес, тогда этот адрес непосредственно передается Diffbot.

В качестве HTTP-клиента мы используем Guzzle, поскольку он уже установлен, соответственно, Diffbot PHP-клиент может применить его для вызова API.

Получив результаты анализа изображения, мы выводим на экран теги (предполагаемые варианты породы) в форме ссылок на результаты поиска Bing и iframe с результатами поиска для первой породы.

Функции, создающие поисковые ссылки и HTML-элемент iframe представлены ниже:

function labelSearchLink($label) {

    return '<a href="http://www.bing.com/images/search?q='.urlencode($label).'&qs=AS&pq=treein&sc=8-6&sp=1&cvid=92698E3A769C4AFE8C6CA1B1F80FC66D&FORM=QBLH" target="_blank">'.$label.'</a>';

}



function iframeSearch($label) {

    return '<iframe width="100%" height="400" src="http://www.bing.com/images/search?q='.urlencode($label).'&qs=AS&pq=treein&sc=8-6&sp=1&cvid=92698E3A769C4AFE8C6CA1B1F80FC66D&FORM=QBLH" />';

}

Просим прощения за простоту дизайна. Это лишь быстро созданный прототип. Применение CSS и фреймворков отвлекло бы нас от сути вопроса.

Тестирование и сравнение

Как видно на изображении выше, Diffbot тоже неправильно определил породу собаки на фото, использованном в начале статьи, хотя ошибся не так сильно, как приложение от Microsoft. На данном фото бигль (beagle) действительно больше похож на древесную енотовую гончую (treeing walker coonhound), чем на типичного бигля.

Давайте проанализируем другие примеры.

Эх… Microsoft выигрывает этот раунд. Diffbot сделал ставку на две породы: бассет-хаунд (basset hound) и древесную енотовую гончую, но в обоих случаях промахнулся. Попробуем еще.

В точку! Оба приложения дали правильный ответ. Diffbot для надежности снова предложил в качестве альтернативного варианта древесную енотовую гончую.

Теперь давайте возьмем что-нибудь посложнее.

Забавно, на этом изображении оба приложения ошибочно увидели вельш-корги (welsh corgi).

Ну а что, если на фото несколько собак?

Неплохая попытка, Diffbot, но мимо. Хорошая работа, Microsoft!

И, наконец, последнее.

Отличный результат у обоих соперников.

Заключение

Сегодня мы создали приложение для определения породы собак на основе сервиса Diffbot и сравнили его c аналогичным продуктом от Microsoft. Diffbot имеет преимущество, поскольку также может выявлять на изображениях лица, текст, бренды, другие виды животных, а также другие объекты, но в отношении собак данные приложения демонстрируют примерно одинаковую эффективность.

В данной статье мы показали, как легко можно использовать мощь современного искусственного интеллекта для определения породы собак (как минимум с некоторой точностью). В будущем возможности подобных систем будут только расширяться.

Источник

Перевод Станислава Петренко

ЧИТАЙТЕ ТАКЖЕ:

100 строк кода: Обучаем нейронную сеть управлять автомобилем

100 строк Python-кода: Автоматизируем биржевую торговлю

Автор публикации

не в сети 1 час

Лариса Шурига

Комментарии: 16Публикации: 911Регистрация: 05-06-2014

Вам также может понравиться

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
*
Генерация пароля