Использование Google Cloud Vision API с Golang

(Изучение LABEL_DETECTION и TEXT_DETECTION)

Google Cloud Vision API позволяет разработчикам понимать содержание изображения, инкапсулируя мощные модели машинного обучения в простой в использовании REST API.

Cloud Vision API - это простой в использовании REST API, который использует операции HTTP POST для анализа данных на изображениях, которые вы отправляете в запросе. API использует JSON как для запросов, так и для ответов. Типичный запрос JSON Vision API включает содержимое изображений, на которых выполняется обнаружение, и набор операций (называемых функциями), выполняемых с каждым изображением.

Из многих функций, которые предоставляет нам API, мы собираемся изучить «LABEL_DETECTION». Запрос «LABEL_DETECTION» аннотирует изображение с помощью метки (или «тега»), которая выбирается на основе содержимого изображения. Например, изображение сарая может содержать метку «сарай», «ферма» или другую аналогичную аннотацию. Запрос метки - один из наиболее распространенных вариантов использования Vision API. Запрос «TEXT_DETECTION» находит и считывает напечатанные слова, содержащиеся в изображениях.

Google Cloud Vision API является общедоступным, и есть уровень бесплатного пользования, на котором вы можете бесплатно использовать 1000 единиц на один запрос функции в месяц. Кроме того, существует многоуровневая модель ценообразования, основанная на количестве единиц, которые вы используете в месяц.

Мой друг Ромин Ирани написал отличную статью Как создать приложение для мониторинга с помощью API Google Cloud Vision », используя Python. См. Страницы 2, 3 и 4 этой статьи и выполните шаги с 1 по 4. Они необходимы для использования Google Cloud Vision API.

После того, как вы выполните шаги с 1 по 4, давайте приступим к написанию кода Go.

Получить зависимости

Наша программа Go зависит от следующих пакетов. Перед тем как приступить к работе, обязательно приобретите их.

go get -u golang.org/x/net/context golang.org/x/oauth2/google google.golang.org/api/vision/...

label.go

Я создал папку cvision, в которой будет храниться мой исходный код Go label.go, text.go и изображение dog.jpg для анализа. Код Go для label.go такой же, как образец кода для Google Cloud Vision с небольшими изменениями.

C:\go_projects\go\src\github.com\SatishTalim\cvision

Мы будем запускать нашу программу из командной строки в папке «cvision» следующим образом:

go run label.go dog.jpg

Первый проект нашей программы «label.go»

Давайте пока разбираемся в программе.

Сначала «импортируйте» библиотеки, необходимые для запуска программы.

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

go run label.go
Usage: label.exe <path-to-image>
exit status 1

Я получаю указанную выше ошибку, поскольку я не указал имя изображения после «label.go».

Пакет os предоставляет платформо-независимый интерфейс для функциональности операционной системы. Stderr указывает на стандартный файл ошибок.

Пакет filepath реализует служебные программы для управления путями к файлам способом, совместимым с путями к файлам, определяемыми целевой операционной системой. Filepath.Base возвращает последний элемент пути. Конечные разделители пути удаляются перед извлечением последнего элемента. Если путь пуст, База возвращает .

Flag.Parse »анализирует флаги командной строки из os.Args [1:]

Flag.Args »возвращает не флаговые аргументы командной строки.

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

Второй проект нашей программы «label.go»

Мы передаем имя файла изображения функции «run ()».

Подтвердите свою службу

Пакет context определяет тип контекста, который переносит крайние сроки, сигналы отмены и другие значения области запроса через границы API и между процессами. Context.Background () »возвращает ненулевой, пустой Context. Он никогда не отменяется, не имеет значений и срока. Обычно он используется основной функцией, инициализацией и тестами, а также в качестве контекста верхнего уровня для входящих запросов. Не храните контексты внутри типа структуры; вместо этого явно передайте контекст каждой функции, которая в нем нуждается. Контекст должен быть первым параметром, обычно называемым ctx.

