글쟁이, 코딩한다

0208/ k_digital 43일차/ 웹 프로그래밍(Django) 본문

나는 코딩도 한다/TIL

0208/ k_digital 43일차/ 웹 프로그래밍(Django)

Algori 2021. 2. 8. 21:32

0.

TIL은 이런 곳에 하기 보다는 주로 깃헙에서 잔디 심는 일을 말한다는 걸 이제 알았다.

43일차라 돌이킬 수가 없지만. 일단 이 과정을 듣는 동안은 마저 이대로 하고 끝나는 대로 그쪽으로 가야겠다.

 

웹 프로그래밍. 오늘은 머신러닝 모델 적용.

예제는 opencv-python 라이브러리를 활용한 사진 얼굴&눈 인식 사이트.

이번에는 pythonanywhere로 배포까지. 역시 똑같은 내용들은 패스하고 새로 배운 것들 위주로.

 

CV2 라이브러리 활용 얼굴&눈 인식 사이트

최종 배포한 웹사이트. 얼굴에는 파란 네모를, 눈에는 초록 네모를. 정확도는... 나름 기괴하기도 하다. 사진은 구글링해서 구한 밴드 라디오헤드.

 

기본 순서

가상환경 구축(opencv-python(4.1.1.26), pillow(5.4.1) 라이브러리 설치)

프로젝트&앱 개설

 

  1. 이미지 파일 업로드

 

(1) Media 폴더

  유저들이 업로드한 파일들을 받아낼 공간
#templates, static과 비슷한 매커니즘

 

설정
  1  settings.py(static 설정 아래)
        MEDIA_URL = '/media/'
        MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

  2  urls.py(적용을 원하는 프로젝트/앱 urls.py)
        from django.conf import settings
        from django.conf.urls.static import static
       urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

(2) form

 

  2-1 FileSystemStorage

 

1-이용자가 이미지를 업로드할 폼을 구성(ImageField를 활용한다)
2-요청값(POST)을 받아 POST값, FILES값을 나눠 받는다
3-FileSystemStorage()를 활용해 받은 이미지 파일 자체, 이름과 URL을 구별한다
 #이 과정에서 이미지는 아까 만들어준 MEDIA_ROOT 경로를 따라 media 폴더에 자동 추가(알아서 생성도 한다)
 #일시적인 저장일 뿐, 따로 저장하지는 않는다
4-저장한 이미지를 바탕으로 웹사이트에 표기한다

FileSystemStorage()를 활용해 임시로 받아내기.
구현한 웹사이트.

  2-2 using DB (권장)

 

1-DB 생성

2-DB를 적용한 업로드 폼으로 forms를 수정
3-요청값(POST)을 받아 POST값, FILES값을 나눠 받는다

4-입력받은 값을 전처리 과정(경로 설정, 저장 내역, 얼굴 인식 등)을 거쳐 DB에 저장한다
#이미지는 DB에 곧바로 저장하지 않는다. DB에는 media 폴더 경로가 들어간다.
5-DB를 바탕으로 이미지를 웹사이트에 표기한다

새로 만든 DB
DB 기반 forms를 통해 받아내기. 큰 차이는 없다. DB save 정도.

 

  2. 모델 적용

 

1- 따로 functions.py 파일을 만들어 복잡한 연산을 함수로 정의한다

  #복잡한 코드는 곧바로 작성하기보다 주피터노트북 등에서 미리 구성해 오자

cv_detect_face란 함수를 정의. 밑으로 한참 길다. 순서대로 이미지 리사이즈, 모델 적용, 모델로 정면 얼굴과 눈 위치 예측하기, 예측값으로 사각형 그리기를 진행한다.

 $$ 여기서는 cv2 라이브러리 내 Haar-based Cascade Classifier를 썼다. AdaBoost 기반 머신러닝 물체 인식 모델이다. 얼굴 정면을 인식하는 'haarcascade_frontalface_default',  눈 부분을 인식하는 'haarcascade_eye'를 가져와 썼다.

함수 안의 모델 설정 부분

2- 모델에 맞춰 파일 크기, 형식 등을 맞춰준다.

  #지나치게 큰 이미지를 줄이거나 따로 맞춰줘야 할 조건들이 있는지 확인하자

3- 모델을 제대로 적용하기 위한 URL 구성

4- 결과값 예측&표기

 

views.py에서는 저 윗부분 한 줄만 달랑 추가해주면 그만이다. 괄호 안 인자는 이미지 파일의 경로.

  

3. 배포

 

1-라이브러리가 너무 많다 -> 일일이 모두 설치?


  requirements.exe : 라이브러리 리스트 기반 자동 설치를 활용하자

 

  (cmd)pip freeze > requirements.txt

      -----이후 가상환경에서 설치할 때는 : pip install -r requirements.txt

 

2- .gitignore 파일 생성

.gitignore : github에 push할 때 파일 내 목록을 모두 제외해준다

 

ex)
*.pyc ; *은 모든 파일을 뜻한다
*~
__pycache__
.DS_Store
-------두고 오는 임시 파일들--------


django_env : 가상환경
db.sqlite3 : DB ; 개발 시 실험단계에서 사용한 로컬 DB 제외 ; 사용자들이 초기화된 상태에서 DB를 생성하도록
/static : CSS 파일들 ; collectstatic으로 프로젝트 내에서 모으는 것이 좋다
/media/images : 개발 단계에서 업로드한 파일들도 날려준다

--------두고 오는 테스트용 파일들-----

 

----이후 gitignore로 제외한 static, DB 등은 collectstatic, migrate 등 명령어로 수집&등록해야한다.
----이전 배포(로또 사이트)와는 달리 (Web탭)Stactic files를 수정. URL에 디렉토리 이름, Directory에 경로를 지정해준다.

 

오늘의 TML

  URL 세부주소, 함수, 별칭(name)은 모두 통일하는 편이 좋다.

  대문자로 쓴 파이썬 변수들 : 다른 파일에서 끌어다쓸 변수들

Comments