Компьютерное зрение считается ИИ-полной проблемой. Другими словами, ее решение было бы эквивалентно созданию такой же умной программы, как люди. Излишне говорить, что такая программа еще не создана. Однако, если вы когда-либо пользовались такими приложениями, как Google Goggles или Google Photos — или смотрели сегмент на Объективе Google в лейтмотиве Google I / O 2017 — вы, вероятно, понимаете, что компьютерное зрение стало очень мощным.
Через API на основе REST под названием Cloud Vision API , Google делится своими революционными технологиями, связанными с видением, со всеми разработчиками. Используя API, вы можете легко добавлять впечатляющие функции, такие как распознавание лиц, обнаружение эмоций и оптическое распознавание символов, в свои приложения для Android. В этом уроке я покажу как.
Предпосылки
Чтобы следовать этому руководству, вы должны иметь:
- аккаунт Google Cloud Platform
- проект в консоли Google Cloud
- последняя версия Android Studio
- и устройство под управлением Android 4.4 или выше
Если некоторые из вышеперечисленных требований покажутся вам незнакомыми, я предлагаю вам прочитать следующее вводное руководство по платформе Google Cloud Machine Learning:
1. Включение API Cloud Vision
Вы можете использовать API Cloud Vision в своем приложении Android только после того, как включите его в консоли Google Cloud и получите действительный ключ API. Итак, начните с входа в консоль и перейдите к API Manager> Library> Vision API . На открывшейся странице просто нажмите кнопку « Включить» .
Если вы уже сгенерировали ключ API для своего проекта консоли Cloud, вы можете перейти к следующему шагу, поскольку вы сможете повторно использовать его с API Cloud Vision. В противном случае откройте вкладку Credentials и выберите Create Credentials> API key .
В появившемся диалоговом окне вы увидите свой ключ API.
2. Добавление зависимостей
Как и большинство других 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»/>
|
3. Настройка API-клиента
Вы должны настроить клиент 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.
4. Обнаружение и анализ лиц
Обнаружение лиц на фотографиях является очень распространенным требованием в приложениях, связанных с компьютерным зрением. Используя Cloud Vision API, вы можете создать высокоточный детектор лица, который также может определять эмоции, условия освещения и ориентиры лица.
Для демонстрации мы запустим функцию распознавания лиц на следующей фотографии, на которой изображена команда «Аполлона-9»:
Я предлагаю вам скачать версию фотографии в высоком разрешении с Wikimedia Commons и поместить ее в папку res / raw вашего проекта.
Шаг 1: закодировать фото
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);
|
Шаг 2: Сделать запрос
Поскольку 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();
|
Шаг 3: Используйте ответ
После обработки запроса вы получаете объект 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();
}
});
|
Теперь вы можете запустить приложение и увидеть следующий результат:
5. Чтение текста
Процесс извлечения строк из фотографий текста называется оптическим распознаванием символов, или, для краткости, 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 вашего проекта. Если у вас нет такой фотографии, вы можете использовать эту, которая показывает дорожный знак:
Вы можете скачать версию фотографии с высоким разрешением из 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();
|
Если вы запустите свое приложение сейчас, вы должны увидеть что-то вроде этого:
Вывод
Из этого руководства вы узнали, как использовать API Cloud Vision для добавления функций обнаружения лиц, эмоций и оптического распознавания символов в приложения для Android. Я уверен, что вы согласитесь со мной, когда я скажу, что эти новые возможности позволят вашим приложениям предлагать более интуитивно понятные и интеллектуальные пользовательские интерфейсы.
Стоит отметить, что в Cloud Vision API отсутствует одна важная функция: распознавание лиц. В своем текущем виде API может только распознавать лица, но не идентифицировать их.
Чтобы узнать больше об API, вы можете обратиться к официальной документации .
А между тем, ознакомьтесь с некоторыми другими нашими учебниками по добавлению компьютерного обучения в ваши приложения для Android!