"졸업하면 그만이야 - WSIE (What Should I Eat)"의 두 판 사이의 차이

MIE capstone
이동: 둘러보기, 검색
(1. 역할 분담)
 
(같은 사용자의 중간 판 9개는 보이지 않습니다)
5번째 줄: 5번째 줄:
  
 
(customized diet management system)  
 
(customized diet management system)  
 
  
 
===프로젝트 기간===
 
===프로젝트 기간===
20번째 줄: 19번째 줄:
  
 
서울시립대학교 기계정보공학과 (20174300**) (이*희) <br/>  
 
서울시립대학교 기계정보공학과 (20174300**) (이*희) <br/>  
 
+
==오픈 소스 코드==
 
<span class="plainlinks">[https://github.com/Kolacider/WSIE2022 깃허브 주소(클릭)]</span>
 
  
 
==프로젝트 개요==  
 
==프로젝트 개요==  
34번째 줄: 31번째 줄:
 
: 평균수명의 증가로 인하여 건강에 관심을 가지는 이들이 많아졌으며, 이로 인해 식단관리의 중요성이 커지고 있다.  
 
: 평균수명의 증가로 인하여 건강에 관심을 가지는 이들이 많아졌으며, 이로 인해 식단관리의 중요성이 커지고 있다.  
  
[[파일:건강관리인식조사결과.jpeg|가운데|섬네일|400픽셀|건강관리 인식 조사 결과 차트]]  
+
[[파일:건강관리인식조사결과.jpeg|가운데|섬네일|600픽셀|건강관리 인식 조사 결과 차트]]  
 
 
: 또한 1인가구의 증가로 인하여 각종 반찬과 음식을 완제품 또는 밀키트의 형태로 출시하는 경우가 많아졌는데, 특정 식품군의 섭취가 제한되는 경우 이를 식별하기 쉽지 않다. 이러한 배경에 의해 제품의 영양성분표와 재료명을 읽어 식단을 관리하는 시스템을 설계하는 프로젝트를 진행하기로 하였다. 먼저 이 시스템의 우선목표는 건강에 관심을 가지고 식단을 조절하고 싶은 개인이나, 신념/종교/질병상의 이유로 특정 식품군의 섭취가 제한되는 사람들을 위한 관리 시스템이다. 위와 같은 이유로 음식을 조절해야 하는 사람들의 경우, 쉽게 성분을 확인하여 식품을 구매할 수 있는 효과를 얻을 수 있다. 또한, 마트와 협업하여 해당 시스템 장비가 부착된 카트를 도입할 수 있다면, 마트의 매출 상승을 기대할 수 있고, 식단을 조절하는 사용자에게 편의를 제공할 수 있고 사회적인 건 강에도 기여할 수 있음은 물론이고 건강에 관한 관심이 나날이 늘어가는 지금, 이용자 수 확보에도 큰 어려움이 없을 것으로 예상하는 바이다.
 
 
 
  
 +
: 또한 1인가구의 증가로 인하여 각종 반찬과 음식을 완제품 또는 밀키트의 형태로 출시하는 경우가 많아졌는데, 특정 식품군의 섭취가 제한되는 경우 이를 식별하기 쉽지 않다. 이러한 배경에 의해 제품의 영양성분표와 재료명을 읽어 식단을 관리하는 시스템을 설계하는 프로젝트를 진행하기로 하였다. 먼저 이 시스템의 우선목표는 건강에 관심을 가지고 식단을 조절하고 싶은 개인이나, 신념/종교/질병상의 이유로 특정 식품군의 섭취가 제한되는 사람들을 위한 관리 시스템이다. 위와 같은 이유로 음식을 조절해야 하는 사람들의 경우, 쉽게 성분을 확인하여 식품을 구매할 수 있는 효과를 얻을 수 있다. 또한, 마트와 협업하여 해당 시스템 장비가 부착된 카트를 도입할 수 있다면, 마트의 매출 상승을 기대할 수 있고, 식단을 조절하는 사용자에게 편의를 제공할 수 있고 사회적인 건 강에도 기여할 수 있음은 물론이고 건강에 관한 관심이 나날이 늘어가는 지금, 이용자 수 확보에도 큰 어려움이 없을 것으로 예상하는 바이다.
  
 
===3. 프로젝트 개발 목표===
 
===3. 프로젝트 개발 목표===
110번째 줄: 105번째 줄:
  
 
====나. 기능별 시스템 구현====  
 
====나. 기능별 시스템 구현====  
 
+
(이걸 각 해당 부분 알고리즘 및 설명 바꿉시다)
 
  
 
* '''글자 인식 알고리즘 (OCR)'''
 
* '''글자 인식 알고리즘 (OCR)'''
183번째 줄: 177번째 줄:
 
::: 영양성분의 몇몇 글자를 비슷한 다른 글자로 인식하는 경우 예외처리과정을 통해 문맥에 맞는 적절한 글자로 바꿔준다.  
 
::: 영양성분의 몇몇 글자를 비슷한 다른 글자로 인식하는 경우 예외처리과정을 통해 문맥에 맞는 적절한 글자로 바꿔준다.  
  
[[파일:글자변환.PNG|400픽셀|섬네일|가운데|글자변환]]  
+
[[파일:글자변환.PNG|600픽셀|섬네일|가운데|글자변환]]  
  
 
::: 글자 단위로는 잘 인식했으나 띄어쓰기가 잘 인식이 안되어 단어로 보았을 때 잘못된 경우나 글자 순서대로 저장이 되지 않는 경우가 종종 있다. 또는 0을 인식하지 못하는 경향이 있다. 이를 해결하기 위해 먼저 ‘inferText’의 위치 정보를 파악하여 json 파일에 저장된 순서가 아닌 위치정보를 토대로 순서대로 단어들을 저장했다. 조금씩 잘못 인식한 단어들을 계속해서 테스트하며 조금씩 수정을 해주었다. OCR이 ‘0g’에서 ‘0’을 인식하지 못하는 경향이 있다. 따라서 ‘g’이 있지만 숫자가 없는 경우 ‘0g’으로 수정을 해주었다.   
 
::: 글자 단위로는 잘 인식했으나 띄어쓰기가 잘 인식이 안되어 단어로 보았을 때 잘못된 경우나 글자 순서대로 저장이 되지 않는 경우가 종종 있다. 또는 0을 인식하지 못하는 경향이 있다. 이를 해결하기 위해 먼저 ‘inferText’의 위치 정보를 파악하여 json 파일에 저장된 순서가 아닌 위치정보를 토대로 순서대로 단어들을 저장했다. 조금씩 잘못 인식한 단어들을 계속해서 테스트하며 조금씩 수정을 해주었다. OCR이 ‘0g’에서 ‘0’을 인식하지 못하는 경향이 있다. 따라서 ‘g’이 있지만 숫자가 없는 경우 ‘0g’으로 수정을 해주었다.   
194번째 줄: 188번째 줄:
 
[[파일:상품사진20개.PNG|800픽셀|섬네일|가운데|상품사진 20개]]  
 
[[파일:상품사진20개.PNG|800픽셀|섬네일|가운데|상품사진 20개]]  
 
   
 
   
[[파일:인식률.PNG|800픽셀|섬네일|가운데|인식률 비교]]  
+
[[파일:인식률.png|800픽셀|섬네일|가운데|인식률 비교]]  
  
 
::: Naver Clova OCR만을 진행할 시 글자 하나하나에 대해서는 인식률이 뛰어나지만 단어 단위로 볼 시 잘못된 경우가 많다. 또한 일부 글자를 잘못 인식하거나 누락하는 경우가 꽤 있다. 20개의 상품이미지 5번 반복 촬영하여 총 100개의 이미지 중 92.2%의 단어 만을 정확하게 인식하였다. 위에서 예외처리를 하고 재 촬영 시 98.6%의 단어를 정확하게 인식하였다. OCR 데이터를 사용하기 위해서는 단어가 정확해야 한다. 따라서 예외처리가 필요하며 매우 중요하다는 것을 볼 수 있다. 틀린 1.4%의 단어의 경우 Naver Clova OCR에서 인식을 전혀 하지 못함으로 발생했다. 인식된 글자가 없으므로 예외처리를 통해 해결하지 못한다. 이미지의 빛 번짐이나 해상도를 높여주는 과정을 거쳐야 한다. 하지만 라즈베리파이로 이를 해결하기에는 알고리즘이 무겁고 또한 딥러닝 등을 사용해야 하기에 구현 또한 쉽지 않다. 사진 촬영 시 빛 번짐이나, 흐릿한 부분 없이 정확하게 찍도록 유도하여 문제를 해결하고자 했다.
 
::: Naver Clova OCR만을 진행할 시 글자 하나하나에 대해서는 인식률이 뛰어나지만 단어 단위로 볼 시 잘못된 경우가 많다. 또한 일부 글자를 잘못 인식하거나 누락하는 경우가 꽤 있다. 20개의 상품이미지 5번 반복 촬영하여 총 100개의 이미지 중 92.2%의 단어 만을 정확하게 인식하였다. 위에서 예외처리를 하고 재 촬영 시 98.6%의 단어를 정확하게 인식하였다. OCR 데이터를 사용하기 위해서는 단어가 정확해야 한다. 따라서 예외처리가 필요하며 매우 중요하다는 것을 볼 수 있다. 틀린 1.4%의 단어의 경우 Naver Clova OCR에서 인식을 전혀 하지 못함으로 발생했다. 인식된 글자가 없으므로 예외처리를 통해 해결하지 못한다. 이미지의 빛 번짐이나 해상도를 높여주는 과정을 거쳐야 한다. 하지만 라즈베리파이로 이를 해결하기에는 알고리즘이 무겁고 또한 딥러닝 등을 사용해야 하기에 구현 또한 쉽지 않다. 사진 촬영 시 빛 번짐이나, 흐릿한 부분 없이 정확하게 찍도록 유도하여 문제를 해결하고자 했다.
221번째 줄: 215번째 줄:
  
 
::: 식품의약품안전처에서 제공하는 약 만여가지의 식품 데이터와 웹에서 크롤링해온 요리 데이터에 대하여 k_mean_cluster 법으로 (n=)5개의 클러스터로 군집화하였고, n은 elbow method를 사용하여 기울기가 flat해지는 2~5 중 메뉴 추천의 유사성을 위하여 n = 5를 사용하였다<br/>
 
::: 식품의약품안전처에서 제공하는 약 만여가지의 식품 데이터와 웹에서 크롤링해온 요리 데이터에 대하여 k_mean_cluster 법으로 (n=)5개의 클러스터로 군집화하였고, n은 elbow method를 사용하여 기울기가 flat해지는 2~5 중 메뉴 추천의 유사성을 위하여 n = 5를 사용하였다<br/>
[[파일:Cluster1.PNG|300픽셀|섬네일|가운데|군집화하기 전]]<br/>
+
[[파일:Cluster1.PNG|600픽셀|섬네일|가운데|군집화하기 전]]<br/>
[[파일:Cluster2.PNG|370픽셀|섬네일|가운데|군집화한 후]]<br/>
+
[[파일:Cluster2.PNG|600픽셀|섬네일|가운데|군집화한 후]]<br/>
[[파일:Elbowmethod.PNG|300픽셀|섬네일|가운데|Elbow Method]]  
+
[[파일:Elbowmethod.PNG|600픽셀|섬네일|가운데|Elbow Method]]  
  
 
::: <br/>이후 각각의 식품별로 데이터를 정규화한 뒤 벡터화하여 식품 사이의 거리를 반환하는 함수를 정의하였다. 사용자가 섭취하고 싶은 메뉴를 입력하면 사용자의 건강 정보와 입력된 메뉴의 영양성분을 비교하여 섭취가능여부를 판단한다. 섭취가능여부는 어플리케이션에서 입력한 활동량, 키, 몸무게, 나이의 정보로 에너지 대사량이 계산되고 당뇨병, 고지혈증, 비만 환자는 각각 탄수화물, 포화지방산, 열량의 에너지의 식으로 하루 섭취 제한량이 정해지게 된다. (단, 고혈압 환자의 나트륨 섭취 제한량은 3700mg으로 고정되었다.) 입력식품이 하루 섭취 제한량을 넘긴다면 섭취 제한량을 넘지 않을 때까지 같은 군집 내의 음식들을 대조하며 추천하며, 데이터셋에 무엇이 있는지 사용자가 알지 못하므로 자동완성 기능으로 입력에 편의성을 추가하였다.
 
::: <br/>이후 각각의 식품별로 데이터를 정규화한 뒤 벡터화하여 식품 사이의 거리를 반환하는 함수를 정의하였다. 사용자가 섭취하고 싶은 메뉴를 입력하면 사용자의 건강 정보와 입력된 메뉴의 영양성분을 비교하여 섭취가능여부를 판단한다. 섭취가능여부는 어플리케이션에서 입력한 활동량, 키, 몸무게, 나이의 정보로 에너지 대사량이 계산되고 당뇨병, 고지혈증, 비만 환자는 각각 탄수화물, 포화지방산, 열량의 에너지의 식으로 하루 섭취 제한량이 정해지게 된다. (단, 고혈압 환자의 나트륨 섭취 제한량은 3700mg으로 고정되었다.) 입력식품이 하루 섭취 제한량을 넘긴다면 섭취 제한량을 넘지 않을 때까지 같은 군집 내의 음식들을 대조하며 추천하며, 데이터셋에 무엇이 있는지 사용자가 알지 못하므로 자동완성 기능으로 입력에 편의성을 추가하였다.
245번째 줄: 239번째 줄:
 
:::데이터베이스는 구글과 연동하기 쉽고 텍스트 정보만 불러오는 등 데이터 다운로드 용량이 매우 낮아 무료로 사용할 수 있는 Firebase를 사용하였다. 또한, 사용자의 건강정보 및 장바구니의 영양성분 양을 실시간으로 확인할 수 있어야 하므로 realtime database안에 사용자 집합 'List of Users'아래에 UID별로 데이터셋을 구축하였다. 각 UID 안에는 사용자의 키, 몸무게 등과 같은 신체정보와 탄수화물, 트랜스지방 등과 같은 장본 영양성분 목록이 담겨있다.
 
:::데이터베이스는 구글과 연동하기 쉽고 텍스트 정보만 불러오는 등 데이터 다운로드 용량이 매우 낮아 무료로 사용할 수 있는 Firebase를 사용하였다. 또한, 사용자의 건강정보 및 장바구니의 영양성분 양을 실시간으로 확인할 수 있어야 하므로 realtime database안에 사용자 집합 'List of Users'아래에 UID별로 데이터셋을 구축하였다. 각 UID 안에는 사용자의 키, 몸무게 등과 같은 신체정보와 탄수화물, 트랜스지방 등과 같은 장본 영양성분 목록이 담겨있다.
  
[[파일:Firebase uid nutrient.PNG|200픽셀|섬네일|가운데|사용자 정보]]
+
[[파일:Firebase uid nutrient.PNG|500픽셀|섬네일|가운데|사용자 정보]]
 
:::<br/>
 
:::<br/>
 
신체정보 목록(gender:성별, height:키, weight:몸무게, age:나이, PA:활동량)<br/>
 
신체정보 목록(gender:성별, height:키, weight:몸무게, age:나이, PA:활동량)<br/>
258번째 줄: 252번째 줄:
  
 
::: 어플리케이션의 기능은 크게 개인정보 입력을 위한 로그인, 파이시스템 로그인을 위한 QR코드 생성, 정보 확인 및 위험도 분석으로 나눌 수 있다. 앞의 두 가지 기능은 위에서 설명했으므로 생략한다. 사용자는 장본 상품들의 목록으로부터 영양성분 데이터를 확인할 수 있는데 이것으로 건강한 식단을 섭취하고 있는 지 알기 힘들 것이라 판단하여 한 눈에 알 수 있도록 차트 기능과 식단방향에 대한 조언을 추가하였다.<br/>
 
::: 어플리케이션의 기능은 크게 개인정보 입력을 위한 로그인, 파이시스템 로그인을 위한 QR코드 생성, 정보 확인 및 위험도 분석으로 나눌 수 있다. 앞의 두 가지 기능은 위에서 설명했으므로 생략한다. 사용자는 장본 상품들의 목록으로부터 영양성분 데이터를 확인할 수 있는데 이것으로 건강한 식단을 섭취하고 있는 지 알기 힘들 것이라 판단하여 한 눈에 알 수 있도록 차트 기능과 식단방향에 대한 조언을 추가하였다.<br/>
[[파일:Chart and advice.jpg|400픽셀|섬네일|가운데|어플리케이션 화면]]<br/>
+
[[파일:App final report.jpg|400픽셀|섬네일|가운데|어플리케이션 화면]]<br/>
  
  
  
::: <br/>위험도는 기준이 으하하하하하 으하하하하 으하하하 으하하 으하 하
+
::: <br/>위험도는 1일 권장섭취량 기준에 대한 비율이며 식단 방향에 대한 조언은 환자별로 계산된 기준치의 70% 이상이면 주의를 요구하고, 100%에 도달하면 섭취를 중단할 것을 요구한다.
  
  
440번째 줄: 434번째 줄:
 
박*기 - 이 프로젝트를 하면서 많은 어려움도 있었지만 하나하나씩 해결해나가면서 배운 것도 많았고 보람 뿐만 아니라 재미도 느낄 수 있었습니다. 우리가 직접 주제를 선택하여 개발을 하기에 처음부터 끝까지 검색하면서 배우고, 문제가 발생 하면 해결해 나가며 프로젝트를 진행했습니다. 이 과정 모두가 스스로 해쳐나가는 것이기에 처음엔 막막하다고 느낄 때가 많아 힘든 부분이 많았지만 문제를 해결하는 과정에서 단지 솔루션을 찾는 것에 그치는 것이 아니라 문제를 정확히 파악하고 해결 방법을 찾고 해결해 나가는 과정을 배울 수 있었습니다. 5명이 팀을 이루어 프로젝트를 진행하면서 올바른 협업에 대한 경험을 쌓을 수 있었습니다. 먼저 프로젝트를 파트 별로 나누어 관심 분야에 맞게 파트를 맡았고 파트 내에서 개발하는 부분을 나누어 서로 충돌 없이 효율적으로 진행 할 수 있도록 노력했습니다. 이 과정에서 의사소통이 매우 중요하다는 것을 또 한번 알게 되었습니다. 서로의 의견을 내세울 때는 근거를 항상 제시해야 된다는 것과 의견 조율 및 절충하는 방법에 대해 배우고 경험할 수 있었습니다. 6개월이라는 짧은 시간 동안 타이트한 일정 내에서 개발을 진행 하였고 일정에 맞추어 매번 목표를 제시하고 개발해 나가는 방법에 대해 경험 할 수 있었습니다. 처음 구상했던 모든 것을 전부 구현하지 못한 것이 조금 아쉬움으로 남았지만 현재 개발한 부분을 잘 다듬어 멋진 프로젝트 결과물을 만들어 내게 되어 뿌듯한 한 학기를 보낸 것 같습니다.
 
박*기 - 이 프로젝트를 하면서 많은 어려움도 있었지만 하나하나씩 해결해나가면서 배운 것도 많았고 보람 뿐만 아니라 재미도 느낄 수 있었습니다. 우리가 직접 주제를 선택하여 개발을 하기에 처음부터 끝까지 검색하면서 배우고, 문제가 발생 하면 해결해 나가며 프로젝트를 진행했습니다. 이 과정 모두가 스스로 해쳐나가는 것이기에 처음엔 막막하다고 느낄 때가 많아 힘든 부분이 많았지만 문제를 해결하는 과정에서 단지 솔루션을 찾는 것에 그치는 것이 아니라 문제를 정확히 파악하고 해결 방법을 찾고 해결해 나가는 과정을 배울 수 있었습니다. 5명이 팀을 이루어 프로젝트를 진행하면서 올바른 협업에 대한 경험을 쌓을 수 있었습니다. 먼저 프로젝트를 파트 별로 나누어 관심 분야에 맞게 파트를 맡았고 파트 내에서 개발하는 부분을 나누어 서로 충돌 없이 효율적으로 진행 할 수 있도록 노력했습니다. 이 과정에서 의사소통이 매우 중요하다는 것을 또 한번 알게 되었습니다. 서로의 의견을 내세울 때는 근거를 항상 제시해야 된다는 것과 의견 조율 및 절충하는 방법에 대해 배우고 경험할 수 있었습니다. 6개월이라는 짧은 시간 동안 타이트한 일정 내에서 개발을 진행 하였고 일정에 맞추어 매번 목표를 제시하고 개발해 나가는 방법에 대해 경험 할 수 있었습니다. 처음 구상했던 모든 것을 전부 구현하지 못한 것이 조금 아쉬움으로 남았지만 현재 개발한 부분을 잘 다듬어 멋진 프로젝트 결과물을 만들어 내게 되어 뿌듯한 한 학기를 보낸 것 같습니다.
  
 +
한*빈 - 이렇게 열심히 프로젝트를 참여한 것이 얼마나 오랜만인가. 정말 열심히 만들었고, 모두 함께 만나서, 서로 노력했다는 것이 느껴졌다. 처음 주제를 선택하면서 어느 정도 윤곽만 잡혀 있었던 것들에 점점 살이 붙으면서 형태가 잡히기 시작하니 욕심이 나서 하나 둘 기능을 추가하게 되었다. 각각의 기능들을 추가하면서, 여러 가지 문제점이 발생하였지만 결국엔 모두 극복해서 만들었다는 것에서 뿌듯했고 자랑스러웠다. 평소에는 컴퓨터를 이용하여 소스코드를 작성하거나, 그래픽 작업등을 진행하였는데, 해당 프로젝트를 라즈베리파이로 진행하면서, 실제 하드웨어의 성능을 고려하여 프로그램을 제작하는 것이 얼마나 힘들지만 중요한 작업인지 알게 된 것 같다. 또한, 기구부를 포함한 시스템을 만들면서 단순히 하나의 프로그램만을 만드는 것과 전체 시스템을 구성하는 것이 완전히 다른 문제라는것도 실감하게 되었다. 그래도 각 팀원 모두가 자신의 자리에서 최선을 다해 준 덕분에 이런 프로그램을 해 낼 수 있었다고 생각한다. 이번 프로젝트를 진행하는데 도움을 주신 교수님, 조교님들, 그리고 주말과 저녁에 만나는 것도 불평불만없이 따라 준 우리 팀원들에게 정말로 감사합니다.
 +
 +
강*성 - 4년째 학교를 다니며 늘 같이 하던 동기들과만 프로젝트와 팀플을 진행해 왔었습니다. 그러나 내장형 시스템 및 실습에서 남는 인원들이 모여 구성된 저희 팀은 처음보게 된 사람도 있었고 이전까지 함께 작업을 해본 경험이 없는 동기들과 함께 하게 되었습니다. 처음엔 소통이나 잘 될지 걱정이 앞섰지만, 프로젝트 주제를 브레인스토밍 할때부터 팀원들의 열정을 볼 수 있었고 설계를 진행하며 각자가 맡은 파트를 해오는 것을 보며 책임감 있는 사람들이라는 것을 느꼈습니다. 프로젝트 진행 과정에 문제가 생기면 함께 협업하며 문제를 처리해 나가는 과정, 서로 의견이 대립했을 때 누군가는 수용하고 합의점을 찾아가는 과정, 그리고 주 2회의 고정 회의시간처럼 개인적인 희생을 감수하는 과정 등 팀플레이를 해야하는 설계자가 앞으로 현업에서 어떻게 문제를 해결해 나가야 하는가에 대한 배움은 수업에서 배운 임베디드 지식보다도 저에게 정말 귀중한 경험이 되었습니다. 저희가 설계한 시스템은 학기가 끝난 이후 누구도 사용하지 않겠지만, 설계를 하며 배운 경험과 수업에서 배운 지식들은 토대가 되어 공학도가 아닌 공학자로 거듭날 수 있게 될 것이라 생각합니다. 처음으로 재미를 느끼며 설계를 진행할 수 있게 해준 팀원들과 학생을 위해 항상 노력해주시는 교수님, 그리고 조교님들께 진심으로 감사드립니다.
 +
 +
이*희 - 5명이서  협업을 하면서 제가 얼마나 부족한지  느끼게 된 프로젝트였던 것 같습니다. 그동안은 단순히 소스코드를 짜고 간단한 수준에서 기획을 했던 것 같은데 처음부터 기획을 하고 설계와 구현을 하는것은 기존과 완전히 다르다는것을 알게 되었습니다. 계획했던 것과 현실적인 상황이 대립하면서 기존의 계획을 변경하거나 문제를 해결하는 과정을 겪게 되었으며 일반적인 환경이 아닌 라즈베리파이라는 임베디드환경에서의 개발을 하면서 오는 여러 변수들 또한 겪게 되었습니다. 또한 이정도 인원에서 협업을 하면서 진행한게 저한테는 처음인데 의사소통과  협업이 가지는 중요성 또한 크다는것을 다시한번 느끼게 되었습니다. 프로젝트 내내 다른 조원들에게 고마움을 느꼈고 다른 조원들이 없었으면 여기까지 오지 못했을 것입니다. 프로젝트를 수행하면서 저에게 무엇이 부족한지 돌아볼 수 있었고 다른 조원들에게도 많은 자극을 받게 되었습니다.
 
==부록==
 
==부록==

2022년 6월 15일 (수) 20:14 기준 최신판

프로젝트 소개

프로젝트 명

사용자 맞춤형 식단관리 시스템 WSIE, What Should I Eat

(customized diet management system)

프로젝트 기간

2022.3~2022.6

팀 소개

서울시립대학교 기계정보공학과 (20174300**) (강*성) (팀장)

서울시립대학교 기계정보공학과 (20184300**) (김*형)

서울시립대학교 기계정보공학과 (20174300**) (한*빈)

서울시립대학교 기계정보공학과 (20174300**) (박*기)

서울시립대학교 기계정보공학과 (20174300**) (이*희)


프로젝트 개요

1. 프로젝트 요약

본 프로젝트에서 섭취할 수 있는 음식에 제한이 있는 환자, 종교인, 더 나아가 건강에 관심이 있는 일반 시민들의 편의와 보편적인 사회의 건강 증진을 위하여 식품의 영양 성분을 확인 및 관리하고 식단을 제안하는 시스템을 제작한다. 식품에 쓰여 있는 영양성분표를 확인하여 피해야 하는 음식에 대해 알림을 주고, 구매한 물품들의 영양정보를 바탕으로 균형 잡힌 식단을 알려준다. 질병이 있거나 종교적인 신념, 또는 채식주의를 실행하는 사람들이 직접 성분표를 확인하지 않아도 되고, 건강에 관심있는 사람들은 별도로 영양 정보를 계산할 필요 없이 식단을 관리해주는 효과를 얻을 수 있다. 해당 시스템을 쇼핑 카트와 어플리케이션 내에서 구현한다.


2. 프로젝트의 배경 및 기대효과

평균수명의 증가로 인하여 건강에 관심을 가지는 이들이 많아졌으며, 이로 인해 식단관리의 중요성이 커지고 있다.
건강관리 인식 조사 결과 차트
또한 1인가구의 증가로 인하여 각종 반찬과 음식을 완제품 또는 밀키트의 형태로 출시하는 경우가 많아졌는데, 특정 식품군의 섭취가 제한되는 경우 이를 식별하기 쉽지 않다. 이러한 배경에 의해 제품의 영양성분표와 재료명을 읽어 식단을 관리하는 시스템을 설계하는 프로젝트를 진행하기로 하였다. 먼저 이 시스템의 우선목표는 건강에 관심을 가지고 식단을 조절하고 싶은 개인이나, 신념/종교/질병상의 이유로 특정 식품군의 섭취가 제한되는 사람들을 위한 관리 시스템이다. 위와 같은 이유로 음식을 조절해야 하는 사람들의 경우, 쉽게 성분을 확인하여 식품을 구매할 수 있는 효과를 얻을 수 있다. 또한, 마트와 협업하여 해당 시스템 장비가 부착된 카트를 도입할 수 있다면, 마트의 매출 상승을 기대할 수 있고, 식단을 조절하는 사용자에게 편의를 제공할 수 있고 사회적인 건 강에도 기여할 수 있음은 물론이고 건강에 관한 관심이 나날이 늘어가는 지금, 이용자 수 확보에도 큰 어려움이 없을 것으로 예상하는 바이다.

3. 프로젝트 개발 목표

가. 카메라를 이용한 인식 및 처리

카메라를 통해 들어온 이미지 정보에 OCR(Optical character recognition) 기술을 통해 영양정보, 원재료명 등 원하는 부분의 글자를 인식하고 의미 있는 정보로 처리하도록 제작한다. 이를 통해 사용자가 상품 정보를 자세히 읽지 않아도 되도록 함으로써 사용자에게 편의성을 제공한다.

나. 식단 정보 처리

위 OCR 기술을 통해 인식한 영양성분 및 원재료명에 대한 정보와 사용자의 정보를 비교하여 식품의 섭취 가능 여부를 파악한다. 또한, 구매한 음식을 기반으로 성분을 분석하여 적절히 균형이 이루어져 있는지 알려주고, 구매한 상품들의 식품유형을 기반으로 제작 가능한 요리를 추천해 준다. 구매한 음식의 영양성분 데이터를 서버에 저장하여 어플리케이션에 출력한다. 따라서 주기적으로 영양성분량을 기록해야 하는 번거로움을 줄여준다. 또한 섭취하고자 하는 식단을 입력했을 때, 4대 성인병을 기준으로 일일 제한 섭취량을 초과하는 영양성분이 포함되어 있다면 섭취 가능한 양의 성분이 포함되어 있는 비슷한 대체음식을 추천해준다.

다. GUI

라즈베리파이와 연결된 터치 스크린을 통하여 사용자가 프로그램을 그래픽적으로 조작하고 즉각적인 피드백을 받을 수 있도록 한다. 이를 통해 사용자는 식품정보, 추천 식단 등에 대한 정보를 한 눈에 볼 수 있고, 시스템을 처음 이용하는 사용자라도 직관적인 조작이 가능하다.

동작 시나리오

1. 전체 동작 시나리오

전체 동작 시나리오(유스 케이스 다이어그램)
전체 동작 시나리오(플로우 차트)

2. 모듈별 동작 시나리오

가. GUI(그래픽 유저 인터페이스) 시나리오

라즈베리파이 GUI 시나리오

나. WSIE 어플리케이션 시나리오

어플리케이션 동작 시나리오

구현 내용

1. 역할 분담

역할분담표

2. 시스템 구성

가. 전체 시스템 개략도

전체 시스템 개략도
  • Application
사용자는 구글 아이디를 통해 해당 시스템에 가입하게 되고, 이후 건강정보(신장, 체중, 지병 혹은 알레르기 여부)를 입력하게 된다. 구글 계정 로그인 시 구글에서 제공하는 암호화된 유저의 고유 UID에 입력한 개인정보를 할당하여 Firebase 서버에서 데이터셋을 관리한다. UID 정보가 담긴 QR코드를 통해 라즈베리파이로 이루어진 서비스에 로그인할 수 있다. 장보기를 마친 후, 사용자는 구매한 상품의 전체 영양정보에 대해 건강위험도를 확인할 수 있고, 식단에 대한 조언을 받을 수 있다.


  • Cart GUI (쇼핑카트 그래픽 유저 인터페이스)
쇼핑카트 기구부 디스플레이에 적용할 그래픽 유저 인터페이스를 생성한다. 사용자는 [시작하기] 버튼을 누른 뒤 기구부 뒷면 카메라에 어플리케이션을 통해 생성된 QR코드를 비추어 사용자 계정으로 로그인을 하게 된다. 이후 상품 뒷면을 찍어 상품정보를 받아들이며 찍은 상품을 장바구니에 담아 관리할 수 있는 기능을 ui를 통해 제공한다. 장바구니 페이지에서 사용자는 어플리케이션을 통해 사용자의 정보나 장바구니에 담긴 상품을 통해 먹을 수 있는 메뉴를 추천받을 수 있으며 로그아웃 시 장바구니에 담긴 상품의 정보들이 사용자의 데이터베이스에 저장이 되며 다른 사용자가 로그인을 할 수 있도록 대기를 한다.


  • OCR (광학 문자 인식)
광학 문자 인식(Optical character recognition; OCR)은 사람이 쓰거나 기계로 인쇄한 문자의 영 상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 기술이다. 이번 프로젝트에서는 문자 인식에 있어 높은 신뢰도를 가지는 Naver Clova OCR API을 사용한다. OCR 과정을 통해 생성된 json파일에 데이터 처리과정을 통해 글자들의 위치와 텍스트를 분석하여 해당 json파일을 영양성분 별 함량, 원재료명, 알레르기 정보 등의 의미 있는 데이터로 변환하여 기구부의 프로그램에 전달하게 된다.


  • Web Cloud Server Database (웹 클라우드 서버 데이터베이스)
서버 구현에 있어 Firebase를 사용한다. 암호화된 사용자 UID, 사용자 신장, 체중 및 지병,알레르기 유무 등의 건강정보를 저장하여 쇼핑카트 기구부의 라즈베리 파이와 사용자 어플리케이션에서 접근 가능하도록 한다.


  • 웹 크롤링
웹 크롤링을 이용하여 재료를 바탕으로 만들 수 있는 음식의 레시피에 관한 정보를 받는다. 정보를 추출해 올 대 상이 되는 사이트는 음식 레시피에 대한 정보를 제공하는 ‘만개의 레시피’ 사이트이고 그 주소는 ‘https://www.10000recipe.com[1]’이다. python 상에서 BeautifulSoup 라이브러리를 이용하여 html 페이지의 데이터를 파싱하고, 필요한 데이터만 추출하는 작업을 거쳐 음식의 레시피 정보를 json 파일로 저장한다. 이 파일들을 raspberryPi 에서 동작하는 프로그램에 추가하여 이후에 식단을 추천해 줄 때 사용한다.

   

나. 기능별 시스템 구현

  • 글자 인식 알고리즘 (OCR)
1) OCR 비교 분석
광학 문자 인식(Optical character recognition; OCR)은 사람이 쓰거나 기계로 인쇄한 문자의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 것이다. 오픈소스로 EasyOCR, Tesseract 등이 있고, 유로서비로는 Naver Clova OCR, Google Cloud VISION 등이 있다. 오픈 소스 중에서 가장 성능이 뛰어난 EasyOCR, 가격이 더 저렴하고 한글 인식에서 유리한 NAVER Clova OCR의 인식률을 비교한다.
Naver, Goole 가격 비교
Easy OCR, NAVER Clova OCR의 글자 인식률을 단어 기준으로 측정하였다.


