https://sokkung.tistory.com/193

https://docs.python.org/ko/3/howto/logging.html

'Language > Python' 카테고리의 다른 글

super()  (0) 2023.02.04
Garbage Collection in Python  (0) 2022.08.29
argparse 사용법  (0) 2022.04.14

https://brownbears.tistory.com/413

'Language > Python' 카테고리의 다른 글

super()  (0) 2023.02.04
Garbage Collection in Python  (0) 2022.08.29
logging 사용법  (0) 2022.04.14

1. 프로젝트 배경

Computer Vision을 배운 후 약 3일간 mini project를 진행하면서 만들게 되었다.

자주다니는 도서관 입구에 마스크착용 + 온도계 시스템이 있었는데, 배운 내용가지고도 충분히 만들 수 있을꺼 같아 해당 주제로 시작하게 되었다. 구글링 하니 비슷한 프로젝트가 있어, 참고하여 쉽게 만들 수 있었다.

 

2. 프로젝트 소개

마스크 착용, 미착용을 구분하는 판별기가 아닌, 코까지 올바르게 마스크를 착용 했는지 판단하는 판별기 이다.

https://youtu.be/wg2FaAc-0k4

검은색 마스크는 데이터셋에 없음

 

3. 프로젝트 과정

구분 기간 활동 비고
주제 선정 03/07() 주제 선정  
모델 및 툴 선정 03/08() CNN 모델 선정
데이터 수집 툴 선정
전이학습 공부
데이터 셋 선정 03/08(), 03/10() 요구되는 데이터 선정 모든 마스크 종류마다 데이터 준비
모델링 03/10() 모델 구현  
데이터 및 모델 수정 03/10() 데이터 표본 다양화
fine tuning
-두 개의 마스크 종류 데이터만 준비
-여러 모델 비교 분석
발표 03/11() 발표  
총 개발기간 03/07()~03/10()(3)   03/09() 공휴일

4. 프로젝트 구성

1. webcam을 통해 10프레임마다 이미지를 저장하여 모델의 데이터셋 생성

2. InceptionResNetV2 모델 전이학습을 통해 판별기 훈련

 2-1. InceptionResNetV2의 imagenet Weight 그대로 사용, 시작과 마지막 Layer만 제거

 2-2. fine-tuning

   - Layer 추가

   - Learning rate 값 정하기

   - epochs, batch_size 값 정하기

   - EarlyStopping으로 overfitting 방지

3. openCV로 결과값 출력

 

5. 소스코드

로컬에선 학습시간이 오래걸려, colab에서 GPU를 사용해 따로 학습시켰다.

https://github.com/jaesik103/Put-Up-your-MASK

 

GitHub - jaesik103/Put-Up-your-MASK

Contribute to jaesik103/Put-Up-your-MASK development by creating an account on GitHub.

github.com

 

6. 프로젝트 리뷰

 6-1. fine-tuning을 통해 성능을 올릴 수 있지만, 아무리 성능을 좋게 뽑아도 손으로 마스크처럼 얼굴을 가린다거나, 비슷한 사물로 마스크처럼 위장하여 얼굴을 가릴때를 잘 구분하지 못했다. fine-tuning보단 모델이 헷갈릴 수 있을만한 다양한 데이터셋을 준비하는 것이 더 유용한 것 같다.

 

 6-2. 해당 프로젝트 데이터셋은 마스크:250장 / 노마스크:300장 이었는데도 불구하고 충분히 시제품으로 사용할 수 있을만한 성능을 보였다.

 

 6-3. 300줄이 안되는 코드로도 좋은 프로그램을 만들수 있었다.

 

 6-4. 어떤 Layer, Learning rate, epochs, batch_size 가 더 적절한지 알아내기 힘들었다. 특히, 해당 모델은 적은 epochs(1~2)으로도 accuracy가 금방 1로 수렴해버려 epoechs를 늘리는게 의미가 있었나 싶지만, 중간에 튀는 값이 있어 EarlyStopping을 사용하지 못했고, 해석하기 어려웠다.

가장 양호하다고 판단된 Learning rate = 0.001 의 그래프

 6-5. 모델검증이 어려웠다.

 

 6-6. 결과를 확인하면 0에폭부터 확률이 100%만 출력되는 것을 볼 수 있다. overfitting됐을 것이라 예측되지만, 표본이 적어서 발생하는 문제이고, 매우 잘 판별하고있다. overfitting을 피하려고 여러 모델들을 사용해 봤는데, 특이하게 colab에서 GPU를 통해 학습시킨 경우에 이런 현상이 잘 발생하였다. 중간에 튀는 값들은 아마 다양한 데이터를 넣으면서 몇몇 데이터가 노이즈로 인식되는 것 같다.

1. 포스팅 배경

최근 머신러닝 프로젝트를 하나 진행했는데 로컬에서는 학습시간이 오래걸려, 대부분 colab의 GPU를 사용해 학습을 진행하였다.

그런데 왠걸, colab에서 로컬로 다운로드한 model.h5을 로컬에서 load_model로 로드하니

ValueError: bad marshal data (unknown type code)

라고 에러가 났다. 처음엔 다운로드 중 손상으로 인한 오류인줄 알았지만, 다시 다운로드해도 마찬가지였다.

구글링해본 결과, Python version 차이가 원인이라고 한다!

!python --version

위의 코드를 통해 버전을 확인해보니, 로컬의 가상환경은 3.9.7, colab은 3.7.12였다.

로컬 가상환경을 3.7.12로 다운그레이드 하려고 구글링을 통해 온갖짓을 다해봤지만 실패했다.

그래서 결국 새 가상환경을 구성하기로 했다.....

예전에 해맸던, VScode에 가상환경을 등록하는 법도 같이 포스팅 하겠다.

 

