MongoDB와 VScode 이용한 드라이빙app 개발 일지 (2022.4.10)

 1. 카카오 API 사용을 통한 토큰 발급  일단 카카오 로그인을 구현하려면 카카오에서 제공하는 api를 이용해야 했다.  https://developers.kakao.com/docs/latest/ko/message/rest-api 공식 카카오톡 api 문서이다. 이전에 말했던 대로 우리는 사업자 등록이 5월로 예정되어있어 아직 카카오톡으로 전화번호 등 몇몇 필요한 정보를 가져올 수는 없었다.  따라서 카카오톡 선택 요구 정보를 프로필, 성별, 이메일로 한 후 토큰 발급을 실행했다.  전체적인 프로세스는 다음과 같았다. (첫 등록일 경우) 첫 등록 확인 - join 등록, 카카오톡에 인증 요청 - 카카오톡 토큰 발급 완료시 - 토큰 처리해 - 필요 정보 확인 후 자동 회원가입  (기존 사용자의 경우) 기존에 등록 확인 - kakao login 등록 - 카카오톡 로그인 -  인증 완료시 프로젝트 로그인 토큰 발급까지 연동 첫 등록의 경우 기존의 회원가입 미들웨어를 이용함과 동시에 위의 카카오 api를 이용하여 새로운 엔드포인트를 만들었다.  기존 사용자의 경우 조금 복잡하게 구현하다 카카오에서 발급 받은 토큰에서 정보를 읽어 기존의 사용자인지 확인하는 미들웨어를 짜고 구현해두었던 로그인 토큰 발급과 연결해서 새로운 엔드 포인트를 만드는 방식으로 해결하였다. 2. 벡엔드 관리, 보수  기존의 sms send 모듈에 관련하여 네이버 api 계정의 등록자 변경관련 논의와 현재 있는 미들웨어들의 표시형식 통일, 중복 부분 수정 등의 작업을 따로 진행했다. 또한 카카오톡 로그인 구현 중 로그인 에러가 나와 그것 또한 수정했다. 3. 개발환경  개발은 github,VScode, postman, mongoDB를 활용해 진행하고 있으며 특히 카카오 Api를 실험하는데 가상으로 토큰을 발급받고 인증하는 것이 가능한 postman이 큰 도움이 되었다. 4. 팀을 떠나며  초기에 아무것도 없는 상태에서 여러가지 미들웨어를 만들기도 했고 처음 만져보는 기술들을 사용해보기도 했다.

minmax search 와 알파-베타 가지치기

이미지
 공부하다보면 트리를 서치하는 여러가지 방법이 나온다. 여기서는 두명의 플레이어가 게임을 한다고 가정하고 이야기를 진행해 보겠다.  1. 개요  만일 당신이 누군가와 체스를 두고 있다. 당신은 지금 폰을 움직여 상대 비숍을 잡을 수도 있고 룩을 움직여 상대 폰을 잡을 수도 있다. 이런 상황이면 대부분의 사람들은 폰을 움직여 비숍을 잡으려 할 것이다. 왜냐하면 그게 자신의 차례에서 최대의 이득이 되니까이다. 하지만 폰을 움직이게 되면 본인의 퀸이 잡힌다면? 그러면 그런 수는 두지 않을 것이다.  오늘 설명하려는 알고리즘도 이와 같다. 자신의 차례에는 자신의 이득을 최대한으로 하려고 하고 이와 마찬가지로 상대 역시 상대 편에는 나의 이득을 최대한 줄이는 방법을 선택하려고 할 것이다.  그중 첫번째로 볼 것은 min-max tree sreach이다. 2. min-max tree sreach 일단 기본적인 min-max의 알고리즘을 확인해보겠다.  트리는 다음과 같이 4,6,7,9,1,2,0,1,8,1,9,2의 말단 노드를 가지고 있다. 이때 min-max의 경우 처음은 본인의 차례로 생각하면 된다 그럼 각 말단 노드에서 비교하여 가장 큰 것을 확인해 선택하게 된다.(본인 차례에서는 최대의 이득을 얻는 것이 목표이므로)  따라서 그 다음 노드는  4 - 6 => 6, 7 - 9 => 9 .....etc로 만들어 진다. 그리고 여기서 이제는 상대편으로 넘어가게 되는데 상대편은 상대 자신의 이득을 높이고 싶어하지 나의 이득을 높이고 싶어하지는 않는다. 즉 상대는 선택할 수 있는 값 중 최소의 선택을 하려 할 것이다. 따라서 방금 올라온 6과 9 중에서 상대는 6을 선택하게 될 것이다. 이런 식으로 모든 노드를 탐색, 비교하게 되면 결국은 8이 내가 선택할 수 있는 최선의 값이 되게 된다. 이게 min-max의 방식이다.  본 방식은 구현이 매우 간단하다는 장점이 있지만 큰 문제점이 존재한다. 바로 트리의 깊이가 깊어질 수록 복잡도와 탐색 시간이 기하급수적으로

