Инструкция: как создать распознаватель изображений

Перед использованием технологии Visual Recognition можно предоставить «обучающий материал», на основе которого модуль и будет распознавать изображения в дальнейшем. Изображение: скриншот из официального ролик IBM.
Перед использованием технологии Visual Recognition можно предоставить «обучающий материал», на основе которого модуль и будет распознавать изображения в дальнейшем. Изображение: скриншот из официального ролик IBM.

Сер­вис Visual Recognition ком­па­нии IBM поз­во­ля­ет «объ­яс­нить» машине, что изоб­ра­же­но на кар­тин­ке, и клас­си­фи­ци­ро­вать дан­ные. Он рас­по­зна­ет лица людей, опре­де­ля­ет их при­мер­ный воз­раст, пол, ищет схо­жие изоб­ра­же­ния. Теп­ли­ца пере­ве­ла руко­вод­ство раз­ра­бот­чи­ка, бло­ге­ра Ашра­фа Хази­бе­ла­га­ла (Ashraff Hathibelagal), в кото­ром экс­перт рас­ска­зал, как само­сто­я­тель­но создать при­ло­же­ние для Android на осно­ве сер­ви­са.

Что у вас долж­но быть: учет­ная запись IBM BluemixAndroid Studio 3.0 Canary 8 и эму­ля­тор Android 4.4 и более новой вер­сии.

С помо­щью сер­ви­са вы може­те так­же созда­вать соб­ствен­ные кастом­ные шаб­ло­ны. Перед исполь­зо­ва­ни­ем тех­но­ло­гии Visual Recognition мож­но предо­ста­вить «обу­ча­ю­щий мате­ри­ал», на осно­ве кото­ро­го модуль и будет рас­по­зна­вать изоб­ра­же­ния в даль­ней­шем.

1. Активация

Сер­вис дол­жен быть акти­ви­ро­ван вруч­ную перед тем, как его мож­но будет исполь­зо­вать в при­ло­же­нии. Поэто­му вой­ди­те в кон­соль Ibm Bluemix и перей­ди­те Services > Watson. На открыв­шей­ся стра­ни­це нажми­те кноп­ку «создать сер­вис» (Create Watson service).

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Из спис­ка доступ­ных услуг, пока­зан­ных ниже, выбе­ри­те Visual Recognition.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Теперь вы може­те дать рабо­чее назва­ние сер­ви­су и нажать кноп­ку «создать» (Create).

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Как толь­ко служ­ба будет гото­ва, для нее будет создан API ключ. Его мож­но посмот­реть, открыв вклад­ку учет­ных дан­ных служ­бы (Service credentials) и нажав кноп­ку уче­та дан­ных про­смот­ра (View Credentials).

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

2. Настройка проекта

В этом уро­ке мы будем исполь­зо­вать Watson Java и Android SDKs, вза­и­мо­дей­ствуя с сер­ви­сом Visual Recognition. Мы так­же будем исполь­зо­вать биб­лио­те­ку Picasso для поис­ка изоб­ра­же­ний из Интер­не­та. Поэто­му добавь­те сле­ду­ю­щие зна­че­ния implementation к ваше­му app фай­лу моду­ля build.gradle.

implementation 'com.ibm.watson.developer_cloud:visual-recognition:3.9.1'
implementation 'com.ibm.watson.developer_cloud:android-sdk:0.4.2'

implementation 'com.squareup.picasso:picasso:2.5.2'

Что­бы вза­и­мо­дей­ство­вать с сер­ве­ра­ми Watson, ваше­му при­ло­же­нию потре­бу­ет­ся раз­ре­ше­ние на Internet, запро­си­те его в фай­ле Androidmanifest.xml ваше­го про­ек­та.

<uses-permission android:name="android.permission.INTERNET" />

Кро­ме того, при­ло­же­нию, кото­рое мы будем созда­вать, потре­бу­ет­ся доступ к каме­ре и внеш­ним носи­те­лям, поэто­му вы так­же долж­ны запро­сить раз­ре­ше­ние на сле­ду­ю­щие зна­че­ния: camera и write_external_storage.

1 <uses-permissionandroid:name="android.permission.CAMERA"/>

2 <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Послед­нее: добавь­те ключ API для визу­аль­но­го рас­по­зна­ва­ния в файл strings.xml.

<string name="api_key">a1234567890bcdefe</string>

3. Инициализация приложения

Watson Java SDK исполь­зу­ет все функ­ции, пред­ла­га­е­мые Visual Recognition через спе­ци­аль­ный класс visualrecognition. Поэто­му вы долж­ны теперь ини­ци­а­ли­зи­ро­вать его экзем­пляр с помо­щью сво­е­го кон­струк­то­ра.

