이미지 데이터셋을 만들려면 직접 웹에서 다운받고 이름 매핑하고 폴도 구조 관리하고 여간 귀찮은 일이 아닐 수 없다..
그래서 파이썬 라이브러리에서 이미지 검색쪽을 찾아보니 괜찮은 것이 있어, 공유하고자 한다.
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 이미지를 잘 다운받은 모습이다.
'A.I.(인공지능) & M.L.(머신러닝) > Python' 카테고리의 다른 글
[python] 이미지 임베딩 후 검색엔진에 저장까지_elastic/opensearch (1) | 2024.06.04 |
---|---|
[실습] Python3.x 다른 python file import 하기 (0) | 2024.04.04 |
[실습] 01. numpy (0) | 2024.02.27 |
* 코사인 유사도란? (0) | 2023.10.28 |