[python] 원하는 이미지 데이터셋을 만들고싶은데, 귀찮을 때

이미지 데이터셋을 만들려면 직접 웹에서 다운받고 이름 매핑하고 폴도 구조 관리하고 여간 귀찮은 일이 아닐 수 없다..

그래서 파이썬 라이브러리에서 이미지 검색쪽을 찾아보니 괜찮은 것이 있어, 공유하고자 한다. 

 

bing_image_donloader  라이브러리이다.

 

이 라이브러리는 bing 이미지 검색 엔진에서 이미지를 손쉽게 다운로드할 수 있는 라이브러리이다. 특정 키워드만 있으면 원하는 이미지를 다운받을 수 있다. 키워드는 카테고리라고 생각하면된다.

 

- 파라미터 

  • keyword: 검색할 키워드.
  • limit: 다운로드할 이미지의 최대 개수.
  • output_dir: 이미지를 저장할 디렉토리 경로.
  • adult_filter_off: 성인 콘텐츠 필터 설정 (True: 필터 사용, False: 필터 사용 안 함).
  • force_replace: 기존 파일을 덮어쓸지 여부 (True: 덮어씀, False: 덮어쓰지 않음).
  • timeout: 각 이미지 다운로드의 타임아웃 시간 (초 단위).

이제 내 로컬에 이미지 데이터셋을 구축하는 코드를 제공하겠다.

from bing_image_downloader import downloader
import os
import shutil

# 테스트용 이미지 카테고리 리스트
test_images = ['shoe', 'eye glasses', 'handbag', 'tie']

def download_images(keyword, num_images=100):
    # images 폴더 생성
    images_folder_path = os.path.join(os.getcwd(), 'images')
    os.makedirs(images_folder_path, exist_ok=True)

    # 카테고리별 폴더 생성
    category_folder_path = os.path.join(images_folder_path, keyword)
    os.makedirs(category_folder_path, exist_ok=True)

    # 이미지 다운로드
    downloader.download(keyword, limit=num_images, output_dir=images_folder_path, adult_filter_off=True, force_replace=False, timeout=60)

    # 다운로드된 이미지를 카테고리 폴더로 이동
    downloaded_folder_path = os.path.join(images_folder_path, keyword)
    if os.path.exists(downloaded_folder_path):
        for filename in os.listdir(downloaded_folder_path):
            src_path = os.path.join(downloaded_folder_path, filename)
            dest_path = os.path.join(category_folder_path, filename)
            if not os.path.exists(dest_path):  # 파일이 존재하지 않을 때만 이동
                shutil.move(src_path, dest_path)
            else:
                print(f"File {dest_path} already exists, skipping.")

        # 빈 폴더 삭제 시도
        if not os.listdir(downloaded_folder_path):
            os.rmdir(downloaded_folder_path)

    print(f"Downloaded {num_images} images for keyword '{keyword}' in folder '{category_folder_path}'")

# 모든 카테고리에 대해 이미지 다운로드 실행
for category in test_images:
    print(f"Downloading images for category: {category}")
    download_images(category, num_images=10)

 

다운을 잘하고 있는 모습이다.

 

필자는 쇼핑몰에서 들어갈만한 상품 이미지를 모아보려고하는데, 카테고리는 30개이상이며 카테고리별로 이미지 또한 30개정도 모아볼 생각이라, 900개이상이 되는 이미지 목록을 손으로 직접 하면 [시간 + 체력 + 정신적 에너지소모] 가 심할 거 같아서 자동화 코드를 작성해보았다. 

이미지 다운에서 끝나는 것이 아닌, 추가적으로 이미지를 다운을 받는 동시에 검색엔진(elasticsearch) 에 상품정보를 저장하는 로직을 붙여보려고한다. (상품정보는 GPT3.5한테 대충 넣어달라고 하여, 상품정보 질을 상향시켜도 좋을 거 같다.)

추가로, 상품정보를 저장할 때는 이미지 벡터 필드를 추가해서 임베딩된 벡터값을 저장하려고 한다.

내 로컬 서버로 테스트해볼 것이라, 검색엔진에는 로컬에 저장된 이미지 파일경로를 저장하여 쇼핑몰에서 상품 데이터를 불러올때는
검색엔진 -> 내 로컬 images폴더에서 이미지를 불러와서 화면단에 상품이미지를 보여줄 생각이다.

 

시간이 되면 AWS s3에 직접 이미지를 업로드하고 해당 경로를 검색엔진에 저장하여 원래 로직 그대로 쓸 수 있도록 해볼 예정..

끝으로 이미지 다운 결과이미지로 마무리하겠다.

 

handbag 이미지를 잘 다운받은 모습이다.

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유