При исполь­зо­ва­нии Visual Recognition вы обыч­но буде­те делать сним­ки с помо­щью каме­ры устрой­ства. У Watson Android SDK есть функ­ция CameraHelper, что­бы помочь вам в этом. Я пред­ла­гаю так­же ини­ци­а­ли­зи­ро­вать экзем­пляр oncreate ().

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Сей­час у вас есть все необ­хо­ди­мое для того, что­бы начать про­цесс рас­по­зна­ва­ния изоб­ра­же­ний с помо­щью сер­ви­са.

4. Обнаружение объекта

Сер­вис может обна­ру­жи­вать боль­шое коли­че­ство физи­че­ских объ­ек­тов. Кар­тин­ка долж­на быть доста­точ­но хоро­шо осве­ще­на, а ее раз­ре­ше­ние – состав­лять не менее 224×224 пик­се­лей. Попро­бу­ем сде­лать фото­гра­фию с помо­щью каме­ры.

Шаг 1: Определение макета

Поль­зо­ва­тель дол­жен иметь воз­мож­ность нажи­мать кноп­ку, что­бы сде­лать сни­мок, поэто­му в XML-фай­ле маке­та ваше­го про­цес­са дол­жен быть виджет Button. Так­же нужен виджет textview для отоб­ра­же­ния обна­ру­жен­ных объ­ек­тов. При жела­нии вы може­те доба­вить виджет ImageView.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

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

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Шаг 2: Сделайте снимок

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

1

helper.dispatchTakePictureIntent();

При­ве­ден­ный выше метод исполь­зу­ет при­ло­же­ние каме­ры по умол­ча­нию, что­бы сде­лать сни­мок. Это озна­ча­ет, что для досту­па к сним­ку вы долж­ны отме­нить метод onActivityResult () и посмот­реть резуль­та­ты по коду запро­са Request_Image_Capture. При­мер:

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Как толь­ко вы най­де­те пра­виль­ный резуль­тат, може­те извлечь изоб­ра­же­ние из него в виде раст­ро­во­го объ­ек­та, исполь­зуя метод getbitmap () клас­са camerahelper. Добавь­те сле­ду­ю­щий код:

1
2
final Bitmap photo = helper.getBitmap(resultCode);

final File photoFile = helper.getFile(resultCode);

Если вы реши­ли доба­вить виджет Imageview в свой макет, вы може­те отоб­ра­зить изоб­ра­же­ние напря­мую, пере­да­вая раст­ро­вое изоб­ра­же­ние через setimagebitmap ().

1
2
ImageView preview = findViewById(R.id.preview);
preview.setImageBitmap(photo);

Шаг 3: Классифицируйте изображение

Для обна­ру­же­ния эле­мен­тов на кар­тин­ке вы долж­ны пере­не­сти изоб­ра­же­ние в classify () мето­да visualrecognition. Одна­ко преж­де чем вы это сде­ла­е­те, вы долж­ны поме­стить его в объ­ект classifyimagesoptions, кото­рый может быть создан с исполь­зо­ва­ни­ем клас­са classifyimagesoptions.builder.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Воз­вра­ща­е­мое зна­че­ние мето­да classify () явля­ет­ся объ­ек­том servicecall, кото­рый под­дер­жи­ва­ет син­хрон­ные и асин­хрон­ные сете­вые запро­сы. Назо­вем его мето­дом execute () для син­хрон­но­го запро­са.

Метод classify () создан для одно­вре­мен­ной обра­бот­ки несколь­ких изоб­ра­же­ний. Сле­до­ва­тель­но, его ответ пред­став­ля­ет собой спи­сок дета­лей клас­си­фи­ка­ции. Так как мы рабо­та­ем с одной кар­ти­ной, нам про­сто нужен пер­вый эле­мент спис­ка. Вот как вы може­те это полу­чить:

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Сле­ду­ю­щий код пока­зы­ва­ет вам, как пере­би­рать спи­сок клас­сов и отоб­ра­жать име­на толь­ко тех, чьи оцен­ки боль­ше 70 в видже­тах textview. Сер­вис Visual Recognition рас­смат­ри­ва­ет каж­дый эле­мент, кото­рый он обна­ру­жил, как отдель­ный класс типа visualclassifier.visualclass. Исполь­зуя метод getclasses (), вы може­те полу­чить спи­сок всех клас­сов. У каж­до­го клас­са есть имя и оцен­ка дове­рия.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Обра­ти­те вни­ма­ние, что в при­ве­ден­ном выше коде исполь­зу­ет­ся метод runonuithread (), пото­му что содер­жи­мое видже­та textview может обнов­лять­ся толь­ко из пото­ка UI. Если вы сей­час запу­сти­те при­ло­же­ние и сде­ла­е­те сни­мок, вы смо­же­те уви­деть, как рабо­та­ет клас­си­фи­ка­ция изоб­ра­же­ний Watson.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

5. Распознавание лиц

У сер­ви­са есть спе­ци­аль­ный метод обра­бот­ки чело­ве­че­ских лиц. Он спо­со­бен опре­де­лять воз­раст и пол чело­ве­ка на любой фото­гра­фии. А если этот чело­век изве­стен, то он может назвать его.

Шаг 1: Определение макета

