- 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