이번에 대학원생 안전교육 방식이 각 과목마다 동영상(15~25분) 하나 재생으로 바뀌었습니다.

 

저는 열심히 들었지만 혹시 학기 말에 너무 급해서 스킵하고 싶으신 분들이 계시다면 아래 코드를 입력해보세요.

 

크롬 : 과목 수강하기 클릭 -> 동영상 재생 -> F12 -> Console -> progressCheck(true) 입력 후 엔터

 

원리는 해당 동영상 재생 창의 Source 코드를 보면 대략 progressCheck가 false인지 true인지에 따라서 안전교육 수강 상태가 변경되는 것을 확인할 수 있습니다. 이를 보면 progressCheck에 true 값을 넣어주면 된다는 것을 볼 수 있고 실제로 입력하면 수강 완료됩니다.

 

 

연구실에서 다른 실험을 계속 진행하느라 얼굴 인식을 손 놓게 되어 작성을 중단했었는데 천천히라도 다시 작성해보겠습니다. 다소 설명하는 퀄리티가 떨어져도 이해해주시면 감사하겠습니다.

 

지난 글들까지는 얼굴인식 설명, python 설치, cuda, cudnn 설치 등까지 진행한 것 같네요.

 

다음으로 python 편집 프로그램을 설치하도록 하겠습니다.

 

둘 중 하나로 정하시면 되는데 1개는 PyCharm이고 하나는 Visual Studio Code 입니다.


Pycharm 설치

Pycharm이란? JetBrain에서 만든 전문 개발자용 Python IDE

https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows

위 주소로 방문하여 설치하시면 됩니다.

둘 중 학생이라면 Professional(리눅스 서버로 원격 파이썬 실행 가능) 일반인이라면 Community를 설치해주세요.


Visual Studio Code

https://code.visualstudio.com/

python 외에도 다양한 언어를 편집할 수 있고 또 원격 리눅스 서버도 사용 가능합니다.


PyCharm과 VSC(Visual Studio Code)는 하나의 편집기이자 디버깅 툴입니다. 초심자들이라면 메모장이나 atom, notepad++ 이런 프로그램 쓰지말고 무조건 사용하시길 바랍니다.

 

저는 Ubuntu OS, Python(Anaconda3 가상환경), Pycharm을 이용하여 앞으로의 설명을 진행하겠습니다.


Ubuntu 18.04 → OS

Python(Anaconda3) → 3.7 혹은 3.8

필요 python 패키지들(pip install numpy, pip install opencv-python 등등 입력하여 설치)

  • numpy
  • matplotlib
  • pillow
  • opencv-python
  • opencv-contrib-python
  • torch
  • torchvision
  • pandas
  • sklearn
  • scikit-image
  • PyQt5
  • 위 항목 외에 import 오류가 뜨면 pip install (오류가 뜬 패키지이름) 을 치면 해결 될 겁니다.

Pycharm → 코드 편집 →원격 리눅스 서버로 코드 전달 및 실행 → 결과 return 및 디버깅

putty → 원격 리눅스 서버 터미널 작업용

winscp → 원격 리눅스 서버 파일 주고 받기용

 

위 정도만 사용할 줄 알면 됩니다.


얼굴 인식에 대한 간단한 Framework

얼굴 인식은

  1. 이미지 입력(opencv, pillow, scikit-image 등)
  2. 입력 이미지 Transform(일반적으로 Normalize정도만)
  3. 얼굴 검출(torch [GPU])
  4. 얼굴 검출 영역 Crop
  5. Crop한 얼굴 이미지 Normalize
  6. 얼굴 특징 추출 네트워크(torch [GPU])
  7. 얼굴 특징 벡터 추출(일반적으로 (B,N) 모양으로 출력된다)
    여기서 B는 Batch Size(입력 얼굴 개수), N은 얼굴을 나타내는 특징 개수
  8. 추출한 특징 벡터와 기존 저장되어 있던 사람들의 특징 벡터를 전부 다 거리 계산
    여기서 거리 계산에는 Euclidean distance와 cosine similarity가 있다. %로 보고 싶으면 cosine similarity의 범위가 -1~1로 나타나기 때문에 더 적합

영어로 나타내면

  1. Input Image
  2. Image Transform
  3. Face Detect using detector(usually YOLO face detector, mtcnn)
  4. Crop with face detector result(x, y, w, h)
  5. Normalize Cropped Face image
  6. Input to Face Recognition Network
  7. Get face feature vector from the network
  8. Compare probe& gallery feature vectors by using distance metrics(Euclidean distance or cosine similarity)

입니다.

 

제가 글을 쓰기 전까지 좀 더 찾아보고 싶으면 영어로 친 내용들을 구글링 해보면 쉽게 도움 받을 수 있습니다.

 

깃허브에도 많은 자료들이 올라와 있으니 한 번 찾아보세요~!

 

그럼 다음에 또 글 올리겠습니다.

안녕하세요. 빵꾸아빠입니다. 본 글은 지난 퀘이사존에 제가 올렸던 글을 가져와 재작성하였습니다.(2020년 12월 18일, 2021년, 1월 12일 작성글)