영양성분표
영양성분표2
OCR 비교표


오픈소스 EasyOCR은 선명한 사진에서는 인식을 잘 수행하지만 빛 번짐이나 글자가 일그러질 경우 제대로 인식을 하지 못하는 큰 단점이 있다. 이를 해결하기 위해 딥러닝을 통한 미세조정 학습을 진행하였으나 오히려 과적합으로 인해 인식률이 더 감소하였다. 그에 반해 Naver Clova OCR은 일정한 인식률을 보여준다. 이번 프로젝트에서 글자 인식 부분이 매우 중요하기에 Naver Clova OCR을 이용하기로 결정했다.


상품사진
상품의 뒷면에는 수많은 정보들이 있다. 이 중 일부분의 정보만이 필요하다. 글자 인식 처리량을 줄이기 위해 ROI를 설정하였다.


2) ROI
상품의 뒷면에는 수많은 정보들이 있다. 이 중 일부분의 정보만이 필요하다. 글자 인식 처리량을 줄이기 위해 ROI를 설정하였다. Naver Clova OCR을 실행하면 인식된 단어들이 json 파일에 저장된다. 이때 단어는 ‘inferText’ 키에 저장되고 단어를 사각형 위치로 잡아 모서리에 해당하는 x, y 좌표가 저장된다. ‘원재료명’, ‘영양정보’, ‘나트륨’, ‘g’, ‘kcal’ 등 필요 글자들을 인식 후 해당 문자의 x, y 좌표를 self.x_min, self.x_max, self.y_min, self.y_max에 계속해서 갱신을 통해 전체 ROI의 크기를 설정해 주었다.
ROI 설정


