【Docker】 Docker 설치 및 기초 명령어

(Docker) Docker 설치 및 기초 명령어

설치

우분투에 도커 설치하는 방법 :

https://www.youtube.com/watch?v=vd8T27BQ2sA

강의 내용 정리

  1. https://docs.docker.com/install/linux/docker-ce/ubuntu/
  2. CE : 무료배포용 EE는 기업용
  3. 그냥 설치 따라하면 설치완료.
  4. 동영상에 있는 것 사용하지 말고, 도커 공식 홈페이지 명령어로 설치하기
  5. Install using the repository부분을 함으로써 도커 repository를 우분투에게 가르쳐 준다
  6. 그리고 INSTALL DOCKER ENGINE - COMMUNITY의 부분까지 마무리해서 설치해주기.
  7. Verity까지 마무리 해주기 : sudo docker run hello-world

ps. nvidia-docker는 docker설치 이후에 설치할 것.

장점 : cuda설치 하지 않고 tensorflow-gpu이용 가능.

설치하는 방법 : 다음의 사이트에 들어가서 순서대로 설치 https://github.com/NVIDIA/nvidia-docker

Docker강의내용

https://www.youtube.com/watch?v=ofY3_pnOXJ0

  1. docker search

img

  1. docker pull

이미지를 받아온다.

  1. docker run

Docker run을 했을때 이미지가 없으면, 자동으로 pull을 통해 이미지를 다운 받는다.

추가로 아래 동영상에서는 -p즉 포트번호를 지정해서, 사용하는 방법에 대해 나와있다.

https://www.youtube.com/watch?v=pMY_wPih7R0&list=PLEOnZ6GeucBVj0V5JFQx_6XBbZrrynzMh&index=3

【Git】 Git개념 및 기본 명령어 공부1 (terminal)

아래의 내용들은 이 동영상 강의 내용을 정리한 내용입니다.

https://www.youtube.com/playlist?list=PLRx0vPvlEmdD5FLIdwTM4mKBgyjv4no81

1. Git 설치와 사용법

img

모든 사람들이 소스코드를 공유한다는 전제로, 사람들이 무료로 이용하게 만들어 놓았다.

로그인 후 리포지터리를 만들어 보기.

Add gitignore : 올리지 않은 파일을 선택하여 git 레파지를 만든다.

Add license : 오픈소스 라이센스 어떤것을 추가했는지 명시

Git을 terminal에 찍으면 다양한 사용방법을 확인할 수 있다.

img

가장 맨 처음 git을 나의 환경으로 사용하기위해 쳐야하는 명령어는 다음과 같다.

$ git config –global user.name junha1125

$ git config –global user.email jnha@gmail.com

나의 컴퓨터를 local로 사용하기 위해 처줘야하는 명령어

img

우리의 컴퓨터 : local repository

Git 사이트 : Remote repository

img

그리고 push과정을 거처야 한다.

Remote repository에 파일이 올라간 것을 확인할 수 있다.

img

2. 오픈소스를 사용하는 이유

https://ndb796.tistory.com/185?category=1029186

3. 동작원리

img

img

working에서 add를 추가해 줌으로써, staging Area에 커밋할 파일 올린다.

https://ndb796.tistory.com/187?category=1029186

img

Merge : comflict가 발생 했을 때를 위해서.

Pull = fetch, merge를 한번에 사용할 수 있는 명령어이다.

Local repo :

img

해쉬값을 이용해서 comflict을 막는다.

4. git명령어 공부해보기.

img

git내부 변경된 상태를 확인한다.

$ git status

commit할 파일 추가하기 즉 Stageing Atrea에 파일 추가하기.

$ git add ./file

Add를 해서 Staging Area에 있는 파일을 제거할 수 있다(즉 add취소)

$ git reset ./file

img

reset으로 부분 add제거를 할 수 있지만,

전체 add제거도 가능하다.(reset뒤에 파일을 안적으면 전체 add가 취소된다.)

img

굳이 내가 add할 파일을 명시하지 않아도, 수정된 전체를 add하겠다면 “ . “ 사용

$ git add .

$ git status

후 어떤 곳에 수정이 있었다고 뜨면…

$ git checkout – junha.py

와 같이 checkout명령어를 이용하면 원래 상태로 돌려준다.

즉 위에 수정됬다는 내용이 전부 사라진다.

$ git commit –m “message 추가하기”

$ git push

5. Commit 내역 수정하기

$ git pull

img

$ git log

최근까지 commit내역들을 살펴본다

img

$ git reset –hard 1916e39cf972406de7f89407ab35587e450342d0

여기 부분 이후의 변경건은 모두 무시하겠다.

reset에 soft옵션, mixed옵션도 있다. =

$ git push –f

을 해야 오류가 안뜬다.

-f : 강제로 push하는 방법

Git message 수정하는 방법

http://tech.javacafe.io/2018/03/01/how-to-change-git-commit-message/

$ git commit –amend

만 치면 vi가 뜬다. (vi사용법 알아야한다.)

최근 commit내용 수정하기

$ git commit –amend

:a -> 수정시작 Esc -> :wq! -> 저장

【Docker, Git】 Youtube 한글 강과 공부법과 순서

(Docker,Git) Youtube 한글 강과 공부법과 순서

<1시간 Docker, Git 공부하기>

[Docker]

  1. https://www.youtube.com/watch?v=2-w679FFMrc - 10분
  2. https://www.youtube.com/watch?v=I2wlvCybB4s - 10분
  3. https://www.youtube.com/watch?v=vd8T27BQ2sA - 10분 : 도커 설치하는 방법
  4. https://www.youtube.com/watch?v=ofY3_pnOXJ0- 14분
  5. 이 정도는 도커 간단히 다루는 수준까지 입니다. 블로그를 통해서 공부하시는 것을 추천합니다.