국내 LCD 사이드 패널 제작 관련 정보가 많이 없어 여러 외국 영상보거나 퀘이사존 정보도 참고하면서 제작해보았습니다.

제작 과정이 담긴 영상은 아래 두 영상을 참고해주세요.

제작 영상 Youtube 채널

https://youtu.be/0VckrZriNnk

https://youtu.be/CKLNpmudkPY

준비물

  • 되도록이면 옆문이 유리인 케이스 제가 사용한 케이스는 다크플래쉬의 DLX-21 White Mesh 케이스이며 옆면 유리를 활용하였습니다.

  • LED 바 or 스트립 : 12V, 5V 자유 (저는 5V 사용했지만 광량이 아쉬워 12V로 바꿀 예정입니다)

  • 중고 모니터 : 구하기 어렵거나 불안하시면 그냥 네이버쇼핑이런데 검색하시면 중고가 + 1~2만원 선으로 구할 수 있습니다.

    - 저는 모니터는 19인치 LG나 삼성거 뜯어서 네이버에서 주문한 만능 AD보드와 물려 사용하였습니다. 패널명은 아마 HSD190MEN3인 것 같습니다. 첫번째 모니터는 패널이 앞 뒤로 분리가 되어 검은 액정 현상이 나타나 두번째 모니터로 교체하면서 영상을 찍게 되었습니다.

  • 만능 AD 보드 : 이건 모니터 AD보드를 사용 못할 때 필요한데 확실히 만능 AD보드 있으니까 편하더라고여

  • 납땜기

  • 전원선들 : 점퍼선 몇개 , Molex 4핀 <-> Sata, Molex 4핀 <-> Molex 4핀 (수)+Molex 4핀 (암), 12V 어댑터 머리(만능 AD보드에 12V 어댑터 꽂는 곳이 있어서)

  • 수축튜브 (선택사항)

  • 모니터, 납땜한 것들 고정용 테이프 : 실리콘 테이프(투명하면서 자국 안남고 잘 붙고 떼어내기도 쉽습니다)

  • 멀티미터 (선택사항) : 기존에 있는 AD보드 전압 알아내기 용도인데 만능 AD보드 사시면 필요 없습니다.

  • 검은색 시트지 : 모니터가 유리를 다 못채워서 가리는 용도로 샀습니다.

제작과정

투명 LCD 사이드 패널은 요약하자면 모니터를 분해 후 백라이트판을 제거한 LCD 패널과 화이트 LED 스트립/바를 장착해주면 끝입니다. 그리고 전원 공급은 몰렉스 핀을 개조하여 12V(AD보드), 5V(LED바)를 공급할 수 있도록 납땜하였습니다.

일단 첫번째 모니터는 분해해서 나온 AD보드만 사용해서 제작해보려 했으나 해당 보드가 14V 전압을 받는 AD보드라 컴퓨터에서 전압을 끌어올 수 없어 결국 만능 AD보드를 주문하여 제작하였습니다.

잘 쓰다가 결국에는 첫번째 모니터에 검은액정 현상이 나타나 두번째 모니터를 구매하였고 마찬가지로 분해해서 나온 AD보드를 사용하려다가 첫번째 영상에서 보시는 것처럼 합선으로 태워먹었습니다 ㅎㅎ

