Cloud Vision API를 사용한 이미지 속 라벨, 얼굴, 명소 감지

Cloud Vision API를 사용하면 간단한 REST API에 강력한 머신러닝 모델을 캡슐화하여 이미지 콘텐츠를 파악할 수 있습니다.

이 실습에서는 Vision API로 이미지를 전송하고 객체, 얼굴, 랜드마크를 감지하는 방법을 알아봅니다.

학습할 내용

  • Vision API 요청을 만들고 curl로 API 호출
  • Vision API의 라벨, 웹, 얼굴, 랜드마크 감지 방법 사용

필요한

  • Google Cloud Platform 프로젝트
  • 브라우저(예: Chrome 또는 Firefox)

본 가이드를 어떻게 사용하실 계획인가요?

읽기만 할 계획입니다. 읽은 다음 연습 활동을 완료할 계획입니다.

귀하의 Google Cloud Platform 사용 경험을 평가해 주세요.

초급 중급 고급

자습형 환경 설정

Google 계정 (Gmail 또는 Google 앱)이 아직 없다면 계정을 만들어야 합니다. Google Cloud Platform Console(console.cloud.google.com)에 로그인하여 새 프로젝트를 만듭니다.

2016-02-10 12:45:26.png 스크린샷

모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

다음으로 Google Cloud 리소스를 사용하려면 Cloud Console에서 결제를 사용 설정해야 합니다.

이 codelab을 실행하는 과정에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하려고 하거나 실행 중일 경우 비용이 더 들 수 있습니다(이 문서 마지막의 '삭제' 섹션 참조).

Google Cloud Platform의 신규 사용자는 $300 무료 체험판을 사용할 수 있습니다.

화면 왼쪽 상단의 메뉴 아이콘을 클릭합니다.

드롭다운에서 API 및 서비스를 선택하고 대시보드를 클릭합니다.

API 및 서비스 사용을 클릭합니다.

그런 다음 검색창에서 '"vision"를 검색합니다. Google Cloud Vision API를 클릭합니다.

사용 설정을 클릭하여 Cloud Vision API를 사용 설정합니다.

사용 설정될 때까지 몇 초 정도 기다립니다. 사용 설정이 완료되면 다음과 같이 표시됩니다.

Google Cloud Shell은 클라우드에서 실행되는 명령줄 환경입니다. 이 Debian 기반 가상 머신은 필요한 모든 개발 도구 (gcloud, bq, git 등)가 함께 로드되며, 영구 5GB 홈 디렉터리를 제공합니다. Cloud Shell을 사용하여 Speech API에 대한 요청을 만듭니다.

Cloud Shell을 시작하려면 헤더 표시줄의 오른쪽 상단에 있는 'Google Cloud Shell 활성화' Screen Shot 2015-06-08 5.30.32 PM.png 아이콘을 클릭하세요.

콘솔 하단에 있는 새 프레임 내에 Cloud Shell 세션이 열리면서 명령줄 프롬프트가 표시됩니다. user@project:~$ 메시지가 나타날 때까지 기다립니다.

curl을 사용하여 Vision API에 요청을 보낼 것이므로 요청 URL을 전달할 API 키를 생성해야 합니다. API 키를 만들려면 Cloud Console에서 API 및 서비스의 서비스의 사용자 인증 정보 섹션으로 이동하세요.

드롭다운 메뉴에서 API 키를 선택합니다.

방금 만든 키를 복사합니다.

이제 API 키가 있으므로 각 요청에 API 키 값을 삽입할 필요가 없도록 환경 변수에 저장합니다. Cloud Shell에서 이 작업을 수행할 수 있습니다. <your_api_key>를 방금 복사한 키로 바꿔야 합니다.

export API_KEY=<YOUR_API_KEY>

Cloud Storage 버킷 만들기

Vision API에 이미지를 감지하려면 API에 base64로 인코딩된 이미지 문자열을 전송하거나 Google Cloud Storage에 저장된 파일의 URL을 전달하는 두 가지 방법이 있습니다. Cloud Storage URL을 사용해 보겠습니다. 이미지를 저장할 Google Cloud Storage 버킷을 만듭니다.