[Git]

https://www.youtube.com/watch?v=rhP5pseOJc0&list=PLw0AGthrdx37TmxVjo8pK2c_8vyuOQj3h

- 4강부터 10강까지(1개당 10분) 7개의 강좌

<1일 2시간. 2주동안 공부하기>

[Docker 공부 순서]

1일차

https://www.youtube.com/watch?v=2-w679FFMrc - 10분

https://www.youtube.com/watch?v=I2wlvCybB4s - 10분

https://www.youtube.com/watch?v=vd8T27BQ2sA - 10분 : 도커 설치하는 방법

2일차~10일차

https://www.youtube.com/watch?v=MHzxhoBmCwA&list=PLEOnZ6G분eucBVj0V5JFQx_6XBbZrrynzMh&index=1 - 강좌 9개 (1개당 45분 )

11일차~12일차 (1일 5개)

https://www.youtube.com/watch?v=HbKCxBFT2wk&list=PLRx0vPvlEmdChjc6N3JnLaX-Gihh5pHcx - 강좌 11개 (1개당 10분)

[Git 공부 순서]

1일차~10일차

https://www.youtube.com/watch?v=JZJQ4_8XoPM&list=PLHF1wYTaCuixewA1hAn8u6hzx5mNenAGM

https://www.youtube.com/watch?v=hFJZwOfme6w&list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk

11일차~12일차 (1일 5개)

https://www.youtube.com/watch?v=rhP5pseOJc0&list=PLw0AGthrdx37TmxVjo8pK2c_8vyuOQj3h

- 강좌10개 (1개당 10분)

스터디 계획서

주 3회 화,목,토 스터디. 스터디 시간 : 8pm~8:30pm

발표자 준비사항 : 강의 내용 및 중요 명령어 문서로 정리해서 발표하기

1234567
1일차공부2일차공부회의 :월화 내용3일차공부4일차공부회의 : 수목 내용5일차공부6일차공부회의 :금토내용부족했던것 알아서공부
891011121314
7일차공부8일차공부회의 :월화 내용9일차공부10일차공부회의 :수목 내용11일차공부12일차공부회의 : 금토내용부족했던것 알아서공부

【Paper-RL】 DQN - playing Atari, Human-level control 논문 리뷰

연구실에서 매주 하는 논문 리뷰의 발표를 위해,

(2013)Playing Atari with Deep Reinforcement Learning

https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf

(2015.1)Human-level control through deep reinforcement

https://web.stanford.edu/class/psych209/Readings/MnihEtAlHassibis15NatureControlDeepRL.pdf

2개의 논문을 읽고 발표를 준비했습니다.

아래 슬라이드에서 홍색 배경의 슬라이드는 playing atari 논문에서 읽은 내용이고,

청색 배경의 슬라이드는 human-level control 논문에서 읽은 내용입니다.


img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

img

【Python-Module】 Numpy Scipy Matplotlib 기초

원본 페이지 : https://junha1125.tistory.com/41?category=835551

[CS231 Justin Johnson] 교수님이 작성해주신 글로 공부한 내용입니다.**

Python Numpy TutorialThis tutorial was contributed by Justin Johnson. We will use the Python programming language for all assignments in this course. Python is a great general-purpose programming language on its own, but with the help of a few popular libraries (numpy, scipy,cs231n.github.io

1. Numpy

- [내용 중간중간에 있는 링크가 매우 유용하니 참고할 것]

- 배열은 동일한 자료형을 가지는 값들

- 값들은 튜플 형태로 색인 된다.

- rank : 몇차원 행렬인가?

- shape : 몇 곱하기 몇 행렬인가. channel * hight * width

배열 생성

>> a = np.array( [[1, 2, 2], [2, 2, 2]] ) >> a.shape

배열 생성 함수

a = np.zeros([2,2]) # 2*2 0행렬 생성 b = np.ones((1,2)) # ()를 사용하던 []를 사용하던 상관 x c = np.full((2,2), 7) # 모든 값을 7로 채운 배열 d = np.eye(2) # 단위백터 e = np.random.random((2,2)) # random vector 생성

numpy배열 인덱싱하기. (슬라이싱)

a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) a[1] == [5,6,7,8] a[1][3] == 7 a[:2, 1:3] == 0,1행과 1,2열 == [[2 ,3],[6,7]] b = a[:2, 1:3] # 단순복사 -> copy of reference

numpy배열 인덱싱하기. (불연속적인 원소 가져오기)

a = np.array([[1,2], [3, 4], [5, 6]]) b = a[[0, 1, 2], [0, 1, 0]] == [a[0, 0], a[1, 1], a[2, 0]] # 즉 행렬의 (0,0) (1,1) (2,0) 원소만 가져오기 즉 1*3행렬

응용하기. b = np.array([0, 2, 0, 1]) c = a[np.arange(4), b] # 즉 a행렬의 (0,0) (1,2) (2,0) (3 1)원소 즉 1*4행렬 # arange/linespace c += 10 print(a) # copy of reference이므로 위의 a행렬의 일부 원소도 10이 더해져 있을 것이다.

불리언 배열(mask 배열)

a = np.array([[1,2], [3, 4], [5, 6]]) bool_idx = (a > 2) print(a[bool_idx]) # 출력 “[3 4 5 6]” print(a[a > 2]) # 출력 “[3 4 5 6]”

자료형

배열 원소의 모든 자료형은 동일 x = np.array([1, 2]) print(x.dtype) # 자료형 알려주는 맴버함수 x = np.array([1, 2], dtype=np.int64) # 특정 자료형을 명시적으로 지정해주는 방법

배열 연산