제작 순서는 다음과 같습니다.

  1. 모니터 분해

    • 작은 드라이버들로 열심히 분리하시면 됩니다. 제 유튜브나 구글에 transparent lcd side panel 검색하시면 모니터 분해영상 많이 나옵니다.

    • 패널 분리 후 앞에 안티글레이징필름인가를 뜯어내야 투명함이 완벽해집니다.

    • 안티글레이징필름은 패널 앞부분(우리가 모니터를 바라보는 부분)에 있습니다.

    • 해당 부분을 물에 24시간 불려야하는데 저는 2~3시간만 불리고 커터칼날 가져와서 살살 뜯어냈습니다.

    • 분리할 때 편광필름까지 뜯어낼 수 있어 조심해야 하는데 퀘이사존 어떤분은 같이 뜯어버리셨다고 하여 참고하고 조심하였으나 저도 첫번째 모니터 분해하다가 모서리부분(2~3cm정도) 조금 뜯겨져 나갔습니다 ㅠㅠ 그 뒤로 잘 쓰다가 결국 검은액정으로 번져 두번째 모니터로 바꿨습니다.
  2. AD보드 연결 후 모니터 테스트

    2-1)기존 AD보드 사용

    • 필요한 전압이 12V인지 14V인지 확인 -> 14V면 버리고 만능 AD보드 구매

    • 12V면 전원 공급하는 부분과 GND 부분에 잘 납땜을 해주시면 됩니다. 납땜해서 MOLEX 4핀 12V 부분에 연결(납땜)하시면 끝!

    • 저는 기존 AD보드은 14V였고 OSD버튼은 터치라서 하루 뻘짓하고 만능AD보드 구매하였습니다.

      2-2)만능 AD보드 사용(풀셋으로 구매해야 편합니다) 일반적으로 대부분 12V입니다.

    • 집에 돌아다니는 12V 단자를 아무거나 잘라서 만능 AD보드 전원 공급용으로 사용하시면 됩니다.

    • 아래 첨부한 사진 12V 어댑터 사용하시면 됩니다. 빨강 = Molex 노란선(12V)이랑 납땜, 검정 = GND

    • 일단 납땜하기 전에 다 테스트 먼저 진행해보았습니다. 화면 잘 나오는 지 일반 12V DC 어댑터로 전원 공급 잘 되는 지

  1. LED 설치 및 필요한 선들 납땜

    • 저처럼 LED 바 작은거 사서 고생 안하시길 바랍니다. 아래거 사서 납땜하다가 정말 힘들었습니다.

    • LED 바 설치 위치는 두군데 해보았는데 아래의 2)번 경우가 좀 더 색감이 선명하였습니다.

    • 옆면유리 모니터 바로 위, 아래, 옆에서 반대편 옆면 방향으로 LED가 나오도록 설치

    • 케이스 내부에 일반 RGB 스트립 꾸미듯이 설치

      https://img2.quasarzone.com/editor/2020/12/18/6a69b348dd41f92005f0bd8f6c06a7d8.png

      )

      https://img2.quasarzone.com/editor/2020/12/18/2e682996aa23199508d92ae04d488da5.png
    • 아무튼 이런거 말고 12V LED 스트립같은거 구매하시고 위에 LED 스트립 쉽게 연결해줄 수 있는 도구 많으니까 그런거 추가구매하시면 되겠습니다.

    • 일단 납땜하기전에 5V 연결로 불 잘들어 오는 지 아두이노로 테스트해보았습니다.

      https://img2.quasarzone.com/editor/2020/12/18/4e6807d722ac557025901022c4b9556a.png
    • 위에도 말했지만 컴퓨터 PSU와 쉽게 연결하기 위해 Molex 4핀을 따로 구매해서 사용하였습니다. Molex 4핀은 노란선 -12V, 빨간선 5V, 검은선 - GND로 이루어져 있는데 Molex 4핀 - SATA 이런거 좀 암수로 여러개 사놓고 잘라서 납땜하여 5V LED바와 12V 만능 AD보드에 전원공급하였습니다.

    • 대충 왼쪽 사진처럼 만들었는데 12V만 DC 어댑터랑 납땜하였고 5V는 따로 Molex 4핀 연장하듯이 달아서 LED 바 전원 끄고 키기 조금 편하게 하였습니다.

  2. 옆면 유리 등 케이스에 부착 후 테스트

    • 가릴 부분에 검은색 시트지를 먼저 옆면 유리에 붙여줍니다(붙일 때 기포같은게 생기는데 물같은거 넣고 카드로 긁어서 물을 빼내주면 기포 사라집니다).
    • 시트지가 조금 마르면 모니터를 실리콘 테이프로 고정해줍니다.
  3. AD보드, 납땜한 선들 모두 합선이 안되도록 절연 테이프나 실리콘 테이프 등으로 감싼 뒤 케이스 내부에 선 정리

  4. Wallpaper engine 등을 이용하여 투명 LCD 케이스를 바라보며 멍때리기

모니터 패널 분리 이후 수시로 모니터 전원이나 화면 잘 들어 오는 지 확인하시길 바랍니다.

 

화면 잘 들어오는 지 확인하려면 컴퓨터와 DVI 선 연결하고 핸드폰으로 손전등 활용해서 보시면 됩니다.

제작 및 사용 후기

1달 정도 사용해보고 아쉬운 점은 LCD 자체가 원래 백라이트판에서 부터 편광필름을 거치고 전기 신호에 따라 색을 빼는 방식이라 흰색 배경이 아닐경우 흰색, 검은색을 제외하고는 색감 표현이 아쉬울 정도로 약합니다.

 

이를 해결하기 위해 분해 시 남은 반투명한 백라이트용 필름을 뒤에 덧대면 그나마 조금 더 잘 보입니다. 대신에 케이스 내부가 물안경 낀것처럼 느껴지는 정도?로 보여집니다.

 

또한 발 아래에 케이스를 두는 경우는 추천 안하는게 구형 LCD는 시야각 조차 안좋기 때문에 안그래도 색감이 잘 안 보이는 상태에서 더 안보이게 됩니다.

 

책상 위에 쓸 경우 결국에는 애매한 듀얼모니터 or 트리플 모니터 상황이 되는데 백라이트 판이 없기 때문에 감성용을 제외하고 일반적인 모니터로 사용하기에는 어렵습니다.

투명 LCD 사이드 패널을 한번 더 업그레이드 하는 방법

이 때문에 다른 방법이 없을까 고민하다가 전기 신호에 따라 불투명/투명하게 해주는 필름을 본 기억이 있어 알리에서 A4 크기의 샘플 2장(A4 2장으로 19인치 4:3 비율 커버)을 구매하여 추가 설치해보았습니다.

 

명칭으로는 PDLC 필름(스마트 필름이라고도 불러요)이라고 하고 아래 사진들은 필름의 스위치를 온/오프 했을 때 찍은 사진들입니다.

 

결과적으로 성공하긴 했는데 LED를 5V로 해서 그런지 아니면 케이스 내부의 검은 부분(메인보드나 CPU 수랭쿨러 부분이나)이 좀 많아서 그런지 눈으로 보는 색감이 조금 아쉬웠습니다.

 