프로젝트의 Cloud Console에서 Storage 브라우저로 이동합니다.

그런 다음 버킷 만들기를 클릭합니다. 버킷에 고유한 이름 (예: 프로젝트 ID)을 지정하고 만들기를 클릭합니다.

버킷에 이미지 업로드

도넛 이미지를 마우스 오른쪽 버튼으로 클릭하고 이미지를 다른 이름으로 저장을 클릭하여 다운로드 폴더에 donuts.png로 저장합니다.

스토리지 브라우저에서 방금 만든 버킷으로 이동하여 파일 업로드를 클릭합니다. 그런 다음 donuts.png를 선택합니다.

버킷에 파일이 표시됩니다.

다음으로, 이미지 권한을 수정합니다.

항목 추가를 클릭합니다.

Group의 새 EntityallUsersName을 추가합니다.

저장을 클릭합니다.

버킷에 파일이 있으므로 Vision API 요청을 만들고 이 도넛 사진의 URL을 전달할 수 있습니다.

Cloud Shell 환경에서 아래 코드를 사용하여 request.json 파일을 만들고 my-bucket-name을 직접 만든 Cloud Storage 버킷 이름으로 바꿉니다. 원하는 명령줄 편집기 (nano, vim, emacs) 중 하나를 사용하여 파일을 만들거나 Cloud Shell에 기본 제공되는 Orion 편집기를 사용할 수 있습니다.

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

첫 번째로 살펴볼 Cloud Vision API 기능은 라벨 감지입니다. 이 메서드는 이미지에 포함된 항목의 단어 (단어)를 반환합니다.

이제 curl로 Vision API를 호출할 준비가 되었습니다.

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

응답은 다음과 같이 표시됩니다.

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "powdered sugar",
          "score": 0.9436922
        },
        {
          "mid": "/m/01wydv",
          "description": "beignet",
          "score": 0.7160288
        },
        {
          "mid": "/m/06_dn",
          "description": "snow",
          "score": 0.71219236
        },
        {
          "mid": "/m/02wvn_6",
          "mid": "/m/0bp3f6m",
          "description": "fried food",
          "score": 0.7075312
        },
        {
          "mid": "/m/02wvn_6",
          "description": "ricciarelli",
          "score": 0.5625
        },
        {
          "mid": "/m/052lwg6",
          "description": "baked goods",
          "score": 0.53270763
        }
      ]
    }
  ]
}

API를 통해 특정 유형의 도넛인 베니에를 확인할 수 있었습니다. Vision API가 찾은 각 라벨마다 항목 이름이 포함된 description가 반환됩니다. 또한 score이 0~100 사이의 숫자를 반환하여 설명이 이미지의 내용과 얼마나 일치하는지를 나타냅니다. mid 값은 Google의 지식 정보에 있는 항목의 중간입니다. Knowledge Graph API를 호출할 때 mid를 사용하여 항목에 관한 자세한 정보를 얻을 수 있습니다.

Vision API는 이미지에 포함된 라벨뿐 아니라 인터넷에서 이미지에 대한 추가 세부정보도 검색할 수 있습니다. API의 webDetection 메서드를 통해 흥미로운 데이터를 많이 얻을 수 있습니다.

  • 유사한 이미지가 있는 페이지의 콘텐츠를 기준으로 한 이미지에서 발견된 항목의 목록
  • 웹에서 찾은 일치된 이미지 및 부분 일치 이미지의 URL과 해당 페이지의 URL
  • 이미지로 검색 등 유사 이미지의 URL

웹 감지를 사용해 보려면 위의 위와 동일한 비네트 이미지를 사용해야 하므로 request.json 파일에서 한 줄만 변경하면 됩니다. 알 수 없는 이미지를 탐색하고 완전히 다른 이미지를 사용할 수도 있습니다. 기능 목록에서 LABEL_DETECTIONWEB_DETECTION로 변경하면 됩니다. 이제 request.json가 다음과 같이 표시됩니다.

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          } 
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

