Статьи

Как использовать API Google Cloud Vision в приложениях для Android

Компьютерное зрение считается ИИ-полной проблемой. Другими словами, ее решение было бы эквивалентно созданию такой же умной программы, как люди. Излишне говорить, что такая программа еще не создана. Однако, если вы когда-либо пользовались такими приложениями, как Google Goggles или Google Photos — или смотрели сегмент на Объективе Google в лейтмотиве Google I / O 2017 — вы, вероятно, понимаете, что компьютерное зрение стало очень мощным.

Через API на основе REST под названием Cloud Vision API , Google делится своими революционными технологиями, связанными с видением, со всеми разработчиками. Используя API, вы можете легко добавлять впечатляющие функции, такие как распознавание лиц, обнаружение эмоций и оптическое распознавание символов, в свои приложения для Android. В этом уроке я покажу как.

Чтобы следовать этому руководству, вы должны иметь:

Если некоторые из вышеперечисленных требований покажутся вам незнакомыми, я предлагаю вам прочитать следующее вводное руководство по платформе Google Cloud Machine Learning:

  • Android SDK
    Как использовать Google Cloud Machine Learning Services для Android

Вы можете использовать API Cloud Vision в своем приложении Android только после того, как включите его в консоли Google Cloud и получите действительный ключ API. Итак, начните с входа в консоль и перейдите к API Manager> Library> Vision API . На открывшейся странице просто нажмите кнопку « Включить» .

Enable Cloud Vision API

Если вы уже сгенерировали ключ API для своего проекта консоли Cloud, вы можете перейти к следующему шагу, поскольку вы сможете повторно использовать его с API Cloud Vision. В противном случае откройте вкладку Credentials и выберите Create Credentials> API key .

Create API key

В появившемся диалоговом окне вы увидите свой ключ API.

Как и большинство других API, предлагаемых Google, к API Cloud Vision можно получить доступ с помощью клиентской библиотеки Google API . Чтобы использовать библиотеку в своем проекте Android Studio, добавьте следующие зависимости compile в файл build.gradle модуля app :

1
2
3
compile ‘com.google.api-client:google-api-client-android:1.22.0’
compile ‘com.google.apis:google-api-services-vision:v1-rev357-1.22.0’
compile ‘com.google.code.findbugs:jsr305:2.0.1’

Кроме того, чтобы упростить операции ввода-вывода файлов, я предлагаю вам также добавить зависимость compile для библиотеки ввода-вывода Apache Commons .

1
compile ‘commons-io:commons-io:2.5’

Поскольку клиент API Google может работать только в том случае, если ваше приложение имеет разрешение INTERNET , убедитесь, что в файле манифеста вашего проекта присутствует следующая строка:

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

Вы должны настроить клиент API Google, прежде чем использовать его для взаимодействия с API Cloud Vision. Для этого в первую очередь необходимо указать ключ API, транспорт HTTP и фабрику JSON, которую он должен использовать. Как и следовало ожидать, транспорт HTTP будет отвечать за связь с серверами Google, а фабрика JSON, помимо прочего, будет отвечать за преобразование результатов, основанных на JSON API, в объекты Java.

Для современных приложений Android Google рекомендует использовать класс NetHttpTransport в качестве транспорта HTTP и класс AndroidJsonFactory в качестве фабрики JSON.

Класс Vision представляет клиент Google API для Cloud Vision. Хотя можно создать экземпляр класса, используя его конструктор, сделать это с Vision.Builder класса Vision.Builder проще и более гибко.

При использовании класса Vision.Builder вы должны не забыть вызвать метод setVisionRequestInitializer() чтобы указать свой ключ API. Следующий код показывает вам, как:

1
2
3
4
5
6
7
Vision.Builder visionBuilder = new Vision.Builder(
                new NetHttpTransport(),
                new AndroidJsonFactory(),
                null);
 
visionBuilder.setVisionRequestInitializer(
            new VisionRequestInitializer(«YOUR_API_KEY»));

Когда экземпляр Vision.Builder готов, вы можете вызвать его метод build() чтобы сгенерировать новый экземпляр Vision вы можете использовать в своем приложении.

1
Vision vision = visionBuilder.build();

На данный момент у вас есть все, что вам нужно, чтобы начать использовать Cloud Vision API.