x + y // x - y // x * y // x / y # 기본 사칙 연산자를 사용해서 해당 위치의 원소들과 계산 된다. np.sqrt(x) # 배열 전체에 sqrt처리 하기

행렬의 곱을 위해서는 dot함수를 사용한다. x.dot(y) np.dot(x, y)

sum함수[수학 함수를 다루는 문서]

np.sum(x) # 행과 열 상관없이 모든 요소의 합 np.sum(x, axis=0) # 열이 같은 요소들을 합해서 1차원 백터로 return #주의# np.sum(x, axis=1) # 행이 같은 요소들을 합해서 1차원 백터로 return #주의#

전치[배열을 다루는 문서]

x.T print(x) # 전치가 적용된 x가 출력된다.

브로드캐스팅

- shape가 다른 배열 간에도 산술 연산이 가능하게 하는 메커니즘

- 예를 들어, 행렬의 각 행에 상수 벡터를 더하는 것

x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]]) # 43 행렬 v = np.array([1, 0, 1]) # 13 행렬 y = x + v # v라는 행렬이 행 방향으로 자동 확대 된다.

[broadcasting되는 조건] 은 아래와 같다.

  1. 두 배열이 동일한 rank를 가지고 있지 않다면, 낮은 rank의 1차원 배열이 높은 rank 배열의 shape로 간주합니다.
  2. 특정 차원에서 두 배열이 동일한 크기를 갖거나, 두 배열 중 하나의 크기가 1이라면 그 두 배열은 특정 차원에서 compatible하다고 여겨집니다.
  3. 두 행렬이 모든 차원에서 compatible하다면, 브로드캐스팅이 가능합니다.
  4. 브로드캐스팅이 이뤄지면, 각 배열 shape의 요소별 최소공배수로 이루어진 shape가 두 배열의 shape로 간주합니다.
  5. 차원에 상관없이 크기가 1인 배열과 1보다 큰 배열이 있을 때, 크기가 1인 배열은 자신의 차원 수만큼 복사되어 쌓인 것처럼 간주합니다.

[추가]

np.reshape(v, (3, 1)) # 13행렬의 v가 31행렬이 된다. reshape를 하려면, 총 요소의 갯수가 같아야 한다.

[broadcasting을 활용한 화려한 연산] :브로드캐스팅은 보통 코드를 간결하고 빠르게 해준다. 따라서 가능한 많이 사용해야 한다.

import numpy as np

###   1.   ### 
# 벡터의 외적을 계산
v = np.array([1,2,3])  # v의 shape는 (3,)
w = np.array([4,5])    # w의 shape는 (2,)
# 외적을 계산하기 위해, 먼저 v를 shape가 (3,1)인 행벡터로 바꿔야 합니다;
# 그다음 이것을 w에 맞춰 브로드캐스팅한뒤 결과물로 shape가 (3,2)인 행렬을 얻습니다,
# 이 행렬은 v와 w 외적의 결과입니다:
# [[ 4  5]
#  [ 8 10]
#  [12 15]]
print np.reshape(v, (3, 1)) * w

###   2.   ###
# 벡터를 행렬의 각 행에 더하기
x = np.array([[1,2,3], [4,5,6]])
# x는 shape가 (2, 3)이고 v는 shape가 (3,)이므로 이 둘을 브로드캐스팅하면 shape가 (2, 3)인
# 아래와 같은 행렬이 나옵니다:
# [[2 4 6]
#  [5 7 9]]
print x + v

###   3.   ###
# 벡터를 행렬의 각 행에 더하기
# x는 shape가 (2, 3)이고 w는 shape가 (2,)입니다.
# x의 전치행렬은 shape가 (3,2)이며 이는 w와 브로드캐스팅이 가능하고 결과로 shape가 (3,2)인 행렬이 생깁니다;
# 이 행렬을 전치하면 shape가 (2,3)인 행렬이 나오며
# 이는 행렬 x의 각 열에 벡터 w을 더한 결과와 동일합니다.
# 아래의 행렬입니다:
# [[ 5  6  7]
#  [ 9 10 11]]
print (x.T + w).T
# 다른 방법은 w를 shape가 (2,1)인 열벡터로 변환하는 것입니다;
# 그런 다음 이를 바로 x에 브로드캐스팅해 더하면
# 동일한 결과가 나옵니다.
print x + np.reshape(w, (2, 1))

###   4.   ###
# 행렬의 스칼라배:
# x 의 shape는 (2, 3)입니다. Numpy는 스칼라를 shape가 ()인 배열로 취급합니다;
# 그렇기에 스칼라 값은 (2,3) shape로 브로드캐스트 될 수 있고,
# 아래와 같은 결과를 만들어 냅니다:
# [[ 2  4  6]
#  [ 8 10 12]]
print x * 2

2. SciPy

numpy를 바탕으로 만들어진 라이브러리. numpy보다 더 많은 함수를 제공하고 과학, 공학분야에 사용된다.

a. 이미지 작업하기

from scipy.misc import imread, imsave, imresize img = imread(‘assets/cat.jpg’) # 이미지 가져오기 img.dtype, img.shape # 이미지의 shape와 type알아보기 img_tinted = img * [1, 0.95, 0.9] # broadcasting을 이용해서 RGB각각에 1 0.95 0.9 곱해주기 img_tinted = imresize(img_tinted, (300, 300)) # 이미지 크기 바꾸기 (400248) -> (300300) imsave(‘assets/cat_tinted.jpg’, img_tinted) # 바꾼 이미지 저장하기

b. matlab 파일 다루기

scipy.io.loadmat 와 scipy.io.savemat함수를 통해 matlab 파일을 읽고 쓸 수 있다.

c. 두 점 사이의 거리

scipy.spatial.distance.pdist함수는 주어진 점들 사이의 모든 거리를 계산한다. 혹은 scipy.spatial.distance.cdist

