Мощный анализ изображений с Google Cloud Vision и Python
Опубликовано: 2022-03-10Совсем недавно я создал веб-приложение для управления личными расходами пользователей. Его основные функции заключаются в сканировании чеков покупок и извлечении данных для дальнейшей обработки. Google Vision API оказался отличным инструментом для получения текста из фотографии. В этой статье я проведу вас через процесс разработки с помощью Python в примере проекта.
Если вы новичок, не волнуйтесь. Вам понадобятся только самые базовые знания этого языка программирования — никаких других навыков не требуется.
Давайте начнем, не так ли?
Никогда не слышали о Google Cloud Vision?
Это API, который позволяет разработчикам анализировать содержимое изображения с помощью извлеченных данных. Для этой цели Google использует модели машинного обучения, обученные на большом наборе изображений. Все это доступно с помощью одного запроса API. Механизм, лежащий в основе API, классифицирует изображения, обнаруживает объекты, лица людей и распознает печатные слова на изображениях.
В качестве примера возьмем всеми любимый Giphy. Они внедрили API для извлечения данных подписей из GIF-файлов, что привело к значительному улучшению взаимодействия с пользователем. Другой пример — realtor.com, который использует OCR Vision API для извлечения текста из изображений вывесок «Продается», сделанных в мобильном приложении, чтобы предоставить более подробную информацию об объекте недвижимости.
Краткий обзор машинного обучения
Начнем с ответа на вопрос, который многие из вас наверняка уже слышали — что такое машинное обучение?
Общая идея состоит в том, чтобы разработать программируемую модель, которая находит закономерности в предоставленных данных. Чем более качественные данные вы предоставляете и чем лучше дизайн модели, которую вы используете, тем более разумным будет результат. Благодаря «дружественному машинному обучению» (как Google называет свои услуги машинного обучения через API) вы можете легко включить часть искусственного интеллекта в свои приложения.
Рекомендуемая литература : Начало работы с машинным обучением
Как начать работу с Google Cloud
Начнем с регистрации в Google Cloud. Google требует аутентификации, но это просто и безболезненно — вам нужно только сохранить файл JSON, включающий ключ API, который вы можете получить непосредственно из Google Cloud Platform.
Загрузите файл и добавьте его путь к переменным среды:
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/apikey.json
Кроме того, в процессе разработки вы можете поддержать себя с помощью from_serivce_account_json()
, который я опишу далее в этой статье. Чтобы узнать больше об аутентификации, ознакомьтесь с официальной документацией Cloud.
Google предоставляет пакет Python для работы с API. Давайте добавим в ваше приложение последнюю версию google-cloud-vision==0.33 . Время кодировать!
Как объединить Google Cloud Vision с Python
Во-первых, давайте импортируем классы из библиотеки.
from google.cloud import vision from google.cloud.vision import types
Когда об этом позаботятся, теперь вам понадобится экземпляр клиента. Для этого вы будете использовать функцию распознавания текста.
client = vision.ImageAnnotatorClient()
Если вы не будете хранить свои учетные данные в переменных среды, на этом этапе вы можете добавить их непосредственно в клиент.
client = vision.ImageAnnotatorClient.from_service_account_file( '/path/to/apikey.json' )
Предполагая, что вы храните изображения для обработки в папке «images» внутри каталога вашего проекта, давайте откроем одно из них.
image_to_open = 'images/receipt.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read()
Следующим шагом является создание объекта Vision, который позволит вам отправить запрос на продолжение распознавания текста.
image = vision.types.Image(content=content) text_response = client.text_detection(image=image)
Ответ состоит из обнаруженных слов, хранящихся в качестве ключей описания, их местоположения на изображении и предсказания языка. Например, давайте подробнее рассмотрим первое слово:
[ ... description: "SHOPPING" bounding_poly { vertices { x: 1327 y: 1513 } vertices { x: 1789 y: 1345 } vertices { x: 1821 y: 1432 } vertices { x: 1359 y: 1600 } } ... ]
Как видите, чтобы отфильтровать только текст, нужно получить описание «по всем элементам». К счастью, на помощь приходит мощное понимание списков Python.
texts = [text.description for text in text_response.text_annotations] ['SHOPPING STORE\nREG 12-21\n03:22 PM\nCLERK 2\n618\n1 MISC\n1 STUFF\n$0.49\n$7.99\n$8.48\n$0.74\nSUBTOTAL\nTAX\nTOTAL\nCASH\n6\n$9. 22\n$10.00\nCHANGE\n$0.78\nNO REFUNDS\nNO EXCHANGES\nNO RETURNS\n', 'SHOPPING', 'STORE', 'REG', '12-21', '03:22', 'PM', 'CLERK', '2', '618', '1', 'MISC', '1', 'STUFF', '$0.49', '$7.99', '$8.48', '$0.74', 'SUBTOTAL', 'TAX', 'TOTAL', 'CASH', '6', '$9.', '22', '$10.00', 'CHANGE', '$0.78', 'NO', 'REFUNDS', 'NO', 'EXCHANGES', 'NO', 'RETURNS']
Если внимательно присмотреться, можно заметить, что первый элемент списка содержит весь обнаруженный на изображении текст, хранящийся в виде строки, а остальные — отдельные слова. Распечатаем.
print(texts[0]) SHOPPING STORE REG 12-21 03:22 PM CLERK 2 618 1 MISC 1 STUFF $0.49 $7.99 $8.48 $0.74 SUBTOTAL TAX TOTAL CASH 6 $9. 22 $10.00 CHANGE $0.78 NO REFUNDS NO EXCHANGES NO RETURNS
Довольно точно, правда? И, очевидно, весьма полезно, так что давайте играть больше.
Что вы можете получить от Google Cloud Vision?
Как я уже упоминал выше, Google Cloud Vision не только распознает текст, но и позволяет обнаруживать лица, ориентиры, свойства изображений и веб-соединения. Имея это в виду, давайте выясним, что он может рассказать вам о веб-ассоциациях изображения.
web_response = client.web_detection(image=image)
Окей, Google, ты действительно знаешь, что изображено на полученном изображении?
web_content = web_response.web_detection web_content.best_guess_labels >>> [label: "Receipt"]
Хорошая работа, Гугл! Это действительно квитанция. Но давайте дадим вам еще немного упражнений — вы видите что-нибудь еще? Как насчет большего количества прогнозов, выраженных в процентах?
predictions = [ (entity.description, '{:.2%}'.format(entity.score))) for entity in web_content.web_entities ] >>> [('Receipt', '70.26%'), ('Product design', '64.24%'), ('Money', '56.54%'), ('Shopping', '55.86%'), ('Design', '54.62%'), ('Brand', '54.01%'), ('Font', '53.20%'), ('Product', '51.55%'), ('Image', '38.82%')]
Много ценных идей, молодец, мой всемогущий друг! Можно также узнать, откуда взялось изображение и есть ли у него копии?
web_content.full_matching_images >>> [ url: "https://www.rcapitalassociates.com/wp-content/uploads/2018/03/receipts.jpg", url:"https://media.istockphoto.com/photos/shopping-receipt-picture-id901964616?k=6&m=901964616&s=612x612&w=0&h=RmFpYy9uDazil1H9aXkkrAOlCb0lQ-bHaFpdpl76o9A=", url: "https://www.pakstat.com.au/site/assets/files/1172/shutterstock_573065707.500x500.jpg" ]
Я впечатлен. Спасибо, Гугл! Но одного недостаточно, не могли бы вы привести мне три примера похожих изображений?
web_content.visually_similar_images[:3] >>>[ url: "https://thumbs.dreamstime.com/z/shopping-receipt-paper-sales-isolated-white-background-85651861.jpg", url: "https://thumbs.dreamstime.com/b/grocery-receipt-23403878.jpg", url:"https://image.shutterstock.com/image-photo/closeup-grocery-shopping-receipt-260nw-95237158.jpg" ]
Милая! Отличная работа.
Есть ли искусственный интеллект в Google Cloud Vision?
Как вы можете видеть на изображении ниже, работа с квитанциями может быть немного эмоциональной.
Давайте посмотрим, что Vision API может сказать вам об этой фотографии.
image_to_open = 'images/face.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read() image = vision.types.Image(content=content) face_response = client.face_detection(image=image) face_content = face_response.face_annotations face_content[0].detection_confidence >>> 0.5153166651725769
Не так уж плохо, алгоритм более чем на 50% уверен, что на картинке есть лицо. Но можете ли вы узнать что-нибудь об эмоциях, стоящих за этим?
face_content[0] >>> [ ... joy_likelihood: VERY_UNLIKELY sorrow_likelihood: VERY_UNLIKELY anger_likelihood: UNLIKELY surprise_likelihood: POSSIBLE under_exposed_likelihood: VERY_UNLIKELY blurred_likelihood: VERY_UNLIKELY headwear_likelihood: VERY_UNLIKELY ... ]
Удивительно, но с помощью простой команды вы можете проверить вероятность некоторых основных эмоций, а также головной убор или свойства фотографии.
Когда дело доходит до обнаружения лиц, я должен обратить ваше внимание на некоторые потенциальные проблемы, с которыми вы можете столкнуться. Вы должны помнить, что вы передаете фотографию машине, и хотя Google API использует модели, обученные на огромных наборах данных, вполне возможно, что он вернет некоторые неожиданные и вводящие в заблуждение результаты. В сети можно найти фотографии, показывающие, как легко можно обмануть искусственный интеллект, когда дело доходит до анализа изображений. Некоторые из них могут показаться забавными, но есть тонкая грань между невинными и оскорбительными ошибками, особенно когда ошибка касается человеческого лица.
Без сомнения, Google Cloud Vision — надежный инструмент. Более того, с ним интересно работать. Архитектура API REST и широко доступный пакет Python делают его еще более доступным для всех, независимо от того, насколько вы продвинуты в разработке Python. Только представьте, насколько значительно вы можете улучшить свое приложение, используя его возможности!
Рекомендуемое чтение : Применение машинного обучения для дизайнеров
Как вы можете расширить свои знания о Google Cloud Vision
Возможности применения сервиса Google Cloud Vision практически безграничны. Имея доступную библиотеку Python, вы можете использовать ее в любом проекте на основе языка, будь то веб-приложение или научный проект. Это, безусловно, может помочь вам пробудить более глубокий интерес к технологиям машинного обучения.
Документация Google содержит отличные идеи о том, как применять функции Vision API на практике, а также дает вам возможность узнать больше о машинном обучении. Я особенно рекомендую ознакомиться с руководством по созданию расширенного приложения для поиска изображений.
Можно сказать, что то, что вы увидели в этой статье, похоже на волшебство. В конце концов, кто бы мог подумать, что простой и легкодоступный API поддерживается таким мощным научным инструментом? Все, что осталось сделать, это написать несколько строк кода, дать волю своему воображению и ощутить безграничный потенциал анализа изображений.