추천 시스템(Recommend System)

이미지
 이번에 진행할 것은 추천 시스템이다. 추천 시스템의 경우 몇 가지 방법이 있다.  간략하게 설명하면 비슷한 유저를 찾아서 그 유저가 좋아했던 콘텐츠를 추천해 주거나 어느 한 유저가 어떤 콘텐츠를 봤을 때 각 콘텐츠의 유사도를 분석하고 비슷한 콘텐츠를 추천해주는 방식이 있다. 이번에는 후자의 방식을 코드와 함께 소개하고자 한다. 1. 추천 시스템의 설명  위의 그림이 매우 간단하게 추천 시스템을 표현하는 그림이다. 유저B는 유저 A와 유사하다고 할 수 있고 따라서 유저 B에게 콜라를 추천해 줄 수 있는 것이다. 또한 반대로 라면을 먹은 유저들 대부분은 삼각김밥을 먹었기 때문에 유저D에게 삼각김밥을 추천해 줄 수 있는 것이다.  2. 추천 시스템의 알고리즘 및 Task 그럼 추천 시스템에서 머신러닝이 하는 역할은 무엇일까? 바로 위의 표에서 빈 공간을 채우거나 새로운 무언가가 들어왔을 때 하는 것이 바로 추천 시스템에서 인공지능의 역할이다. 위처럼 비어있는 공간이나 아니면 전혀 새로운 유저나 콘텐츠가 들어왔을 경우 아무런 정보 없이 그 선호도를 파악하기 위해 행렬 분해를 사용하고 각각을 채운다. 이는 나중에 논문과 코드를 리뷰해보면서 더욱 자세히 알아보도록 하겠다.  3. 기본적인 협업 필터링 구현 코드 본격적인 인공지능을 이용한 추천 시스템을 하기 전에 기본적인 협업 필터링을 통한 추천 시스템을 구현해 보도록 하겠다. 가장 먼저 데이터를 구비한다. 데이터는 다음과 같이 movie, rating 두가지 파일이 있고 각각은 다음과 같은 형태를 띈다.  movie.csv 파일 rating.csv 파일 보다 싶이 나누어서 영화 이름, 아이디, 장르와 관객 정보, 점수 등이 표시되어 있다. 이제 우리는 이 자료를 가지고 한 사용자에게 다른 영화를 추천해주는 알고리즘을 짜볼 것이다.   일단 사용할 기본적인 라이브러리들과 데이터를 불러왔다.  import pandas as pd from sklearn.metrics.pairwise import cosine_similari

CNN 이미지 분류 모델을 이용한 논문 리뷰.2

이미지
이전 포스트와 이어지는 포스트입니다.  기존 논문에서 3X3 필터 2개를 사용한 경우 5X5 필터와 비슷한 효과를 가지며 3X3 필터 3개를 사용하였을 경우 7X7 필터를 적용한 효과를 가진다. 라고 언급했다. 또한 비선형적인 측면에서 층이 깊어져서 더욱 풍부한 효과를 누릴 수 있다. 라고 언급하였다.  따라서 이전 포스팅에서 언급한 모듈을 이용하여 실험을 하였다. 각 결과는 다음과 같다.  1. 3X3 필터 2개의 경우 약 92%의 정확도를 보였다. 2. 5X5 필터 1개의 경우  약 88%의 정확도를 보였다. 3. 3X3 필터 3개의 경우 약 94%의 정확도를 보였다. 4. 7X7 필터의 경우  약 92%의 정확도를 보였다. 결론 기존의 논문에서 언급한 것처럼  3X3 필터가 층을 쌓으면 충분히 또는 그 이상의 효과를 내는 것을 확인하였다. 또한 더 적은 파라메터의 개수와 더 풍부하게 비선형성을 가진다는 장점 또한 있다고 할 수 있다. 하지만 파라메터 개수를 줄이는데만 급해 레이어를 대폭 늘리면 연산 속도가 느려질 수도 있다는 단점도 분명히 존재한다. 추가 실험 결과  5X5와 7X7 필터의 경우 패팅의 옵션에서 'SAME'(기존 크기 강제 유지)과 'VAILD'(유효한 부분만 정리) 중 VAILD가 더 나은것으로 반대로 3X3필터는 'SAME'이 더 정확도가 높게 나왔다. 이는 개인적인 추론이지만  1. 사진의 크기가 작아 고급 필터 적용시 남는 부분이 너무 많다. 2. 반대로 3X3 필터의 경우 패딩에 큰 상관이 없다. 3. 따라서 INPUT 크기에 따라 다르겠지만 고급 필터의 경우 'VAILD'가 작은 필터의 경우 'SAME'이 더욱 효과적일 것이라 생각한다.

