앞서 ubuntu에 pytorch 환경을 설정했지만 SSH 콘솔을 통해 코딩 및 디버깅을 하기엔 어려움이 따른다.

 

그래서 구글링을 통해 pycharm pro에서 SSH interpreter를 활용하는 방법을 찾았다.

 

그러니까 뭔말이냐면,

 

내 컴퓨터가 너무 구리거나

 

혹은 너무 좋아서 (RTX 3000번대.. 현재 pytorch에서 암페어 아키텍처를 정식 지원 안해서 못쓴다고 보면 된다, github보면 어거지로 컴파일해서 돌리는 친구들 있는데 속도 안나온다, 괜히 고생하지 말자)

 

딥러닝 개발환경이 안된다면,

 

server의 컴퓨팅 자원을 활용해서 학습도 하고 코딩도 하고 싶은데,

 

디버깅이 편하려면 pycharm을 써야되는데,

 

ssh 콘솔 접속을 통해서 pycharm을 어떻게 써야하나 고민중에,

 

이를 해결할 수 있는 방법이란 얘기이다.

 

왜 pycharm pro를 써야하냐면 pro만 SSH interpreter 기능을 제공한다...

 

참고로 학생일 경우 pro가 1년간 무료로 제공된다.

 

물론 졸업했더라도 학교 이메일만 가지고 있으면 된다.

 

학교 이메일을 통해 계정을 activate할 수 있다.

 

(참고로 본인은 학교 메일로 윈도우와 오피스365를 이용하면서 감사함을 느끼고 있다)

 

www.jetbrains.com/ko-kr/community/education/#students

 

Free Educational Licenses - Community Support

Learn or teach how to code with best-of-industry tools from JetBrains. Free Educational Licenses for JetBrains' tools.

www.jetbrains.com

pycham pro를 실행하고 settings -> project interpreter -> add python interpreter -> SSH interpreter

 

host 및 username을 입력하자.

 

warning 창이 뜨지만 yes를 클릭하고 넘어가자.

 

password를 입력하자.

 

interpreter 폴더를 지정해야하는데 본인은 가상환경을 생성해서 진행하기 때문에

 

anaconda3/envs/venv_name/bin/python3

 

위의 경로로 지정했다.

 

그리고 path mappings에서 local 폴더 및 server 폴더를 지정한다.

 

deployment를 통해 파일 동기화를 수행하는 경로를 지정하는 것이다.

 

설정을 잘 맞췄다면 local에 있는 폴더 및 파일이 서버에 업로드되는 것을 확인할 수 있다.

 

pycharm pro에서 terminal 이용도 가능하다.

 

tools -> start SSH session -> 위의 설정한 host 선택

 

이로써 원격으로 코딩하고 디버깅할 수 있는 환경이 마련됐다.

 

하지만 실사용을 해보니 단점이 명확했다.

 

local의 dataset이 server에도 있어야하니 업로드 시간이 필요했고

 

반대로 추론 결과 및 weight 파일이 server에 저장되니 local로 다운로드가 필요했다.

 

역시 뭐든 local에서 돌리는게 가장 좋은 환경인거 같다.

 

pytorch에서 암페어 아키텍처를 지원하면 서버는 안쓸거 같긴하다.

 

서버 성능이 그렇게 좋은것도 아니고 (1080TI)

계속 windows에서만 작업하다가 ubuntu에서 작업할 일이 생겨서

 

부랴부랴 구글의 도움을 받아 세팅을 완료했다.

 

이전에도 ubuntu에서 작업했지만 좀 오래되서 다 까먹음..

 

서버를 제공받은터라 putty를 통해 세팅을 진행했다.

 

또한 cuda 10.1과 cuDNN 7.6.5로 version을 정한 이유는

 

google colab pro 및 pytorch를 사용중인데

 

거기서 사용하는 version이기 때문이다. (구글 형님 믿고 갑니다)

 

ubuntu는 설치되어있다고 가정하에 cuda 설치를 진행한다.

 

cuda 설치시 driver가 설치되기 때문에 따로 graphic driver를 설치하지 않아도 된다.

 

- 기존 driver 및 cuda가 설치되어 있을 시 제거

$sudo apt-get purge nvidia* && sudo apt-get autoremove && sudo apt-get autoclean && sudo rm -rf /usr/local/cuda*

 

- cuda 10.1 update 2 다운로드 및 설치

 

developer.nvidia.com/cuda-10.1-download-archive-update2?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=runfilelocal

 