3) 예외처리
제품마다 상품의 영양성분표 표기 방식이 다를 수 있다.


가로표기
영양성분과 그 함량이 가로로 배열되어 있는 경우


세로표기
영양성분과 그 함량이 세로로 배열되어 있는 경우


위 사례와 같이 영양성분 표기방식이 다른 경우가 있을 수 있으므로 OCR 데이터 처리에 앞서 세로표기와 가로표기를 구분한 뒤 데이터 처리를 실행한다.
성분표에 표기된 함량과 전체 함량이 다를 수 있다.
ROI 설정
위 2, 3번째 영양성분표와 같이 총 내용량에 대한 단위 내용량 당 영양정보가 표기되어 있는 경우 상품 구매 시 입력받은 영양성분 함량 데이터와 실제 구매한 상품 영양성분 함량에 차이가 생길 수 있다. 따라서 이 경우 전체 영양성분 함량을 총 내용량 당으로 환산하여 데이터를 처리한다.


상품 촬영 과정에서 상품이 기울어질 수 있다.
기울어짐 보정
영양성분의 함량 인식에 있어 좌표를 기반으로 하기 때문에 좌표가 틀어졌을 시 영양성분 분석이 불가능할 수 있다. 따라서 영양성분표 인식 전 상품이 기울어진 각도를 확인해 기울어진 각도가 임계값 이상일 시 Opencv API를 통한 이미지 레벨링 과정을 거쳐 알고리즘의 정확도를 높인다.