CNN 이미지 분류 모델을 이용한 논문 리뷰.1

이미지
 이번 포스트는 저번에 리뷰한 ' Very Deep Convolutional Networks For Large-Scale Image Recognition' 논문을 직접 코드를 짜서 실험해 본것이다.   들어가기 전에 정리하면  1. 합성곱 신경망으로 3*3 필터 3개 VS 7*7 필터 1개와 3*3필터 2개 VS 5*5 필터를 비교한다. 2. 기존 논문과 다르게 매우 깊게 구현하지는 않았다. 그냥 필터의 성능 시험이다. 3. 기존 논문과 다른 점은 Building과 Glacier 이미지 두개를 분류하는 사실상 이진 분류 문제이다. 따라서 Softmax가 아닌 sigmoid 함수를 출력 함수로 사용했으며 loss function 역시 binary-crossentropy이다. 데이터 셋은 여기서 가져왔다. https://www.kaggle.com/puneet6060/intel-image-classification 그럼 먼저 코드를 리뷰해 보도록 하겠다. 일단 사용한 라이브러리들은 다음과 같다. import os import numpy as np from tqdm import tqdm from PIL import Image from keras.preprocessing import image from keras.models import Sequential from keras.layers import Conv2D , MaxPooling2D , Dense , Flatten , Dropout 기본적인 numpy, os, keras등을 임포트 한다. 그 외에 tqdm의 경우 작업 진행량을 표시하기 위해 임포트 하였다. 데이터의 경우를 보면  학습 데이터가 각 파일별로 다음과 같이 정리가 되어있다. 이제 가장 먼저 데이터를 불러오고 각각의 전처리를 하겠다. traindir = "data/seg_test/buildings" dir = os.listdir(traindir) 위와 같이 데이터를 읽을 경로를 지정하고 각각에 들어있는 리스트를 읽어온다

MongoDB와 VScode 이용한 드라이빙app 개발 일지 (2022.2.10)

이미지
 실제로 진행되는 프로젝트이므로 코드는 공개하지 않습니다. 1. 비밀번호 변경 비밀번호를 변경해야 하는 상황이 왔다. 하지만 그냥 아이디, 비밀번호만 하기에는 보안이 너무 취약하다.. 따라서 본인인증을 수단을 생각하니 SMS인증을 시도했다. 어차피 우리 어플리케이션을 사용하려면 전화번호를 입력해야했다. 따라서 이제 SMS 전송 API를 공부하기 시작했다. 2. SendSMS모듈 제작 일단 기본적으로 네이버에서 제공하는  SENS(Simple & Easy Notification Service) 서비스를 이용하기로 했다. 그래서 공식 REST문서를 읽어가며 만지작 거리던 중 계속 오류가 났다. 하루종일 머리를 싸메다가 결국 발견한건 request라는 함수를 더이상 사용하지 않는다는것 즉 나는 요청을 보낼 수 없는 코드를 가지고 하루종일 머리를 싸멘 것이였다. 결국 axios로 변경하니 정상적으로 메일이 발송되었다. 수많은 노력의 흔적들.jpg 3. 인증번호 저장 및 인증 절차 이제 가장 큰 문제가 남았다. 인증 번호를 발송한 것 까지는 좋았으나 인증번호를 확인하고 인증 절차를 구성하는데 자꾸 인증번호를 넘기지 못하는 오류가 났다. 결국 캐시메모리를 사용하는 라이브러리를 임포트하고 나서야 인증이 가능해졌고 그 뒤의 비밀번호 재설정의 경우는 크게 어렵지 않게 구현하였다.  4. 다음 Task 이제 다음은 카카오톡으로 로그인이다. 카카오톡으로 로그인을 구현하려면 토큰, 인증, 카카오톡 API등 공부해야 할게 더 많아. 산넘어 산이다. 잘 할 수 있을까 걱정이 된다.   참고로 네이버 SENS에서 문자의 경우 50통까지는 매달 무료로 하며 그 이후 한통당 7원이 부과된다. 알림톡의 경우는 무료가 없으며 각 5원이 부과됨으로 본인에게 맞는 걸 사용하기를 바란다. 우리는 아직 개발중이라 일정 비율 무료인 SMS를 사용해 개발하였다.