이미지 탐지기 쉽게 구현하기

당근마켓에서 딥러닝을 활용해서 이미지 탐지기를 만들어 사용하고 있는데, Tensorflow Hub로 쉽게 구현한 방법을 공유해보려 합니다.

당근이

먼저 이미지 탐지기를 만들게 된 계기를 설명해드릴게요. 당근마켓에는 당근이라는 캐릭터가 있습니다. 당근이는 당근마켓의 나눔의 날, 주목할 만한 소식 그리고 크리스마스 같은 특별한 날에 당근마켓에서 사용자와 소통하는 캐릭터예요.

당근이

이렇게 귀엽고 친근하게 생겼죠:)

하지만 간혹 당근이가 좋거나 의도치 않게 당근이 캐릭터의 사진이나 당근이라는 명사로 닉네임을 지어 사용자에게 당근이와 혼돈될 수 있는 여지가 있어요. 그래서 닉네임에 ‘당근’ 명사를 사용하지 못하게 제한을 두었어요.

닉네임 글자는 쉽게 텍스트 제한할 수 있지만, 이미지는 픽셀로 구성되어 있어 기존의 간단한 프로그램 로직으로 구별하기 쉽지 않았어요.

이제 이런 것을 쉽게 가능한 방법으로 딥러닝이 있어요. 딥러닝은 이미 사람의 사진 구별능력을 넘어선지 꽤 됐으니 이미지 구별에 사용하면 됩니다.

딥러닝 모델의 이미지 탐지기 만들기

1. 이미지 특징 추출 모델 준비

이미지의 특징을 추출하려면 많은 양의 이미지를 수시간에서 몇일정도 학습시켜야하는데요. 얼마전 미리 학습된 모델을 쉽게 사용할 수 있는 Tensorflow Hub가 공개되었어요. TF Hub의 Image Modules을 사용하면 학습할 필요없이 코드 몇줄로 구현이 아주 간단합니다.

import tensorflow_hub as hub
module = hub.Module("https://tfhub.dev/google/imagenet/...")

2. 당근이 이미지의 특징 추출

탐지할 타켓의 이미지인 당근이 이미지를 위에서 준비한 모듈을 사용하여 당근이 이미지의 특징을 추출합니다. 이 작업은 처음 한번만 하고 이후 재사용합니다.

outputs = module(dict(images=daangn_profile_image), signature="image_feature_vector", as_dict=True)
target_image = outputs['default']

3. 사용자의 이미지의 특징 추출

사용자가 당근이 이미지 사용하는지 비교하기 위해 사용자의 이미지의 특징 추출합니다. 이 작업은 사용자의 프로필 이미지를 변경할 때 비동기로 작업을 실행하고 있습니다.

outputs = module(dict(images=user_profile_images), signature="image_feature_vector", as_dict=True)
input_image = outputs['default']

4. 당근이 이미지와 사용자의 이미지 비교

학습된 모듈에서 추출된 이미지의 특징은 벡터의 값으로 유사도를 비교하기 위해 Cosine similarity를 사용했습니다.

dot = tf.tensordot(target_image, tf.transpose(input_image), 1)
similarity = dot / (tf.norm(target_image, axis=1) * tf.norm(input_image, axis=1))
similarity = tf.reshape(similarity, [-1])

양수인 두 벡터의 cosine similarity 값은 0.0 ~ 1.0 인데 유사한 정도에 따라 1.0에 가깝습니다.

5. 유사도에 따라 검출

실제 몇개 이미지를 비교해본 결과 다음과 같이 나왔습니다.

이미지 별 유사도

첫번째 당근이 이미지는 동일하기 때문에 유사도 1.0이 나왔고, 당근이 이미지와 비슷한 순서대로 유사도 값이 높게 나온걸 알 수 있습니다.

3번째 이미지는 당근이와 꽤 유사하기 때문에 검출 기준값을 0.71이상으로 설정하면 되겠습니다. 당근마켓에서는 유사도 기준값 이상인 사용자 프로필 이미지가 발견되면 slack으로 알림을 받아 관리자가 확인하고, 유사도 기준값을 조정하여 후처리를 자동화하고 있습니다.

구현

위의 방법으로 당근마켓에서 실제 구현에 사용한 코드를 colab 노트북으로 공개했습니다. 자세한 코드는 아래 링크를 참고해주세요~!

참고로 구현된 모델을 Cloud ML Engine 에 배포하여 서비스 서빙하는 코드도 포함되어 있으니 참고하여 서비스 운영에 사용해보세요.


당근마켓에서는 딥러닝을 활용하여 사용자 만족도/편의성을 높이고, 효율적으로 운영되도록 시스템을 개선해나가고 있어요. 서비스 개선에 흥미가 있나요?

PS. 지금 당근마켓에서 마케터, 개발자를 모시고 있습니다. 채용공고를 살펴봐주세요. https://www.rocketpunch.com/companies/daangn/jobs

Like what you read? Give 전무익 (Ed Jeon) a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.