개요
-
- 연계/소속회사 : 한이음 멘토링 사업
- 수행 기간 : 2021.3 ~ 2021.11 (약 9개월 소요)
- 주요 역할 : 아두이노 보드 구성 및 Python 기반의 OpenCV를 통한 영상처리, Selenium을 통한 쇼핑몰 리뷰 수집과 분석, Android 앱 구성과 디자인 등
- 기술 스택 : Python - OpenCV / Arduino / Android OS / Server - AWS / DB - MySQL / 협업툴 - Notion / VCS - Git, Gitlab
- 업무 성과 : 2021년 한이음 멘토링사업 프로젝트의 지원으로 진행된 프로젝트입니다. TTOKSHOW는 아두이도 보드를 활용하여 상품의 바코드를 인식하고 해당하는 데이터를 서버와 통신하여 DB에 저장된 데이터를 가져옵니다. 다양한 상품에 관한 리뷰와 상품 정보를 여러 쇼핑 사이트에서 자동으로 추출하여 통계 및 분석하고 이에 따른 결과를 사용자에게 보기 좋게 알려줍니다. 1년 간의 프로젝트 결과 한이음 공모전에 입상하였습니다.
프로젝트 설명
한국정보산업연합회에서 주관하는 2021년 한이음 공모전에 출품했던 프로젝트이다.
총 4명의 팀원과 1명의 멘토링 사업 멘토님과 함께 약 9개월 간 진행하여 공모전에서 입선작으로 선정되었다.
팀장으로 활동하며 프로젝트 수행 및 팀원과의 소통에 앞장 서서 이끌었던 프로젝트이다.
작품 소개
본 프로젝트의 스마트 안경은 부착된 카메라를 통해 쇼핑 중에 상품의 정보를 읽고, 인터넷상의 리뷰들을 빠르게 수집하여 사용자에게 알려준다. 사용자가 마트에서 상품을 선택할 때, 해당 상품의 리뷰를 인터넷에 직접 검색하지 않아도 손쉽게 이어폰으로 확인할 수 있어 더욱 편리하고 합리적인 쇼핑을 할 수 있게 된다. 마트에 진열된 수많은 상품들을 보고 어떤 상품을 골라야 하는지 고민해 본 사람들은 알 것이다. 이제 스마트 안경을 통해 손쉽게 나에게 딱 맞는 상품을 선택함으로서 똑똑한 쇼핑을 해보자
1. 기획 의도
- 리뷰를 찾아보기 위해서는 검색해야하는 번거로움이 따름
- 단계를 줄여줌으로써 편리성이 증가함
- 결과적으로 소비자에게 맞는 상품을 손쉽게 찾게 해줘서 구매를 유도시킴
2. 작품 내용
- ESP-32 CAM 아두이노 보드를 통한 영상 스트리밍
- WiFi 통신 및 포트포워딩을 통한 외부 접속 허용
- 스트리밍되는 영상에서 바코드 번호 추출 및 DB 내 상품 조회
- 상품 리뷰 크롤링 및 수집된 리뷰 분석하여 텍스트마이닝하여 DB에 저장
- 똑쇼 앱에서 상품을 조회하면 DB 내의 정보를 요약해주고 TTS를 활용하여
- 음성 출력 지원
작품의 개발 배경 및 필요성
스마트워치, 무선이어폰 등 여러 가지 분야의 웨어러블 기기들이 상용화에 성공했지만 여전히 스마트 안경 분야는 개발이 부족한 상황이다. 이미 수년 전 구글을 통해 '구글글래스'가 출시되었을 때 스마트 안경 시대가 금방 도래할 분위기였으나, 사생활 침해의 문제 등 여러 장벽에 부딪혀 발전이 늦춰진 상황이다. 이러한 스마트 안경을 우리 생활과 밀접한 분야인 쇼핑에 접목을 시키면 어떨까? 스마트 안경을 쇼핑에 접목 시켜 마트 내에서의 사용으로 제한한다면 사생활 침해 문제로부터는 자유로울 수 있다. 우리는 쇼핑을 할 때 모든 구매품목에 대한 정보를 정확히 알고 구매하지는 않는다. 그저 눈에 쉽게 보이는 한정된 정보로 판단하며, 가끔은 직감에 따라 구매했다가 후회하는 경우도 적지 않다.
특히 고령층으로 갈수록 인터넷에서 정보를 찾는데 어려움이 증가한다. 위 표에 따르면 소비자정보 접근성이 일반인은 7점 만점에 평균 5.9점인 반면 나이가 증가할수록 점수가 점점 떨어져 초고령노인은 평균 1.8점으로 나타나게 된다. 이를 해결하기 위해 스마트 안경을 통해 정보 수집 단계를 줄여 손쉽게 소비자 정보에 접근이 가능해져 쇼핑의 질을 높일 수 있다. 쇼핑을 위해 준비된 스마트 안경이 다양한 상품들의 후기나 정보 등을 인터넷 상에서 찾아와 보기 좋게 정리해준다면 더욱 알차고 합리적인 쇼핑을 할 수 있을 것이다. 또한 검색의 간소화로 짧은 시간에 다양한 상품 검색이 가능해져 더욱 빠르고 편리한 쇼핑이 가능할 것이다. 본 프로젝트에서는 이런 아이디어에서 착안하어 바코드가 존재하는 상품들을 안경의 카메라 모듈을 통해 인식하고 데이터를 분석하여 정리해주는 프로토타입과 그와 연동된 모바일 앱을 만들어 내는 것이 주요 목적이다.
작품의 특징
- 바코드 번호를 통해 상품을 검색하여 상품 정보를 보여주는 것은 많다. 하지만 실 사용자의 리뷰 정보를 종합적으로 분석하여 보여주는 것을 통해 사용자들의 합리적인 쇼핑에 많은 도움을 줄 것이다.
- 스마트안경에서 발생하는 사생활 침해 이슈를 ‘똑쇼’는 사용 장소를 마트 내로제한하여 기존 개인용 스마트안경에서 발생하는 문제를 해결할 수 있다.
- 실제 스마트안경 시장이 발전이 더딘 상황에서 ‘똑쇼’가 좋은 예시가 되어 스마트안경 시장 발전에 이바지할 수 있다.
- 스마트폰을 이용하여 리뷰를 확인할 수 있지만 검색을 하지 않고 스마트안경을 착용하여 원하는 상품의 바코드를 바라보기만 하여도 해당 상품의 정보, 평점, 리뷰 등을 확인할 수 있다. 이로써 편리성을 증대시키고 나아가 상품 비교 및 관리에 있어서 효율성 또한 증대시킬 수 있다.
- 대부분의 상품에 대한 정보를 인터넷 상에서 검색할 수 있지만 ‘똑쇼’는 실시간으로 반영되는 새로운 리뷰들과 그 정보를 도식화한 자료를 한눈에 볼 수 있어 정보이용 취약계층 또한 손쉽게 사용할 수 있을 것이다.
작품의 내용
작품의 기능
1) H/W
ESP-32 CAM & WiFi Manager
ESP-32 CAM는 똑쇼의 메인보드로 사용된 아두이노 보드이다. 해당 보드는 기본적으로 카메라, WiFi 모듈, 블루투스 모듈을 탑재하고 있다. 이 보드는 바코드를 촬영하고 WiFi 통신을 통해 전달하는 과정을 담당하기에 충분한 성능이라고 판단되었고, 실제로 상용화를 진행하게 되어도 저렴한 가격으로 대량생산에 용이하다는 장점이 있다.
이 보드에 업로드한 WiFi Manager는 스마트폰을 이용해 특정 네트워크에 연결할 수 있도록 설계해두었다. 매번 아두이노를 재부팅할 때마다 수동으로 연결하도록 해두었으나, 특정 네트워크가 어떤 네트워크로 연결될 지 정해져있다면 해당 네트워크에 자동으로 연결할 수 있도록 변경할 수 있다.
2) S/W
zbar & zxing
바코드는 ESP-32 카메라를 통해 인식하거나, 스마트폰 카메라를 통해 인식할 수 있다. ESP-32 카메라를 활용하면 로컬 네트워크를 통해 실시간으로 영상을 전송하게 되고, OpenCV와 zbar 라이브러리를 사용하여 서버에서 바코드를 빠르게 스캔해낸다. 관리자가 내부망이 아닌 외부에서도 접속할 수 있도록 네트워크 포트포워딩을 활용해서 연결할 수 있도록 설계해두었다.
스마트폰 카메라를 활용할 경우에는 어떤 바코드가 인식되는 지에 따라서 스마트안경 매칭 또는 상품 검색으로 나뉜다. 스마트안경에 미리 할당해 둔 QR코드를 인식하게 되면 해당 안경과 스마트폰 APP이 매칭이 되고, 바코드가 인식된다면 해당 상품을 바로 검색하여 상품 정보를 출력한다. 또한 스마트폰 카메라로 바코드를 찍게 되면 안드로이드의 zxing을 활용하여 처리하게 된다. 이 경우는 서버와 응답할 필요가 없으므로 더욱 빠른 응답속도를 나타낸다.
MySQL & AWS DB
바코드로 상품을 검색했을 때 상품 정보와 리뷰들을 보여주기 위하여 이러한 정보들을 저장해줄 데이터베이스가 필요했다. 따라서 AWS에서 제공하는 데이터베이스를 생성하여 이를 MySql에 연결시켰고, 파이썬에서 데이터베이스를 관리하기 위해 pymysql을 사용하였다. 상품정보를 데이터베이스에 저장하기 위해 대한상공회의소에서 제공하는 바코드정보 파일을 openpyxl로 엑셀에 접근하여 해당 정보들을 데이터베이스에 저장해 주었다.
Firebase
Firebase는 구글이 소유하고 있는 모바일 애플리케이션 개발 플랫폼으로 앱을 개발하고, 개선하고, 키워갈 수 있는 도구 모음(toolset)이다. 안경으로 상품을 인식했을 때 푸시알림을 통해 상품이 검색되었다는 것을 알려주기 위해 Firebase Cloud Messaging(FCM)기능을 사용했다. 특정 기기에만 푸시알림을 주기 위해 Firebase에서 할당해주는 기기 고유의 토큰 값을 서버에 전송하여 해당 기기에만 푸시알림을 줄 수 있도록 한다. 서버에서 FCM을 사용하기 위해 pyfcm을 사용하였다.
TTS
컴퓨터 텍스트를 음성으로 디지털화 한 오디오 렌더링으로 자바의 ‘android.speech.tts.TextToSpeech’라는 패키지를 사용한다. 정보를 다양한 방식으로 전달하기 위해 음성출력을 사용했다. 언어는 한국어로 사용하고, 음량과 재생속도, 높낮이를 적절하게 설정하여 speak() 메소드를 통해 다양한 정보를 음성으로 출력한다. 상품이름 및 평점 그리고 리뷰에 자주 나온 단어 등을 음성으로 출력해준다.
Crawling
웹 페이지를 접근하여 원하는 데이터를 추출해내는 기술이며 동적으로 웹페이지를 접근하여 상품을 검색한 후 추출하기 위해 파이썬의 Selenium 라이브러리를 사용했다. Selenium의 Webdriver를 통해 Chromedriver를 제어하여 SSG과 LotteOn 온라인 쇼핑몰의 상품 정보와 리뷰 데이터를 추출해온다.
상품의 모든 리뷰들을 추출하기 위해서 마지막 페이지까지 순차적으로 탐색하도록 수정하였고, 조회되지 않거나 리뷰가 없는 상품은 수집하지 않도록 예외처리 하였다. 추출한 데이터를 튜플 형식으로 정리하여 2차원 리스트에 저장하였으며 이를 데이터베이스에 저장하였다.
AWS Server
AWS 서버 EC2를 이용하여 클라이언트에서 처리 할 수 없거나 처리 하지 않아도 되는 정보들을 서버에서 처리하게 했다. 이를 통해 어플리케이션에서는 중요한 기능만 돌아가게 하여 경량화했다.
AWS 서버에서 Server.py 파일을 구동하여 socket과 threading 라이브러리를 통해 어플리케이션의 Client.java 파일과 통신하는 알고리즘을 작성하였다.
Client와 통신을 성공하면 어플리케이션 정보 및 휴대폰 정보를 받아오며 스마트 안경과 매칭 시켜 데이터를 저장한다. 이를 통해 여러 개의 스마트안경이 동시에 바코드를 찍어도 데이터 혼선 없이 올바른 휴대폰에 데이터를 전송할 수 있다.
스마트 안경으로 바코드를 인식한 경우, pyfcm 라이브러리의 FCMNotification을 통해 Client로부터 수신한 휴대폰 정보를 이용하여 푸시알림을 전송한다. 이로써 어플리케이션이 꺼져 있는 상태에서도 리뷰 데이터에 접근을 빠르게 할 수 있게 하였다. 또한 ESP-32에서 스트리밍한 영상에 접근하여 바코드를 인식하는 알고리즘을 작성하였으며, 인식 후 AWS Database에 접근하여 원하는 정보만을 받아와 Client 파일에 전송하였다.
Glide
Glide는 안드로이드 라이브러리로 별도의 처리를 하지 않아 빠르게 이미지를 앱 내에서 로드할 수 있게 해준다. Firebase Database에 올려둔 사진의 링크를 load 명령어로 이미지화하며 into 명령어로 원하는 위치의 View에 보여준다.
텍스트마이닝
웹쇼핑몰에서 수집한 리뷰들을 텍스트마이닝 기법을 사용하여 핵심 키워드를 추출한다. 이 과정에는 KoNLPy의 Okt 모듈을 통해 문자열을 분석하였으며, Wordcloud 모듈로 키워드를 도식화한 형태로 저장하였다.
Okt는 KoNLPy의 모듈 중 문자열 처리가 굉장히 빠른 편에 속하지만 리뷰 수가 너무 많이 쌓이면 처리시간이 많이 느려진다. 따라서 수집한 리뷰들 중 상당한 시간이 지나버린 리뷰는 최신 리뷰보다 중요도가 상대적으로 낮다고 판단하여 최신 리뷰부터 정해진 양 만큼의 문자열을 잘라서 처리하도록 설계하였다.
3) 주요 기능 정리
작품 결과물
작품 개발 환경
작품의 가치 및 제작 노력
1) 서버 및 바코드 인식 효율성 개선
- URL을 통해 직접 영상에 접속하지 않도록 영상 스트리밍은 서버에서만 접속하여 바코드 번호만 추출하도록 설계하였다.
- 바코드 인식의 효율성 증대를 위해 촬영되는 화면을 Grayscale로 조정하여 바코드를 인식하도록 하였다.
- 서버 응답속도를 빠르게 하기 위해 Thread를 활용하고 코드를 최적화하였다.
2) 데이터 처리 방식 개선
- 크롤링 도중에 상품의 결과가 없는 경우, 유사한 다른 제품을 검색하는 경우, 상품의 리뷰가 없는 경우 등의 다양한 케이스의 예외를 처리하였다.
- DB에 상품리뷰를 저장하기 위해 인덱싱을 고려해봤지만 데이터 삽입이 빈번하게 일어나는 경우에는 적절하지 않다고 생각되어 제외했다. 그 외에도 innoDB를 고려해봤지만 리뷰정보만을 저장하기에는 저장공간이 너무 커서 제외했다.
3) 모바일 앱 로딩 속도 개선 및 직관성 향상
- 앱 속도 향상을 위해 다양한 부분을 고려했다. 사진로딩 할 때, Thread에서 glide으로 변경하고 사진을 Firebase에 저장해서 로딩속도를 더욱 빠르게 했다. 또한 리뷰 로딩 할 때, 처음엔 ListVew를 사용하였지만 호환성이 좋은 RecyclerView로 변경하였다. 정적변수를 통해 계속 사용되는 정보를 저장하여 Activity(화면)간의 로딩을 짧게 해주었다.
- 심미성과 직관성 향상을 위해 Adobe XD를 활용하여 앱 디자인과 레이아웃 배치 등에 노력을 기울였다.
작품의 기대 효과
1) 소비자의 편리성 향상
소비자는 본래 합리적인 소비를 하기 위해 제품에 대한 정보를 인터넷에 검색해보곤 한다. 하지만 매번 정보를 검색하는 것이 귀찮기도 하고, 바이럴 마케팅(Viral Marketing) 등 소비자로 둔갑한 광고 사이에서 어떤 정보가 진짜 정보인지 파악하는데 어려움을 겪곤 한다. 이에 '똑쇼'를 활용하게 되면 상품에 대한 전반적인 리뷰를 종합하여 가짜 리뷰에 현혹되지 않는 똑똑한 쇼핑을 할 수 있게 도와준다. 다른 소비자들의 실제 리뷰를 종합하여 한눈에 보기 좋게 정리해주어 더욱 편리한 쇼핑을 가능하게 해줄 것이다.
2) 마트의 매출 증대
마트와의 협업을 통해 마트 내부에 '똑쇼'를 배치하여 소비자들이 쇼핑카트와 같이 편하게 이용할 수 있도록 준비할 수 있다. 이를 통해 소비자들이 스마트한 쇼핑에 관심을 갖게 하고 편리한 쇼핑에 대한 니즈를 해소해줌으로써 더욱 많은 소비자들을 유치할 수 있을 것이다.
3) 더 나은 상품의 질
상품에 대한 평가가 좋지 않은 제품들은 '똑쇼'를 통해 부정적인 평가들로 자연스레 나타나기 때문에 소비자들의 수요가 줄어들 것이고, 이에 따라 질이 좋지 않은 제품들은 줄어든 수요에 맞춰 품질을 높이거나 또는 도태되어 더 좋은 품질의 상품들이 시장에서 살아남게 될 것이다. 이에 따라 시중에 판매되는 제품들의 전반적인 성능과 품질이 향상되는 부가적인 영향도 기대해볼 수 있다.
작품의 활용 분야
1) 실버세대의 스마트한 쇼핑 도우미
인터넷 검색에 익숙하지 않은 고령 세대들에게 한눈에 보기 좋은 정보를 전달하여 상품 선택의 안목을 높여주도록 활용할 수 있을 것이다.
2) 시각장애인들을 위한 쇼핑 보조장치로써의 활용성
시각 장애를 가진 쇼핑 고객들에게 제품에 대한 다양한 정보를 대신 수집하여 음성으로 알려줌으로써 쇼핑에 도움이 되도록 보조장치로 활용할 수 있을 것이다.
3) 아이들의 흥미를 활용한 마케팅 효과
어린 아이들에게 재미있는 놀이와 같은 쇼핑으로 흥미를 끌어 어린 자녀들과 함께 오는 고객들을 대상으로 한 마케팅으로 활용할 수 있을 것이다.
프로젝트 난관 및 해결 과정
1. 프로젝트 관리 측면
- GitLab 사용 중 팀원 간 Rule 정리가 안 되어서 개발한 작업내용이 충돌로 인해 없어지는 경우가 발생했었다. 팀원들의 Git 숙련도가 부족했기 때문에 한이음에서 제공하는 Git 학습을 활용하여 함께 공부하고 Git 저장소를 초기화하여 처음부터 다시 체계적으로 관리하도록 변경하였다.
- 개발이 가장 활발해야할 시기에 COVID-19 거리두기 단계가 격상되어 팀원이 정기적으로 모두 모여 개발하기 힘든 상황이 발생했다. 개발 내용이 겹치는 팀원 2명만 모여서 개발하거나, 모든 팀원이 모여야 하는 경우에는 낮에 짧은 시간 동안 모임을 가지도록 유연하게 변경해서 진행하였다. 또한 온라인 미팅을 최대한 활용하여 짧은 주기로 회의를 자주 진행하여 프로젝트 진행에 있어 오프라인 모임의 한계를 해결하기 위해 노력하였다.
2. 작품개발 측면
- 카메라가 보여주는 화면을 스트리밍하는 아두이노를 사용하고 있는데 ESP32는 원래 로컬 네트워크에 접속된 관리자만 스트리밍되는 영상을 제어할 수 있다. 하지만 외부에서 관리할 수 있게 포트포워딩 방식을 활용하였다.
- 현재 안경 하나로 테스트 하여 다른 앱으로 정보가 가거나 바코드 인식을 해도 알림을 받아오지 못하는 등의 오류가 없지만 실제로 마트에서 사용 할 경우 여러 개의 안경과 휴대폰을 각각 매핑 시켜야 한다. 그래서 Firebase를 통해서 스마트폰 마다 고유 ID(토큰)를 할당 받도록 했다. 이 ID에 대응되는 ESP32의 고유번호를 배정해서 올바른 데이터가 앱으로 전송될 수 있게 안경에 QR코드를 부착하는 방식으로 변경하면 연결 및 해제 과정이 더욱 효율적으로 관리 될 것 이다.
- 온라인 쇼핑몰을 여러 군데 조사해서 크롤링을 시도했으나 쿠팡 사이트 접근 시 접근 권한이 없는 오류가 발생하였다. 인터넷 사용자 쿠키 제거, 브라우저 정보 주입, IP 변경 등 여러 가지 방법으로 해결하려고 노력했으나 쿠팡 측에서 반복적인 웹페이지 로드를 의도적으로 막아두었기 때문에 쿠팡 API를 구매하여 사용하는 방법 밖에 없었다. 하지만 개발 단계에서 하나의 쇼핑몰을 사용하기 위해 API를 구매하는 것에 집중하는 것보다 다른 쇼핑몰들을 크롤링하는 게 우선이라고 판단하여 크롤링 대상 사이트에서 쿠팡을 배제하였다.
- 상공회의소에서 제공하는 상품 리스트 샘플에 상품 이미지 링크가 포함되어 있었다. 모바일 앱에서 URL을 통해 로드하는 것에는 성공하였으나 로딩 속도가 너무 느려서 Firebase Cloud에 사진을 업로드하여 Glide를 사용하여 사진을 빠르게 접근하도록 해결하였다.
- 모든 리뷰를 보여주기 위해 한 번에 다 로드하면 상품에 따라 몇 십 개에서 몇 만 개에 달하는 리뷰가 로드되어 실행 시간에 큰 걸림돌이 되었다. 그래서 Recycler View를 사용하여 화면 형식을 쉽게 변형하고 보여주고자 하는 내용을 저장하기 쉽게 적용하였다.
프로젝트를 통해 배우거나 느낀점
- Git과 GitLab을 통해 팀원과 협업하고 형상관리하는 방식을 배울 수 있었다.
- 평소 학교 커리큘럼에서 배울 수 없는 다양한 분야를 접할 수 있는 기회가 되었다.
- 팀원들과 항상 의견이 통일되는 것은 아니고 소통이 안 되는 때도 있었으나, 그때마다 계획을 수정하고 목표를 달성해나가는 방식을 배울 수 있었다.
- AWS 서버와 안드로이드 Java 통신을 할 때 Thread를 이용하여 통신 하며 병렬적 구조 처리가 필요한 작업들도 새로운 Thread를 이용하여 서버와의 통신 효율성을 증가 시키는 방법을 알게 되었다.
- 클라우드를 통해 데이터베이스에 접근하고 보안 및 관리하는 방식을 이해하고 배울 수 있었다.
수상 실적