Перед взаимодействием со службой Vision API вам необходимо будет аутентифицировать свою службу, используя ранее полученные учетные данные. В приложении самый простой способ получить учетные данные - использовать Учетные данные приложения по умолчанию (ADC). По умолчанию ADC будет пытаться получить учетные данные из переменной среды GOOGLE_APPLICATION_CREDENTIALS, которая должна указывать на файл ключа JSON вашей служебной учетной записи (шаг 4 статьи Ромина Ирани).

Пакет google обеспечивает поддержку выполнения авторизованных и аутентифицированных HTTP-запросов OAuth2 к API Google. Google.DefaultClient »возвращает HTTP-клиента, который использует DefaultTokenSource » для получения учетных данных для аутентификации. Он ищет учетные данные в файле JSON, путь к которому указан переменной среды GOOGLE_APPLICATION_CREDENTIALS.

Пакет Vision предоставляет доступ к Cloud Vision API. Vision.CloudPlatformScope - это константа, которая может просматривать и управлять вашими данными в сервисах Google Cloud Platform.

Vision.New возвращает Услугу.

Теперь у нас есть служба Vision API, с помощью которой мы можем выполнять вызовы API.

Прочтите изображение и создайте запрос, кодируя изображение в base64

Сначала мы считываем данные нашего изображения в переменную. Ioutil.ReadFile читает весь файл, названный по имени файла, и возвращает его содержимое. Запросы к Google Cloud Vision API предоставляются в виде объектов JSON. Однако JSON не поддерживает передачу двоичных данных, поэтому нам нужно будет преобразовать наши двоичные данные в текст, закодировав их в Base64. Переменная StdEncoding - это стандартная кодировка base64. EncodeToString (b) »возвращает кодировку base64 для b.

В настоящее время Vision API состоит из одной коллекции (изображений), которая поддерживает один метод HTTP-запроса (аннотирование). Запрос аннотации передает запрос JSON типа AnnotateImageRequest. Пример показан ниже:

«Requests» - массив запросов, по одному для каждого изображения.
«image» - данные изображения для этого запроса.
«features» - массив функций, которые необходимо обнаружить для этого изображения
«Type» - пример типа функции LABEL_DETECTION
«maxResults» - максимальное количество результатов, возвращаемых для этого типа функции. API может возвращать меньше результатов.

Vision.AnnotateImageRequest »- это запрос на выполнение задач Vision над предоставленным пользователем изображением с запрошенными пользователем функциями.

Vision.Image: изображение клиента для выполнения задач Vision.

Vision.Feature »указывает, какой тип задачи по обнаружению изображений следует выполнять. Пользователи описывают тип задач Vision, которые нужно выполнять над изображениями, с помощью функций. Функции кодируют вертикаль Vision, над которой нужно работать, и количество лучших результатов, которые нужно вернуть. Мы используем LABEL_DETECTION. В нашем случае мы просим 5 результатов, которые будут даны нам в порядке возрастания вероятности.

Отправка запросов в пакетном режиме

Vision.BatchAnnotateImagesRequest - несколько запросов на аннотации изображений объединяются в один сервисный вызов.

«Аннотировать»: запускать обнаружение изображений и аннотации для пакета изображений. «Do» выполняет вызов «vision.images.annotate».

Выполнен запрос POST.

Формат ответа JSON

На запрос Аннотировать приходит ответ JSON типа AnnotateImageResponse. Хотя запросы одинаковы для каждого типа функции, ответы для каждого типа функции могут быть совершенно разными.

«LabelAnnotations», если присутствует, обнаружение метки выполнено успешно. «Описание» - это текстовое описание сущности.

Запустите программу

go run label.go dog.jpg

Вывод

Found label: pet, Score: 0.989092 for dog.jpg
Found label: dog, Score: 0.988883 for dog.jpg
Found label: mammal, Score: 0.962768 for dog.jpg
Found label: animal, Score: 0.954685 for dog.jpg
Found label: labrador retriever, Score: 0.941879 for dog.jpg

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

text.go

Эта программа очень похожа на «label.go» с некоторыми незначительными изменениями, как показано ниже.

Запустите программу

go run text.go dog.jpg

Вывод

Found text: BENZY

Теперь вы можете легко написать программу Go, которая может использовать «LOGO_DETECTION» и «FACE_DETECTION».

Вот и все!