안경잡이개발자

728x90
반응형

  깃허브(GitHub)는 단순히 아이디, 비밀번호를 입력하여 인증하는 방식을 없애고 있는 추세다. 물론 GitHub 공식 웹 사이트에 로그인할 때는 ID와 비밀번호를 입력한 뒤에 SMS 인증을 진행하여 로그인할 수 있다. 하지만, 별도로 리눅스 서버에서 이따금 내 GitHub 계정의 비공개(private) 저장소의 코드를 가져올 때(Pull)는 단순히 아이디와 비밀번호로는 가져올 수 없다. 단순히 아이디와 비밀번호를 입력해 로그인하는 경우에는 다음과 같은 오류가 등장한다.


  "Can't connect to any URI: ..."

  이럴 때는 Personal Access Token을 이용해 인증을 진행하면 된다. ID와 비밀번호 대신에 ID와 Personal Access Token을 이용하는 방식인데, 그냥 저장소(repository)의 코드를 불러올 때 비밀번호 입력하는 칸에 Personal Access Token을 입력하면 된다. 굉장히 간단하다.

 

※ Personal Access Token 생성 방법 ※

 

  Personal Access Token을 새롭게 생성하는 방법은 간단하다. GitHub에 접속한 뒤에 [Settings] 페이지로 이동한다.

 

 

  이후에 [Developer settings] 페이지로 이동한다.

 

 

  그리고 다음과 같이 [Pesonal access tokens] 페이지로 이동하면 된다. 참고로 아래 링크를 클릭하여 바로 접근할 수도 있다.

 

  ▶ Pesonal Access Token 페이지 경로: https://github.com/settings/tokens

 

GitHub: Where the world builds software

GitHub is where over 65 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

 

  이후에는 다음과 같이 [Generate new token] 버튼을 눌러 새로운 토큰(token)을 생성하면 된다.

 

 

  이후에 다음과 같이 토큰의 이름과 토큰의 범위(scope)를 설정한 뒤에 토큰을 생성하면 된다. 간단히 private repository에 접근하고 관리할 수 있는 권한을 주기 위해서는 [repo]에 체크하면 된다. 또한 만료(expiration) 기한을 설정할 수 있는데, 단순히 무기한으로 설정하는 것은 보안상의 이슈가 존재할 수 있다. 따라서 실제로 해당 토큰이 필요한 기간을 계산하여 생성할 필요가 있다.

 

 

  토큰이 생성되면 다음과 같이 토큰(token) 문자열을 복사한 뒤에 별도로 저장해 두고 있으면 된다. 참고로 토큰은 단 한 번만 출력되기 때문에, 생성 직후에 토큰 문자열을 저장해 두지 않으면 해당 토큰(token)을 다시 확인할 수 없다. 따라서 꼭 토큰 문자열을 복사하여 별도의 파일로 저장해 두자.

 

 

  결과적으로 이렇게 만들어진 토큰(token)을 비밀번호(password) 대신 입력하여 로그인을 진행할 수 있다.

 

※ Personal Access Token 삭제하는 방법 ※

 

  삭제할 때는 마찬가지로 [Personal access tokens] 페이지로 접속한 뒤에 [Delete] 버튼을 누르면 된다.

 

728x90
반응형

Comment +0

728x90
반응형

  일반적으로 특정한 딥러닝 관련 팀에 소속되어 GPU 서버에 접속하게 되면, 개발 환경 구축(Python 라이브러리 설치 및 Jupyter Notebook 설정 등) 과정이 필요하다. 자신만의 서버 컴퓨터를 직접 조립 및 설정하는 경우도 있지만, 일반적인 경우에는 이미 다른 사람이 구축해 놓은 GPU 서버(server)에 접속하여 이용하게 된다.

※ 서버 정보 확인 ※

 

  일단 서버에 접속한 뒤에는 기본적인 서버 환경을 알아야 한다.


  * cat /etc/issue: Ubuntu 서버 버전 확인
  * nvidia-smi: GPU 그래픽 카드 사용 현황 확인


  nvidia-smi 명령어를 이용했을 때 서버에 NVIDIA 드라이버가 설치되어 있다면, 정상적으로 GPU 정보가 출력된다. 참고로 CUDA의 버전도 알려준다. (예를 들어 11.2와 같은 버전 정보) CUDA를 설치할 때 이러한 정보를 참고하면 된다.

 

  또한 nvidia-smi를 입력하면, 현재 GPU 기기의 정보를 확인할 수 있다. 예를 들어 자신의 GPU 서버에 Tesla V100이 4개 있다면, 각 GPU에 대하여 얼마나 사용되고 있는 상태인지 점검이 가능하다. 또한 특정한 코드를 실행한 뒤에 실시간으로 GPU 사용량을 확인하고자 한다면, watch nvidia-smi를 입력하면 된다. 물론 다른 사람이 사용하고 있는 GPU 서버라면, 이미 그래픽 드라이버 설정이 완료되어 있을 가능성이 높다.

※ CUDA 설치 ※

  기본적으로 그래픽 드라이버가 설치되어 있다면, nvidia-smi를 입력했을 때 결과가 정상적으로 나온다. 이후에는 CUDA를 설치하면 된다. 다양한 버전을 설치해 놓고 사용하는 경우도 많기 때문에, 설치 방법에 대해서 알고 있는 것이 좋다. 기본적으로 CUDA가 이미 설치되어 있다면, 다음과 같이 입력했을 때 CUDA의 버전이 나온다.

  ▶ 설치된 CUDA 버전 확인: cat /usr/local/cuda/version.txt

  예를 들어 Ubuntu 18.04를 쓰고 있는 서버라면, CUDA를 설치하기 위해 다음과 같이 NVIDIA의 repository를 가장 먼저 추가한다.

 

sudo apt install sudo gnupg
sudo apt-key adv --fetch-keys "http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub"
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-cuda.list'
sudo sh -c 'echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-machine-learning.list'
sudo apt update


  이제 실질적으로 CUDA 및 cuDNN을 설치한다. 다음과 같이 CUDA 10.1 버전으로 Toolkit을 설치할 수 있다.

sudo apt-get install cuda-10-1
sudo apt-get install libcudnn7-dev


  설치 이후에는 다음의 명령어로 설치가 정상적으로 이루어졌는지 버전을 확인할 수 있다.

  ▶ CUDA 버전: cat /usr/local/cuda/version.txt
  ▶ cuDNN 버전: cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2

※ Anaconda 설치 ※

  이후에 Anaconda를 설치할 수 있다. 다음과 같이 아카이브(archive)에 방문하여, 최신 버전의 Anaconda를 설치할 수 있다. 혹은 자신이 원하는 버전을 설치해도 된다.

 

wget https://repo.anaconda.com/archive/Anaconda3-2021.05-Linux-x86_64.sh
bash Anaconda3-2021.05-Linux-x86_64.sh

 

  하지만 Anaconda의 경우에는 라이센스를 확인하고 설치를 진행할 필요가 있다. 특히나 규모가 큰 팀에서 딥러닝을 하는 상황이라면, 라이센스에 유의할 필요가 있다. (Anaconda는 현재 조건부 유료화를 진행한 상황이기 때문이다.) 또한 필요시 다음과 같이 입력한다.

