[Google Skills] Cloud Vision API로 이미지 분석


  • LAB: Cloud Vision API로 이미지 분석: 챌린지 실습
  • ID: ARC122
  • 1 Credit

사진 던져주면 글자가 뭔지, 어디 랜드마크인지 등 이미지를 분석해서 알려주는 게 Cloud Vision API다. 모델 학습은 우리가 안 하고, 구글이 이미 만들어둔 거에 JSON만 보내면 된다.

그래서 파이썬 SDK 깔 필요 없이, 콘솔에서 API 키 하나 따고 request.json에 이미지 GCS 경로랑 감지 종류(TEXT_DETECTION / LANDMARK_DETECTION)만 적은 다음 curl로 POST 하면 끝이다. 인증도 서비스 계정 붙이는 게 아니라 ?key=에 그 키만 넣으면 되고, 채점도 그 JSON이랑 응답 파일을 버킷에 올렸는지 본다.

작업 1. 리소스 확인

API키를 생성할 때 주의할 점이, 최근 API access를 세부설정하는 부분이 생겼는데 교안에서는 안내를 제대로 해주지 않는다…
사실 보안을 생각하면 이게 맞는데 이제서야 적용한 듯?

# 1. 프로젝트 / 버킷
export PROJECT_ID=$(gcloud config get-value project)
export BUCKET=${PROJECT_ID}-bucket
gcloud services enable vision.googleapis.com
gcloud storage ls gs://$BUCKET

# 2. API 키 (APIs & Services > Credentials > Create credentials > API key)
## Name: vision-api-key (기본값 그대로도 OK)
## APIs that can be accessed using this key: Cloud Vision API 검색 후 체크 (필수)
## Authenticate API calls through a service account: 비움
## Application restrictions: None
## 저장/만들기 후 키 복사
export API_KEY=

# 3. 버킷 객체 공개
gcloud storage buckets add-iam-policy-binding gs://$BUCKET \
    --member=allUsers \
    --role=roles/storage.objectViewer
gsutil iam ch allUsers:objectViewer gs://$BUCKET

작업 2. request.json 만들기

물론 storage에서 url을 복붙해서 해도 되지만.. 귀찮았던 관계로 필자는 url을 추출해서 자동세팅을 해놨다 ㅎㅎ

IMAGE=$(gcloud storage ls gs://${BUCKET} | grep -E '\.(jpg|jpeg|png)$' | head -n 1 | awk -F'/' '{print $NF}')

cat <<EOF > request.json
{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://${BUCKET}/${IMAGE}"
          }
        },
        "features": [
          {
            "type": "TEXT_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}
EOF
cat request.json

작업 3. json 파일 업데이트

텍스트 돌리고 올린 다음, 같은 파일 type만 LANDMARK_DETECTION으로 바꿔서 다시 호출한다. 마지막 request.json이 랜드마크여야 채점 통과한다.

그리고 채점하기 전에 cat 명령어를 실행해서 잘 되는지 꼭 확인을 하자. 안됐을 경우 에러가 자세히 나오니 잘 확인해보자. 필자는 storage read access를 제대로 확인을 안해 에러가 계속 났었다…

# 작업 2의 파일 결과물 보내기
curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json "https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}" -o text-response.json
gcloud storage cp text-response.json gs://${BUCKET}

# LANDMARK_DETECTION 메서드 사용
cat <<EOF > request.json
{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://${BUCKET}/${IMAGE}"
          }
        },
        "features": [
          {
            "type": "LANDMARK_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}
EOF

curl -s -X POST -H "Content-Type: application/json" \
    --data-binary @request.json \
    "https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}" \
    -o landmark-response.json
cat landmark-response.json
gcloud storage cp landmark-response.json gs://$BUCKET

작성자: Ruby Kim
저작권: 별도 표시가 없는 한 이 블로그의 글은 CC BY 4.0 라이선스를 따릅니다. 재사용 시 출처를 밝혀 주세요. Ruby Kim !
Comments
  목차