CUDA Toolkit 10.1 update2 Archive

Select Target Platform Click on the green buttons that describe your target platform. Only supported platforms will be shown. Operating System Architecture Distribution Version Installer Type Do you want to cross-compile? Yes No Select Host Platform Click

developer.nvidia.com

위의 링크로 가면 Installation Instructions에 따라 다운로드 받고 설치할 수 있다.

 

- 설치가 잘 됐는지 version check

 

nvidia-smi or nvcc --version

 

- cuDNN 7.6.5 설치

nvidia 계정을 생성 및 로그인을 통해 cuDNN 7.6.5를 다운받자.

 

linux용으로 확장자가 solitairetheme8 라는 이름으로 되어있다.

 

아래 명령어로 압축을 해제하자.

$tar -xzvf cudnn-10.1-linux-x64-v7.6.5.32.solitairetheme8

그리고 아래의 명령어로 cudnn을 등록?하자.

$sudo cp cuda/include/cudnn.h /usr/local/cuda/include
$sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
$sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

- anaconda 설치

 

www.anaconda.com/products/individual

 

Anaconda | Individual Edition

Anaconda's open-source Individual Edition is the easiest way to perform Python/R data science and machine learning on a single machine.

www.anaconda.com

위의 링크에서 linux용으로 다운로드 받고 bash쉘로 실행시켜서 설치하자.

$bash ./Anaconda3-2020.07-Linux-x86_64.sh

 

- pytorch 설치

 

cuda 10.1용 pytorch를 설치하자.

$conda install pytorch torchvision torchaudio cudatoolkit=10.1 -c pytorch

 

- python을 실행해서 torch에서 cuda 설치가 잘 됐는지 확인하자.

import torch
torch.cuda.is_available()

설치에 이상이 없으면 True 값이 반환될 것이다.

machine learning을 위해서는 dataset을 train/val/test set으로 분할할 필요가 있다.

 

이유는 cs231n 강의 초반에 자세하게 나오지만,

 

간략하게 정리하면

 

training의 평가를 위함이다.

 

generization이 잘되야 좋은 model이라고 볼 수 있다.

 

본인은 보통 train/val/test의 비율을 75/15/10으로 분할한다.

 

그리고 class imbalance를 피하기위해 각 class별 data 비율도 중요하고

 

또 하나는 random으로 sampling을 해야한다는 것이다.

 

기존에는 dataset을 하나의 폴더에 모아놓고

 

powershell 명령어를 통해 분할했었다.

Get-ChildItem SomeFolder | Get-Random -Count $x | Move-Item -Destination SomeOtherFolder

SomeFolder가 dataset 폴더가 되고 $x에 빼내려는 이미지 개수, SomeOtherFolder가 val or test 폴더를 지정해서 분할했었다.

 

단점은 전체 이미지의 개수를 이용해서 비율대로 개수를 계산해서 수행해야한다는 것이다.

 

예를 들어, 전체 dataset이 1,000 장이면, val를 15%로 설정할 시에는 150을 $x에 계산해서 넣어줘야한다.

 

처음에 이런 식으로 진행했다가 최근 검색을 통해 손쉬운 방법을 찾았다.

 

python library를 활용하는 것이다. (파이선 짱짱맨)

pip install split-folders

일단 설치한다.

import splitfolders
splitfolders.ratio('input folder', output="output folder", seed=1337, ratio=(0.75, 0.15, 0.1))

'Data' 에는 전체 이미지가 모아져있는 폴더를 지정한다.

 

'output' 에는 출력 폴더를 지정한다.

 

위의 코드를 실행시키면 출력 폴더에 train/val/test folder가 생성된다.


2020-11-30 추가

쓸일이 있어서 해보니까 안되서

 

왜 안되나 도큐먼트 찾아보니까

 

input 폴더에 class 폴더가 또 있어야 된다(...)

 

그래서 그냥 폴더 하나 만들어서 split 하고

 

파일 옮기는걸로 했다.

 

그래도 편하긴 하네!

R-CNN 이전의 object detection에 사용되던 방법들은

 

hand-crafted feature에 기반하는 SIFT와 HOG와 같은 알고리즘이였다.

 

AlexNet 이후에 버클리 연구팀이 CNN을 이용하여

 

detection 분야에 R-CNN이라는 알고리즘을 만들었다.

 

R-CNN: Regions with CNN features

먼저 입력 이미지로부터 약 2,000개의 후보 영역을 설정한다.

 