이상입니다. 긴글 읽어 주셔서 감사합니다.

Intro

안녕하세요 빵꾸아빠입니다.

다른 실험을 진행하고 있어 너무 손을 놓고 있었지만 계속해서 작성해보겠습니다.

Linux로 서버 세팅을 하실 분들은 제 github 주소로 들어가시면 linux-manual이라는 repository에 자세하게 설명이 되어 있으니 참고해서 진행하시면 됩니다.(연구실의 선배님께서 예전에 빠른 서버세팅을 위해 만든 매뉴얼입니다.)

Python 준비

Python은 Linux의 경우 기본적으로 2.7버전과 3.x 버전이 깔려 있고 이를 System python이라고 합니다.

System python에 이것저것 패키지를 깔다가 잘 못 깔거나 지워버리는 경우가 있습니다. 그렇게 될 경우 패키지 구성이 꼬이고 오류가 발생하는 경우가 간혹 있을 수 있어 망하면 깔끔하게 지우고 새로 설치할 수 있는 가상환경 형태의 python을 설치하는 것을 추천합니다.

Anaconda3

https://www.anaconda.com/

위 링크로 들어가서

잘 찾아가서 들어가면

이런식으로 다운받는 링크들이 있습니다.

python3.7에 해당하는 최신 버전으로 설치해주시면 됩니다.

저같은 경우에는 아나콘다를 서버의 /opt/anaconda3 위치에 설치를 해주었습니다.

아나콘다를 설치하고 껐다 키면(윈도우는 anaconda prompt라는 cmd 같이 생긴 프로그램 실행)

conda

~

해서 명령어를 입력할 수 있고

conda create -n py37-tc python==3.7

이런식으로 python3.7에 해당하는 어떤 python 환경을 py37-tc라는 이름으로 만든다라고 명령을 하면

system python이 아닌 깔끔하게 python3.7이 설치 된 환경을 만들 수 있습니다.

가상환경 접근 방법은 conda activate py37-tc, 윈도우는 activate py37-tc라고 치면

위처럼 괄호 안에 py37-tc라는 이름이 나타날 것입니다.

이 상태에서 pip 명령어를 통해 numpy, matplotlib, pillow, scikit-image, torch, torchvision, opencv-python, opencv-contrib-python, PyQt5 등등을 설치해야 하는데 CUDA를 설치한 뒤 설치하는 것으로 넘어가겠습니다.

CUDA, CUDNN

이 프로젝트의 경우 python과 pytorch를 이용할 예정입니다. pytorch를 사용할 경우 CUDA와 CUDNN이 필수로 설치가 되어 있어야 합니다.

현재 CUDA가 11버전까지 나왔는데 안정성을 위해 10.1 버전을 사용하는 것을 추천합니다.

리눅스의 경우 마찬가지로 제 깃허브에 linux-manual을 참고하시면 편하게 설치할 수 있습니다.

윈도우는 제가 기억이 잘 안나는데 cuda 설치하고 cudnn 압축풀어서 폴더 복사하고 최종적으로 시스템 환경변수에 cuda 위치 추가해줬던 것으로 기억납니다.

Intro

안녕하세요 빵꾸아빠입니다.

지난 글을 시작으로 제가 이미 제작해 본 딥러닝을 활용한 얼굴 인식 프로젝트와 데모를 통한 시연 프로그래밍을 다시 한번 정리하면서 진행하려고 합니다.

이 프로젝트를 진행하기 위해서는 파이썬 프로그래밍 언어에 대한 기본적인 지식이 있어야 되고 딥러닝에 대해 자세한 설명을 하지 않으므로 구글에 모두의 딥러닝이라고 검색하시면 좋은 무료 강의 들이 많으니 2~4주 정도 기초 지식이나 기술을 배워 오시면 프로젝트를 따라 진행하는 데 있어 많은 도움이 될 것입니다.


얼굴 인식

이 프로젝트는 딥러닝으로 학습한 얼굴 인식 네트워크를 실제로 어떻게 활용하는지 따라 하거나 학습할 수 있도록 정리할 예정입니다.

Computer Vision 분야에서 얼굴 인식은 크게 2가지의 Task로 나눠지는데 하나는 Verification, 다른 하나는 Identification이라고 합니다.

인식을 하려면 우선 데이터, 즉 우리가 비교하고자 하는 사람의 얼굴이 있어야 합니다. 보통 인식을 하고자 하는 얼굴을 Probe라고 부르며 비교할 대상들을 Gallery라고 합니다. Probe와 Gallery를 어떻게 비교할 지에 따라 task가 구분됩니다.

Gallery에는 각 사람별로 ID(또는 class)가 있고 각 ID별로 여러 장의 얼굴 사진들이 저장되어 있을 것입니다.

Verification은 Probe(입력이라고 생각하시면 됩니다.)로 들어온 얼굴 사진과 Gallery의 한 ID의 한 장의 얼굴 사진과 어떠한 얼굴의 값을 나타내는 벡터 값의 차이를 계산하여 Probe가 Gallery의 ID와 동일하냐 아니냐를 판단하는 task입니다.

Identification은 Probe로 들어온 얼굴 사진이 Gallery의 모든 ID의 모든 얼굴 사진과 얼굴의 값을 나타내는 벡터 값을 비교했을 때 가장 차이가 적은 ID를 Gallery에서 찾아내는 task입니다.