상품 촬영 과정에서 글자를 잘못 인식할 수 있다.


영양성분의 몇몇 글자를 비슷한 다른 글자로 인식하는 경우 예외처리과정을 통해 문맥에 맞는 적절한 글자로 바꿔준다.
글자변환
글자 단위로는 잘 인식했으나 띄어쓰기가 잘 인식이 안되어 단어로 보았을 때 잘못된 경우나 글자 순서대로 저장이 되지 않는 경우가 종종 있다. 또는 0을 인식하지 못하는 경향이 있다. 이를 해결하기 위해 먼저 ‘inferText’의 위치 정보를 파악하여 json 파일에 저장된 순서가 아닌 위치정보를 토대로 순서대로 단어들을 저장했다. 조금씩 잘못 인식한 단어들을 계속해서 테스트하며 조금씩 수정을 해주었다. OCR이 ‘0g’에서 ‘0’을 인식하지 못하는 경향이 있다. 따라서 ‘g’이 있지만 숫자가 없는 경우 ‘0g’으로 수정을 해주었다.


4) 최종 인식률
초기 글자 인식 알고리즘과 예외처리를 진행한 알고리즘의 인식률을 비교해보고자 한다. 20개의 상품이미지를 5번 반복 촬영하여 영양정보에 해당하는 글자의 인식률을 단어 단위로 측정한다.
상품사진 20개
인식률 비교
Naver Clova OCR만을 진행할 시 글자 하나하나에 대해서는 인식률이 뛰어나지만 단어 단위로 볼 시 잘못된 경우가 많다. 또한 일부 글자를 잘못 인식하거나 누락하는 경우가 꽤 있다. 20개의 상품이미지 5번 반복 촬영하여 총 100개의 이미지 중 92.2%의 단어 만을 정확하게 인식하였다. 위에서 예외처리를 하고 재 촬영 시 98.6%의 단어를 정확하게 인식하였다. OCR 데이터를 사용하기 위해서는 단어가 정확해야 한다. 따라서 예외처리가 필요하며 매우 중요하다는 것을 볼 수 있다. 틀린 1.4%의 단어의 경우 Naver Clova OCR에서 인식을 전혀 하지 못함으로 발생했다. 인식된 글자가 없으므로 예외처리를 통해 해결하지 못한다. 이미지의 빛 번짐이나 해상도를 높여주는 과정을 거쳐야 한다. 하지만 라즈베리파이로 이를 해결하기에는 알고리즘이 무겁고 또한 딥러닝 등을 사용해야 하기에 구현 또한 쉽지 않다. 사진 촬영 시 빛 번짐이나, 흐릿한 부분 없이 정확하게 찍도록 유도하여 문제를 해결하고자 했다.