Обнаружение лиц на фотографиях является очень распространенным требованием в приложениях, связанных с компьютерным зрением. Используя Cloud Vision API, вы можете создать высокоточный детектор лица, который также может определять эмоции, условия освещения и ориентиры лица.

Для демонстрации мы запустим функцию распознавания лиц на следующей фотографии, на которой изображена команда «Аполлона-9»:

Sample photo for face detection

Я предлагаю вам скачать версию фотографии в высоком разрешении с Wikimedia Commons и поместить ее в папку res / raw вашего проекта.

Cloud Vision API ожидает, что его входное изображение будет закодировано в виде строки Base64, которая находится внутри объекта Image . Однако перед созданием такого объекта необходимо преобразовать загруженную фотографию, которая в настоящее время является необработанным ресурсом изображения, в byte массив. Это можно быстро сделать, открыв его входной поток с помощью openRawResource() класса Resources и передав его toByteArray() класса IOUtils .

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

01
02
03
04
05
06
07
08
09
10
11
12
13
// Create new thread
AsyncTask.execute(new Runnable() {
    @Override
    public void run() {
        // Convert photo to byte array
        InputStream inputStream =
                    getResources().openRawResource(R.raw.photo);
        byte[] photoData = IOUtils.toByteArray(inputStream);
        inputStream.close();
 
        // More code here
    }
});

Теперь вы можете создать объект Image , вызвав его конструктор по умолчанию. Чтобы добавить byte массив к нему в виде строки Base64, все, что вам нужно сделать, это передать массив в его encodeContent() .

1
2
Image inputImage = new Image();
inputImage.encodeContent(photoData);

Поскольку API Cloud Vision предлагает несколько различных функций, вы должны явно указать интересующую вас функцию при выполнении запроса к ней. Для этого необходимо создать объект Feature и вызвать его setType() . Следующий код показывает, как создать объект Feature для распознавания лиц:

1
2
Feature desiredFeature = new Feature();
desiredFeature.setType(«FACE_DETECTION»);

Используя объекты Image и Feature , теперь вы можете создать экземпляр AnnotateImageRequest .

1
2
3
AnnotateImageRequest request = new AnnotateImageRequest();
request.setImage(inputImage);
request.setFeatures(Arrays.asList(desiredFeature));

Обратите внимание, что объект AnnotateImageRequest всегда должен принадлежать объекту BatchAnnotateImagesRequest поскольку API Cloud Vision предназначен для обработки нескольких изображений одновременно. Чтобы инициализировать экземпляр BatchAnnotateImagesRequest содержащий один объект AnnotateImageRequest , вы можете использовать служебный метод Arrays.asList() .

1
2
3
4
BatchAnnotateImagesRequest batchRequest =
                        new BatchAnnotateImagesRequest();
                         
batchRequest.setRequests(Arrays.asList(request));

Чтобы фактически сделать запрос обнаружения лица, вы должны вызвать метод execute() объекта Annotate который инициализирован с использованием только что созданного BatchAnnotateImagesRequest объекта BatchAnnotateImagesRequest . Чтобы создать такой объект, необходимо вызвать метод annotate() предлагаемый клиентом Google API для Cloud Vision. Вот как:

1
2
BatchAnnotateImagesResponse batchResponse =
       vision.images().annotate(batchRequest).execute();

После обработки запроса вы получаете объект BatchAnnotateImagesResponse содержащий ответ API. Для запроса обнаружения лица ответ содержит объект FaceAnnotation для каждого лица, обнаруженного API. Вы можете получить список всех объектов FaceAnnotation используя метод getFaceAnnotations() .

1
2
List<FaceAnnotation> faces = batchResponse.getResponses()
                               .get(0).getFaceAnnotations();

Объект FaceAnnotation содержит много полезной информации о лице, таком как его местоположение, его угол и эмоция, которую он выражает. Начиная с версии 1, API может обнаруживать только следующие эмоции: радость, печаль, гнев и удивление.

Чтобы этот урок был коротким, давайте теперь просто отобразим следующую информацию в Toast :

  • Количество лиц
  • Вероятность того, что они выражают радость