쉽게 설명하자면 A라는 사람의 얼굴이 새로 입력으로 들어왔을 때 Verification은 A가 맞냐 아니냐를 맞추는 것이고, Identification은 A부터 Z까지의 사람들 중에 이 사람이 A라는 것을 맞추는 것입니다.


딥러닝

우리가 현재 흔히 말하고 있는 인공지능 기술은 딥러닝을 통해 학습한 네트워크의 결과물을 가지고 분석하여 여러 분야에 활용하고 있는 기술을 말합니다.

딥러닝 또한 머신러닝의 일부이며 머신러닝은 과거 오래전부터 계속 연구되어 왔습니다. 그래픽카드의 발전으로 딥러닝 네트워크라고 부르는 deep neural network를 효과적이며 빠르게 학습할 수 있게 되었습니다.

현재 2020년에는 python이라는 언어를 통해 코딩의 장벽이 매우 낮아져 쉽게 자신만의 딥러닝 네트워크를 만들어 볼 수 있습니다.


얼굴인식+딥러닝

이 프로젝트의 목적은 얼굴인식을 딥러닝을 통해 진행하고 그것을 화면으로 보여줄 수 있는 데모까지 만드는 것입니다.

프로젝트는 크게 데이터 준비, 딥러닝 모델 준비, 학습 및 테스트 준비, 데모 프로그램 개발의 단계로 구분이 됩니다.


데이터 준비

딥러닝은 대용량의 데이터를 통해 원하는 task를 할 수 있도록 딥러닝 네트워크의 값을 계속해서 수정해가며 학습하는 것을 말합니다.

그렇다면 딥러닝을 활용하고 싶다면 먼저 대용량의 데이터가 있는지 먼저 조사를 해봐야 합니다.

1) 학습용 데이터셋

얼굴의 경우 매우 다양한 데이터셋이 존재하는데 저는 학습용으로 VGGFace2라는 데이터를 이용할 예정입니다.

아마 검색을 해보시면 무료로 다운이 가능할 텐데 대략 9000명 이상의 사람이 있고 300만 장 정도의 얼굴 사진이 저장되어 있습니다.

2) 테스트용 데이터셋

딥러닝을 통해 학습을 하면 네트워크가 학습용 데이터셋만 잘 맞추는 오버 피팅이라는 문제가 생길 수 있습니다. 따라서 주기적으로 테스트용 데이터셋을 이용해 우리의 네트워크가 학습이 잘 진행되고 있는지 확인할 필요성이 있습니다.

일반적으로 LFW라는 데이터셋을 많이 사용하니 LFW Dataset을 준비하도록 하겠습니다.

딥러닝 모델(NEURAL NETWORK) 준비

저는 얼굴 인식을 위해서 경량화니 성능이 더 좋다니 하는 네트워크들을 준비해서 사용했지만 여기서는 ResNet이라는 네트워크를 사용할 예정입니다. python에서 사용 가능한 딥러닝용 패키지들에는 몇 가지 기본적인 네트워크를 쉽게 사용할 수 있도록 제공해주는 데 ResNet이 바로 그 기본적인 네트워크입니다.

학습 환경 준비

1) CPU

인텔 CPU 추천(AMD CPU보다 인텔 CPU가 그래픽카드를 사용하지 않는 수학 연산이 훨씬 빠르다고 들었습니다)

2) GPU

NVIDIA 그래픽 카드만 사용, CUDA 지원 여부 확인해야 하며 최소 GRAM 4GB 이상은 되어야 학습이 가능합니다.

Batch Size라고 한 번에 몇 장의 이미지를 학습하는 지에 대한 크기와 우리가 학습하려는 딥러닝 모델의 구조에 따라 그래픽 카드 메모리 사용량이 변하게 됩니다.

실제 테스트를 위한 그래픽카드 메모리는 2GB~4GB 사이라 NVIDIA 9XX대 그래픽카드들로도 충분히 데모프로그램을 만들 수 있습니다.

하지만 그래픽카드 메모리가 적으면 학습이 불가능할 수도 있으니 추천은 6GB 이상을 추천 합니다.

3) 저장장치(SSD, HDD)

딥러닝 좀 해보신 분들 중에 의외로 모르는 분들이 많은데 학습 시간이 좀 길다고 느껴지는 분들은 한 번 확인해봐야 하는 부분입니다.

요약 정리를 해드리자면 학습에 사용할 DB는 SSD, 학습한 모델이나 중간중간 테스트 로그 등을 저장할 곳은 HDD 이렇게 나눠서 저장하시면 좀 더 빠르게 학습이 가능합니다.

학습은 저장장치 공간 => 시스템 메모리 => GPU 메모리 이런식으로 학습에 사용할 이미지들을 불러오면서 진행됩니다. 우리는 300만장이라는 이미지를 GPU 메모리에 한 번에 올릴만큼 GPU 메모리가 큰 것이 아니므로 Batch라는 방식으로 32장, 64장, 128장 등 (대부분 2의의 n제곱)의 형태로 데이터를 불러와 학습하는 것을 반복하게 됩니다.