5) 데이터 저장
OCR 인식 한 글자들을 예외처리 과정 후 단계별로 txt 파일에 저장하였다. ROI 내 인식한 글자 중 영양성분 이름과 뒤에 나오는 성분량을 단어의 위치 정보 x, y를 토대로 붙여주어 first_process.txt 파일에 저장한다.
예) ‘나트륨’의 4곳 모서리의 x, y 평균값인 center_x, center_y 중앙점과 다른 단어들의 x, y 좌표를 비교하여 center_x 보다 x 좌표가 오른쪽에 위치하고 center_y가 위 아래 모서리의 y 좌표내에 들어올 경우 단어들을 좌표 순서대로 저장한다. ‘100 mg’ 이 하나의 단어로 인식될 경우 ‘나트륨’ 뒤에 붙여줘 ‘나트륨100 mg’으로 저장한다. ‘나트륨’ ‘100 mg’ -> ‘나트륨 100 mg’
‘100’, ‘mg’ 이 따로 인식될 경우 ‘mg’ 까지 반복적으로 붙여준다. ‘나트륨’, ‘100’, ‘mg’ -> ‘나트륨 100’, ‘mg’, -> ‘나트륨 100 mg’
전체 함량을 구하기 위한 ‘총 내용량’, 영양성분 이름들 ‘나트륨’, ‘탄수화물’, 영양성분량 ‘숫자 g’, ‘숫자 mg’ 등의 필요 정보만을 뽑아 infertext.txt 파일에 1회 영양성분량과 총 영양성분량에 대해 저장하였다.
GUI에 표시해주기 위해 nutritional_info.txt 파일에 각각의 상품의 영양성분량을 저장하고 누적한다.
예) 1. 나트륨 100mg 탄수화물 100g 단백질 100g.... 2. 나트륨 30mg 탄수화물 30g 단백질 30g...
nutritional_info.txt 파일에 저장된 여러 상품의 영양성분량을 계산한 누적 성분량과 7일 기준 권장섭취량에 대한 퍼센트(%)를 add_nutrional_info.txt 파일에 저장한다.


  • 메뉴 추천 알고리즘 - 1