Vision API로 보내려면 이전과 동일한 curl 명령어를 사용하면 됩니다 (Cloud Shell에서 위쪽 화살표를 누르기만 하면 됨).

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

webEntities부터 시작하여 응답 내용을 살펴보겠습니다. 다음은 이 이미지가 반환한 항목의 예입니다.

 "webEntities": [
          {
            "entityId": "/m/01hyh_",
            "score": 0.7155,
            "description": "Machine learning"
          },
          {
            "entityId": "/m/01wydv",
            "score": 0.48758492,
            "description": "Beignet"
          },
          {
            "entityId": "/m/0105pbj4",
            "score": 0.3976,
            "description": "Google Cloud Platform"
          },
          {
            "entityId": "/m/02y_9m3",
            "score": 0.3782,
            "description": "Cloud computing"
          },
          ...
        ]

이 이미지는 Cloud ML API의 여러 프레젠테이션에서 재사용되었기 때문에 API에서 '머신러닝', 'Google Cloud Platform', '클라우드 컴퓨팅' 항목을 찾았습니다.

fullMatchingImages, partialMatchingImages, pagesWithMatchingImages 아래에 있는 URL을 자세히 분석하면 많은 URL이 이 Codelab 사이트 (슈퍼 메타)를 가리킵니다.

정확하게 같은 이미지가 아닌 다른 베니션 이미지를 찾고 싶다고 가정해 보겠습니다. 바로 이때 API 응답의 visuallySimilarImages 부분이 도움이 됩니다. 다음은 시각적으로 유사한 이미지 몇 가지입니다.

"visuallySimilarImages": [
          {
            "url": "https://igx.4sqi.net/img/general/558x200/21646809_fe8K-bZGnLLqWQeWruymGEhDGfyl-6HSouI2BFPGh8o.jpg"
          },
          {
            "url": "https://spoilednyc.com//2016/02/16/beignetszzzzzz-852.jpg"
          },
          {
            "url": "https://img-global.cpcdn.com/001_recipes/a66a9a6fc2696648/1200x630cq70/photo.jpg"
          },
          ...
]

이 URL로 이동하여 유사한 이미지를 볼 수 있습니다.

훌륭합니다. 0:12:39.680,0:12:44.320 이제 베이지넷을 Google 이미지를 이미지로 검색하는 것과 유사합니다.

하지만 Cloud Vision을 사용하면 사용이 간편한 REST API로 이 기능에 액세스하고 애플리케이션에 통합할 수 있습니다.

다음으로 Vision API의 얼굴 및 랜드마크 감지 방법을 살펴보겠습니다. 얼굴 인식 메서드는 이미지에서 발견된 얼굴에 관한 얼굴과 위치 등의 감정에 관한 데이터를 반환합니다. 랜드마크 감지는 랜드마크의 공통된 랜드마크 이미지를 식별할 수 있습니다. 여기에는 랜드마크의 이름, 위도 경도 좌표, 이미지에서 랜드마크가 식별된 위치의 위치가 반환됩니다.

새 이미지 업로드

이 두 가지 새로운 메서드를 사용하려면 얼굴과 명소가 포함된 새 이미지를 Cloud Storage 버킷에 업로드하세요. 다음 이미지를 마우스 오른쪽 버튼으로 클릭한 다음 다른 이름으로 이미지 저장을 클릭하여 다운로드 폴더에 selfie.png로 저장합니다.

그런 다음 이전 단계에서 했던 방식과 동일하게 Cloud Storage 버킷에 업로드합니다. '공개 공유' 체크박스를 선택해야 합니다.

요청 업데이트

다음으로 새 이미지의 URL을 포함하고 라벨 인식 대신 얼굴 및 랜드마크 감지를 사용하도록 request.json 파일을 업데이트합니다. my-bucket-name을 Cloud Storage 버킷 이름으로 바꿔야 합니다.

request.json

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          } 
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

Vision API 호출 및 응답 파싱

이제 위에서 사용한 것과 동일한 curl 명령어를 사용하여 Vision API를 호출할 준비가 되었습니다.

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