이 과정에서 이미지를 불러오는 시간이 은근히 오래 걸리는데 DB 위치를 HDD에 저장하고 사용하다가 SSD에 저장하는 것으로 바꿔보면 2배 이상 빨라진 것을 체감하실 수 있을 것입니다.

4) 메모리

메모리 크기는 8GB만 넘으면 충분합니다.

5) OS

개인 서버를 만들 수 있다면 서버는 Linux를 추천합니다.

만약 그게 힘들고 집에 있는 컴퓨터로 딥러닝을 개발하고 싶으면 Window 그대로 사용해도 됩니다.

Mac은 제가 사용 안해봐서 잘 모르겠습니다.

저는 연구실에 서버가 있어 서버는 Linux로 되어 있고 코드 작성이랑 실행 등은 윈도우에서 진행합니다.

Introduction

요새 좀 부지런하게 살고자 하는 마음에 하루에 기본적으로 해야 할 일들 혹은 할 것 같은 일들을 기록하고자 매일 하는 체크리스트를 Python과 Linux를 통해 자동으로 매일매일 같은 양식의 페이지를 추가해주는 환경을 구축해 보았습니다.

 

어떤 페이지를 만들면 그 페이지에 매일 새로운 체크리스트 페이지를 만드는 방식입니다.

페이지를 들어가보면 이런 식으로 오전, 오후, 기타, 취미, 빵꾸(저의 반려동물입니다.) 등에 대해 Toggle을 만들어 놓았고 펼쳐보면 아래처럼 체크박스 형태의 내용물들이 나옵니다.

동작은 python 코드 한 개와 매일 새벽 2시 5분에 자동으로 프로그램을 실행하게 만드는 Linux crontab 관련 기능을 이용해서 만들어서 제가 올려드리는 소스코드를 참고하시면 쉽게 따라 하실 수 있을 것입니다.


Notion에 새로운 페이지 만들기

Notion에 Private 부분에 +버튼을 눌러주세요.

그러면 새로운 Untitled 페이지가 생성되는데 여기서 파란줄 부분을(DATABASE - Table) 눌러줍니다.

그러면 3줄짜리 TableViewBlock이라는게 생깁니다.

저 3줄을 일단 우클릭을 눌러 Delete를 통해 3줄 모두 삭제합니다.

깔끔! 그리고 Untitled 부분에 원하는 페이지 이름을 작성합니다.

Icon까지 이쁘게 설정하시면 됩니다.


Token_v2 값 알아오기

python에서 api를 통해 페이지 정보를 받거나 수정하려면 token_v2라는 값이 필요합니다. 계정마다 token_v2값이 다르며 비밀번호라고 생각하시면 됩니다.

(※ 주의. 절대로 다른사람에게 token_v2값을 보여주지 마세요!)

찾는 법은 간단합니다. 외국인 블로그인가 유튜브에서 notion api 사용법에 대해 찾으면서 봤는데

일단 크롬 브라우저에서 본인의 notion 페이지에 접속합니다.(notion 검색하고 들어가서 로그인하면 보여요)

크롬에서 열면 위와 같이 주소창에 나오는 url 주소는 미리 복사해서 어디 저장해 두세요.

그리고 F12버튼을 눌러줍니다.

F12 버튼을 누르고 Application Tab → Cookies Tab 들어가면 token_v2의 값이 나옵니다. 해당 값을 복사해서 또 url 주소와 같이 보관해 두세요.

url 주소와 token_v2 값만 있다면 python에서 이제 당신의 notion 페이지에 손쉽게 접근이 가능하게 되었습니다!


Python 자동 체크리스트 추가 파일 만들기

저는 Pycharm을 이용했습니다. 필요한 패키지는 notion 패키지만 있어도 쉽게 사용 가능합니다.

notion package는 아래의 명령어를 치면 쉽게 설치 가능합니다.

https://pypi.org/project/notion/

pip install notion
from notion.client import NotionClient
from notion.block import *
from notion.collection import *
from datetime import datetime
import notion

def get_today_str():
    today = datetime.today()
    return f'{today.year}년 {today.month}월 {today.day}일'

token_v2 = '아까 복사한 token_v2 값' # token == 비밀번호 라고 생각하면 됩니다.
client = NotionClient(token_v2=token_v2)    # Notion에 접속한다고 생각하면 됩니다.

url = '우리가 접근하려고 하는 notion page 주소' #우리가 수정하거나 정보를 받고 싶은 페이지의 url 주소를 입력해주세요.

page = client.get_block(url, force_refresh=True) #  해당 url의 메인 페이지를 불러올 수 있습니다.

## page.children을 print해보면 CollectionViewBlock 혹은 TableViewBlock이 존재한다고 나올겁니다.

myViewBlock = page.children[0] # 우리가 미리 만들어 놓은 테이블(ViewBlock)을 호출합니다.

new_row_of_my_table =myViewBlock.collection.add_row()   # 우리가 만든 테이블의 데이터 모음을 collection이라고 부르는데 여기에 새로 가로 줄을 하나 추가해줍니다.

# 가로줄을 추가하는 순간 table view의 특성상 이름이 Untitled(안보임)인 페이지가 추가됩니다.