식품의약품안전처에서 제공하는 약 만여가지의 식품 데이터와 웹에서 크롤링해온 요리 데이터에 대하여 k_mean_cluster 법으로 (n=)5개의 클러스터로 군집화하였고, n은 elbow method를 사용하여 기울기가 flat해지는 2~5 중 메뉴 추천의 유사성을 위하여 n = 5를 사용하였다
군집화하기 전

군집화한 후

Elbow Method

이후 각각의 식품별로 데이터를 정규화한 뒤 벡터화하여 식품 사이의 거리를 반환하는 함수를 정의하였다. 사용자가 섭취하고 싶은 메뉴를 입력하면 사용자의 건강 정보와 입력된 메뉴의 영양성분을 비교하여 섭취가능여부를 판단한다. 섭취가능여부는 어플리케이션에서 입력한 활동량, 키, 몸무게, 나이의 정보로 에너지 대사량이 계산되고 당뇨병, 고지혈증, 비만 환자는 각각 탄수화물, 포화지방산, 열량의 에너지의 식으로 하루 섭취 제한량이 정해지게 된다. (단, 고혈압 환자의 나트륨 섭취 제한량은 3700mg으로 고정되었다.) 입력식품이 하루 섭취 제한량을 넘긴다면 섭취 제한량을 넘지 않을 때까지 같은 군집 내의 음식들을 대조하며 추천하며, 데이터셋에 무엇이 있는지 사용자가 알지 못하므로 자동완성 기능으로 입력에 편의성을 추가하였다.



  • 메뉴 추천 알고리즘 - 2
웹 크롤링 기술을 이용하여 요리 레시피의 재료 등과 같은 정보를 json파일에 저장한다. 사용자가 마트에서 물건을 구매하는 경우, 그 재료를 인식한 후, 해당 재료가 가장 많이 포함된 요리를 추천한다. 예를 들어, 사용자가 ‘두부’, ‘김치’, ‘삼겹살’ 을 구매한 경우 그 정보를 바탕으로 ‘두부김치’ 나 ‘삼겹살 김치조림’ 보다, ‘삼겹살과 곁들여 먹는 두부 김치’ 라는 레시피 우선도가 더 높으므로 해당 레시피가 추천되는 형식으로 작동한다. 포함된 재료의 개수가 같은 메뉴가 여러 개이면 그 중에서 무작위로 추천한다.
페타치즈를 인식한 화면
메뉴추천을 누르면, 치즈가 포함된 레시피가 추천됨
(위의 그림에서, 자연치즈를 인식한 후 메뉴추천을 누를 경우 치즈가 포함된 레시피가 추천됨)


  • 데이터베이스
데이터베이스는 구글과 연동하기 쉽고 텍스트 정보만 불러오는 등 데이터 다운로드 용량이 매우 낮아 무료로 사용할 수 있는 Firebase를 사용하였다. 또한, 사용자의 건강정보 및 장바구니의 영양성분 양을 실시간으로 확인할 수 있어야 하므로 realtime database안에 사용자 집합 'List of Users'아래에 UID별로 데이터셋을 구축하였다. 각 UID 안에는 사용자의 키, 몸무게 등과 같은 신체정보와 탄수화물, 트랜스지방 등과 같은 장본 영양성분 목록이 담겨있다.
사용자 정보

신체정보 목록(gender:성별, height:키, weight:몸무게, age:나이, PA:활동량)
질환정보 목록(allergy:알러지, diabetes:당뇨병, hypertension:고혈압, hyperlipidemia:고지혈증, obesity:비만)
영양성분 목록(cholesterol:콜레스테롤, danbaek:단백질, dangryu:당류, kcal:열량, natryum:나트륨, powhazibang:포화지방, tansu:탄수화물, zibang:지방, transzibang:트랜스지방)
위의 신체정보 목록 및 질환정보 목록은 어플리케이션의 개인정보 입력 페이지의 저장 버튼 클릭이벤트로 데이터베이스에 생성 및 갱신이 되며, 메뉴 추천 및 알러지 파악 여부 등에 사용된다. 또한 파이 시스템에서 로그아웃 버튼 클릭이벤프로 장바구니에 담긴 상품들의 영양정보가 데이터베이스에 저장이 된다.


  • 어플리케이션 기능


어플리케이션의 기능은 크게 개인정보 입력을 위한 로그인, 파이시스템 로그인을 위한 QR코드 생성, 정보 확인 및 위험도 분석으로 나눌 수 있다. 앞의 두 가지 기능은 위에서 설명했으므로 생략한다. 사용자는 장본 상품들의 목록으로부터 영양성분 데이터를 확인할 수 있는데 이것으로 건강한 식단을 섭취하고 있는 지 알기 힘들 것이라 판단하여 한 눈에 알 수 있도록 차트 기능과 식단방향에 대한 조언을 추가하였다.
어플리케이션 화면



위험도는 1일 권장섭취량 기준에 대한 비율이며 식단 방향에 대한 조언은 환자별로 계산된 기준치의 70% 이상이면 주의를 요구하고, 100%에 도달하면 섭취를 중단할 것을 요구한다.


  • 유저 그래픽 인터페이스 (GUI) 구현