source ~/.bashrc


  설치가 완료되면 Conda 가상환경을 만들면 된다.

conda create -n mine python=3.7


  만들어진 뒤에 가상환경으로 접속한다.

conda activate mine


  접속한 상태에서는 다음과 같이 PyTorch를 설치하면 된다.

conda install pytorch torchvision cudatoolkit=10.1 -c pytorch


  가상 환경에서 나올 때는 다음과 같이 한다.

conda deactivate

 

 

  참고로 만들어진 가상환경들은 다음과 같이 확인할 수 있다.

 

conda info --envs


  삭제하고자 하는 가상환경은 다음과 같이 삭제하면 된다.

conda remove --name mine --all


  참고로 Anaconda 자체를 통째로 삭제할 때는 다음과 같이 한다. 가장 먼저 base 가상 환경에 접속한다. 이후에 다음과 같이 입력한다.

conda install anaconda-clean
anaconda-clean --yes


  이후에 anaconda 폴더 자체를 완전 삭제할 수 있다.

rm -rf ~/anaconda3
rm -rf ~/.anaconda_backup


  추가적으로 .bashrc와 같은 파일에서 anaconda 관련 내용을 모두 제거한다.

※ PIP 설치 ※

  파이썬 패키지 관리 시스템(PIP) 또한 설치한다.

 

sudo apt install python3-pip
pip3 --version

sudo apt install python-pip
pip --version


※ Python 가상환경 virtualenv 사용 ※

  그리고 굳이 Anaconda를 사용하지 않고, virtualenv로 가상환경을 관리할 수도 있다. 필자의 경우 virtualenv를 애용한다.

 

pip install virtualenv
pip3 install virtualenv


  참고로 virtualenv를 설치하기 위해서는, 우분투 18.04에서는 다음과 같이 설치해야 할 수도 있다.

sudo apt-get install python-virtualenv


  설치 이후에는 다음과 같이 가상환경을 만든다.

python3 -m virtualenv mine


  그리고 다음과 같이 가상환경에 접속한다.

source mine/bin/activate


  이후에 필요한 라이브러리를 설치한다.

pip3 install torch torchvision
pip3 install matplotlib
pip3 install opencv-python
pip3 install scipy
pip3 install scikit-learn


  참고로 논문을 작성한 뒤에 코드를 공유할 때는, 해당 환경에서의 패키지 리스트를 저장할 필요가 있다. 다음과 같이 내보내기가 가능하다.

pip3 freeze > requirements.txt


  가상 환경에서 나갈 때는 다음과 같이 한다.

deactivate


※ PyTorch 설치 확인 ※

  이제 PyTorch가 정상적으로 설치되었는지 확인한다. 하나의 파이썬 파일 check.py를 만들어 다음과 같이 입력한다.

 

import torch

a = torch.FloatTensor([1, 2, 3]).cuda()
print(a)


  python3 check.py를 입력하여 실행해 보자. 정상적으로 PyTorch를 불러오는지 확인하면 된다. 마찬가지로 코드를 실행할 때, 미리 watch nvidia-smi를 이용해 정상적으로 GPU를 사용하는지 확인할 수 있다.

※ Jupyter Notebook 설치 및 접속 ※

  이후에 Jupyter Notebook을 사용하고 싶다면, 다음과 같이 가상환경에 접속한 뒤에 jupyter를 설치하면 된다.

 

source mine/bin/activate
pip3 install jupyter


  참고로 Visual Studio Code에서 Remote SSH를 이용하는 경우에는, 자동으로 포트포워딩을 해준다. 따라서 단순히 Visual Studio Code를 실행한 뒤에 Jupyter를 실행한 뒤에 주어진 URL 주소로 접속하여 코드를 작성할 수 있다.

  또한 Jupyter 자체를 계속 켜 두는 방법으로는 screen을 이용할 수 있다. 그리고 Jupyter Notebook에서 노트북 코드를 생성한 뒤에 반복문 코드를 실행한 뒤에 새로고침을 해도, 기본적으로 실행 중인 셀은 백그라운드에서 계속 실행된다. 나중에 Jupyter에서 [Running] 탭으로 돌아온 뒤에, 실행 중인 셀의 다음 셀의 내용을 실행하면 된다. 만약 이전 셀이 아직 백그라운드에서 종료되지 않았다면, [Interrupt] 이후에 코드를 실행하면 된다.

 

  Python 코드상으로 오랜 기간 학습해야 할 때에도 screen을 이용하면 된다. 필자의 경우 500GB 이상의 큰 데이터셋 다운로드 및 오랜 기간 학습을 해야 할 때는, screen을 이용해 세션(session)을 열어서 작업을 진행한다.

728x90
반응형

Comment +0

728x90
반응형

  CheXpert 데이터셋은 스탠포드(Standford) 대학교에서 연구 목적으로 공개하는 Chest X-rays 데이터셋이다. 본 데이터셋은 말 그대로 흉부 X-ray 데이터셋으로, X-선 검사를 이용해 촬영한 이미지로 구성되어 있다. X-ray를 활용한 신체검사를 받아 본 분들은 알겠지만, 일반적으로 흉부 X-ray 이미지는 정면과 측면 2장을 찍는 경우가 많다.

 

  흉부 방사선 검사는 간단한 검사이지만, 심장의 크기/모양 및 폐혈관의 크기 및 폐부종 여부를 확인하는 데에 도움을 준다는 장점이 있다. 자동으로 흉부 방사선 이미지해석(interpretation)할 수 있는 기술에 대한 수요가 많아지고 있으며, 최근에는 실제로 의사들의 의사결정을 돕기 위해 인공지능을 활용하는 경우가 많아지고 있다. 

 

 

  ▶ CheXpert 데이터셋 소개: https://aimi.stanford.edu/chexpert-chest-x-rays

  ▶ CheXpert 대회(competition) 소개: https://stanfordmlgroup.github.io/competitions/chexpert/

 

  스탠포드(Standford)에서 제공하는 CheXpert 데이터셋은 총 65,240명의 환자(patient)로부터 얻은 224,316개의 흉부 방사선(chest radiograph) 이미지로 구성되어 있다. 각 이미지는 기본적으로 진단 결과 보고서(reports) 정보와 함께 확인 가능하다. CheXpert는 데이터셋의 크기가 크고, 비교를 위해 전문가의 성능 지표를 함께 제공한다.

 

  일반적으로 CheXpert는 데이터셋을 두 개로 나누어 사용한다. 하나는 original 버전이고, 하나는 small 버전이다. small 버전의 경우 320 X 320 크기의 해상도를 갖는다. 실제 논문을 확인해 보면, 각 방사선 촬영 이미지의 크기를 320 X 320으로 변형한 뒤에 분류 모델을 학습하고 평가를 진행한 것을 알 수 있다.

 