new_row_of_my_table.title = get_today_str()+' 체크리스트'    # 새로운 가로줄의 이름을 설정하면 새로운 페이지가 눈에 보일 것입니다.

AM_check_list_toggle = myViewBlock.children.add_new(ToggleBlock, title='오전 체크리스트')   # 누르면 펼쳐지고 또 다시 누르면 닫히는 Toggle 블럭을 우리가 새로 만든 페이지에 추가해줍니다.

## 위의 Toggle Block의 이름은 미리 title에서 지정해두었고 toggle의 하위 내용으로
## TodoBlock을 추가해줍니다.

AM_check_list_toggle.children.add_new(TodoBlock,title='8시 30분 전에 기상')
AM_check_list_toggle.children.add_new(TodoBlock,title='10시 30분 전에 출근')
AM_check_list_toggle.children.add_new(TodoBlock,title='새로운 메일 점검!')

# 이런식으로 추가해주세요.

# Notion은 블럭단위로 입력이 되는데 위와같이 코딩을 할 경우 한 줄씩 차례대로 입력되는 것을 볼 수 있습니다.

열심히 주석에 설명을 달아놓았으니 한번 사용해보고 입맛에 맞게 변경하여 사용하시면 됩니다.


체크리스트 자동화 시스템 - Linux, Ubuntu

열심히 만든 python 파일을 이제 자동으로 매일 실행시키는 코드만 남았습니다!

Linux의 crontab을 이용하면 손쉽게 자동으로 프로그램을 실행시킬 수 있습니다.

sudo nano /var/spool/cron/crontabs/{사용자이름}

위 명령어를 치면

이런 화면이 나옵니다.

맨 마지막에 명령어를 보면

5 2 * * * /opt~~/python /home~~~/upload_test.py

위 처럼 되어 있는데 5 2 * * * 는 매일 2시 5분에 자동으로 뒤에 나온 명령어를 실행시키라는 명령어입니다.

그렇다면 실제 명령어는

/opt~~/python /home~~~/upload_test.py

이 명령어가 실행이 되는데 가상 환경을 쓰셨다면 가상 환경의 bin 폴더 내 python 위치 띄우고 아까 작성한 python 파일 위치를 지정하시면 매일 새벽 2시 5분에 체크리스트가 새로 추가되는 것을 확인하실 수 있습니다!

중간에 gdrive 명령어는 제가 엑셀에 적은 일정 내용을 자동으로 구글 캘린더랑 연동시키는 프로그램을 자동화한 건데 귀찮아서 안 쓰고 있습니다...


결론

컴퓨터를 실험 때문에 항상 켜 두는 입장이라 저는 이런 자동화 환경이 가능하지만 아닌 분들은 그냥 notion에 템플릿을 등록해두고 매일 추가해주시면 편할 거예요. 굳이 이렇게 귀찮다고 코딩하는 분들은 많이 없길 바랍니다!

'' 카테고리의 다른 글

2021-2학기 바뀐 안전교육 스킵하는 법  (0) 2021.12.17
Python 코드 스타일 업로드 테스트  (0) 2020.06.04

Introduction

안녕하세요 빵꾸아빠입니다.

딥러닝을 이용한 얼굴 인식 프로젝트를 진행하고 최종적으로 데모까지 만드는 과정을 글로 공유하고자 합니다.

사용하는 프로그래밍 언어는 Python을 사용하고 가상환경을 위하여 Anaconda3를 설치하여 Pycharm과 Linux를 통한 개발환경에서 프로젝트를 진행합니다.


준비물

코드 편집기(선택)

  • Visual Studio Code(추천) : 무료
  • Atom(잘 몰라요) : 무료
  • Pycharm(추천) : 학생은 무료

가상환경

  • Anaconda3 : 무조건 최신버전

서버 세팅

서버 원격 접속 세팅

  • 추후 추가 예정
  • Pycharm : 원격 접속
  • Putty : 원격 접속
  • Putty - tmux 세팅

파이썬 코드 업로드 테스트

 

import torch
import numpy as np

# Torch 버전 확인
print(torch.__version__)

# CUDA 동작 확인?
print(torch.cuda.is_available())

print("=================== 구분선 ====================")
# Torch 원하는 Shape 만들기 /rand 사용
# rand는 0부터 1사이의 랜덤한 소수점 4자리 만드는 듯

print(torch.rand(1,2)) # (3,6) 이면 size가 (3 x 6) 으로 표시 (행, 열)

print(torch.rand(1,2,3)) # 괄호가 있든 없든 아래와 같은 결과
print(torch.rand([1,2,3])) #[]든 ()든 상관 없다.
print(torch.rand((1,2,3))) # (1,2,3) 이면 size가 (1 x 2 x 3) 으로 표시

print(torch.rand((2,2,3))) # (n, 행, 열) (행, 열이 이미지라면 n은 이미지 개수)

# 더 늘어난다면?? (3,4,5,6)이라고 생각해보면 5x6 이미지가 4개가 묶여있는 것이 3개가 묶여있다!
print("=================== 구분선 ====================")
# 위의 값들은 Variable?일까?
print(torch.is_tensor(torch.rand(1,1)))

