본문 바로가기
개발 고민

상품 이미지 검색 고민

by 냉동만두 2023. 11. 19.

요약

상품 이미지 검색기 컨셉 잡는 중


같은 상품 기준?

새로운 상품을 추가 할 때, 자동화 하기 어려운 부분이 있다. 새로 수집 또는 사용자가 추가 할 상품이 기존에 있는 상품인가 하는 것이다. 상품 이미지, 상품 이름, 상품 브랜드, 카테고리를 보고 판단 한다면, 각 항목별로 기존 상품들과 새로운 상품의 유사성 판단 정책을 수립 해야 한다. 그러다 문득 생각이 들었다. "그냥 이미지만 보고 판단 가능 하지 않을까?"

 

 

데이터 흐름

이미지를 검색 하기위한 큰 흐름을 생각 해 본다. 각 단계별로 최소한의 기능 구현으로 컨셉을 증명 해보고, 필요 하다면 단계별로 고도화 한다. 처음부터 "뭐는 꼭 이걸 쓰고 이렇게 해야해" 말에 휘둘리면 진도가 안나가서 재미 없다.

 

1. 검색 바탕이 되는 상품 이미지를 검색 가능 하도록 전처리. 임베딩

jpg, png등 이미지 파일을 embedding 하여 특징을 추출(feature extraction) 한다. 잘 학습된 이미지 모델 (pre trained model)에 서 바탕이 되는 상품 이미지를 임베딩 한다. 처음에는 모델 미세 조정 (fine tuning) 하지 않고, 특징만 추출 하는 용도로 사용 한다. 모델을 사용하는 라이브러리는 torch, tensorlfow 가 있겠고, mediapipe 처럼 좀 더 사용하기 편리한 래핑 라이브러리를 써도 좋겠다. 다음 단계에서 호환성을 위해, 라이브러리와 관계 없이, 임베딩 값은 numpy array 를 사용 한다.

 

2. 바탕이 되는 상품 이미지 임베딩 값들을 검색 공간에 인덱싱

앞서 임베딩한 데이터를 검색이 가능 하도록 인덱싱 해야 한다. 임베딩된 데이터를 검색 하는 방법은 elasticsearch에 넣고 벡터 유사도 검색 하거나, 아니면 다른  라이브러리를 사용 하여 검색을 구현 할 수 있다. 여기서 난 단순히 라이브러리를  사용 할 예정이고, faiss를 선택 했다. 코드 몇줄로 임베딩 값들을 인덱싱 하고, 원하는 임베딩 값을 넣고 검색 할 수 있다.

이떄, 인덱스 방법및 종류는 가장 간단하고 쉬워 보이는걸로 테스트를 진행 하고, 필요함하면 인덱스 방법을 바꿔본다.

 

어느정도 컨셉이 증명되고, 안정화가 필요 하다면, faiss로 서버를 만들어야 할텐데, cpu만 사용 한다면 검색 기능 한에서는 thread safe하여 간단히 flask같은 서버에 통합이 가능 할 것 같다. 물론 처음부터 elasticearch로 구현 하면 걱정이 없겠지만.

 

 

3. 새로운 상품 이미지를 검색 가능 하도록 전처리. 임베딩

새로운 상품의 이미지를 전처리 하고 임베딩 한다. 1번과 거의 같은 단계임.

 

 

4. 새로운 상품 이미지 임베딩 값을 검색 공간에 넣고 유사한 이미지 검색

앞서 인덱싱한 이미지 인덱스에 새로운 상품 이미지의 임베딩 값을 넣고 검색 한다. 인덱스가 유사도를 판단하여 결과 k개를 반환 한다(knn). 해당 인덱스에 맵핑된 아이디를 바탕으로 실제 이미지와 상품 정보를 보여줄 수 있다.

 

 

 

결론

테스트로 상품 몇개에 대한 검색을 해보면 기대한대로 유사한 이미지를 찾을 수 있었다. 물론 전혀 다른 이미지를 보여줄 때도 있지만, 이는 단계별 고도화를 진행 하면 어느정도 보완이 가능 해 보인다.

 

고도화 해볼 수 있는 항목

- 원본 이미지 이미지 규격화 등 이미지를 전처리하여, 미리 학습 된 모델에서 특징을 잘 추출 할 수있도록 유도

- 이미지 모델을 파인 튜닝 하여 특징 추출 효율을 높임

- 바탕이 되는 상품 이미지를 더 많이 인덱스에 추가 하여 검색 확률을 높임

- 인덱스 방법을 바꿔가며 최적의 인덱스를 찾아 인덱스 성능 개선