특정 버전의 파이썬 가상환경 구축(명령 프롬프트)

cd 를 통해 가상환경을 모아놓은 디렉토리로 이동한다. 나는 venvs에 가상환경을 다 모아두고 관리하고있다.

아래 코드를 통해 원하는 Python version의 가상환경을 구축할 수 있다. 먼저 해당 버전의 파이썬을 다운해야한다.

py -원하는버전 -m venv 가상환경이름
py -3.7 -m venv colab

가상환경 구축은 끝났으며, 가상환경에 진입하고 싶으면 아래 코드를 통해 진입할 수 있다.

C:\venvs>cd colab\Scripts
C:\venvs\colab\Scripts>activate
(colab) C:\venvs\colab\Scripts>

 

Visual Studio Code(VScode)에 커널 등록하기

VScode에서 ctrl+shift+p를 누르면 뭔가 검색하는 창이 아래 그림처럼 생긴다.

안나오는 사람은 맨위의 탭에서 [보기] -> [뷰열기] 를 하면 창이 나오는데 view를 지워주고 위의 그림처럼 꺽쇠(>)를 입력해주면된다.

위의 그림에 나온 Python:Select interpreter 를 검색해 클릭하면 아래 그림처럼 환경들이 쭉 나오는데, 우리가 방금만든 가상환경은 안나올 것이다.

[+Enter interpreter path...] -> [Browse your file system to find a Python interpreter.]를 누른 후, 우리가 만든 가상환경 폴더로가 Scripts 폴더의 python을 선택해준다. 그럼 VScode에 가상환경 등록이 완료된다.

나의 경로는 c:\venvs\colab\Scripts\python.exe 이다.

위 그림의 우측의 빨간박스 부분을 누르면 가상환경을 연결시킬 수 있다.

colab에서 학습시킨 후, 다운로드한 모델을 로컬에서 못 읽어서 한참을 고생했다. 원인은 Python version 문제였는데, 로컬과 코렙의 버전차이 때문이었다. 이번 일을 통해 왜 Python 최신버전을 안 쓰고 각자 따로 쓰는지 제대로 알게 되었다 ㅋㅋ. 간단하게 포스팅 하나 해놓아야 겠다.

 

파이썬 버전 설정

 

'Virtual envirment' 카테고리의 글 목록

상상해온 서비스들을 직접 기획부터 개발까지 하는 '진짜 개발자'가 되기 위한 스토리

jaesik103.tistory.com

 

'개발일기' 카테고리의 다른 글

티스토리 이미지 업로드 오류  (0) 2022.06.11
2022.03.13(일) 블로그  (0) 2022.03.13

12월 부터 시작한 6개월 과정의 K-Digtal traing이 벌써 반 이상이 지나갔다. 블로그를 만든이유는 복습하며 정리한 내용을 포스팅 하기 위해서지만, 해보니 의외로 오랜 시간이 걸려 힘들었다. 

현재 배운 내용을 순서대로 나열하면, Python, maching-Learning, crawling&scraping, Deep-Learning, django,  Computer-vision을 공부했고 개발기간(총3일)에 해당하는 미니 프로젝트를 하나 수행했다. 블로그를 만든 시기는 django를 배울때인데, django를 포스팅하다 미루다보니 지금 다시 시작하게 되었다. 아마 앞에 배웠던 내용은 프로젝트를 수행하거나, 필요에 의해 다시 뒤적거리게 될때 포스팅하게 되지않을까 싶다.

 

 

'개발일기' 카테고리의 다른 글

티스토리 이미지 업로드 오류  (0) 2022.06.11
2022.03.16(수) Python downgrade  (0) 2022.03.16

템플릿에서 사용된 URL의 하드코딩을 없애는 방법에 대해서 알아보자.

URL 하드코딩

question_list.html 템플릿에 사용된 다음 링크를 보자.

<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>

<a>태그의 href는 하이퍼링크를 의미한다.

링크가 /pybo/{{ question.id }}/ 로 주소가 완전히 다 적혀 있는 것을 하드코딩이라한다.

링크 구조가 수정될 때 일일이 찾아 수정하는 수고를 덜기 위하여 하드코딩은 지양하는게 좋다.

URL 별칭

링크주소 대신 URL 매핑에 name 속성을 부여해 별칭을 사용할 수 있다.

[파일명: C:\projects\yoursite\pybo\urls.py] #라인 수정

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index#, name='index'),
    path('<int:question_id>/', views.detail#, name='detail'),
]

URL 별칭 사용

[파일명: C:\projects\yoursite\templates\pybo\question_list.html] #라인 수정

{% if question_list %}
    <ul>
    {% for question in question_list %}
        #<li><a href="{% url 'detail' question.id %}">{{ question.subject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}

/pybo/{{ question.id }}{% url 'detail' question.id %} 로 변경했음.

question.id 는 URL 매핑에 정의된 <int:question_id>에 전달해야 하는 값

URL 네임스페이스

현재는 pybo앱 하나만 사용중이지만, 이후 다른 앱들이 추가되면서 동일한 URL 별칭을 사용해 중복되는 상황을 방지함.

pybo/urls.py 에서 네임스페이스를 정의하자

[파일명: C:\projects\yoursite\pybo\urls.py] #라인 수정

from django.urls import path

from . import views

#app_name = 'pybo'

urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
]

네임스페이스를 사용해보자

[파일명: C:\projects\yoursite\templates\pybo\question_list.html] #라인 수정

{% if question_list %}
    <ul>
    {% for question in question_list %}
        #<li><a href="{% url 'pybo:detail' question.id %}">{{ question.subject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}

네임스페이스 : 별칭 을 사용하자!

+ Recent posts