Конечно, вы можете получить количество граней, вызвав метод size() в List содержащем объекты FaceAnnotation . Чтобы получить вероятность того, что лицо выражает радость, вы можете вызвать интуитивно названный getJoyLikelihood() связанного объекта FaceAnnotation .

Обратите внимание: поскольку простой Toast может отображать только одну строку, вам придется объединить все вышеперечисленные детали. Кроме того, Toast может отображаться только из потока пользовательского интерфейса, поэтому обязательно вызывайте его после вызова runOnUiThread() . Следующий код показывает вам, как:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Count faces
int numberOfFaces = faces.size();
 
// Get joy likelihood for each face
String likelihoods = «»;
for(int i=0; i<numberOfFaces; i++) {
    likelihoods += «\n It is » +
                faces.get(i).getJoyLikelihood() +
                » that face » + i + » is happy»;
}
 
// Concatenate everything
final String message =
        «This photo has » + numberOfFaces + » faces» + likelihoods;
 
// Display toast on UI thread
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getApplicationContext(),
                message, Toast.LENGTH_LONG).show();
    }
});

Теперь вы можете запустить приложение и увидеть следующий результат:

Face detection results

Процесс извлечения строк из фотографий текста называется оптическим распознаванием символов, или, для краткости, OCR. Cloud Vision API позволяет легко создавать оптический считыватель символов, который может обрабатывать фотографии как печатного, так и рукописного текста. Более того, созданный вами читатель не будет иметь проблем с чтением углового текста или текста, наложенного на красочную картинку.

API предлагает две различные функции для распознавания текста:

  • TEXT_DETECTION , для чтения небольших объемов текста, таких как текст на вывесках или обложках книг
  • и DOCUMENT_TEXT_DETECTION , для чтения большого количества текста, такого как текст, представленный на страницах романа

Шаги, которые необходимо выполнить, чтобы сделать запрос OCR, идентичны шагам, которые вы выполнили, чтобы сделать запрос обнаружения лица, за исключением того, как вы инициализировали объект Feature . Для OCR вы должны установить его тип либо TEXT_DETECTION либо DOCUMENT_TEXT_DETECTION . Пока пойдем с первым.

1
2
Feature desiredFeature = new Feature();
desiredFeature.setType(«TEXT_DETECTION»);

Вам, конечно же, также нужно будет поместить фотографию с текстом в папку res / raw вашего проекта. Если у вас нет такой фотографии, вы можете использовать эту, которая показывает дорожный знак:

Sample photo for text detection

Вы можете скачать версию фотографии с высоким разрешением из Wikimedia Commons .

Чтобы начать обработку результатов операции OCR, после получения объекта BatchAnnotateImagesResponse необходимо вызвать метод getFullTextAnnotation() чтобы получить объект TextAnnotation содержащий весь извлеченный текст.

1
2
final TextAnnotation text = batchResponse.getResponses()
                       .get(0).getFullTextAnnotation();

Затем вы можете вызвать метод getText() объекта TextAnnotation чтобы фактически получить ссылку на строку, содержащую извлеченный текст.

Следующий код показывает, как отобразить извлеченный текст с помощью Toast :

1
2
Toast.makeText(getApplicationContext(),
               text.getText(), Toast.LENGTH_LONG).show();

Если вы запустите свое приложение сейчас, вы должны увидеть что-то вроде этого:

Text detection results

Из этого руководства вы узнали, как использовать API Cloud Vision для добавления функций обнаружения лиц, эмоций и оптического распознавания символов в приложения для Android. Я уверен, что вы согласитесь со мной, когда я скажу, что эти новые возможности позволят вашим приложениям предлагать более интуитивно понятные и интеллектуальные пользовательские интерфейсы.

Стоит отметить, что в Cloud Vision API отсутствует одна важная функция: распознавание лиц. В своем текущем виде API может только распознавать лица, но не идентифицировать их.

Чтобы узнать больше об API, вы можете обратиться к официальной документации .

А между тем, ознакомьтесь с некоторыми другими нашими учебниками по добавлению компьютерного обучения в ваши приложения для Android!

  • Android SDK
    Как использовать Google Cloud Machine Learning Services для Android
  • Android SDK
    Создайте интеллектуальное приложение с Google Cloud Speech и API на естественном языке
  • Android вещи
    Android вещи и машинное обучение
    Пол Требилкокс-Руис