Deep Learning/Computer Vision

이미지 검색 결과를 바탕으로 데이터셋 만들기 (Google Custom Search API, Bing Image Search API)

makeitworth 2022. 2. 7. 18:42

지금까지는 주로 잘 알려진 벤치마크 데이터셋이나 AI Hubkaggle의 데이터셋을 활용하는 과제만 해왔다.

그래서 사실 직접 이미지 데이터를 수집하고 정제하는 경험이 많지 않았...거의 없었다. (물론 이미 수집된 데이터도 과제에 따라서 정제하고 전처리하는 과정을 거치긴 하지만 거친 세상(in the wild ㅋㅋ)에 있는 데이터를 수집해서 추리는 과정에 비하면 훨씬 간단하고 단순한 편이다.

 

이번에 시간이 좀 생겨서 모델 품질 향상을 위해 다양한 데이터를 활용할 겸, 이미지 데이터셋 만들기 연습,훈련도 할 겸 이미지 검색 결과를 바탕으로 데이터셋을 만드는 연습을 해봤다.

 

1. Google Custom Search API 활용하기

참고 

http://sudahe.blogspot.com/2019/08/software-python-google-crawling.html

https://callahan-coding.tistory.com/4

byeonghun-lee.github.io/2017/06/29/googleCustomSearch/

 

아무래도 제일 익숙하고 신뢰가 가는 건 구글 이미지 검색 결과인데, 구글 커스텀 서치 엔진을 활용해서 원하는 조건의 파라미터를 설정할 수 있다는 것이 가장 큰 장점이다. 특히 imgType에 "face" 옵션이 있어서 얼굴 인식 같은 얼굴 관련 학습 데이터셋을 만들 때 유용하게 활용할 수 있다.

쿼리 파라미터의 종류와 예시는 다음을 참고해보면 된다.

https://developers.google.com/custom-search/v1/reference/rest/v1/cse/list?hl=ko

google custom search 쿼리 파라미터

단점은 하루 100회 쿼리 제한이 걸려있는 데다가  한번에 10개의 검색 결과만 받을 수 있기 때문에 하나의 검색어로 여러 장(예를 들어 100장 이상)의 이미지를 다운로드 받을 수 없다는 것. (내가 몇 번 쿼리를 요청했는지는 api 대시보드에서 확인할 수 있다.)

https://console.developers.google.com/apis

구글 custom search API 쿼리 요청 횟수 확인

 

아무리 다양한 쿼리 파라미터를 걸었다고 해도 이미지 파일에 문제가 있어서 제대로 다운로드 되지 않았거나 조건에 맞지 않는 이미지들을 제외하는 경우에 동질한 데이터 양을 유지하기 어려워서 문제다.

 

2. Bing Image Search API

참고

https://medium.com/@syed.sohaib/cognitive-services-creating-image-dataset-using-azures-bing-image-search-api-39802ae99644

 

구글과 유사하게 Cutom Search를 만들어서 활용할 수 있다.

일단 구글 클라우드와 유사한 azure 계정이 있어야 하고,

https://portal.azure.com/ 에서 내가 만든 커스텀 검색 엔진이나 search API를 확인할 수 있다.

그리고 구글 커스텀 서치와 마찬가지로 다양한 쿼리 파라미터를 통해 검색결과의 품질을 높일 수 있다.

(imageContent 파리미터를 "face"로 설정해 얼굴 이미지만 찾을 수 있다.)

https://docs.microsoft.com/en-us/rest/api/cognitiveservices-bingsearch/bing-images-api-v7-reference

bing search API 월당 호출 수

위 이미지와 같이 bing의 경우에도 무료로 쓰려면 월 쿼리 호출 1000회 제한이 걸려있지만, 가장 큰 차이는 한 번에 불러올 수 있는 이미지의 제한이 150까지라는 것. 구글의 10에 비하면 15배라서 느껴지는 체감상의 깝깝함은 천지 차이다.

 

3. Google Custom Search API 와 Bing Image Search API 결과 비교

나머지 코드는 거의 비슷하게 유지한 상태에서 두 API의 성능을 비교해 보았다. 단, 지정할 수 있는 쿼리 파라미터의 종류와 옵션이 다르기 때문에 설정이 좀 다를 수 밖에 없는 것들이 있었다.

google query parameter :

param = {
  "key":apikey, # 내가 받은 apikey
  "cx":engineid, # 내가 받은 custom engine id
  "q" : item, # 쿼리 요청할 검색어
  "searchType" : "image", # 이미지만 검색       
  "imgType" : "face", # 얼굴 이미지만
  "imgColorType" : 'color', # 컬러 이미지만 
  "num" : 10, # return 할 결과물 수 1~10까지 설정 가능
  "filter" : 1, # 중복 결과 필터링
  "safe" : "active", # adult content filtering
  "rights" : cc_publicdomain,	# 퍼블릭 도메인 이미지만 수집 
  "start": 1 + n*10 # 총 검색 결과에서 몇번째 부터 return할 것인지 설정
  # 결과물을 한번에 10개 밖에 안주기 때문에 이 파라미터를 활용해서 여러번 쿼리를 요청함  
  }

bing query parameter :

param = {"q" : item, # 검색할 단어
      "count" : 30, # 한번에 return 할 결과물의 갯수
      "imageType" : "Photo", # 사진만 검색
      "imageContent" : "Face", # 사진 중에서도 얼굴 사진만 검색
      "minHeight" : 256, # 높이 256px 이상의 사진만 검색
      "safeSearch" : "strict", # adult content 필터링
      "color" : "ColorOnly", # 흑백이 아닌 컬러 이미지만 검색 
	  "licence" : public # 퍼블릭 도메인 이미지만 검색      
      }

1. 시간

구글 이미지 검색의 경우, 5개의 쿼리에서 30개의 결과를 얻는 테스트에서

빙 이미지 검색의 경우, 

215초 정도 걸렸다.

GCS의 경우 한 번에 10개의 결과만 주기 때문에 loop을 돌렸는데 BIS와 속도 면에서 큰 차이가 없다는 것을 알 수 있다.

 

2. 실패 / 중복 이미지 카운트 비교 

각 쿼리당 30장의 이미지를 다운 받도록 했지만, permission error 등의 에러가 발생하거나, 다운받은 파일이 열리지 않는 경우, 쿼리를 요청한 인물이 아닌 전혀 다른 인물의 사진이 다운로드된 경우(동명이인 제외), 사진이 아닌 이미지인 경우를 실패로 count 하였다. 

그리고 중복 이미지는 구글의 경우 중복 이미지 필터를 1로 설정하였고, 빙은 해당 파라미터가 없었다.

완전히 똑같이 않더라도 동일한 사진의 크롭 이미지의 경우도 중복으로 카운트하였다. 단 좌우 반전은 포함하지 않았다.

  구글 커스텀 검색 빙 이미지 검색
실패 이미지 수 6 17
중복 이미지 수 22 6
실패와 중복을 제거한 이미지 수 122/150 (81.3%) 127/150 (84.7%)

 

결과적으로는 두 API 모두 수집한 이미지 중 쓸만한 이미지의 비율이 80퍼센트 전반을 기록했다. 특이할만한 사항은 구글 커스텀 검색의 경우 골고루 실패/중복 이미지가 발생했는데, 빙 이미지 검색의 경우 5개의 쿼리 중에서 유독 한 사람에 대한 결과에서 검색한 인물이 아닌 다른 사람이 집중적으로 등장해서 스코어를 떨어뜨렸다. 이럴 때는 그 쿼리 자체를 빼는 것이 더 나을 것 같다. 

 

어째튼 둘 다 80퍼센트 때의 스코어는 상당히 실망스러운 결과이다. 수집이야 API가 해준다고 하지만, 적절하지 않은 이미지를 빼는 것은 수작업으로 할 경우 상당히 많은 시간이 들 것이기 때문이다. 언어나 국가 파리미터, 또는 그 밖의 파라미터를 활용하면 스코어가 더 올라가는지 시도해볼 필요가 있을 것 같다.

 

3. 결과물의 주관적 비교

연예인 또는 정치인이나 그에 준하는 유명인들 이름으로 이름 리스트를 만들어서 데이터 수집을 진행해 보았는데, 연예인이 아닌 유명인의 경우에 bing API에서 그 사람의 이미지 만으로 제대로 모아 주지 못하는 경우가 종종 있었다. bing 이미지 검색 알고리즘의 성능이 구글보다 떨어지는 것이 아닐까 싶었다.

반면 구글 API의 경우에는 빙보다 한 번에 수집할 수 있는 수가 10개로 더 적은데 무료티어의 경우 하루 100개의 쿼리 밖에 요청할 수 없다는 것이 가장 큰 에로사항. 즉 아무 오류가 없어도 10*100, 하루 1000장, 한달 3만 장 수집이 한계. 물론 구글 계정을 여러 개 만들어서 돌릴 수 있겠지만 귀찮은 부분이 분명히 있다. bing 은 한번에 150개, 한달 요청 1000번이니 한달에 이미지 15만 장 수집이 가능하다. 

좀 더 많은 양의 데이터를 장기간 수집해보면 생각이 달라질지도 모르겠지만, 일단 아직까지는 bing 이미지 서치 API를 사용하고, 수집을 못하는 인물은 빼버리는 식으로 데이터셋을 구축할 생각이다. (특정 인물이나 직군에 대한 제한을 두고 수집하는 것이 아니기 때문.

 

4. 이미지 데이터 수집 코드

깃허브 참고

https://github.com/kim-jeonghyun/make_img_dataset_with_searchAPIs

 

GitHub - kim-jeonghyun/make_img_dataset_with_searchAPIs: practice codes for making image dataset using google custom search API

practice codes for making image dataset using google custom search API and bing image search API - GitHub - kim-jeonghyun/make_img_dataset_with_searchAPIs: practice codes for making image dataset u...

github.com