먼저 응답에서 faceAnnotations 객체를 살펴보겠습니다. API가 이미지에서 발견된 각 얼굴의 객체(이 경우에는 3)를 반환하는 것을 확인할 수 있습니다. 다음은 잘린 답변입니다.

{
      "faceAnnotations": [
        {
          "boundingPoly": {
            "vertices": [
              {
                "x": 669,
                "y": 324
              },
              ...
            ]
          },
          "fdBoundingPoly": {
            ...
          },
          "landmarks": [
            {
              "type": "LEFT_EYE",
              "position": {
                "x": 692.05646,
                "y": 372.95868,
                "z": -0.00025268539
              }
            },
            ...
          ],
          "rollAngle": 0.21619819,
          "panAngle": -23.027969,
          "tiltAngle": -1.5531756,
          "detectionConfidence": 0.72354823,
          "landmarkingConfidence": 0.20047489,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_LIKELY"
        }
        ...
     }
}

boundingPoly는 이미지 내 얼굴 주변의 x,y 좌표를 제공합니다. fdBoundingPolyboundingPoly보다 작은 상자로, 얼굴의 피부 부분에 둘러싸고 있습니다. landmarks은 각 얼굴 특징의 객체 배열입니다. 아직 모르는 사람도 있습니다. 이는 지형지물의 3D 위치 (x,y,z 좌표)와 함께 z 좌표가 깊이인 랜드마크 유형을 알려줍니다. 나머지 값은 기쁨, 슬픔, 분노, 놀라움을 포함한 얼굴에 관한 세부정보를 제공합니다. 위 객체는 이미지의 가장 바깥쪽을 대상으로 합니다. POSSIBLEjoyLikelihood을 설명하는 바보 같은 얼굴을 보고 있습니다.

다음으로 응답의 landmarkAnnotations 부분을 살펴보겠습니다.

"landmarkAnnotations": [
        {
          "mid": "/m/0c7zy",
          "description": "Petra",
          "score": 0.5403372,
          "boundingPoly": {
            "vertices": [
              {
                "x": 153,
                "y": 64
              },
              ...
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 30.323975,
                "longitude": 35.449361
              }
            }
          ]

여기에서 Vision API는 이 사진을 페트라에서 촬영했다고 말할 수 있었습니다. 이 이미지의 시각적 단서가 너무 적었기 때문에 이 작업은 굉장히 인상적입니다. 이 응답의 값은 위의 labelAnnotations 응답과 유사합니다.

신뢰도 score와 함께 랜드마크의 이름(description)의 mid를 가져옵니다. boundingPoly는 이미지에서 랜드마크가 식별된 영역을 나타냅니다. locations 키는 이 랜드마크의 위도 경도 좌표를 나타냅니다.

Vision API의 라벨, 얼굴, 랜드마크 감지 방식을 살펴보았으나 아직 다루지 않은 세 가지 방법을 살펴봅니다. 다른 세 가지 문서에 대해 알아보려면 문서를 살펴보세요.

  • 로고 감지: 이미지에서 일반 로고와 위치를 식별합니다.
  • 세이프서치 검색: 이미지에 선정적인 콘텐츠가 포함되어 있는지 확인합니다. 이 기능은 사용자 제작 콘텐츠가 있는 모든 애플리케이션에 유용합니다. 성인용, 의료, 폭력, 위장 콘텐츠 등의 4가지 요소를 기준으로 이미지를 필터링할 수 있습니다.
  • 텍스트 감지: OCR을 실행하여 이미지에서 텍스트를 추출합니다. 이 방법을 통해 이미지에 있는 텍스트의 언어도 식별할 수 있습니다.

Vision API로 이미지를 분석하는 방법을 배웠습니다. 이 예시에서는 이미지의 Google Cloud Storage URL을 API에 전달했습니다. 또는 이미지의 base64 인코딩 문자열을 전달할 수 있습니다.

학습한 내용

  • Cloud Storage 버킷의 이미지 URL을 전달하여 curl로 Vision API 호출
  • Vision API의 라벨, 웹, 얼굴 및 랜드마크 감지 방법 사용

다음 단계