※ CheXpert 데이터셋 다운로드 방법 ※

 

  아래 사이트에 접속하여 아래쪽을 확인해 보자.

 

  https://stanfordmlgroup.github.io/competitions/chexpert/

 

CheXpert: A Large Dataset of Chest X-Rays and Competition for Automated Chest X-Ray Interpretation.

How well does the baseline model do on the test set? The model achieves the best AUC on Pleural Effusion (0.97), and the worst on Atelectasis (0.85). The AUC of all other observations are at least 0.9. On Cardiomegaly, Edema, and Pleural Effusion, the mode

stanfordmlgroup.github.io

 

  라이센스에 대한 설명이 있는데, 라이센스를 잘 읽고 아래와 같은 양식(form)을 채워 넣어서 [등록(Register)]을 진행할 수 있다. 결과적으로 등록을 진행하고 나면 다운로드 링크가 나온다.

 

 

  다운로드 링크를 확인한 뒤에는 곧바로 링크를 눌러 다운로드할 수 있지만, 리눅스(Linux) 환경에서는 wget을 이용하여 다운로드를 진행하는 것을 추천한다.

 

sudo wget -O CheXpert-v1.0-small.zip "CheXpert small 버전 다운로드 링크"
sudo wget -O CheXpert-v1.0.zip "CheXpert original 버전 다운로드 링크"

 

  다운로드 이후에는 다음과 같이 압축을 풀어줄 수 있다.

 

sudo unzip CheXpert-v1.0-small.zip
sudo unzip CheXpert-v1.0.zip

 

  참고로 original 데이터셋의 경우 크기가 500GB에 가까우므로, wget으로 다운로드받는 동안 세션을 계속 유지하기 어려울 수 있다. 따라서 리눅스 환경에서는 screen을 사용하는 것이 좋다. 예를 들어 다음과 같이 CheXpert_download라는 이름으로 세션(session)을 생성할 수 있다.

 

screen -S CheXpert_download

 

  이후에 다음과 같이 입력하여 다운로드를 진행한다.

 

sudo wget -O CheXpert-v1.0.zip "CheXpert original 버전 다운로드 링크"

 

  screen에서 세션을 유지한 채로 나가려면 ctrl + a를 입력한 뒤에, d를 누른다. 그러면 (detached)라는 메시지가 출력되고, 스크린 밖으로 빠져나올 수 있다. 현재 존재하는 screen 목록을 볼 때는 screen -list를 누르면 된다. 다시 해당 세션으로 접속할 때는 screen 명령어의 r 옵션을 사용하면 된다.

728x90
반응형

Comment +0

728x90
반응형

  비주얼 스튜디오 코드(Visual Studio Code)는 대표적인 소스코드 에디터(editor)다. C/C++, Python을 포함해 다양한 프로그래밍 언어로 소스코드를 작성할 때 매우 편리하게 사용할 수 있다. 또한 기본적으로 회사에서도 무료로 사용할 수 있다는 점에서, 회사에 다니는 많은 프로그래머들이 Visual Studio Code를 이용한다. Visual Studio Code는 다음의 홈페이지에 접속하여 설치를 진행할 수 있다.

 

※ Visual Studio Code 설치 ※

 

  ▶ Visual Studio Code 홈페이지: https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

  접속 이후에는 [Download for Windows] 버튼을 눌러 설치 프로그램을 다운로드할 수 있다.

 

 

  Visual Studio Code를 설치할 때 기본(default) 설정으로 설치를 진행할 수 있다.

 

 

  설치 이후에는 다음과 같이 [Welcome] 탭이 등장한다.

 

 

※ 확장 프로그램 설치 ※

 

1. Python 확장 프로그램

 

  기본적으로 자주 사용되는 확장 프로그램들을 설치하면 좋다. 필자의 경우 메인으로 사용하는 프로그래밍 언어가 Python이므로 일단 Python 확장 프로그램(extension)을 설치했다. 사전에 파이썬이 설치되어 있어야 한다.

 

 

2. C/C++ 확장 프로그램

 

  참고로 C/C++ 개발 환경을 설치하고 싶다면, MinGW를 다운로드한다.

 

  ▶ MinGW 설치 경로: https://sourceforge.net/projects/mingw/

 

MinGW - Minimalist GNU for Windows

Download MinGW - Minimalist GNU for Windows for free. A native Windows port of the GNU Compiler Collection (GCC) This project is in the process of moving to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the G

sourceforge.net

 

  MinGW Installation Manager에서는 다음과 같이 필요한 패키지를 선택하여 설치한다. 최종적으로 설치를 진행할 때는 [Installation] - [Apply Changes] - [Apply]를 누르면 된다.

 

 

  이후에 시스템 환경 변수로 설치된 MinGW의 bin 폴더를 지정한다.

 

 

  이후에 [C/C++] 확장 프로그램을 설치한다.

 

 

  이후에 다음과 같이 예제 코드를 작성한다.

 

 

  코드 작성 이후에 [F5]를 눌러서 디버깅을 진행할 수 있다. 이때 C++ (GDB/LLDB)를 선택할 수 있다.

 

 

  이후에 앞서 설치한 MinGWg++.exe를 선택하여 디버깅을 진행할 수 있다. 참고로 경로에 한글이 포함되어 있다면 "Unable to start debugging. Program path..."라는 내용의 오류가 발생할 수 있다.

 

 

  또한 C++로 작성된 프로그램을 빌드할 때는 단순히 [Ctrl + Shift + B]를 눌러 빌드를 진행하면 된다. 이후에 생성된 .exe 파일을 터미널(terminal)에서 실행할 수 있다.

 

 

3. Java 확장 프로그램

 

  Java의 경우 JDK를 설치해야 한다. 필자는 Oracle JDK 14를 업무용이 아닌 개인 컴퓨터에 설치했다.

 

  ▶ Oracle JDK 14 링크: https://www.oracle.com/java/technologies/javase/jdk14-archive-downloads.html

 

 

  이후에 시스템 환경 변수로 등록한다.

 

  시스템 변수명: JAVA_HOME / 경로: C:\Program Files\Java\jdk-14.0.2

  시스템 변수명: JDK_HOME / 경로: C:\Program Files\Java\jdk-14.0.2

 

  이후에 PATH 시스템 변수에 %JAVA_HOME%\bin 경로를 추가한다. 이제 Visual Studio Code에서 [Extension Pack for Java]를 검색하여 설치한다.

 

 

  확장 프로그램이 설치된 이후에는 다음과 같이 Main.java 파일을 만들어 [Run]으로 프로그램을 실행해 볼 수 있다.

 

 