유저 그래픽 인터페이스를 통해 사용자가 쉽고 직관적이게 시스템에 대한 정보를 받을 수 있고, 입력할 수 있도록 한다. 각 시나리오에 적절한 GUI를 구현한다
로그인을 위한 GUI, 로그인용 QR코드를 인식하면 다음화면으로 넘어간다
상품을 인식하기 위한 GUI. 상품을 카메라에 올려놓고 촬영버튼을 누르면 그 정보가 시스템 상에 저장된다
상품을 촬영한 경우 그 영양정보에 대한 정보를 제공한다
촬영한 상품에 사용자의 알러지 정보가 포함될 경우, 그에 대한 알림을 사용자에게 준다
상품의 영양정보 뿐 만 아니라 성분표에 대한 인식도 가능하다
여태까지 장바구니에 넣은 상품의 영양정보를 열람할 수 있다
구매한 상품정보를 바탕으로 적절한 레시피를 추천해준다

3. 하드웨어 설계 및 구현

가. 회로 구성

회로 구성
터치 디스플레이의 경우 조작성을 위해 Sunfounder 사의 10.1인치 라즈베리 파이용 디스플레이를 사용하였으며, 배터리의 경우 디스플레이는 Coms사의 12V 6cell 배터리팩, Raspberry Pi는 보조배터리로 작동하도록 설계하였다. 카메라의 경우 라즈베리파이 카메라모듈 V2, 8M를 사용하였다.

나. 기구부 지지대 및 디스플레이 프레임 구성

  • 기구부 지지대
Blender 프로그램을 통해 설계한 후 3D 프린터를 이용해 출력하였다.


지지대 모델링
지지대 출력물

실제 카트 규격을 고려하여 설계하였으며, 디스플레이의 무게를 고려하여 기구부가 앞쪽 혹은 뒤쪽으로 넘어지지 않도록 설계하였다. 지지대 갈고리 부분을 손잡이 부분에 건 뒤 U자 고리 부분에 철창을 끼워 고정 핀으로 고정한다


  • 디스플레이 프레임
프레임 앞면
프레임 뒷면
프레임 출력물

실제 디스플레이 규격을 고려하여 설계하였으며, 카메라가 배치될 수 있도록 프레임 뒷판에 렌즈용 구멍을 뚫었고, 사용 시 라즈베리 파이의 열 발생이 확인되어 라즈베리 파이 위치에 환풍기용 환풍구를 뚫어 주었다. 또한, 기구부 지지대와 단단히 결합할 수 있도록 튀어나온 부분을 설계하였고, 뒷판에 슬라이드 가이드를 만들어 기구부 분해 없이도 배터리 교체가 가능하도록 설계하였다.

프로젝트 결과

1.최종 결과물

전체 시스템
전체 시스템

프로젝트 협업 과정

1. 파트별 소스 분산 버전 관리(GIT)

깃허브 master 브랜치 메인화면

졸업하면 그만이야 팀의 메인 브랜치 화면이다. 졸업하면 그만이야 팀은 각 S/W 개발이 파트 별로 나뉘어져 있기에 브랜치를 나누어 진행했다. OCR, 메뉴추천 알고리즘1, 메뉴추천 알고리즘2, PyQT UI 브랜치가 존재한다. 버전 관리 또한 브랜치 별로 나누어 진행했으며 최종 버전은 메인 브랜치에서 통합했다. README.md에 설치해야할 라이브러리, 실행 방법에 대해 간단하게 적혀있다. 공동개발 참여자는 Kolacider(강*성), parkmg98(박*기), woohiq(한*빈), ljuneh(이*희), medist4230(김*형)으로 구성되어 있다. 시스템의 대부분은 파이썬을 기반으로 작성되어있다.

깃허브 브랜치 화면


프로젝트 평가

평가항목

평가항목 표
  • 단어 기준 성분표 인식 정확도 평가
성분표 촬영 후 글자 인식 정확도를 20회 반복 측정하여 정확도의 평균을 구한다.
  • 성분표 촬영 피드백 응답시간 평가
성분표 촬영 후 피드백 제공까지 소요되는 시간을 20회 반복 측정하여 응답시간의 평균을 구한다.
  • 동기화 신뢰성 평가
사용자 로그인을 시도하여 사용자 정보의 동기화 성공률을 20회 반복 측정하여 그 성공률을 구한다.
  • 사용자 만족도 평가
설문조사를 통해 해당 시스템의 만족도를 평가한다. 설문조사는 일반 시민 20명을 대상으로 하였다.
  • 적절한 피드백 제공 여부 평가
알레르기, 지병 여부 등 유저의 설정에 따른 피드백 제공의 적절성을 측정한다.


평가결과

  • 단어 기준 성분표 인식 정확도 평가
[자세한 측정 방법]
20개의 상품 이미지를 5번 반복 촬영하여 총 100개의 이미지에 대한 OCR을 진행한다. 단어 기준으로 인식률을 측정하여 %로 표시한다.
[점수 평균 혹은 분포]
인식률 비교
예외처리를 진행하기 전 인식률을 평균 92.2%이다. 개발 목표치는 넘은 수치이지만 조금이라도 인식하지 못하는 부분이 발생한다면 알고리즘에서 정확한 결과를 도출하지 못한다. 따라서 예외처리를 통해서 잘못 인식한 부분을 수정하는 작업을 거쳤다. 최종 예외처리를 거친 OCR의 인식률은 98.6%이다. 거의 100%에 근접하는 수치이다. 1.4%의 인식하지 못하는 부분은 Naver Clova OCR에서 완전히 인식을 못하는 부분이다. 위에서 언급 했듯이 이는 사진 전처리 과정이 필요하고 후 개발에 개선할 예정이다.
[개선 필요한 점]
OCR에서 글자 자체를 인식하지 못하는 경우 예외처리를 통해 해결하지 못한다. 따라서 이미지의 빛 번짐이나 해상도를 높여주는 과정을 거쳐야 한다. 이번 프로젝트에서는 하드웨어의 성능에 제약과 개발 시간 등의 문제로 인해 구현을 하지 못하였다. 후에 추가 개발을 하게 될 경우 이 점을 개선하고자 한다.


  • 성분표 촬영 피드백 응답시간 평가
[자세한 측정 방법]
총 20개의 상품 이미지에 대해서 상품정보를 받아들이기까지 걸리는 시간을 측정하고 평균 측정 시간을 구함.
[점수 평균 혹은 분포]
응답시간
[개선 필요한 점]
평균 측정시간은 3.9초로 개발 목표치에 비해 충분히 빠르게 나왔지만 일부 이미지에 대해서 OCR을 통해 읽는 글씨가 많는 경우 응답시간이 6초 이상으로 나오게 되었고 설문조사에서도 이에 대한 피드백이 있었다. 이에 대해서 추후 개선이 필요함.


  • 동기화 신뢰성 평가
[자세한 측정 방법]
동기화 측정으로 사용자의 알레르기 정보가 파이에 로그인 시 적용이 되었는지 확인했다. 임의의 알레르기로 우유를 설정하고 우유가 들어있는 제품을 20회 반복 촬영하여 알레르기 경고가 제대로 이루었는 지를 확인한다.
[점수 평균 혹은 분포]
동기화 성공률
20회 반복 측정 모두 정확히 알레르기 경고를 해주었다. 이는 처음 어플리케이션에서 사용자 설정의 내용이 서버에 정확히 등록이 되고 파이에 동기화가 제대로 이루어졌다는 것을 의미한다.


  • 사용자 만족도 평가
[자세한 측정 방법]
교내에서 무작위 시민 20명을 대상으로 제품 기능 설명 후 시민이 제품을 사용하도록 하고 그 후 설문조사지를 통해 1~5점 이내로 만족도를 조사하며, 제품 피드백을 위해 불편사항이 있을 시 불편사항을 기재하도록 하여 조사한다.
[점수 분포(20명 대상)]
3점 : 4명
4점 : 12명
5점 : 4명
만족도 조사
설문조사 결과 만족도 평균은 4점으로 조사되었다.
[개선 필요한 점]
상품의 위치를 조절하는 과정을 불편해하거나 상품을 찍는 과정에서 모니터가 방해되는 등 상품의 초점을 맞추는 과정에서 불만사항이 조사되었으며, 상품 인식 불량 시 재촬영으로 인한 불만사항이 조사되었다.
[최종 버전에 추가된 점]
알고리즘의 정확도를 높여 인식 불량을 줄였다.
  • 적절한 피드백 제공 여부 평가
