Vcrpy с GoogleCloudVision

#python #grpc #google-cloud-vision #google-vision #vcr

#python #grpc #google-облачное видение #google-vision #Видеомагнитофон

Вопрос:

Я пишу тест для получения данных метки из API Google Cloud Vision.

В рамках теста я использую vcrpy для хранения результатов поиска моей метки.

 with vcr.use_cassette(
        vcr_cassette_path.as_posix(), record_mode="twice",
        match_on=["uri", "method"], decode_compressed_response=True):
    labels = GCloudVisionLabelsRetriever().get_labels(self.FILE_PATH.as_posix())
  

Который в конечном итоге вызывает этот блок, как определено самим Google https://cloud.google.com/vision/docs/labels#detect_labels_in_a_local_image:

 def detect_labels_from_path(path: str):
    client = vision.ImageAnnotatorClient(
        credentials=settings.GCLOUD_CREDENTIALS)

    with io.open(path, 'rb') as image_file:
        content = image_file.read()

    image = vision.Image(content=content)

    response = client.label_detection(image=image)
    labels = response.label_annotations

    return labels
  

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

Я считаю, что это связано с тем, что видеомагнитофон не поддерживает gRPC, что и происходит под капотом.

Интересно, есть ли какой-нибудь способ издеваться над этим или, может быть, пакет, который может работать с gRPC для тестов python?

Ответ №1:

Необходимо создать новый клиент с vision.ImageAnnotatorClient каждый раз, когда вы вызываете API, вместо этого вам нужно создать клиент, а затем выполнить цикл клиента.label_detection. Кроме того, я думаю, что передача учетных данных Google как

 client = vision.ImageAnnotatorClient(credentials=settings.GCLOUD_CREDENTIALS)
  

это неправильный способ, если вы настроили GCLOUD_CREDENTIALS в своем path, нет необходимости указывать его, например:

 client = vision.ImageAnnotatorClient()
  

Хотя, если вы хотите указать путь к своей учетной записи службы в формате json, вы можете использовать для этого следующий код:

 import os
import io
from google.cloud import vision
from google.oauth2 import service_account

#Loads the service account JSON credentials from a file
credentials = service_account.Credentials.from_service_account_file('SERVICE_ACCOUNT_KEY_FILE.json')
client = vision.ImageAnnotatorClient(credentials=credentials)

#I you have configure the GCLOUD_CREDENTIALS to your path, use this instead    
#client = vision.ImageAnnotatorClient()

image_path = "wakeupcat.jpg"

with io.open(image_path, 'rb') as image_file:
    content = image_file.read()


image = vision.types.Image(content=content)


# Performs label detection on the image file
response = client.label_detection(image=image)
labels = response.label_annotations

print('Labels:')
for label in labels:
print(label.description)