4. 원격 SSH 확장 프로그램

 

  또한 별도로 특정한 서버에 접속하여 코드를 작성하는 경우에는 [Remote - SSH] 또한 설치하면 좋다.

 

 

  설치 이후에는 [F1]을 누르고, "Remote-SSH: Connect to Host..."를 검색하여 원하는 호스트(host)에 접속할 수 있다. 리눅스 서버에 접속하는 경우, configuration 정보를 생성한 뒤에 리눅스(Linux)로 선택하여 접속을 진행하면 된다. 추가적인 정보는 관련 문서(https://code.visualstudio.com/docs/remote/ssh)에서 확인할 수 있다.

 

 

  접속 이후에는 터미널(terminal) 탭을 열어서 다양한 리눅스 명령어를 입력하는 것이 가능하기 때문에, 필자가 업무를 처리할 때는 추가적으로 Putty나 XShell 같은 프로그램을 사용하지 않아도 크게 어려움이 없는 것 같다. 다시 말해 개인적으로 Visual Studio Code에서의 Remote-SSH를 이용하는 것만으로도 굉장히 편리하게 많은 업무를 할 수 있었다.

 

※ 알아두면 좋은 단축키들 ※

 

  ▶ 에디터 창 분할하는 방법: Ctrl + \

  ▶ 선택한 영역을 자동 코드 정리: Ctrl + K + F

  ▶ 좌측 사이드바 토글: Ctrl + B

  ▶ 하단 패널(panel) 토글: Ctrl + J

  ▶ 디버그: F5

728x90
반응형

Comment +0

728x90
반응형

※ 개인적으로 공부하면서 작성한 글이라서 잘못된 정보가 포함되어 있을 수 있습니다. ※

 

※ 건강보험료란? ※

 

  건강보험이란 일종의 보험으로, 의료비용을 지불해주는 역할을 수행한다. 우리가 병에 걸려서 고액의 진료비가 발생한다면, 개인의 입장에서는 과도하게 큰 부담이 될 수 있을 것이다. 그래서 국민들이 건강보험료를 납부하고, 국민건강보험공단이 이를 관리하다가 필요할 때 보험급여를 제공하는 제도다.

 

  건강보험 대상자에는 건강보험을 직접 내는 사람도 포함되지만, 피부양자도 포함된다. 예를 들어 우리가 학생일 때는 우리가 피부양자가 된다. 가장 흔한 케이스를 생각하면 부모님께서 직장에 다니면서 건강보험료를 납부하게 된다. 이러한 경우에 우리는 학생 신분이지만 부모님의 밑에 피부양자로 들어가 있기 때문에, 건강보험의 혜택을 받게 된다.

 

  건강보험료는 일반적으로 두 가지 유형으로 납부하게 된다.

 

  ▶ 직장가입자: 회사에 다니는 직장인, 공무원 및 교직원들은 일반적으로 직장가입자에 해당한다. 쉽게 말하면, 우리가 회사에 다니면 4대 보험에 가입이 될 건데, 거기에 건강보험이 포함된다. 직장인의 경우 건강보험료의 절반은 회사가 내주고, 나머지 절반은 가입자 본인이 납부하게 된다.

  ▶ 지역가입자: 직장가입자가 아닌 개인사업자, 프리랜서 등이 일반적으로 지역가입자에 해당한다. 기본적으로 개인사업자는 건강보험료 산정에 있어서 소득, 재산, 자동차를 고려한다. 당연히 소득과 재산이 클수록 많은 건강보험료를 납부하게 된다.

 

  참고로 휴직자의 경우 건강보험료를 경감해주거나, 특수한 경우에 따라서 경감 혹은 면제되는 경우가 있기 때문에, 이에 대해서도 알아 보면 좋다. 그리고 앞서 언급했듯이 직장인의 경우 매월 급여에서 건강보험료를 회사와 절반씩 나눈다. 일반적으로 인사팀이 해결해주기 때문에, 직장인이라면 크게 신경을 쓰지 않는 것 같다. 하지만 퇴직 이후에는 피부양자로 등록되지 않는 이상 건강보험료가 많이 부담스러워질 수 있다. 그래서 전반적으로 지역가입자의 경우에 특히 더 건강보험료를 효율적으로 처리하기 위해 많이 신경쓰게 되는 것 같다.

 

  참고로 부모님 등 다른 가족 구성원을 피부양자로 등록할 때에도 신경쓸 내용이 있다. 바로 피부양자의 자격 요건에 대해서 확인하는 것이다. 기본적으로 배우자, 부모님, 자녀 등이 기본적인 부양 요건이 된다. 또한 소득이 적어야 피부양자가 될 수 있다. 참고로 사업자 등록을 한 사람이라면, 사업소득이 조금이라도 있으면 피부양자가 될 수 없다. 또한 재산 요건도 있기 때문에, 재산이 많은 사람은 피부양자가 될 수 없다.

 

※ 건강보험료 조회 방법 ※

 

  국민건강보험공단 홈페이지에 접속하여 건강보험료 관련 업무를 처리할 수 있다.

 

  ▶ 국민건강보험공단 홈페이지: https://www.nhis.or.kr/nhis/index.do

 

  건강보험료를 조회하고 싶다면, 다음과 같이 [보험료 조회/납부] 페이지에 접속한다. 이후에 공인인증서(공동인증서)로 로그인을 진행하면 된다.

 

 

  1. 개인사업자(지역보험료에 해당)인 경우

 

  개인사업자 등으로 일을 해서 지역보험료에 해당했다면, [지역보험료 조회] 페이지로 이동한 뒤에 기간을 입력하고 [조회]를 진행하면 된다. 그러면 다음과 같이 조회 결과가 나오는데, 원하는 달을 선택하여 [상세내역]을 조회할 수 있다.

 

 

  [상세내역]을 조회하면 다음과 같이 어떠한 기준으로 해당 금액만큼 고지하였는지 확인할 수 있다. 지역가입자의 경우 소득 및 재산에 따라서 점수를 부여하고, 해당 점수를 기준으로 지역보험료를 부과하게 된다.

 

 

  2. 직장인(직장보험료에 해당)인 경우

 

  직장보험료에 해당하는 사람은 [직장보험료 조회] 페이지에 들어가서 조회하면 된다.

 

 

※ 미납된 건강보험료 납부 방법 ※

 

  미납된(연체된) 건강보험료를 납부하고자 할 때는 [보험료납부] 페이지에 접속한 뒤에, 미납된 내역 중에서 내고자 하는 달을 선택하여 납부를 진행하면 된다. 만약에 밀린 모든 달에 대하여 한꺼번에 납부하고자 한다면, (완납)을 선택하여 납부한다.

 

728x90
반응형

Comment +0

728x90
반응형

※ 개인적으로 알아보고 쓴 글이며, 잘못된 정보가 포함되어 있을 수 있습니다. ※

 

※ 코로나 상생 국민지원금 소개 ※

 

  코로나19 장기화로 어려움을 겪는 국민을 위해 코로나 상생 국민지원금이 지급된다. 코로나 상생 국민지원금은 기본적으로 건강보험료를 기준으로 대상 여부를 결정한다. 예를 들어 1인 가구의 경우 건강보험료가 17만 원이 넘어가면 국민지원금을 받을 수 없다. 온라인 신청 및 지급 기간은 2021년 09월 06일부터 2021년 10월 29일까지다. 기본적으로 1인당 25만 원을 지급한다.

 

※ 코로나 상생 국민지원금 지원 대상자 확인 ※

 

  코로나 상생 국민지원금을 받을 수 있는지의 여부는 [대상자 조회]를 통해 알 수 있다. 각종 카드사 홈페이지에서도 조회할 수 있지만, 간단히 국민건강보험공단 홈페이지에 방문하여 조회할 수 있다.

 

  ▶ 국민건강보험 홈페이지: https://www.nhis.or.kr/nhis/index.do

 

국민건강보험

이벤트 1 / 8

www.nhis.or.kr

 

  사이트에 접속하면 다음과 같이 [국민지원금 대상 여부 조회하기] 버튼을 눌러 조회할 수 있다.

 

 

  다음과 같이 국민지원금 [조회하기] 버튼을 누르면 된다.

 

 

  이후에 공인인증서로 로그인을 해주고 코로나19 상생 국민지원금 [조회]를 진행할 수 있다.

 

 

  이후에 다음과 같이 건강보험료 정보와 함께 [국민지원금 지급 대상 여부]가 출력된다. 만약 건강보험료 선정기준을 초과하는 경우에는 다음과 같이 "국민지원금 지급 대상이 아닙니다."라는 메시지가 출력된다.

 

 

※ 코로나 상생 국민지원금 이의신청 ※

 

  국민지원금 지급 대상이 아닌 사람들은 이의신청을 진행할 수 있다.

 

  ▶ 코로나 상생 국민지원금 이의신청: https://www.epeople.go.kr/nsf/Intro.html

 

국민지원금 이의신청

입양 전 아동, 시설에 거주하는 영유아, 대리양육 아동 등의 경우, 아동복지법상 시설장이나 대리양육자 등에 상당하는 사람이 증빙서류*를 제출하여 이의신청하실 수 있습니다. * 증빙서류는

www.epeople.go.kr

 

  이의신청 홈페이지에 접속한 뒤에 [이의신청 진행하기] 버튼을 클릭한다.

 

 

  이의신청은 본인인증을 수행한 뒤에, 다음과 같이 신청서를 작성하여 제출하는 방식으로 진행된다. 

 

 

※ 코로나 상생 국민지원금 신청 방법 ※

 

  자신이 신청 대상자에 해당한다면, 온라인 신청이 가능하다. 지역사랑상품권, 신용·체크카드 충전 방식 등으로 신청이 가능하다. 먼저 신용카드 및 체크카드로 국민지원금을 받고자 한다면, 아래와 같이 자신이 사용하고 있는 카드사 홈페이지에 접속하는 것이 좋다. 카드사 홈페이지에 접속하면 국민지원금 신청 관련 안내 문구가 나오므로, 단순히 안내에 따라서 신청을 진행하면 된다.

 

  ▶ 농협카드: https://card.nonghyup.com/

  ▶ 우리카드: https://pc.wooricard.com/dcpc/main.do

 

  또한 지역사랑상품권으로 받는 것이 가능하다. 지역사랑상품권의 경우 앱(app)을 이용해서 신청할 수 있다. 관련 내용은 지역별 지역사랑상품권 홈페이지에 접속해 확인할 수 있다.

 

  ▶ 경기도 지역사랑상품권: https://www.gg.go.kr/

  ▶ 서울특별시 지역사랑상품권: https://www.seoul.go.kr/main/index.jsp

728x90
반응형

Comment +0

728x90
반응형

  OBS대표적인 방송 및 녹화 프로그램이다. 실제로 유튜브(YouTube) 활동을 하고 있는 많은 사람들이 OBS를 이용해 방송과 녹화를 진행하고 있다. 이번 포스팅에서는 OBS를 다운로드하여 설치한 뒤에, 기본적인 방송/녹화 설정을 진행하는 방법에 대해 소개할 것이다. OBS는 다음의 경로에서 설치할 수 있다.

 

  ▶ OBS 다운로드: https://obsproject.com/ko/download

 

내려받기 | OBS

OBS Studio을 사용할 수 있는 윈도우 버전은 8, 8.1 그리고 10입니다.

obsproject.com

 

  OBS 공식 웹 사이트에 방문한 뒤에 [인스톨러 내려받기]를 눌러 설치 프로그램을 다운로드할 수 있다.

 

 

  이후에 다음과 같이 설치 프로그램을 실행하여 [Next]를 눌러 설치를 진행할 수 있다.

 

 

  결과적으로 [Install] 버튼을 눌러 설치를 진행하면 된다.

 

 

  OBS가 설치되고 나면 [Launch]에 체크한 뒤에 [Finish]를 눌러 설치를 마치고, OBS를 실행할 수 있다.

 

 

  OBS가 처음 실행되면 프로그램의 사용 목적을 묻는다. [방송 최적화, 녹화는 부차적으로 사용]을 눌렀다. 이렇게 선택하더라도, 녹화를 진행하는 데에는 큰 문제가 없다. 필자의 모니터는 UHD 3840 X 2160의 해상도를 가지지만, 기본적으로 HD (1920 X 1080)으로 녹화를 진행하게 되었다.

 

 

  이후에 방송 정보를 넣는다. 자신이 사용하는 방송 서비스를 선택하면 된다. YouTube에서 방송하는 경우, YouTube에 로그인한 뒤에 자신의 방송용 [스트림 키]를 복사하여 OBS에 붙여넣으면 된다. 방송 설정이 매우 간단하다. 참고로 스트림 키는 다른 사람에게 노출하면 안 된다.

 

 

  다음과 같이 스트림 키를 넣은 뒤에, [다음] 버튼을 누르면 검사가 완료된다. 필자의 경우 출력 해상도가 1280 X 720으로 조정되었는데, 이는 나중에 다시 1920 X 1080으로 바꿀 수 있다.

 

 

  필자는 바로 [설정] - [비디오] 탭으로 이동하여 출력 해상도를 1920 X 1080으로 다시 변경했다.

 

 

  이후에 [출력] 탭으로 이동하여, 녹화 형식을 [mp4]로 변경했다.

 

 

  이후에 [오디오] 탭으로 이동하여 마이크를 설정했다. 필자는 사용 중인 Yeti 마이크를 설정했다.

 

 

  이후에 [일반] 탭으로 이동하여 추가적인 설정을 진행했다. 필자는 [방송 시 자동으로 녹화][방송을 시작할 때 대화 상자 표시] 버튼을 눌렀다. 개인 방송하시는 분들이 일반적으로 많이 설정하는 부분이기도 하다.

 

 

  이제 화면이 보이도록 하기 위해 [소스 목록][디스플레이 캡처]를 추가하도록 하자.

 

 

  디스플레이를 추가한 뒤에 다음과 같이 화면 크기를 적절히 조절하면 된다.

 

 

  이제 방송 및 녹화를 진행할 수 있다.

728x90
반응형

Comment +0

728x90
반응형

  Convolution 연산CNN을 포함한 다양한 딥러닝 네트워크에서 활용되는 중요한 연산이다. PyTorch와 같은 딥러닝 프레임워크에서는 Convolution 연산을 기본적으로 제공하고 있다. 이러한 Convolution 연산에 대해 더욱 자세히 이해하기 위하여 본 포스팅에서는 Convolution 연산을 Python NumPy만을 이용해 구현해보도록 하겠다.

 

  예를 들어 입력 차원이 (배치 크기, 채널 크기, 높이, 너비) = (2, 3, 5, 5)인 예시를 확인해 보자. 이때 3 X 3짜리 커널을 3개 사용하여 stride = 2, padding = 0 설정으로 Convolution 연산을 수행하면 그 결과는 다음과 같다. 수식으로 표현하자면 출력 차원은 (배치 크기, 커널 개수, out_h, out_w) = (2, 3, 2, 2)가 된다.

 

 

※ 단순 반복문을 이용한 구현 ※

 

  이러한 Convolution 연산을 어떻게 구현할 수 있을까? 가장 기본적인 방법은 바로 반복문을 이용하는 것이다. 기본적으로 출력 높이(out_h)와 출력 너비(out_w)는 다음의 공식을 이용해 구현할 수 있다.

out_h = (h + 2 * padding - filter_h) / stride + 1
out_w = (w + 2 * padding - filter_w) / stride + 1

 

  또한, 일반적으로 패딩(padding)은 입력 데이터의 높이와 너비 차원에 대해서만 수행한다. 이를 위해 np.pad() 메서드를 사용할 수 있다. 아래 코드를 보면 높이와 너비 차원에 대해서만 패딩을 넣는 것을 알 수 있다.

 

  결과적으로 출력 텐서(out)를 만든 뒤에 각각의 원소마다 Convolution 연산을 수행한 결과 값을 채워 넣는 것을 알 수 있다. NumPy에서 단순히 두 행렬에 대하여 곱셈 연산을 수행하면, 원소 단위(element-wise)로 곱셈 연산이 수행된다. 그래서 Convolution 연산을 다음과 같이 구현할 수 있다.

 

import numpy as np


def conv(X, filters, stride=1, pad=0):
    n, c, h, w = X.shape
    n_f, _, filter_h, filter_w = filters.shape

    out_h = (h + 2 * pad - filter_h) // stride + 1
    out_w = (w + 2 * pad - filter_w) // stride + 1

    # add padding to height and width.
    in_X = np.pad(X, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')
    out = np.zeros((n, n_f, out_h, out_w))

    for i in range(n): # for each image.
        for c in range(n_f): # for each channel.
            for h in range(out_h): # slide the filter vertically.
                h_start = h * stride
                h_end = h_start + filter_h
                for w in range(out_w): # slide the filter horizontally.
                    w_start = w * stride
                    w_end = w_start + filter_w
                    # Element-wise multiplication.
                    out[i, c, h, w] = np.sum(in_X[i, :, h_start:h_end, w_start:w_end] * filters[c])

    return out

 

  이제 앞서 다루었던 그림을 그대로 코드로 옮겨 결과를 확인해 보자.

 

X = np.asarray([
# image 1
[
    [[1, 2, 9, 2, 7],
    [5, 0, 3, 1, 8],
    [4, 1, 3, 0, 6],
    [2, 5, 2, 9, 5],
    [6, 5, 1, 3, 2]],

    [[4, 5, 7, 0, 8],
    [5, 8, 5, 3, 5],
    [4, 2, 1, 6, 5],
    [7, 3, 2, 1, 0],
    [6, 1, 2, 2, 6]],

    [[3, 7, 4, 5, 0],
    [5, 4, 6, 8, 9],
    [6, 1, 9, 1, 6],
    [9, 3, 0, 2, 4],
    [1, 2, 5, 5, 2]]
],
# image 2
[
    [[7, 2, 1, 4, 2],
    [5, 4, 6, 5, 0],
    [1, 2, 4, 2, 8],
    [5, 9, 0, 5, 1],
    [7, 6, 2, 4, 6]],

    [[5, 4, 2, 5, 7],
    [6, 1, 4, 0, 5],
    [8, 9, 4, 7, 6],
    [4, 5, 5, 6, 7],
    [1, 2, 7, 4, 1]],

    [[7, 4, 8, 9, 7],
    [5, 5, 8, 1, 4],
    [3, 2, 2, 5, 2],
    [1, 0, 3, 7, 6],
    [4, 5, 4, 5, 5]]
]
])
print('Images:', X.shape)

filters = np.asarray([
# kernel 1
[
    [[1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]],

    [[3, 1, 3],
    [1, 3, 1],
    [3, 1, 3]],

    [[1, 2, 1],
    [2, 2, 2],
    [1, 2, 1]]
],
# kernel 2
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
],
# kernel 3
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
]
])
print('Filters:', filters.shape)