[자세한 측정 방법]
적절한 피드백 제공 여부 측정으로 장바구니에 있는 재료를 바탕으로 정확한 메뉴를 추천하는 지를 확인했다. 재료가 하나 있을 때 20회 반복 메뉴 추천을 누르고, 재료가 두 개 있을 때 20회 반복 메뉴 추천을 눌러 추천된 메뉴에 해당 재료가 포함되어 있는 지를 확인한다.
[점수 평균 혹은 분포]
적절한 피드백 제공 여부
첫 번째 재료는 두부이고 두 번째 재료는 계란이다. 두부 재료 하나로만 메뉴 추천을 진행했을 때, 두부와 계란으로 메뉴 추천을 진행했을 때 20회 모두 재료를 기반으로 한 메뉴를 추천해주었다.

느낀점

김*형 - 구성 재료나 필수 구현 사항 등이 제한되지 않은 설계는 처음이라 주제선정부터 시간이 걸리기는 했지만 그만큼 더 자유롭게 구현하고 싶은 사항들을 추가하며 프로젝트를 진행할 수 있어 좋았습니다. 이론시간에 배운 내용을 프로젝트에 바로 적용할 수 있다는 점이 좋았고, 프로젝트를 통해 효율적인 의사소통과 협업방법에 대한 경험을 쌓을 수 있었습니다. 구현하고 싶은 사항이나 최적화할 부분이 많았으나 시간이 부족해 전부 다 구현하지는 못한 게 아쉽지만 주제 선정 때 예상했던 것보다 훨씬 만족스러운 작업물을 만들 수 있어 좋은 경험을 했다고 생각합니다. 누구 하나 빠지는 일 없이 휴일도 반납하고 프로젝트에 함께해준 팀원들에게 고맙다는 말을 전하고 싶습니다.


박*기 - 이 프로젝트를 하면서 많은 어려움도 있었지만 하나하나씩 해결해나가면서 배운 것도 많았고 보람 뿐만 아니라 재미도 느낄 수 있었습니다. 우리가 직접 주제를 선택하여 개발을 하기에 처음부터 끝까지 검색하면서 배우고, 문제가 발생 하면 해결해 나가며 프로젝트를 진행했습니다. 이 과정 모두가 스스로 해쳐나가는 것이기에 처음엔 막막하다고 느낄 때가 많아 힘든 부분이 많았지만 문제를 해결하는 과정에서 단지 솔루션을 찾는 것에 그치는 것이 아니라 문제를 정확히 파악하고 해결 방법을 찾고 해결해 나가는 과정을 배울 수 있었습니다. 5명이 팀을 이루어 프로젝트를 진행하면서 올바른 협업에 대한 경험을 쌓을 수 있었습니다. 먼저 프로젝트를 파트 별로 나누어 관심 분야에 맞게 파트를 맡았고 파트 내에서 개발하는 부분을 나누어 서로 충돌 없이 효율적으로 진행 할 수 있도록 노력했습니다. 이 과정에서 의사소통이 매우 중요하다는 것을 또 한번 알게 되었습니다. 서로의 의견을 내세울 때는 근거를 항상 제시해야 된다는 것과 의견 조율 및 절충하는 방법에 대해 배우고 경험할 수 있었습니다. 6개월이라는 짧은 시간 동안 타이트한 일정 내에서 개발을 진행 하였고 일정에 맞추어 매번 목표를 제시하고 개발해 나가는 방법에 대해 경험 할 수 있었습니다. 처음 구상했던 모든 것을 전부 구현하지 못한 것이 조금 아쉬움으로 남았지만 현재 개발한 부분을 잘 다듬어 멋진 프로젝트 결과물을 만들어 내게 되어 뿌듯한 한 학기를 보낸 것 같습니다.

한*빈 - 이렇게 열심히 프로젝트를 참여한 것이 얼마나 오랜만인가. 정말 열심히 만들었고, 모두 함께 만나서, 서로 노력했다는 것이 느껴졌다. 처음 주제를 선택하면서 어느 정도 윤곽만 잡혀 있었던 것들에 점점 살이 붙으면서 형태가 잡히기 시작하니 욕심이 나서 하나 둘 기능을 추가하게 되었다. 각각의 기능들을 추가하면서, 여러 가지 문제점이 발생하였지만 결국엔 모두 극복해서 만들었다는 것에서 뿌듯했고 자랑스러웠다. 평소에는 컴퓨터를 이용하여 소스코드를 작성하거나, 그래픽 작업등을 진행하였는데, 해당 프로젝트를 라즈베리파이로 진행하면서, 실제 하드웨어의 성능을 고려하여 프로그램을 제작하는 것이 얼마나 힘들지만 중요한 작업인지 알게 된 것 같다. 또한, 기구부를 포함한 시스템을 만들면서 단순히 하나의 프로그램만을 만드는 것과 전체 시스템을 구성하는 것이 완전히 다른 문제라는것도 실감하게 되었다. 그래도 각 팀원 모두가 자신의 자리에서 최선을 다해 준 덕분에 이런 프로그램을 해 낼 수 있었다고 생각한다. 이번 프로젝트를 진행하는데 도움을 주신 교수님, 조교님들, 그리고 주말과 저녁에 만나는 것도 불평불만없이 따라 준 우리 팀원들에게 정말로 감사합니다.

강*성 - 4년째 학교를 다니며 늘 같이 하던 동기들과만 프로젝트와 팀플을 진행해 왔었습니다. 그러나 내장형 시스템 및 실습에서 남는 인원들이 모여 구성된 저희 팀은 처음보게 된 사람도 있었고 이전까지 함께 작업을 해본 경험이 없는 동기들과 함께 하게 되었습니다. 처음엔 소통이나 잘 될지 걱정이 앞섰지만, 프로젝트 주제를 브레인스토밍 할때부터 팀원들의 열정을 볼 수 있었고 설계를 진행하며 각자가 맡은 파트를 해오는 것을 보며 책임감 있는 사람들이라는 것을 느꼈습니다. 프로젝트 진행 과정에 문제가 생기면 함께 협업하며 문제를 처리해 나가는 과정, 서로 의견이 대립했을 때 누군가는 수용하고 합의점을 찾아가는 과정, 그리고 주 2회의 고정 회의시간처럼 개인적인 희생을 감수하는 과정 등 팀플레이를 해야하는 설계자가 앞으로 현업에서 어떻게 문제를 해결해 나가야 하는가에 대한 배움은 수업에서 배운 임베디드 지식보다도 저에게 정말 귀중한 경험이 되었습니다. 저희가 설계한 시스템은 학기가 끝난 이후 누구도 사용하지 않겠지만, 설계를 하며 배운 경험과 수업에서 배운 지식들은 토대가 되어 공학도가 아닌 공학자로 거듭날 수 있게 될 것이라 생각합니다. 처음으로 재미를 느끼며 설계를 진행할 수 있게 해준 팀원들과 학생을 위해 항상 노력해주시는 교수님, 그리고 조교님들께 진심으로 감사드립니다.

이*희 - 5명이서 협업을 하면서 제가 얼마나 부족한지 느끼게 된 프로젝트였던 것 같습니다. 그동안은 단순히 소스코드를 짜고 간단한 수준에서 기획을 했던 것 같은데 처음부터 기획을 하고 설계와 구현을 하는것은 기존과 완전히 다르다는것을 알게 되었습니다. 계획했던 것과 현실적인 상황이 대립하면서 기존의 계획을 변경하거나 문제를 해결하는 과정을 겪게 되었으며 일반적인 환경이 아닌 라즈베리파이라는 임베디드환경에서의 개발을 하면서 오는 여러 변수들 또한 겪게 되었습니다. 또한 이정도 인원에서 협업을 하면서 진행한게 저한테는 처음인데 의사소통과 협업이 가지는 중요성 또한 크다는것을 다시한번 느끼게 되었습니다. 프로젝트 내내 다른 조원들에게 고마움을 느꼈고 다른 조원들이 없었으면 여기까지 오지 못했을 것입니다. 프로젝트를 수행하면서 저에게 무엇이 부족한지 돌아볼 수 있었고 다른 조원들에게도 많은 자극을 받게 되었습니다.

부록