Ана­лиз лиц с помо­щью сер­ви­са не слиш­ком отли­ча­ет­ся от клас­си­фи­ка­ции объ­ек­тов. Поэто­му вы може­те повтор­но исполь­зо­вать макет, кото­рый созда­ли ранее. Одна­ко, что­бы позна­ко­мить вас с еще несколь­ки­ми воз­мож­но­стя­ми, пред­ла­га­е­мы­ми сер­ви­сом, я создам новый макет с дру­гой функ­ци­о­наль­но­стью.

На этот раз вме­сто того, что­бы делать сним­ки с помо­щью каме­ры и пере­да­вать их на сер­вис, исполь­зу­ем URL-адрес изоб­ра­же­ния. Что­бы поль­зо­ва­тель мог вве­сти URL-адрес и начать ана­лиз, наше­му маке­ту пона­до­бит­ся виджет Edittext и виджет Button. Виджет Textview так­же пона­до­бит­ся для отоб­ра­же­ния резуль­та­тов ана­ли­за.

Я пред­ла­гаю вам так­же доба­вить виджет Imageview в макет, что­бы поль­зо­ва­тель мог видеть изоб­ра­же­ние, на кото­рое ука­зы­ва­ет URL.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Шаг 2: Отображение изображения

Внут­ри видже­та Button вы може­те вызвать gettext () метод видже­та Edittext, что­бы опре­де­лить URL-адрес изоб­ра­же­ния. Как толь­ко вы узна­е­те URL-адрес, вы може­те про­сто пере­дать его Picasso с помо­щью load () и into () для загруз­ки и отоб­ра­же­ния кар­тин­ки в видже­те Imageview.

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Шаг 3: Анализ лица

Для запус­ка ана­ли­за лица на URL-адре­се вы долж­ны исполь­зо­вать detectfaces () метод visualrecognition кли­ен­та. Как и метод classify (), этот метод так­же нуж­да­ет­ся в объ­ек­те visualrecognitionoptions. Вы уже зна­е­те, как исполь­зо­вать метод execute () для созда­ния син­хрон­ных запро­сов, давай­те теперь вме­сто это­го вызы­ва­ем метод enqueue (), кото­рый выпол­ня­ет­ся асин­хрон­но и тре­бу­ет обрат­но­го вызо­ва. Сле­ду­ю­щий код пока­зы­ва­ет вам, как это сде­лать:

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Как вы може­те видеть в при­ве­ден­ном выше коде, внут­ри мето­да onresponse () обрат­но­го вызо­ва у вас есть доступ к объ­ек­ту обна­ру­жен­ных объ­ек­тов, кото­рый содер­жит спи­сок резуль­та­тов ана­ли­за лица. Так как мы исполь­зо­ва­ли один образ в каче­стве наше­го вво­да, нам пона­до­бит­ся толь­ко пер­вый эле­мент спис­ка. При­ме­няя метод getfaces (), вы полу­ча­е­те спи­сок всех обна­ру­жен­ных объ­ек­тов лица.

1

List<Face> faces = response.getImages().get(0).getFaces();

Каж­дый объ­ект лица име­ет свя­зан­ный с ним пол и воз­раст­ной диа­па­зон, к кото­рым мож­но полу­чить доступ, исполь­зуя мето­ды getgender () и getage ().

Метод getgender () фак­ти­че­ски воз­вра­ща­ет объ­ект к gender. Вы долж­ны исполь­зо­вать свой соб­ствен­ный метод getgender (), что­бы полу­чить пол как стро­ку, кото­рая будет либо «муж­ской», либо «жен­ской». Ана­ло­гич­ным обра­зом метод getage () воз­вра­ща­ет воз­раст­ной объ­ект. Исполь­зуя мето­ды getmin () и getmax (), вы може­те опре­де­лить при­бли­зи­тель­ный воз­раст лица.

Сле­ду­ю­щий код пока­зы­ва­ет вам, как пере­би­рать спи­сок объ­ек­тов лица, гене­ри­ро­вать стро­ку, содер­жа­щую ген­дер­ные груп­пы и воз­раст всех лиц, и отоб­ра­жать ее в видже­тах Textview:

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Вот при­мер резуль­та­та рас­по­зна­ва­ния лица:

Изображение: скриншот с сайта code.tutsplus.com
Изоб­ра­же­ние: скрин­шот с сай­та code.tutsplus.com

Заключение

Сер­вис поз­во­ля­ет вам созда­вать умные при­ло­же­ния, кото­рые осве­дом­ле­ны о том, что их окру­жа­ет. В этом уро­ке вы узна­ли, как исполь­зо­вать сер­вис сов­мест­но с Watson Java и Android SDKs для обна­ру­же­ния и ана­ли­за объ­ек­тов и лиц. Что­бы боль­ше узнать об услу­ге, вы може­те обра­тить­ся к офи­ци­аль­ной доку­мен­та­ции.

Ори­ги­нал руко­вод­ства (Eng).