out = conv(X, filters, stride=2, pad=0)
print('Output:', out.shape)
print(out)

 

  실행 결과는 다음과 같다. 그림에서의 결과와 동일한 것을 확인할 수 있다.

 

Images: (2, 3, 5, 5)
Filters: (3, 3, 3, 3)
Output: (2, 3, 2, 2)
[[[[174. 191.]
   [130. 122.]]

  [[197. 244.]
   [165. 159.]]

  [[197. 244.]
   [165. 159.]]]


 [[[168. 171.]
   [153. 185.]]

  [[188. 178.]
   [168. 200.]]

  [[188. 178.]
   [168. 200.]]]]

 

※ im2col을 이용한 구현 ※

 

  앞서 단순 반복문을 이용해 Convolution 연산을 구현해 보았다. Convolution 연산을 수행할 때 단순히 반복문(for loops)을 이용하는 경우, 행렬 곱을 제대로 활용하지 못한다는 점에서 속도가 느리다. 따라서 메모리를 조금 더 많이 사용하여, 속도를 비약적으로 개선할 수 있는 방법으로 im2col 연산을 활용하는 방법이 있다.

 

  다음과 같이 한 배치에 두 장의 이미지가 존재하여 마찬가지로 입력 차원이 (배치 크기, 채널 크기, 높이, 너비) = (2, 3, 5, 5)인 예시를 확인해 보자. 이러한 입력이 들어왔을 때, 이것을 행렬(matrix)로 형태를 변형하는 것이 im2col 연산이다. im2col 연산을 수행한 결과를 확인해 보자. (8, 27) 차원을 갖는 행렬이 생성되었다. 정확히는 (이미지 개수 X out_h X out_w, 입력 채널 개수 X kernel_h X kernel_w)의 차원을 갖는 행렬이 된다.

 

 

  im2col 연산은 다음과 같이 구현할 수 있다.

 