후보 영역 설정은 selective search 방법을 사용한다.

 

selective search는 계층적 그룹핑 방법이며, region의 유사도를 따져서 반복적으로 통합하는 방법이다.

 

후보 영역을 설정하면 해당 영역을 모두 동일한 224x224 크기로 warping을 수행한다.

 

AlexNet 구조를 활용했기때문에 입력 크기를 224x224 크기로 통일했다. (위 그림 3번)

 

마지막 layer인 FC를 통해 feature vector를 얻으면

 

linear SVM loss를 이용하여 해당 후보 영역에 대한 클래스를 분류한다.

 

selective search로 추출한 bounding box는 부정확하기 때문에 선형 회귀(linear regression) 방법을 사용한다.

 

아래 수식에서 x, y, w, h는 x, y 좌표, width, height를 뜻한다.

 

P는 selective search의 bounding box 이고 G는 ground truth의 bounding box이다.

 

P를 G로 회귀하도록 학습하는것이 목표이다.

 

Bounding Box Regression

x, y, w, h를 각각 이동하는 함수들을 표현하면 아래와 같다.

 

x, y는 좌표이기 때문에 이미지 크기에 관계없이 위치만 이동시키면 된다.

 

width와 height는 이미지 크기에 비례하여 조정해야 한다.

 

이러한 특성을 적용하여 P를 G로 이동시키는 함수는 식 (1), (2), (3), (4)와 같다.

 

여기서 학습을 통해 얻으려는 함수는 d 함수이다.

 

R-CNN에서는 d 함수를 구하기 위해 pool5 layer에서 얻은 feature vector를 사용했다. 식 (5) 아래.

 

loss 함수인 식 (5)에서 t는

 

P를 G로 이동시키기위해 필요한 이동량을 의미하며 식 (6), (7), (8), (9)와 같다.

 

결국 pool5 layer에서 얻은 feature vector와 x, y, w, h를 조정하는 함수의 w를 곱해서

 

bounding box를 조정해주는 regression을 학습한다.

 

R-CNN은 여러 문제점이 있다.

 

입력 이미지의 크기를 224x224로 강제 warping 했기 때문에 이로 인한 성능 저하가 있을 수 있다.

 

약 2,000개의 후보 영역(region proposal)에 대해 순차적으로 CNN을 수행해야해서 학습시간이나 추론(inference)시간이 오래 걸린다.

 

특히 후보 영역 검출 방법이 병렬적인 처리가 빠른 GPU 사용에 적합하지 않았다.

 

selective search는 CPU를 이용하는 알고리즘이다.

 

SPPNet은 R-CNN의 문제를 해결하려고 했다.

 

AlexNet에서 convolutional layer는 sliding window 방식이기 때문에 입력 크기에 영향을 받지 않으며,

 

뒤에 오는 FC layer만 입력 이미지 크기에 영향을 받았다.

 

Distortion due to Warping

위 그림은 crop이나 warping을 하면 왜곡이 발생하는 것을 보여준다.

 

이 문제는 crop이나 warp 대신 conv layer를 거치고 spatial pyramid pooling을 수행함으로써 해결했다.

 

spatial pyramid pooling은 pyramid 연산을 통해 입력 이미지의 크기에 따라 대응할 수 있게 한다.

 

SPPNet은 BoW(Bag of Word) 개념처럼 여러 단계의 pyramid 레벨에서 얻을 수 있는 feature들을 FC layer의 입력으로 사용하고,

 

pyramid 출력을 영상의 크기에 관계없이 사전에 미리 정하면,

 

이미지의 크기에 제한을 받지 않게 된다.

 

BoW 개념이란, 특정 객체를 분류하는데 굵고 강한 특징에 의존적인게 아닌

 

여러개 작은 특징을 사용하여 객체를 잘 구별할 수 있다는 것이다.

 

spatial pyramid pooling은 직전 conv layer 결과를 여러 단계의 pyramid로 나누고,

 

여러 단계에서 얻어진 결과를 concat하여 FC layer의 입력으로 사용한다.

 

여러 단계의 예시를 들면,

 

1단계는 1x1 pooling, 2단계는 2x2 pooling, 3단계는 4x4 pooling 이런식으로 spatial bin이라고 불리는 총 M개의 영역으로 나눈다고 볼 수 있다.

 

아래 그림을 보면 좀 더 쉽게 이해할 수 있다.

SPPNet

+ Recent posts