Skip to content
WonjuLee edited this page Mar 20, 2022 · 8 revisions

[캡스톤 디자인] 3주차 회의록 (10조)

작성자 : 강지수 참여자 : 박준용, 이세희, 이원주 일시 : 2022.03.18


1. 진행 상황 및 추후 일정 공유

파트 진행 상황 추후 일정
백엔드 - 현재 대부분 구현되어 있는 상태.
- 로그인/회원가입 부분 구현 중(이세희)
- 디테일 한 테스트 코드 / DB 설정 만져보기 등의 공부와 함께 진행 예정.
- AWS에서 테스트 서버 구동시킬 예정.
프론트 - 강지수, 이세희, 이원주 프론트(React+Typescript) 스터디 진행 중 - 중간 발표 때, 결과물이 바로 나올 필요는 없어보이기 때문에 좀 더 공부하며, 시간을 두고 개발 시작 예정.
인공지능 - 크롤링을 통해, 100장/50종류 로 진행.
- 라벨링 과정이 중도 끊기면 라벨링 해둔 과정이 초기화 되기 때문에, 대체 프로그램 시도 중.
- 현재 정확도가 평균적으로 60~70%. 정확도 올릴 수 있는 방안 모색 중.
- 현재 학습한 파일(정답지)을 json으로 변환한 상태.
- 학습된 모델을
1) python 코드를 직접 돌리는가
2) js로 변환하여 돌리는가.
-> 2의 경우, js 공부가 추가적으로 필요할 것으로 예상.
  • 인공지능 모델 학습 설명
    1. 정답지 (model)을 json 형태로 구축함
    2. 정답지를 해석할 수 있는 녀석(tensorflow.js | 파이썬 코드(opencv + tensorflow + numpy)이 필요함
    3. 녀석을 구동할 수 있는 서버를 만들어야 함 ※ 입력: 재료 이미지 ※ 출력: 재료 이름 텍스트
No. 서버 개발 방식 공부 담당자
1 BE server에 migrate -
2 별도의 Server를 구축 -
3 Node.js 서버 (Express) + tensorflow.js (녀석) 박준용
4 Python Server (Django, Flask) + 파이썬 코드 (녀석) -
5 Node.js 서버 (Express) + 파이썬 코드 (녀석) 강지수

  • 기본 환경설정
$ pip install opencv-python
$ pip install tensorflow  
$ pip install numpy
  • python 모델 학습 코드
# python 3.7

import cv2
import numpy as np
import tensorflow as tf


min_confidence = 0.5 
width = 800
height = 0
show_ratio = 1.0

file_name = "keras/sweet.jpg" #이미지 경로
classes_name ="keras/classes.txt" # classes 이름이 담긴 파일
weight_name = "keras/capstone_custom.h5" # .h5파일
classes = []
# colors = [(0, 255, 0), (0, 0, 255),(255,0,0)] 클래스 갯수만큼


read_image = cv2.imread(file_name)
CW = 32
CH = 32
CD = 3

model = tf.keras.models.load_model(weight_name)
with open(classes_name, 'r') as txt:
    for line in txt:
        name = line.replace("\n","")
        classes.append(name)
print(classes)


def detectAndDisplay():
    global read_image
    global classes
    test_images = []
    
    h,w = read_image.shape[:2]
    height = int( h * width/w )
    img = cv2.resize(read_image, (width, height))
    
    box = cv2.selectROI("Select a ROI and then press SPACE or ENTER button!", img, fromCenter=False, showCrosshair=True)
    
    startX = int(box[0])
    startY = int(box[1])
    endX = int(box[0] + box[2])
    endY = int(box[1] + box[3])
    image = cv2.resize(img[startY:endY, startX:endX]
                       ,(CW,CH), interpolation= cv2.INTER_AREA)
    test_images.append(image)
    test_images = np.array(test_images)
    test_images = test_images.astype("float32") / 255.0
    
    result = model.predict(test_images)
    result_number = np.argmax(result[0])
    # print(result, result_number)
    print("%s : %.2f %2s" % (classes[result_number], result[0][result_number] * 100, "%"))
    
    text = "{} : {}%".format(classes[result_number], round(result[0][result_number]*100,2))
    y = startY - 10 if startY - 10 > 10 else startY + 10    
    cv2.rectangle(img, (startX, startY), (endX, endY),
                   (255,0,0), 2)
    cv2.putText(img, text, (startX, y)
                 ,cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,0,0) ,2)
    
    ### 밑 주석 코드는 필요없음
    # for i in range(len(classes)):
    #     print("%10s %15.7f %2s" % (classes[i], result[0][i]*100, '%'))
    #     text = "{}: {}".format(classes[i], result[0][i])
    #     cv2.putText(img, text, (10, height - ((i * 20) + 20)),
    #                 cv2.FONT_HERSHEY_SIMPLEX, 0.6, colors[i], 2)
        
    img[0:CH, 0:CW] = image
    cv2.imshow("test", img)
    cv2.waitKey(0)
        
detectAndDisplay()
  • 파일 설명 (백업)
    • classes.txt : 분류 가능한 재료 목록
    • capstone_custom.h5 : python tensorflow 버전에서 돌릴 때, 모델의 정답지가 담겨있는 파일.
    • model.json : js에서 돌릴 때 필요한 정답지.