import numpy as np


def im2col(X, filters, stride=1, pad=0):
    n, c, h, w = X.shape
    n_f, _, filter_h, filter_w = filters.shape

    out_h = (h + 2 * pad - filter_h) // stride + 1
    out_w = (w + 2 * pad - filter_w) // stride + 1

    # add padding to height and width.
    in_X = np.pad(X, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')
    out = np.zeros((n, c, filter_h, filter_w, out_h, out_w))

    for h in range(filter_h):
        h_end = h + stride * out_h
        for w in range(filter_w):
            w_end = w + stride * out_w
            out[:, :, h, w, :, :] = in_X[:, :, h:h_end:stride, w:w_end:stride]

    out = out.transpose(0, 4, 5, 1, 2, 3).reshape(n * out_h * out_w, -1)
    return out


X = np.asarray([
# image 1
[
    [[1, 2, 9, 2, 7],
    [5, 0, 3, 1, 8],
    [4, 1, 3, 0, 6],
    [2, 5, 2, 9, 5],
    [6, 5, 1, 3, 2]],

    [[4, 5, 7, 0, 8],
    [5, 8, 5, 3, 5],
    [4, 2, 1, 6, 5],
    [7, 3, 2, 1, 0],
    [6, 1, 2, 2, 6]],

    [[3, 7, 4, 5, 0],
    [5, 4, 6, 8, 9],
    [6, 1, 9, 1, 6],
    [9, 3, 0, 2, 4],
    [1, 2, 5, 5, 2]]
],
# image 2
[
    [[7, 2, 1, 4, 2],
    [5, 4, 6, 5, 0],
    [1, 2, 4, 2, 8],
    [5, 9, 0, 5, 1],
    [7, 6, 2, 4, 6]],

    [[5, 4, 2, 5, 7],
    [6, 1, 4, 0, 5],
    [8, 9, 4, 7, 6],
    [4, 5, 5, 6, 7],
    [1, 2, 7, 4, 1]],

    [[7, 4, 8, 9, 7],
    [5, 5, 8, 1, 4],
    [3, 2, 2, 5, 2],
    [1, 0, 3, 7, 6],
    [4, 5, 4, 5, 5]]
]
])
print('Images:', X.shape)

filters = np.asarray([
# kernel 1
[
    [[1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]],

    [[3, 1, 3],
    [1, 3, 1],
    [3, 1, 3]],

    [[1, 2, 1],
    [2, 2, 2],
    [1, 2, 1]]
],
# kernel 2
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
],
# kernel 3
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
]
])
print('Filters:', filters.shape)

