Notice
Recent Posts
Recent Comments
Today
Total
03-29 18:05
Archives
관리 메뉴

Jeongchul Kim

Google Cloud ML Vision API를 이용한 이미지 텍스트 추출 그리고 번역을 위한 Translation API와 Natural Language API 본문

Google Cloud Platform

Google Cloud ML Vision API를 이용한 이미지 텍스트 추출 그리고 번역을 위한 Translation API와 Natural Language API

김 정출 2018. 4. 10. 04:06


Google Cloud ML Vision API를 이용한 이미지 텍스트 추출 그리고 번역을 위한 Translation API와 Natural Language API


curl을 사용하여 Vision API에 요청을 보낼 것이므로, 요청 URL에 전달할 API 키를 생성해야합니다.


API 및 서비스 -> 대시보드로 이동합니다.


사이드 메뉴에서 “사용자 인증 정보" 클릭합니다.


“사용자 인증 정보 만들기" 버튼을 클릭합니다.


API 키 버튼을 클릭합니다.


그런 다음 방금 생성한 키를 복사합니다. 닫기를 클릭합니다.


이제 API 키를 환경 변수에 저장하여 각 요청에 API 키 값을 삽입하지 않아도됩니다.

Cloud Shell에서이 작업을 수행 할 수 있습니다. 상단 메뉴에서 Cloud Shell 아이콘을 클릭해주세요.


다음의 명령어를 통해 환경 설정합니다.


$ export API_KEY=API키

$ echo $API_KEY


Cloud Vision API 사용 설정

https://console.developers.google.com/apis/api/vision.googleapis.com/


“사용 설정" 버튼을 클릭합니다.



사용이 시작됩니다.

Google Cloud Storage 버킷에 이미지 업로드


클라우드 저장소(Cloud Storage) 버킷(bucket) 만들기
이미지 검색을 위해 Vision API에 이미지를 보내려면 두 가지 방법이 있습니다. API에 base64로 인코딩된 이미지 문자열을 보내거나 Google Cloud Storage에 저장된 파일의 URL을 전달하는 방법입니다. 여기서는 이미지를 저장할 Google Cloud Storage 버킷을 만듭니다.

클라우드 콘솔에서 Storage 브라우저로 이동합니다.


“버킷 만들기" 버튼을 클릭합니다.



중복되지 않은 이름을 입력하고 만들기 버튼을 클릭합니다.



버킷에 이미지 업로드하기

사진을 한 장 준비해야 합니다.

저는 미국에서 라스베가스 뉴욕 호텔에서 찍은 사진으로 테스트 해보겠습니다.


GCP Console로 돌아가 파일 업로드 버튼을 클릭하거나 끌어놓습니다.


업로드하면 추가된 사진 파일의 목록을 확인할 수 있습니다. 공개적으로 공유하기 버튼을 클릭합니다. 공개적으로 공유하여야 Vison API에서 접근이 가능합니다.


공개 링크를 클릭하면 URL의 주소를 확인할 수 있습니다.


Vision API 요청(request) 생성하기

Cloud Shell 환경에서 bucket 이름으로 vision-request.json 파일을 생성합니다. 원하는 편집기를 선택하여 만들거나 Cloud Shell의 code editor로 수정합니다. 저는 code editor를 사용하겠습니다.


File 메뉴에서 -> New -> File 버튼을 클릭합니다.


이름을 vision-request.json으로 입력하고 다음의 코드를 입력합니다.

본인의 버킷 이름과 이미지에 따라 gs://버킷/이미지이름 변경해주셔야 합니다.

{
 "requests": [
     {
       "image": {
         "source": {
             "gcsImageUri": "gs://jeongchul-images-bucket/lasvegas.jpg"
         }
       },
       "features": [
         {
           "type": "TEXT_DETECTION",
           "maxResults": 10
         }
       ]
     }
 ]
}

여기서는 Vision API의 TEXT_DETECTION 기능을 사용하게 됩니다. 그러면 텍스트를 추출하기 위해서 이미지에서 광학 문자 인식(OCR, Optical Character Recognition) 기능이 실행됩니다.


Vision API 실행해보기

Cloud Shell에서 Vision API를 curl 명령어를 이용해 실행해봅시다.

$ curl -s -X POST -H "Content-Type: application/json" --data-binary @vision-request.json https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}


결과들이 넘어 왔습니다. locale은 en(english)영어로 description을 살펴보면 인식된 문장을 살펴볼 수 있습니다.

N이 읽히지 않은 EW YOR 로 읽히고 다음칸은 EW YORK로 추출되었습니다.

x,y 좌표로 인식된 위치를 확인할 수 있습니다.


에러 코드로 PERMISSION_DENIED 가 나온다면 API_KEY가 제대로 설정되었는지 확인합시다. 없다면 위에서 export 로 다시 추가합니다.


OCR 방법은 이미지에서 많은 텍스트를 추출할 수 있습니다. textAnnotations 에서 가져온 첫 번째 데이터는 API가 이미지에 찾은 전체 텍스트 블록입니다.