print("=================== 구분선 ====================")
# 일단 Tensor인걸로 결과도 FloatTensor로 나온다.
# 그럼 위의 값들은 cuda 사용되는 Tensor?
# CUDA는 아래방법을 쓰면 될듯
# dtype 을 정의해놓고 쓰자
dtype1 = torch.FloatTensor
dtype2 = torch.cuda.FloatTensor

a = torch.rand(1,2,3)
# a.fill_(3.5)    # 원하는 값으로 채워버리기

# a = a.add(4.0) #원하는 값 더해버리기
b = torch.rand(1,2,3)
c = torch.rand(2,2,3)
d = torch.rand(2,1,2,3)

# Variable 만들면서 텐서를 하나만 넣을 수 있다고함,
# Variable 은 autograd 안에 있음
# requires_grad는 뭔지 모르겠다.

print(torch.autograd.Variable(a.type(dtype1),requires_grad=False))
print(torch.autograd.Variable(a.type(dtype2)))  # 이러면 Cuda 사용하는 텐서
                                                # 근데 GPU 0이 지정된거 보면
                                                # GPU도 원하는 거 지정가능하지 않을까
# print(torch.autograd.Variable(a,a,a,a)) 이러면 error
print("=================== 구분선 ====================")

# TODO: Variable에서 Tensor로 변환
Test_Variable_to_Tensor =torch.autograd.Variable(a.type(dtype1))
print(Test_Variable_to_Tensor.data)

# TODO: Tensor에서 numpy로 변환
a_np = a.numpy()
print(a_np)
# TODO: Variable에서 numpy로 변환
print(Test_Variable_to_Tensor.data.numpy())

# TODO: numpy to Tensor to Variable
np_rand = np.random.rand(1,2,3)
print(np_rand)
np_to_tensor = torch.from_numpy(np_rand)
print(np_to_tensor)
np_to_Variable = torch.autograd.Variable(np_to_tensor.type(dtype1))
print(np_to_Variable)
print("=================== 구분선 ====================")
# 사칙연산

    # Tensor 영역

    # Variable 영역

t1 = torch.rand(1,2,3)
t2 = torch.rand(3,2,1)

t3 = torch.FloatTensor([[[1,2,3],[-1,-2,-3]]])  # size 1,2,3
t4 = torch.FloatTensor([[[1],[2]],[[3],[4]],[[5],[6]]])  # size 3,2,1

t5 = torch.rand(1,3,2)
t6 = torch.rand(2,3,2)
t7 = torch.rand(2,2,3)
print(t3, "t3", t4, "t4")
V1 = torch.autograd.Variable(t3.type(dtype1))
V2 = torch.autograd.Variable(t1.type(dtype1))
V3 = torch.autograd.Variable(t1.type(dtype2))
V4 = torch.autograd.Variable(t4.type(dtype1))
V5 = torch.autograd.Variable(t5.type(dtype1))
V6 = torch.autograd.Variable(t6.type(dtype1))
V7 = torch.autograd.Variable(t7.type(dtype1))
# Variable 덧셈
print(V1+V2) # 단순 덧셈 가능
print(torch.add(V1,2))  # 원하는 값 덧셈 가능

# Variable 덧셈 그냥 + Cuda
# print(V1+V3)    # CUDA와 그냥은 더할 수 없다!
# print(torch.add(V1+V3)) #이것도 마찬가지!

# GPU 영역의 Tensor, Variable들과 CPU 영역의 Tensor, Variable들과 연산 불가
# 따로 도는 건 가능한 듯 하다.

# Variable 곱셈
print(V1,V4, V1*V4) # error 발생 안함 why?
print(torch.mul(V1,V4))


    # 두 결과 모두 같은 결과를 보임
    # 두 결과는 [1 2 3]          [1 1 1]  확장을 해서 각 인스턴스별로 곱한 결과를 보임
    #          [-1 -2 -3]       [2 2 2]

# print(torch.matmul(V1,V4)) # error 발생 함   사이즈 오류 1x2x3와 3x2x1 인데 2x3과 2x1이 들어가는듯 맨 앞은 배치

# 위로 알아낸 사실은 matmul은 아마 2d matrix multiply이기 때문에 저런식으로 오류가 나는게 아닐까 싶다.

# 그러면 다음 size가 같은거 하면?
# print(torch.matmul(V1,V2)) # 마찬가지로 error 자동변환 ㄴㄴ

# Next 그러면 1x2x3과 1x3x2는 잘 동작하겠지?

print(torch.matmul(V1,V5))  # 결과물 1x2x2 잘 동작 한다.

# 그러면 1x2x3과 2x3x2는? 2x2x3과 2x3x2는?
print(torch.matmul(V1,V6))  # 결과물 2x2x2 잘 동작 한다. 이 경우 1x2x3을 각 1x3x2에 matmul하는 것이고
print(torch.matmul(V7,V6))  # 결과물 2x2x2 잘 동작 한다. 이 경우 각 1x2x3을 각 1x3x2에 matmul 하는 것?



# TODO: 1x2x3 이런식으로 3차원인경우 맨 앞 차원은 배치로 들어간다. 그렇다면 4차원인경우도 가능한가?

print("=================== 구분선 ====================")

#
# TODO : 원하는 Shape의 Vairable 만들기

+ Recent posts