import numpy as np from scipy.spatial.distance import pdist, squareform d = squareform(pdist(x, ‘euclidean’))


3. Matplotlib

a. 함수그리기

matplotlib.pyplot 모듈 내부에 있는 함수를 이용하면 편하다.

import matplotlib.pyplot as plt x = np.arange(0, 3 * np.pi, 0.1) y = np.sin(x) plt.subplot(2, 1, 1) # 2*1 행렬에 1번째 원소로 아래의 그래프가 들어간다. plt.plot(x, y) plt.xlabel(‘x axis label’) plt.ylabel(‘y axis label’) plt.title(‘Sine and Cosine’) plt.legend([‘Sine’, ‘Cosine’]) plt.show()

b. 이미지 나타내기

from scipy.misc import imread, imresize import matplotlib.pyplot as plt # 이미지 가져오기 scipy를 이용해서 가져오기 img = imread(‘assets/cat.jpg’) # 1 plt.subplot(1, 2, 1) plt.imshow(img) # 2 plt.subplot(1, 2, 2) plt.imshow(np.uint8(img_tinted))

plt.show()

【선박분류】 대회 설명 및 대회 결과 - 위성 영상 정밀 객체 검출 [알파프로젝트]

원본 글 위치 : https://junha1125.tistory.com/30?category=836123

1. 대회 설명

우리가 준비하는 대회는 한국국방과학연구소에서 주관하는 대회로써, 위성 사진에서 컨테이너, 유조선, 항공모함, 기타 민간 선박을 검출 및 분류하는 대회이다. 왼쪽 이미지와 같은 위성 사진의 해양 항구, 바다 이미지에서 객체를 오른쪽 사진과 같이 검출한다.

데이콘 대회 링크 :

https://dacon.io/competitions/official/235492/data?join=1

img

2. 대회 배경

  • 우리는 위성으로부터 수집된 영상의 정밀한 객체 인식하는 문제를 해결하고자 하며, 특히 선박들의 위치와 종류를 파악하는 알고리즘을 연구하고 개발하고자 한다.
  • 실제 해상에서 일어나고 있는 다양한 문제들을 해결하기 위해서는 인공위성 영상으로부터 객체 검출을 위한 알고리즘개발은 매우 중요하며 필수적이다. 특히 삼면이 바다인 한반도에서는 실시간 위성 영상으로부터 자동으로 다양한 종류와 크기의 해상 표적을 검출하는 것이 필수적인 기술이다.
  • 따라서 최신 깊은 인공신경망과 딥러닝을 이용한다면 해상 표적탐지 핵심 기술 역량을 확보할 수 있을 것으로 예상한다. 실제 해당 기술을 활용하면, 불법적인 선박을 효율적으로 검출 및 추적뿐만 아니라 해상 조난이 발생했을 경우, 조난 선박의 위치를 더 정확하고 신속히 파악하여 대처하는 것이 가능하다.
  • 인공위성 영상로부터 정밀 객체를 검출해내는 과제에서의 가장 큰 문제점은위성 사진은 다른 여타 사진들과는 다르게 해상도가 많이 떨어진다는 것이다. 그러므로 우리가 해결해야 하는 과제는 해상도를 높이는 작업과 객체를 정밀 검출하는 작업으로 총 2가지로 구분될 수 있다.

3. 한학기 전체 계획 및 목표

인공위성 영상으로부터 선박의 종류를 인식하고 그 선박의 위치를 검출하는 딥러닝 모델을 구축하기 위해 다음의 절차를 수행한다.

1) 데이터 전처리

  • 딥러닝 모델을 만들기 위해, 최대한 많은 인공위성 사진을 수집한다.
  • 단지 사진만 주어지면, 학습이 불가능하므로 주어진 사진에 선박이 어디에 있는지, 그리고 그 선박의 종류가 무엇인지에 관한 정보를 추가한다.

2) 신경망 구성

  • 인공위성 사진은 화질이 낮으므로, 그대로 객체 검출에 사용하기에 부적절하다. 따라서 초해상화(Super-Resolution)를 하는 신경망을 따로 구성하여 객체 검출의 정확도를 높인다.
  • 해상도가 높아진 사진을 기반으로 객체 검출(Object Detection)을 하는 신경망을 제작하고 학습시킨다.

3) 결과 확인

  • 선박 위치 탐색과 객체 검출을 성공적으로 수행하는지 판단하여, 우리가 구축한 모델이 정확히 동작하는지 확인한다.
  • 구축한 모델이 잘 동작하지 않는다면, 모델을 수정해가면서 최상의 성능으로 동작하는 모델을 구축해 나간다.

img프로젝트의 전체 흐름도

4. 대회 결과

주어진 시간이 2주라는 시간 밖에 없었고, (늦게 대회를 신청해서..)

컴퓨팅 파워(코랩, DLPC 사용)가 부족해서 매우 좋은 성과는 내지 못하였습니다.

하지만 대회를 대회를 준비하면서 많은 것을 배우고 느꼈습니다.

image

60팀 참가 중 10위를 했지만, 다른 1위~7위 사람들에 비해서는 그래도 많이 낮은 성능을 보였습니다.

시간이 더 있었다면, 좋은 성능을 낼 수도 있었을 것 같아 조금은 아쉽습니다.

다음에 기회가 생겨 대회에 다시 참가한다면, 3위 이내에 들어가는 결과를 얻을 수 있도록

더욱더 꾸준히 성실히 노력하겠습니다.

【확통】 최대 우도(가능도) 방법 (Maximum Likelihood Method)

공부를 위해 다음을 참고하였다.

https://bit.ly/2ufTaQe

- 확률분포가 어떤 분포인지에 따라서 최대 우도가 얼마인지 추정해본다.