글자가 선명한 다른 사진으로 테스트해봅시다.


그랜드 캐년에 가기 전에 후버 댐에서 찍은 사진으로 테스트 해보겠습니다.


버킷에 업로드 합시다.

hooverdam.jpg를 업로드 하였습니다.


다시 vision-request.json 파일을 수정합니다.

gcsImageUri에서 이미지 이름을 변경합니다.


결과를 확인해봅시다.

$ curl -s -X POST -H "Content-Type: application/json" --data-binary @ocr-request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

와우.. 이번에는 정확하네요

놀랍게도 WELCOME TO Nevada THE SILVER STATE Pacific Time Zone 정확히 대소문자 구별해서 정확히 인식했습니다..!!

세상에.. :D

WELCOME\nTO\nNevada\nTHE SILVER STATE\nPacific\nTime Zone\n



다음을 이용해 결과를 vision-response.json에 저장해봅시다.

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


만족스럽네요 다음에는 Translation API를 사용해봅시다.


Translation API 사용 설정

https://console.developers.google.com/apis/api/translate.googleapis.com/

“사용 설정" 버튼을 클릭합니다.

이미지에서 추출한 문장을 Translation API 사용하여 번역하기

Translation API는 텍스트를 100개 이상의 언어로 번역합니다. 또한 입력 텍스트의 언어를 감지할 수 있습니다.


자 이번에는 translation-request.json 파일을 생성해봅시다.

여기서는 영어를 한국어로 번역해보죠.

q는 번역할 문자열이 오게 됩니다.


파일을 저장합시다.


Cloud Shell에서 이 Bash 명령을 실행하여 이전 단계(이미지에 텍스트 추출)에서 얻은 텍스트를 translation-request.json으로 복사합니다.


jq 명령어를 통해 json 파일에 원하는 텍스트를 가져올 수 있습니다.

$ jq .responses[0].textAnnotations[0].description vision-response.json


$ STR=$(jq .responses[0].textAnnotations[0].description vision-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" translation-request.json



다음의 명령을 실행하면 Translation API의 응답으로 json 파일을 받을 수 있습니다.

$ curl -s -X POST -H "Content-Type: application/json" --data-binary @translation-request.json https://translation.googleapis.com/language/translate/v2?key=${API_KEY} -o translation-response.json


만족스러운 번역 결과를 얻었습니다.


Natural Language API 사용 설정


https://console.developers.google.com/apis/library/language.googleapis.com/

이동하여 사용 설정 버튼을 클릭합니다.





이미지에 나온 텍스트를 Natural Language API 넣어 분석하기

Natural Language API는 엔티티를 추출하고 감정과 구문을 분석하고 텍스트를 범주로 분류하여 텍스트를 이해하는 데 도움이 됩니다. Natural Language API가 이미지의 텍스트에서 찾을 수있는 엔티티를 확인하려면 analyzeEntities 메소드를 사용합니다.

nl-request.json 파일을 생성합니다.

다음의 코드를 입력해주세요

{
 "document":{
   "type":"PLAIN_TEXT",
   "content":"your_text_here"
 },
 "encodingType":"UTF8"
}




request에서는 보내는 텍스트에 대해 Natural Language API에 알려줍니다.


type : 지원되는 유형 값은 PLAIN_TEXT 또는 HTML입니다.


content : 분석을 위해 Natural Language API에 보낼 텍스트를 전달합니다. Natural Language API는 텍스트 처리를 위해 Cloud Storage에 저장된 파일을 보낼 수도 있습니다. Cloud Storage에서 파일을 보내려면 gcsContentUri로 콘텐츠를 대체하고 Cloud Storage에서 텍스트 파일의 uri 값을 사용합니다.


encodingType : 텍스트를 처리 할 때 사용할 텍스트 인코딩 유형을 API에 알립니다. API는이 텍스트를 사용하여 특정 엔터티가 텍스트에 나타나는 위치를 계산합니다.


Cloud Shell에서이 Bash 명령을 실행하여 번역 된 텍스트를 Natural Language API 요청의 콘텐츠 블록에 복사합니다.


$ STR=$(jq .data.translations[0].translatedText  translation-response.json) && STR="${STR//\"}" && sed -i "s|your_text_here|$STR|g" nl-request.json


이제 nl-request.json 파일에는 원본 이미지의 번역된 한국어 텍스트가 들어 있습니다. 그것을 분석 할 시간입니다.


이 curl 요청을 사용하여 Natural Language API의 analyzeEntities 을 호출합니다.


$ curl "https://language.googleapis.com/v1/documents:analyzeEntities?key=${API_KEY}"   -s -X POST -H "Content-Type: application/json" --data-binary @nl-request.json

결과는 Wikipedia 페이지가 있는 엔티티의 경우 url과 중간을 포함하는 metadata를 제공합니다. mid는 Google Knowledge Graph에 맵핑되는 ID입니다. 이에 대한 자세한 정보를 얻으려면 Knowledge Graph API를 호출하여 ID를 전달하면 됩니다.


고생하였습니다ㅎ_ㅎ



Comments