out = im2col(X, filters, stride=2, pad=0)
print('Output:', out.shape)
print(out)

 

  im2col 연산 예제 실행 결과는 다음과 같다.

 

Images: (2, 3, 5, 5)
Filters: (3, 3, 3, 3)
Output: (8, 27)
[[1. 2. 9. 5. 0. 3. 4. 1. 3. 4. 5. 7. 5. 8. 5. 4. 2. 1. 3. 7. 4. 5. 4. 6.
  6. 1. 9.]
 [9. 2. 7. 3. 1. 8. 3. 0. 6. 7. 0. 8. 5. 3. 5. 1. 6. 5. 4. 5. 0. 6. 8. 9.
  9. 1. 6.]
 [4. 1. 3. 2. 5. 2. 6. 5. 1. 4. 2. 1. 7. 3. 2. 6. 1. 2. 6. 1. 9. 9. 3. 0.
  1. 2. 5.]
 [3. 0. 6. 2. 9. 5. 1. 3. 2. 1. 6. 5. 2. 1. 0. 2. 2. 6. 9. 1. 6. 0. 2. 4.
  5. 5. 2.]
 [7. 2. 1. 5. 4. 6. 1. 2. 4. 5. 4. 2. 6. 1. 4. 8. 9. 4. 7. 4. 8. 5. 5. 8.
  3. 2. 2.]
 [1. 4. 2. 6. 5. 0. 4. 2. 8. 2. 5. 7. 4. 0. 5. 4. 7. 6. 8. 9. 7. 8. 1. 4.
  2. 5. 2.]
 [1. 2. 4. 5. 9. 0. 7. 6. 2. 8. 9. 4. 4. 5. 5. 1. 2. 7. 3. 2. 2. 1. 0. 3.
  4. 5. 4.]
 [4. 2. 8. 0. 5. 1. 2. 4. 6. 4. 7. 6. 5. 6. 7. 7. 4. 1. 2. 5. 2. 3. 7. 6.
  4. 5. 5.]]

 

  이렇게 구해진 im2col 결과 행렬(matrix)과 연산하기 위해 다음과 같이 커널(kernel) 또한 flatten을 진행하면 된다. 결과적으로 두 행렬(matrix)에 대하여 행렬 곱(matrix multiplication)을 수행하여 결과를 구할 수 있다.

 

 

  따라서 최종적인 코드는 다음과 같다.

 

import numpy as np


def im2col(X, filters, stride=1, pad=0):
    n, c, h, w = X.shape
    n_f, _, filter_h, filter_w = filters.shape

    out_h = (h + 2 * pad - filter_h) // stride + 1
    out_w = (w + 2 * pad - filter_w) // stride + 1

    # add padding to height and width.
    in_X = np.pad(X, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')
    out = np.zeros((n, c, filter_h, filter_w, out_h, out_w))

    for h in range(filter_h):
        h_end = h + stride * out_h
        for w in range(filter_w):
            w_end = w + stride * out_w
            out[:, :, h, w, :, :] = in_X[:, :, h:h_end:stride, w:w_end:stride]

    out = out.transpose(0, 4, 5, 1, 2, 3).reshape(n * out_h * out_w, -1)
    return out


X = np.asarray([
# image 1
[
    [[1, 2, 9, 2, 7],
    [5, 0, 3, 1, 8],
    [4, 1, 3, 0, 6],
    [2, 5, 2, 9, 5],
    [6, 5, 1, 3, 2]],

    [[4, 5, 7, 0, 8],
    [5, 8, 5, 3, 5],
    [4, 2, 1, 6, 5],
    [7, 3, 2, 1, 0],
    [6, 1, 2, 2, 6]],

    [[3, 7, 4, 5, 0],
    [5, 4, 6, 8, 9],
    [6, 1, 9, 1, 6],
    [9, 3, 0, 2, 4],
    [1, 2, 5, 5, 2]]
],
# image 2
[
    [[7, 2, 1, 4, 2],
    [5, 4, 6, 5, 0],
    [1, 2, 4, 2, 8],
    [5, 9, 0, 5, 1],
    [7, 6, 2, 4, 6]],

    [[5, 4, 2, 5, 7],
    [6, 1, 4, 0, 5],
    [8, 9, 4, 7, 6],
    [4, 5, 5, 6, 7],
    [1, 2, 7, 4, 1]],

    [[7, 4, 8, 9, 7],
    [5, 5, 8, 1, 4],
    [3, 2, 2, 5, 2],
    [1, 0, 3, 7, 6],
    [4, 5, 4, 5, 5]]
]
])
print('Images:', X.shape)

filters = np.asarray([
# kernel 1
[
    [[1, 0, 1],
    [0, 1, 0],
    [1, 0, 1]],

    [[3, 1, 3],
    [1, 3, 1],
    [3, 1, 3]],

    [[1, 2, 1],
    [2, 2, 2],
    [1, 2, 1]]
],
# kernel 2
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
],
# kernel 3
[
    [[5, 1, 5],
    [2, 1, 2],
    [5, 1, 5]],

    [[1, 1, 1],
    [1, 1, 1],
    [1, 1, 1]],

    [[2, 0, 2],
    [0, 2, 0],
    [2, 0, 2]],
]
])
print('Filters:', filters.shape)