2. 교수님 의견

  • 사진을 촬영해서 이미지로 재료를 인식하는 서비스
  • 아이템은 좋다. 누구나 많이 쓸 수 있는 앱인데 어떤 차별점을 줄 것인가가 관건.
  • 다수가 이 서비스를 꼭 써야하는 이유가 있어야 함.
  • 우리는 유사한 앱이 가지지 못함 차별점 구현한 노력을 작성하여 각자 역할 어필 필요

3. 교수님 의견에 대한 피드백

차별점

1. 각자가 생각하는 현재 우리 서비스의 차별성

  • 이원주 : 사진 인식만으로도 이미 차별성이 있다고 생각
  • 이세희 : 이미지 인식으로 레시피 추천. 우리 팀
  • 박준용 : 나만의 냉장고 기능을 추가한다면 차별성이 있다고 생각
  • 강지수 : 사용자 데이터 기반 추천 레시피 기능이 있다. 다른 사이트들은 일방적으로 레시피 관련 정보를 전달함에 목적을 두는데, 우리 서비스는 사용자와 상호 작용 가능

2. 추가 의견

  • 재료 사진 인식으로 레시피 추천하는 기능만으로는 조금 약하다.
  • '나만의 냉장고' 기능은 서비스 기획 시, 나왔던 의견으로 현재 서비스 구현에서는 빠진 부분.

3. 차별성을 만드는 방안 모색

  1. 마트 영수증 텍스트 인식 추가

    • 영수증에 있는 재료들을 이용한 요리 레시피에는 어떤 것들이 있는가 알려주기
    • 영수증은 이미 구매 항목이니, 해당 항목에 대한 레시피 추천이 의미가 있을까라는 의문 -> 영수증의 재료 목록을 사용자 개인의 데이터로 축적했을 때, 선호 재료는 알 수 있지 않을까? -> 선호 재료가 들어간 음식 레시피 추천. -> 맨 처음에 이야기 나왔던, 사용자 데이터 기반 레시피 추천을 다른 사용자 데이터 없이 가능하지 않을까 -> (채택)재료 검색할 때 나온 재료들을 사용자의 정보에 테이블 만들어서 검색된 재료 누적
  2. 나만의 냉장고!

    • 음식을 찍어 '나만의 냉장고'라는 가상 냉장고에 해당 재료에 대한 유통기한과 함께 저장해두면 식재료 관리가 용이해질 것. -> 냉장고에 넣을 땐 사진으로 넣으면 좋은데, 냉장고에 들어간 재료를 사용 시, 사용자들이 이 재료가 소진될 때마다 그때그때 제거할까? -> 레시피 시작을 누를 시, 해당 레시피에 대한 식재료가 냉장고에서 사라지게 한다면? -> 음식량 및 개인 취향에 따라 재료 사용이 다르다. 또한, 해당 서비스의 레시피에 있는 요리를 하지 않은 상황에서는 사용자가 수동으로 재료를 제거해주어야한다.
  3. 레시피 시작!

  • 레시피 시작! 버튼을 누르면, 레시피 단계 별로 예상 소요 시간이 지나면 다음 단계로 넘어가게 해준다. -> 문제점 : 단계별 예상 소요 시간 데이터가 필요
    1. 현재 갖고 있는 공공데이터의 시간 데이터는 우리가 넣어야함.
    2. 색이 변할 때까지/음식의 양에 따라/조리 방식에 따라 등 시간을 설정하는 기준이 애매함.

4. 해야하는 것

  1. github.io 소개 페이지 정리
  2. 발표 구성 요소 생각하기 (서비스 개요, 진행 상황, 현재 상황에서 문제점, 남은 부분(?) 중 어디까지 중간 발표 때 진행할지)
  3. 발표 자료(ppt 등) 만들기
  4. 발표 관련해서 역할 분담 (발표는 몇 명이서 하는지 등)
  5. 소개 영상/레포트 택 1 해서 만들기.

-> 결론: 다음주부터 생각해보기(03.25)


5. 기능 추가

  1. 검색에 포함된 재료를 '내가 좋아하는 재료'로 관리 -> '사용자 데이터 기반 레시피 추천'에 사용
  2. 가상 냉장고 기능

작성자의 의견/소감

  • TO DO LIST

    • node.js 에서 python 코드 머신 러닝 연동 알아보기
    • python 학습된 모델 js로 변환해주는 사이트도 있었던 것 같음(찾아보기)
    • React + Typescript 공부 좀 더 해보면서, 간단한 프로젝트 해보기 -> react 스터디 프로젝트 간단히 함께 해보기 일정 잡기
  • 기존 파트 분배에서 FE 파트로 변경 및 추가가 되어 공부해야할 양이 조금 많은 것 같다. FE에 대한 이해가 좀 더 있었으면 좋았을 것 같다는 아쉬움이 든다.

  • 차별성을 생각하는 것이 어려운 것 같다. 차별성이 있으면서, 최대한 현재 기획을 무너뜨리지 않고 어우러질 수 있는 추가 기능 생각해보기.