- 가장 단순한 베르누이 분포(이항 분포)일때, 이 블로그 내용을 추가 설명하자면,

x는 실험을 했을 때 동전의 앞면이 나온 횟수이고, 뮤(μ)는 1회 실험시 동전 앞면이 나올 확률이다.

https://bit.ly/2vJVDTi

- 위의 사이트와 다르게 베르누이 분포(이항 분포)일 때 최대 우도에 대해서 생각해 본다.

- 이 블로그 내용을 맨 아래에 적어 놓을 예정이다.

오일석 - 기계학습


기계학습책 내용정리

확률변수

기계 학습이 처리할 데이터는 불확실한 세상에서 발생하므로, 불확실성을 다루는 확률과 통계를 잘 활용해야 한다.

확률 변수(https://namu.wiki/w/%ED%99%95%EB%A5%A0%20%EB%B3%80%EC%88%98)

img

img

여기서 소문자 x는 아래의 대문자 X이다.

일정한 확률을 갖고 발생하는 사건(event) 또는 사상(事象)에 수치가 부여되는 함수. 일반적으로 대문자 X로 나타낸다. 확률변수 X의 구체적인 값에 대해서는 보통 소문자를 사용해서, 예를 들어 X가 p의 확률로 x의 값을 가진다는 것은 P(X = x) = p 등의 확률함수로 표현할 수 있다. (즉 X는 확률변수 : 가능한 모든 경우 x : 그 가능한 모든 경우 중 특정한 경우 하나)

예시 : X : 주사위를 2번 던졌을때 나오는 모든 경우(36가지) -> x : 1다음에 5가 나오는 경우 -> 이때 P(X = x) = 1/36

머신러닝에서 확률백터와 확률 분포

img

위의 경우처럼 ‘가능한 모든 경우’가 확률 분포가 된다. 이때 특정한 x가 나올 확률을 찾는다면, 이와 같다.

P(X = x{5,5,10,6}) = 1/156132156

결합 확률과 독립 사건

어떤 2가지 상황이 독립 사건이면 다음과 같은 식이 성립한다.

P(x,y) = p(x)*p(y)

하지만 2가지 상황이 결합이면 다음과 같은 식이 성립한다.(결합 : 2가지 사건이 연결, 연관 되어 있는 경우 ex) 내가 국민대학교를 가서 돈까스를 먹을 확률 = 국민대학교를 갈 확률 * (국민대학교에서)돈까스를 먹을 확룰)

img

P(x,y) = p(x)*p(y|x)

P(x,y) = p(y)*p(x|x)

이것을 묶은게 오른쪽 베이즈 정리이다.

우도(가능도/likelyhood)

img

오른쪽 경우에 대해, 다음의 문제를 생각해보자.

“하얀 공이 나왔다는 사실만 알고 어느 병에서 나왔는지 모르는데, 어느 병 인지 추정하라.”

이는 위에서 배운 베이즈 정리를 이용하면 된다.

img

img

다른 관점으로 다시 생각해보자. 베이즈 정리는 [사후확률][우도][사전확률]을 이용한 수식이다.

사후 확률 : 사건 발생 후의 확률

사전 확률 : 사건 x와 무관하게 미리 알 수 있는 확률

우도 : 사후확률을 구하기 위해 사용! 여기서는 이렇게 사용되었지만, 사실 우도는 이와 같이 쓰인다.

- 우도 추정 = 역 확률 문제

- p(알고있음x | 추정해야 할 사건y) = L(y,x) 라고 표현된다.

그렇다면 우리가 이 우도를 왜 배우고 있는 것일까? 기계학습의 적용에서 공부해보자.

우도 지도 학습에 적용

지도 학습은 x와 y를 다음과 같이 적용할 수 있다. y = 클래스, 라벨, 타겟 x = 특징 백터

img

예를 들어 오른쪽 그림과 같다.

이 예제에서 p(y|x)는 이와 같이 해석할 수 있다. feature가 …일 때 그것이 ,,,꽃일 확률

이 확률들을 이산확률분포라고 가정하고 일일이 구하는 것은 불가능하다. (특징이 …일때 이 것은 ,,, 꽃일 확률이 몇%이다. 라고 전부 정의하는 것은 어렵다.) 따라서 우리는 베이즈 정리를 이용해서 p(y|x)값을 구할 수 있다.

p(x|y)를 구하기 쉬운가? x는 높은 차원이 될수 있지만, y는 일반적으로 고정된 샘이다, (유한한 클래스 갯수) 따라서 각각의 클래스들은 독립적으로 확률분포를 추정할 수 있고, 그렇게 독립된 분포를 보고 확률을 추정하면 되므로, 훨씬 쉽다고 할 수 있다.

최대 우도법

의 병 문제를 다시 생각해보자. p((1)|하양)은 우리가 전체적은 그림을 알고 있다고 가정하고 베이즈 정리를 사용해서 계산을 했다. 그렇다면 다음의 경우에는 어떻게 계산할까?

img

img

다시 한번 생각해보면, 데이터 집합 X는 구할 수 있다. q3는 모른다. q3의 추정값을 찾기 위해서 X를 이용하는 방법이 최대우도법이다.

이때 우리는 X ={흰공, 파랑공, 흰공, 파란공} 과 같은 위의 표현을 이와 같이 쓸 수 있다.

X= {x1, x2, x3,x4} 이것은 위의 식의 P(X|theta)는 다음과 같이 쓸 수 있다

img

이것은 확률의 곱이므로 너무 작은 값이 될 수 있다. 따라서 다음과 같이 최대 로그 우도 추정을 사용한다.

img

기계학습에서의 최대 우도 공식**

W = argmax P(X|W)

임의의 데이터 분포(date set)에 대해서, 그 분포처럼 나오게 하는, 최대로 적절한 신경망의 가중치 W값


