본문 바로가기
프로그래밍/Web

중고마켓 기획에 이미지 검색 구현 후기(1)

by 물고기고기 2023. 10. 5.

이번에 항해 해커톤을 참여한 후기 및 신경써서 구현해보았던 기획에 대해 작성하고자 한다.

과제는 여러 기업의 과제 중 하나를 선택할 수 있었는데 우리는 육아 의류 플랫폼인 '룩키즈'의 개선 프로젝트였다.


 

👉 원더윅스 컴퍼니

  • 주제 : 더이상 유지보수를 진행하지 않는 프로젝트인 ‘룩키즈’ 서비스 개선
    • 서비스 소개 페이지[링크]
    • 앱스토어[링크] 플레이스토어[링크]
    • 키즈 패션 공유하기 & 키즈 패션 상품 구매 & 중고거래
    • 원래 자사 서비스인 ‘맘맘’ 에서 디자인을 일부 수정하여 제작하였고, 3개월 가량 기능 추가를 하며 개선하였으나 크게 반응이 없어 일시중지 상태.
    → 룩키즈를 만드는 팀에 배정되었다고 가정하고, ‘룩키즈’를 사용해본 뒤에 ‘룩키즈’ 서비스를 소생시키려면 어떻게 해야할지 고민해보고, 해커톤 기간동안 개선 방향성을 담은 프로젝트 제작.

개선 프로젝트인 만큼 재미있는 아이디어가 많이 나왔는데 나는 그 아이디어 중 하나인 중고제품 내 이미지 검색을 구현하고자 했다.

일단 평소에도 다른 사람이 입은 옷이 어디 제품 인지 궁금해 했던 경험이 있을텐데, 이때 사람한테 묻는 것보다 검색하며 찾아보는게 더 빠르기 때문에 주로 이미지 검색을 활용하게 된다. 혹은 이미 판매처를 알고있지만 더 싸게 사고 싶어서 찾게되기도 한다.

그런 의미에서 가격적인 메리트가 있는 중고시장에서 이미지 검색이 생기면 유저들 입장에서 더 좋을 것 같았다. 혹은 유저가 생각치도 못하게 마음에 드는 제품을 만나 서비스 활성화에 기여하지 않을까 싶었다.

 

거두절미하고 이미지 검색을 구현하려면 여러가지 방법이 있을 것이다.

1. 직접 올라온 이미지들로 검색 모델 구현하기

2. open API 활용하기

데이터과학부 전공으로써(ㅎㅎ..) 1번을 해보고 싶었지만 아무래도 해커톤이다보니 시간상 한계가 있을 것 같아 2번의 방식을 채택했다.

 

개인적으로 네이버 스마트렌즈를 유용하게 사용중이라 네이버쪽 open api를 사용하고 싶었는데

아쉽게도 지원 계획이 없다고 한다..

 

그래서 아쉬운대로 구글 이미지 검색을 찾아봤는데 아니나 다를까 너무 잘되어있다.

https://cloud.google.com/vision/product-search/docs/searching?hl=ko

다만 open api를 처음 사용해보는 경우엔 읽고 이해해야할 문서가 워낙 많아 헷갈릴 것 같다.

간단하게 설명하자면 여기서 제공하는 제품 검색의 경우

1. 제품 세트를 만들고

2. 해당 제품 세트에 제품을 만든다.

3. 그리고 이때 해당 제품에 대해 라벨링및 참조 이미지를 붙여준다.

4. 이미지 검색 api로 이미지와 함께 요청을 날리면 1번에서 만든 제품 세트내에 존재하는 이미지를 응답으로 준다.

이러한 프로세스를 거치기 때문에 자세히 읽어보지않으면 제법 헷갈린다.

 


그렇다면 이걸 어떻게.. 우리 서비스내의 DB와 매핑시키지?가 문제다.

우선 제품 학습을 위해서는 이러한 라벨들이 필요하다.

image-uri image-id product-set-id product-id product-category product-display-name labels
bounding-poly
gs://lookids-image-search/02.jpg   (1번에서 할당받은
프로젝트 set - id)
2 apparel-v2 sample02    
gs://lookids-image-search/03.jpg     3 apparel-v2 sample03    
gs://lookids-image-search/04.jpg     4 apparel-v2 sample04    
gs://lookids-image-search/05.jpg     5 apparel-v2 sample05    
gs://lookids-image-search/06.jpg     6 apparel-v2 sample06    

 

그리고 이러한 데이터들을 학습에 사용한 제품세트에서 제품 검색 api로 요청을 보내면

이러한 데이터 셋이 return된다.

{
    "responses": [
        {
            "productSearchResults": {
                "indexTime": "2023-10-05T08:29:26.519050153Z",
                "results": [
                    {
                        "product": {
                            "name": "projects/clean-authority-399607/locations/asia-east1/products/3",
                            "displayName": " ",
                            "productCategory": "apparel-v2"
                        },
                        "score": 1,
                        "image": "projects/clean-authority-399607/locations/asia-east1/products/3/referenceImages/3499533011610344693-1"
                    }
                ],
                "productGroupedResults": [
                    {
                        "boundingPoly": {
                            "normalizedVertices": [
                                {
                                    "x": 0.114974916,
                                    "y": 0.07066301
                                },
                                {
                                    "x": 0.8918297,
                                    "y": 0.07066301
                                },
                                {
                                    "x": 0.8918297,
                                    "y": 0.8474925
                                },
                                {
                                    "x": 0.114974916,
                                    "y": 0.8474925
                                }
                            ]
                        },
                        "results": [
                            {
                                "product": {
                                    "name": "projects/clean-authority-399607/locations/asia-east1/products/3",
                                    "displayName": " ",
                                    "productCategory": "apparel-v2"
                                },
                                "score": 1,
                                "image": "projects/clean-authority-399607/locations/asia-east1/products/3/referenceImages/3499533011610344693-1"
                            }
                        ],
                        "objectAnnotations": [
                            {
                                "mid": "/m/01d40f",
                                "name": "Dress",
                                "score": 0.9126193
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

해당 데이터를 자세히 보면 product쪽에 아까 학습시킨 데이터중 맞는 데이터에 대한 정보 같으니

어떻게 우리쪽 데이터와 잘 매핑시키면 서비스내의 이미지 검색을 활용할 수 있을 것 같다.

그거에 대한 실제 구현은 다음글에서 계속 작성하겠다 :3

댓글