stride = 2
pad = 0
X_col = im2col(X, filters, stride=stride, pad=pad)

n, c, h, w = X.shape
n_f, _, filter_h, filter_w = filters.shape

out_h = (h + 2 * pad - filter_h) // stride + 1
out_w = (w + 2 * pad - filter_w) // stride + 1

out = np.matmul(X_col, filters.reshape(n_f, -1).T)
out = out.reshape(n, out_h, out_w, n_f)
out = out.transpose(0, 3, 1, 2)

print('Output:', out.shape)
print(out)

 

  실행 결과는 다음과 같으며, 앞서 반복문을 이용한 구현 결과와 동일하다.

 

Images: (2, 3, 5, 5)
Filters: (3, 3, 3, 3)
Output: (2, 3, 2, 2)
[[[[174. 191.]
   [130. 122.]]

  [[197. 244.]
   [165. 159.]]

  [[197. 244.]
   [165. 159.]]]


 [[[168. 171.]
   [153. 185.]]

  [[188. 178.]
   [168. 200.]]

  [[188. 178.]
   [168. 200.]]]]
728x90
반응형

Comment +0

728x90
반응형

  구글 크롬(Chrome) 브라우저는 시크릿 모드를 제공합니다. 필자는 공용 PC를 사용하거나, 집에서 컴퓨터를 할 때에도 PC에 방문 기록을 남기지 않고자 할 때는 시크릿 모드를 사용합니다. 시크릿 모드는 크롬(Chrome) 브라우저를 실행한 뒤에 [새 시크릿 창] 버튼을 클릭하거나  [Ctrl + Shift + N]을 눌러서 간단하게 열 수 있습니다.

 

 

  시크릿 모드가 실행되면 다음과 같은 화면이 등장합니다. 스크릿 모드를 이용하면 방문 기록, 쿠키 및 사이트 데이터, 양식에 입력한 정보가 저장되지 않습니다. 다시 말해 이러한 정보가 현재 사용하고 있는 기기(컴퓨터)에 저장되지 않습니다. 그래서 나중에 내 컴퓨터를 다른 사람이 사용하더라도, 내가 어디에 접속했는지 알 수 없는 것입니다. (참고로 일반적인 경우에 자기 자신도 자기가 어디에 접속했었는지 알 수 없습니다. 머릿속으로 기억하고 있으면 좋지만, 기록상으로는 남기 때문에, 가끔 기억이 안 나서 낭패를 보는 일이 생깁니다.)

 

  아무튼 시크릿 모드는 굉장히 유용합니다. 예를 들어 필자가 누나의 생일 선물을 사주려고 인터넷에 검색할 때 시크릿 모드를 사용하게 되면, 같은 컴퓨터를 사용하는 누나가 검색 기록을 알지 못하게 되는 것입니다. 다만, 시크릿 모드를 사용하더라도 파일을 다운로드하거나 북마크를 추가했다면 이러한 정보는 저장되므로, 시크릿 모드일 때 다운로드한 파일이 기록된다는 점을 기억하세요.

 

 

※ 참고사항 ※

 

  참고로 시크릿 모드는 [닫은 탭 다시 열기] 기능을 제공하지 않습니다. 따라서 실수로 탭을 닫았을 때 혹은 이전에 방문했던 웹 페이지에 다시 방문하고 싶을 때, 기록이 남아 있지 않아서 낭패를 보는 경우가 발생할 수 있습니다. 그래서 시크릿 모드로 웹 페이지를 방문하다가, 좋은 정보가 포함된 웹 페이지를 찾았다면 그 링크는 별도로 기록할 필요가 있습니다.

 

  또한 내 컴퓨터에 정보가 남지 않는 것이지, 실제로 웹 사이트에 접속했을 때, 웹 사이트의 관리자는 여러분의 방문 기록을 알 수 있습니다. 예를 들어 우리가 네이버(Naver)에 접속해 특정한 웹 페이지에 접속했다고 가정해 봅시다. 그러면 여러분의 컴퓨터에서 보내는 패킷은 네이버 서버에 도달하게 됩니다. 당연히 네이버 입장에서는 여러분의 IP나 패킷 정보를 처리하게 될 것입니다. 그렇기에 웹 사이트 관리자, 인터넷 서비스 제공업체(ISP), 네트워크 관리자의 입장에서는 방문 기록을 확인할 가능성이 있다고 보시면 됩니다.

 

  그래서 여러분의 IP 정보를 포함해 완전히 여러분의 신원을 숨기고 싶다면, 시크릿 모드를 넘어서 VPN을 이용해 보시면 좋습니다. 물론 VPN을 이용한다고 하더라도, 여러분이 특정 웹 사이트에 로그인을 하는 등으로 정보를 노출한다면, 이 또한 활동 내역이 남게 될 여지가 있다는 점에 유의하세요. 실제로 웹 사이트 관리자 입장에서는 접속자가 로그인을 했을 때에만 중요한 정보를 노출하도록 하여, 어떤 사람이 어떤 기능을 이용했는지 처리하는 경우가 많습니다.

728x90
반응형

Comment +0

728x90
반응형

  다양한 이유로 인터넷 속도를 측정해야 할 때가 있다. 예를 들어 인터넷 방송을 하고 싶다면, 업로드 속도가 특정 속도 이상이 나와야 한다. 따라서 자신의 인터넷 속도를 측정하는 방법에 대해 알고 있으면 좋다. 이때 간단하게 사용할 수 있는 서비스로는 NIA에서 제공하는 [인터넷 속도 측정] 서비스가 있다. 아주 간단하게 사용해 볼 수 있다.

 

  ▶ NIA 인터넷 속도 측정: https://speed.nia.or.kr/index.asp

 

한국정보화진흥원 - 인터넷 품질측정 시스템

 

speed.nia.or.kr

 

  웹 사이트에 접속한 뒤에는 필요한 프로그램을 다운로드한다.

 

 

  이후에 다음과 같이 기본 설정 그대로 설치를 진행하면 된다.

 

 

  필자의 경우 전체 설치 과정이 약 1분 내외의 시간을 요구했다.

 

 

  결과적으로 다음과 같이 측정을 진행할 수 있다. 필자의 경우 SK의 기가 라이트(500Mbps) 인터넷 서비스를 사용하고 있다. 따라서 해당 정보를 기입한 뒤에 [측정하기] 버튼을 눌렀다.

 

  결과적으로 다음과 같이 다운로드/업로드 속도 각각 500Mbps 정도의 속도가 나오는 것을 알 수 있다.

 

 

 

728x90
반응형

Comment +0