블로그 내용정리

우도와 가능도

모수 θ에 의해 만들어진 확률변수 X. 모수는 위에서 q3와 같이, 분포 곡선을 생성하기 위해 확률 분포 함수(PDF)의 입력 값으로 사용되는 모집단 전체를 설명하는 측도입니다.

img

img

L(θ|x)는 표본 x에 대해서 모수 θ의 가능도이다. 풀어 쓰자면, 특정 모수를 가지는 모집단에 대해서, 표본 x가 나왔을 때, 그 표본이 나올수 있게 하는 모수 θ의 가능도(가능성-이 모수를 가지는것이 몇%로 정확한 것인가?)를 L(θx)라고 한다.

참고로 위의 | 는 조건부 확률의 |가 아니다. 그냥 모수 θ를 가지는 모집단에서 xn이 나올 확률이다. (이해가 안된다면 맨 위에서 부터 차근차근 아래로 내려오자.)

(여기서 부터 모수 θ == 모수 μ)

최대 가능도 방법

표본 x가 있을 때, 가장 가능한(적절한) 모수 θ의 확률(분포)를 구하는 것이다.

이항 분포 : 속된 n번의 독립적 시행에서 각 시행이 확률 p를 가질 때의 이산 확률 분포이다

베르누이 분포 : 매 시행마다 오직 두 가지의 가능한 결과만 일어난다고 할 때, 이러한 실험을 1회 시행하여 일어난 두 가지 결과에 의해 그 값이 각각 0과 1로 결정되는 확률변수 X

img

여기서 μ는 위에서 봤던 모수 θ를의미한다. 그리고 x는 0 또는 1이다.(베르누이 분표에서의 0과 1사용)

직접 0과 1을 대입해보면 P(x=0) = 1-μ 그리고P(x=1) = μ가 됨을 확인할 수 있다.

img

p(앞2뒷2|μ)=μ^2(1−μ)^2 = P(x=0) * P(x=0)* P(x=1) *P(x=1)라고 말할 수 있다. 그리고 이것을 그림으로 그리면 다음과 같이 표현 된다.

img

이것으로써 우리는 P가 최대(0.063)가 되는 μ가 0.5 라는 것을 알 수 있다.

이것을 일반화해서 적으면 다음과 같다.

img

즉 다시 말해서, 관측된 Data가 나올 확률을 Likelihood라고 하고, 이 방법을 Maximum Likelihood Estimation, 줄여서 MLE라고 한다. 또 위의 파란색 부분을 일반화 하면

img

자. 위에서 내가 μ에 대해서 그래프를 그렸다. P가 최대가 되는 μ를 찾기 위해 항상 그래프를 그려야할까??

아니다. μ에 대해서 미분을 하면 되지 않는가?? 그리고 미분한 그 함수가 0이 되는 지점이 최대값이나 최솟값이 되는 지점이겠지…

그냥 미분을 하면 너무 힘드므로, 바로 위의 식에 양변에 log를 씌우고 미분을 해서, 미분한 함수가 0이 되는 μ값을 찾아보자.

img

즉 우리가 원하는 μ의 MLE

이때 N은 총 수행 횟수이다. (앞앞앞뒤뒤 -> N = 5)

즉 xn(동전의 앞면) = 1 에 대해서 μ는 (1/N) *(N/2) = 1/2 가 될 것이다. (시그마 xn ~= N/2 이기 때문에.)

【선박분류】 facebook API - detectron2 사용법 연구해보기

원본 글 위치 : https://junha1125.tistory.com/45?category=836123

@#### **<전체 구조="">**

