어떤 상품을 추천할 때, 혹은 검색 결과를 보여줄 때
우리는 생각보다 더 많은 상황에서
같은 이미지 사진을 마주합니다.

[사진은 네이버 쇼핑에서 히트텍 검색한 결과입니다]
같은 이미지 상품은 하나만 보여주는 것이
UX면에서 휠씬 좋지만,
이는 생각보다 어려운 작업입니다.
왜냐하면,
같은 이미지를 다른 브랜드에서 사용하는 경우도 많아
단순히 브랜드 이름으로 필터링할 수는 없기 때문입니다.
저는 이런 상황에서 사용하기 좋은
IMAGE HASH를 소개하려고 합니다.
https://github.com/JohannesBuchner/imagehash
사용법은 엄청 간단합니다.
파이썬 기반 패키지로써
pip를 사용해 install을 먼저 해줍니다.
pip install imagehash
그리고 image를 PIL type으로 만들고,
hash 함수를 통해 특정 길이의 값으로 만들면 작업을 끝납니다.
>>> from PIL import Image
>>> import imagehash
>>> hash = imagehash.average_hash(Image.open('tests/data/imagehash.png'))
>>> print(hash)
ffd7918181c9ffff
자, 이제 모든 이미지들의 hash 값을 구한 후,
hash 값이 동일한 경우 이를 필터링해주면
중복 이미지 처리가 가능해집니다.
imagehash에서 제공하는 hash 종류는
average_hash 외에도 몇가지 더 존재합니다.
저는 이 중에 Average hash와 Color hash를 사용하여
두 값이 모두 동일한 경우 같은 이미지라고 처리하는 로직을 작성해보았습니다.
for pid in tqdm(prd_id_list, desc="Processing images"):
pil_imgs = data_manager.get_pid_imgs([pid])
if not pil_imgs:
continue
img = pil_imgs[0]
img_hash = imagehash.average_hash(img, hash_size=img_hash_size)
color_hash = imagehash.colorhash(img, binbits=color_hash_size)
img_hashes.append(
{"prd_id": pid, "img_hash": str(img_hash), "color_hash": str(color_hash)}
)
원하는 정확도에 따라 hash 값 사이즈 조절도 가능합니다.
저는 default value로 진행했습니다.
아래 사진은 같은 hash값을 가진 이미지들입니다.




테스트해본 결과,
만족스러운 중복이미지 처리였습니다.
해시값 차이를 통해 비슷한 이미지를 분별할 수도 있다고 하니
유사한 이미지 처리하는 작업에도 유용한 패키지일 것 같습니다.
저는 의류 추천 로직을 만드는 프로젝트를 진행한 적이 있습니다.
예를 들어,
검정색 반바지가 있다고 하면
해당 반바지 상세 페이지를 구경하고 있는 소비자에게
이런 상품은 어떠세요? 하며 유사한 상품을 추천해주는 방식이었습니다.

제품의 유사도 점수를 위주로 추천 로직을 설계했기 때문에,
중복된 이미지를 가진 다른 제품이 추천되는 경우가 많았습니다.
중복된 이미지 추천은 소비자에게 혼란을 일으킬 수 있기에
중복 이미지를 없애기 위해 IMAGE HASH를 이용하기로 하였습니다.
아래는 실제 추천에 사용되는 이미지를 가지고
Hash 값 차이를 분석한 표입니다.

같은 이미지면 무조건 Hash값이 같을것이다라고 생각한 가설과는 달리
Hash값이 1~10 정도 차이나는 경우가 대부분이었습니다.

그래서 Image Hash 값이 같으면 중복 이미지로 판단하기 보다,
Image hash 차이가 특정 범주안에 있으면 중복 이미지라고 판단하는
로직을 작성했습니다.
왼쪽이 적용 전 추천 결과, 오른쪽이 적용 후 추천 결과입니다.
동일한 이미지가 추천에서 제외된 것을 보실 수 있습니다.



편의성: 5/5