@ 오리지널 깃 사이트 : [https://github.com/facebookresearch/detectron2]

  @ install : [https://github.com/facebookresearch/detectron2/blob/master/INSTALL.md]

​    @ doecker : [https://github.com/facebookresearch/detectron2/blob/master/docker/Dockerfile]

​      \- dockerfile 구동 방법 : [http://pyrasis.com/Docker/Docker-HOWTO#dockerfile]

​      \- 그냥 dockerfile이 있는 위치에서 다음의 명령어 실행

​      \- docker로 하면, 어떻게 될지는 궁금하나,

​       현재는 우리의 데이터셋을 이용하기 위함까지 해야하므로, 로컬에 우선 설치하자. 

​      $ docker build --tag detectron2:1.0

​      $ docker run --name facebookDetectron -d -p 80:80 -v [host path]:[container path] detectron2:1.0

​    @ 차근 설치법(코랩) : [[drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5#scrollTo=QHnVupBBn9eR](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5#scrollTo=QHnVupBBn9eR)]

​    @ source를 다운받아서 직접 build하는 방법.

​    @ pre-built 되어 있는 source를 다운받는 방법.

​      \- 쿠다 버전 관리 주의

​      \- 이것은 가장 최신 버전의 파일이므로, 깃에 있는 파일과 양립하지 않을 수 있다.

  @ Quick Start : [https://github.com/facebookresearch/detectron2/blob/master/GETTING_STARTED.md]

​    \- 위의 코랩이, 이 내용까지 포함하고 있다.

  @ Document : [https://detectron2.readthedocs.io/index.html]

ps.

  • intallation를 보다 보면 드는 의문 : ‘pip install’ 과 ‘python setup.py intsall’ 는 표면적으로 같은 역활을 한다.[https://stackoverflow.com/questions/15724093/difference-between-python-setup-py-install-and-pip-install] 여기서는 pythion pip install을 사용했다. pip install과 동일한 것 같다.
  • 남의 코드 보다가 모르는거 있으면 제발 print 해보아라. 디버깅을 해야 그게 뭔지 알지!! 눈으로만 보고 document로만 읽고 하면 기억에 남는것도 별로 없고, 확실히 알지도 못한다.

<코랩 - Run a pre-trained detectron2 model>

\1. torch==1.4.0+cu100 // torchvision==0.5.0+cu100 로 파이토치 버전을 바꿔준다.

\2. 코코API를 pip install을 통해서 다운받는다.

[$ pip install -U ‘git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI’]

\3. 코랩에서는 [pre-built Scource == detectron2]를 사용한다.

img

\4. 위에서 설치한 detectron2 패키지를 전적으로 이용한다. 다음에서 정보를 얻을 수 있다.

git : [https://github.com/facebookresearch/detectron2] -> 어떤 config가 있는지 눈으로 확인 가능

document : [https://detectron2.readthedocs.io/index.html] -> API에서 import하는 메소드 코드 확인 가능

\5. 다음과 같이 내가 원하는 Cascade Rcnn을 이용하여 학습 완료

코드 설명 :

- pretrained_model을 가져오기 위해서 config_file의 경로를 설정해준다.

- 그리고 model_zoo라는 곳(pretrained model이 모두 저장되어 있다)에서 모델 파라메터를 가져온다.

- 우리가 가져온 파라메터를 사용해서, predictor를 정의한다.

- 정의한 predictor를 사용해서, 우리의 이미지를 예측해본다.

img

\6. 예측한 결과는 output이라는 변수에 저장되어 있다.

outputs 변수 설명 :

[https://detectron2.readthedocs.io/tutorials/models.html#model-output-format]

img

<코랩 - Train on a custom dataset>

\1. 우선 detectron2에서 우리의 데이터를 얻는 방법을 알려줘야한다. 우리의 json파일을 읽고, 그 json파일을 해석하는 방법을 다음과 같이 함수로 직접 정의하면 된다.

img

\2. 그리고 DatasetCatalog와 MetadataCatalog 함수를 이용해서, 위에서 정의한 함수가 있다는 것을 알려준다. str으로 내가 원하는 데이터 셋을 찾을 수 있다. 다양한 데이터 셋을 한방에 관리하게 위해 DatasetCatalog와 같은 함수를 사용한다고 한다.

\3. 그렇게 DatasetCatalog과 MetadataCatalog로 정의된 데이터 셋을 살펴보면 다음과 같다.

print(balloon_metadata) print(DatasetCatalog.get(“balloon_train”))

>> Metadata(name=’balloon_train’, thing_classes=[‘balloon’]) >> [{‘file_name’: ‘balloon/train/34020010494_e5cb88e1c4_k.jpg’, ‘image_id’: 0, ‘height’: 1536, ‘width’: 2048, ‘annotations’: [{‘bbox’: [994, 619, 1445, 1166], ‘bbox_mode’: <BoxMode.XYXY_ABS: 0>, ‘segmentation’: [[1020.5, 963.5, 1000.5, 899.5, 994.5, 841.5, 1003.5, 787.5, 1023.5, 738.5, 1050.5, 700.5, 1089.5, 663.5, 1134.5, 638.5, 1190.5, 621.5, 1265.5, 619.5, 1321.5, 643.5, 1361.5, 672.5, 1403.5, 720.5, 1428.5, 765.5, 1442.5, 800.5, 1445.5, 860.5, 1441.5, 896.5, 1427.5, 942.5, 1400.5, 990.5, 1361.5, 1035.5, 1316.5, 1079.5, 1269.5, 1112.5, 1228.5, 1129.5, 1198.5, 1134.5, 12 …..

**

다음과 같이 모델을 정하고, 몇가지 정보를 입력해 간단하게 train을 시킨다.

img

img

여기서 주의할 점은, os.makedirs(cfg.OUTPUT_DIR) 에 의해서 현재 나의 위치(pwd)에 output이라는 폴더가 만들어졌고, 그 안에 파일들이 저장되고 있음을 확인할 수 있다.

**

img

\1. 학습이 완료되면 다음과 같이 pth라는 파일이 생긴다. 이것은 tensorflow에서 cpkt와 같은 역활을 한다. 즉 model의 parameter를 저장해놓는 역활을 한다.

\2. 아래와 같이 predictor를 명시만 해준다. (그 predictor는 지금까지 내가 학습시킨 파라메터인 model_final을 사용한다)

img

\3. 아래와 같은 방법으로 이미지를 가져오고, 가져온 이미지를 predictor를 이용해 predict을 진행한다. 그 후 outputs에 predict의 정보가 저장되고, 그 정보는 아래와 같은 get_fields()[output정보를 dict으로 바꿔줌]과 같은 메소드를 이용해서 해석할 수 있다.

img

pred_masks에 mask정보가 있다. true, false값을 사용해 이미지의 한 픽셀픽셀이 객체의 부분인지를 말해준다.(다각형 꼭지점 좌표를 이용한 mask 데이터 아님.)

**<적절한 데이터="" 구조="">**

\- detectron_for_alpha
   \- test
    \- 0.png
    \- ...
    \- [1239.png](https://junha1125.tistory.com/1239.png)
   \- images
    \- 0.png
    \- ...
    \- [1664.png](https://junha1125.tistory.com/1664.png) (maybe)
   \- [labels.json](https://junha1125.tistory.com/labels.json)  (for images)
   \- output
    \- [model_final.pth](https://junha1125.tistory.com/model_final.pth)
    \- ....

**

이를 위해 다음과 같은 과정을 거쳤다.

1. 튜토리얼을 통해 코드 및 변수 분석하기

img

2. 그 코드와 변수를 이용해서, 내가 원하는 데이터 뽑아내기

img

3. 뽑아낸 데이터가 잘 뽑아졌느지 확인하기

img

4. csv모듈 공부하기

img

csv 모듈을 이용해서 파일을 저장한다. csv모듈을 다루는데 2차원 행렬만 생각하면 된다. [[],[], … ]

그리고 writerow라는 함수를 사용하여 한 행 씩 저장하는게 보통이지만,

나는 writerows라는 함수를 이용해서 한방에 결과를 저장하려고 한다.

5. ship detector model에 적용하여 원하는 정보 뽑아내기

img

6. 뽑아낸 정보를 csv로 만들어 파일 저장하기

img

옮바른 형식으로 출력 완료.

img

【선박분류】 이미지 상자 치기 코드draw_boxs_in_images

이미지 상자 치기 코드draw_boxs_in_images

a. 코드 제작 배경

알파 프로젝트를 하면서, 완성된 신경망을 통해 나온 결과를 CSV파일이 아닌 직접 눈으로 확인할 필요가 많았다. 예를 들어서 코드를 돌려서 나온 결과는 다음과 같다.

image

이 출력이 정말 좋은 값들로 출력이 된 것인지 확인할 필요가 있었다. 예를 들어 이 데이터를 이용해서 사진에 박스를 처줌으로써 우리의 신경망이 배를 잘 찾았는지 확인하는 것처럼 말이다. <원본> ![image](https://user-images.githubusercontent.com/46951365/79422206-6bc5db80-7ff7-11ea-8e98-2d4a5f6158e8.png) <박스를 친="" 사진=""> ![image](https://user-images.githubusercontent.com/46951365/79422209-6d8f9f00-7ff7-11ea-9dde-ec0106b87da6.png) ### **b.** **완성한 코드** ```python from matplotlib import pyplot as plt import numpy as np import argparse from PIL import Image from matplotlib import pyplot as plt import cv2 import pandas as pd from PIL import ImageFont from PIL import ImageDraw def save_image_with_box(box_info, imageName , start_index, last_index , image_path, save_path): """ box_info : panda로 받아드린 csv파일 image_Name : image_Num.png 파일을 봐야한다. start, last : box_info['file_name'][start ~ last]가 image_Num.png에 대한 정보를 담고 있다. img_path : 이미지가 있는 directory name save_path : 이미지가 저장될 directory name """ try: im = Image.open(image_path + imageName) except : print("no such file in directory : ", imageName) return plt.figure(figsize = (30,30)) plt.imshow(im) color_set = ['r','b','y','g'] for i in range(start_index, last_index+1): point1 = (box_info["point1_x"][i],box_info["point1_y"][i]) point2 = (box_info["point2_x"][i],box_info["point2_y"][i]) point3 = (box_info["point3_x"][i],box_info["point3_y"][i]) point4 = (box_info["point4_x"][i],box_info["point4_y"][i]) plt.plot([point1[0],point2[0]],[point1[1],point2[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point2[0],point3[0]],[point2[1],point3[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point3[0],point4[0]],[point3[1],point4[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.plot([point4[0],point1[0]],[point4[1],point1[1]], linewidth=3, color = col-or_set[box_info['class_id'][i] - 1]) plt.savefig(save_path + imageName) plt.close() print("saved : ", imageName) if __name__ == "__main__": # 기본 설정 # image_path = './Alpha-project/images/' # save_path = './Alpha-project/images_with_boxs/' # csv_path = './Alpha-project/baseline.csv' parser = argparse.ArgumentParser(description='draw_rbox_in_images') parser.add_argument('--image_path', type=str, default='images') parser.add_argument('--save_path', type=str, default='images_with_boxs') parser.add_argument('--csv_path', type=str, default='baseline.csv') args = parser.parse_args() image_path = args.image_path + '/' # imagepath == images/ save_path = args.save_path + '/' # save_path == images_with_boxs/ csv_path = args.csv_path #csv file load box_info = pd.read_csv(csv_path) #run start_index = 0 for i in range(len(box_info)+1): try: # i+1번째 파일이 다른 이미지라면, i번째 파일에 대해서 박스가 처진 그림을 그린다. if box_info['file_name'][i][0:-4] != box_info['file_name'][i+1][0:-4]: save_image_with_box(box_info, box_info['file_name'][i] , start_index, i, image_path ,save_path ) start_index = i+1 except: # box_info['file_name'][i+1]가 존재하지 않으면 , 즉 999.png 이후를 바라본다면 save_image_with_box(box_info,box_info['file_name'][i],start_index,i, image_path ,save_path ) ``` ### **c.** **코드 사용하는 방법** **<****실행 방법>** ```python python drawRbox_in_Images.py --image_path=./images --save_path=./images_with_boxs --csv_path=./baseline.csv ``` <****위 실행을 위한 data structure>** drawRbox_in_Images.py images \- 0.png \- 1.png \- 2.png images_with_box \- (empty) baseline.csv **<****세부 사항>** \- images에 있는 사진만 박스 친다. \- test사진 1240장 모두가 꼭 있어야 하는 것은 아니다. ### **d.** **이를 통해 배운 내용: 원하는 코드 찾는 방법** 여러가지 코드를 작성하다 보면, 이런 생각이 들 때가 있다. “내가 하고 있는 작업을 누군가 하지 않았을까?” 이럴 때 다른 사람들의 코드를 찾아보는 방법이 아래의 3가지가 있다. 위의 코드를 만들 때도 이 방법을 사용해서 코드를 찾아보곤 했다. **코드 검색을 위해, 다음을 이용하자.** \1. 케글 - 이미 개발된 코드가 있을 수 있고, discussion에 data augmentation에 대한 정보도 많다 \2. 깃 - 패키지 안에, 검색을 함으로써 이미 만들어진 코드를 검색할 수 있다. \3. 구글 - 어떤 코드, 함수를 찾으려면 위의 방법을 이용하는게 낫다. [~하는 코드]는 구글에서 찾기 힘들다

Pagination


© All rights reserved By Junha Song.