【확통】 최대 우도(가능도) 방법 (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. 구글 - 어떤 코드, 함수를 찾으려면 위의 방법을 이용하는게 낫다. [~하는 코드]는 구글에서 찾기 힘들다

【선박분류】 simplified_rbox_cnn 코드 분석 준비

오른쪽 사이트의 코드를 분석한다.

https://github.com/SIAnalytics/simplified_rbox_cnn

Tensorflow Object Detection API를 Base로 사용하기 때문에, 아래의 사진과 같은 분석을 해보았다.

파란색 라인 밑줄은 Tensorflow Object Detection API와 비교했을때 같은 폴더나 파일을 체크해 놓은 것이다.

그리고 파일 옆에 동그라미, 네모 표시된 파일은 내가 읽어보고 확인해볼 파일(코드)이다.

코드를 분석한 결과를 다음 게시물 부터 차근차근 적어놓을 계획이다.

img

【선박분류】 프로젝트 위한 Docker/DLPC 환경설정하기

DLPC는 국민대 딥러닝 서버 이름입니다.

(선박분류) 프로젝트 위한 Docker/DLPC 환경설정하기

사이트 목록

DLPC : https://dlpc.cs.kookmin.ac.kr/

Project : Dacon

BaseLine Code : https://github.com/SIAnalytics/simplified_rbox_cnn

img


[Docker 환경설정]

Local환경에서 baseline Code를 돌리기 위해 다음과 같은 환경설정을 하였다.

우선 아래의 이미지가 baseline code를 돌리는데 문제가 없다고 하여, 도커이미지를 다운 받았다.

Docker Hub TF Repo: https://hub.docker.com/r/tensorflow/tensorflow

TF 1.6 py3-gpu Docker Image: https://hub.docker.com/layers/tensorflow/tensorflow/1.6.0-gpu-py3/images/sha256-0f4b997bc3af4caa3b700552bf295dde3a6a36c4816ff036d0ddd1632e73cb52

$docker pull tensorflow/tensorflow:1.6.0-gpu-py3

그리고 이를 실행하기 위해 다음과 같은 코드로 실행시켰다.

$ sudo docker run –runtime=nvidia -it [–rm] -p 8888:8888 -p 6006:6006 –name tf16 tensorflow/tensorflow:1.6.0-gpu-py3

실행하면 자동으로 주피터가 열린다. 주피터 환경에서 upload를 진행했다. upload는 baseline의 git repository를 전체 git clone한 것을 압축하여 업로드 하였다. 파일이 주피터에 올라갔으면 터미널에서 아래의 명령어를 사용해 압축을 풀었다. (압축 하기, 풀기)

$ tar -xvzf <simpli~~>.tar

ctrl+c를 통해서 서버를 닫은 다음, 다음을 순차적으로 실행하면 정상적으로 동작하는 것을 확인하였다.

$ docker start $ docker attach chrome 의 주소창에 -> http://localhost:8888/tree

그러면 이전에 넣었던 파일이 그대로 있고, 주피터 환경이 열리는 것을 알 수있다.

그리고 이 파일을 내 도커 허브에 올려놓기 위해 다음의 명령어를 사용했다.

docker commit <tf16_with_rboc/ImageName/tag는 자동으로 latest>

도커 허브에 올리기

$ docker login $ export DOCKER_ID_USER=”sb020518” # str변수 정의 해둠 $ docker tag tf16_with_rboc:latest $DOCKER_ID_USER/tf16_with_rbox $ docker push $DOCKER_ID_USER/tf16_with_rbox


[DLPC 환경설정]

DLPC에서 baseline Code를 돌리기 위한 준비를 다음과 같이 환경설정 하였다.

1. virtualenv를 설치하기

패키지와 라이브러리들을 잘 관리하기 위해 virtualenv를 사용한다.

anaconda를 사용하려고 했지만, anaconda는 docker에서 좀 더 아래 Layer여서 사용할 수가 없었다. 또는 docker inside docker 방법으로 내가 활동하는 docker위에 docker를 새로 설치함으로써 내가 위에서 만든 이미지를 다운받아 사용하려고 하였다.

https://gist.github.com/Geoyi/d9fab4f609e9f75941946be45000632b

$ sudo pip3 install virtualenv $ virtualenv venv $ source ./venv/bin/activate

2. google drive handling

연결 끊김 방지 : https://bryan7.tistory.com/1077function ClickConnect() { var buttons = document.querySelectorAll(“colab-dialog.yes-no-dialog paper-button#cancel”); buttons.forEach(function(btn) { btn.click(); }); console.log(; document.querySelector(“#top-toolbar > colab-connect-button”).click(); } setInterval(ClickConnect,100060); function CleanCurrentOutput(){var btn = document.querySelector(“.output-icon.clear_outputs_enabled.output-icon-selected[title$=’현재 실행 중…’] iron-icon[command=clear-focused-or-selected-outputs]”);if(btn) { console.log(“30분마다 출력 지우기”); btn.click(); } }setInterval(CleanCurrentOutput,100060*30);

colab : Alpha_project.ipynb

from google.colab import drive drive.mount(‘/content/gdrive’) % cd /content/gdrive/My Drive/알파돌고래/10th ! ls

3. 추가 패키지 다운받기

baseline code : https://github.com/SIAnalytics/simplified_rbox_cnn

tenserflow object detection API : https://github.com/tensorflow/models/tree/master/research/object_detection

API install : https://github.com/tensorflow/models/tree/master/research/object_detection

$ pip install –ignore-installed –upgrade tensorflow-gpu==1.6.0 $ pip install OpenCV-Python==3.4.9.31 아래코드) DLPC에서 이것이 uninstall 되는 경우가 잦으므로, 자주 다시 설치해주기 $ sudo apt-get install protobuf-compiler python-pil python-lxml python-tk

$ pip install Cython contextlib2 pillow lxml jupyter matplotlib $ pip list #venv에서 activate 하고 있을때.

4. baseline 코드 실행해보기

$ cd ~/Rbox_junha/simplified_rbox_cnn/ $ protoc protos/*.proto –python_out=.

5. Data Set 다운로드

\1. dropbox계정에 로그인을 한다.

\2. 제공된 Data Set이 저장되어 있는 dropbox에서, send to my directory를 선택하여, 나의 계정에 파일을 넣어놓는다.

\3. share link를 만들어 링크를 복사한다.

(ex) https://www.dropbox.com/s/jauf/0~400%28with_json%29.zip?dl=0)

\4. DLPC에서 다음과 같이 명령어를 친다.

@ 주의 : sudo mv 0~400(with_json).zip\?dl=0 다음과 같이 특수문자를 사용하기 위해 \과 같이 사용해야 한다.

$ sudo wget https://www.dropbox.com/s/jauf/0~400%28with_json%29.zip?dl=0 # 다운 받은 파일의 이름을 바꾼다. $ sudo mv 0~400(with_json).zip\?dl=0 0~400(with_json).zip # 그리고 다음과 같이 압축을 해제한다. $ sudo unzip 0~400(with_json).zip -d ./0~400 # 해당파일을 압축해제. 0_400이라는 폴더 내부에 사진 저장.

\5. 그 다음 파일을 다운받기 위해, send to my directory 또 실행하면 공간부족이라고 뜬다. 따라서, 이전 파일을 지우고 1번~5번까지의 과정을 다시 반복한다.

img

6. train을 위한 Data Set 만들기

아래와 같은 명령어를 사용해서, 어떤 폴더에 있는 모든 사진(파일)들을 다른 폴더로 옮긴다.

$ sudo mv ./0~400/* ./0~400+json/

7. create_dataset (TFRecord 생성하기)

img

8. config 설정하기

img

9. train하기

python train.py …

10. python train_n_eval.sh

img


실행 순서

  1. pip install –ignore-installed –upgrade tensorflow==1.6.0

  2. [https://dacon.io/competitions/official/235492/codeshare/615]
  3. pip install shapely
  4. sudo python3 create_dataset.py –src_dir=’train’ –dst_path=’train.tfrecord’ –is_include_only_pos

  5. sudo python3 train.py –pipeline_config_path=”configs/rbox_cnn_resnet101.config” –train_dir=”train”

【25살】이전 블로그 글 링크

원래 나는 가끔 다른 곳에 공부한 내용들이나 나의 이야기를 글로 작성해왔다. 2020-04 이전에 올려진 게시물은 원래 다른 블로그에 작성한 글이다.

  1. 네이버 블로그
  2. Tstory 블로그

이후 내용은 다음 포스트 참조 (Git Page로 안녕하세요)

위 블로그 글들을 md 파일로 새로 만든 파일들은 아래의 링크에서 찾아 볼 수 있습니다.

【GAN】 처음으로 투고해본 통신학회 논문

논문 제목 : 다양한 생성모델들의 위성 사진으로부터의 지도 변환 성능 비교

(GAN) 처음으로 투고해본 통신학회 논문

Style Transfer Maps from Satellite Images by using Generative Models

논문을 한번도 써보지 않은 저에게, 이번 도전은 매우 큰 의미가 있었습니다.

많은 것을 공부해보았고, 많은 고민을 해보았고, 많은 논문 교정을 해보았습니다.

하면서 많은 것을 배우고 느꼈습니다.

점점 더 성장해 나가면서, 더 좋은 논문들을 작성할 수 있도록 꾸준히 노력해 나갈 것 입니다.

첫 도전은 많이 투박하고 많이 서툴렀지만,

꾸준함과 성실함, 독함이 저를 언젠간 크게 성장시킬거라 확신합니다..

img
img

【Digital-Twin】 일본 CPWC 대회 - 기사 원본

국민대 자율주행 자동차 동아리 KaAI에서의 활동 내용들을 올려봅니다.

일본 대회 수상^^

국민대 자동차융합대학 카이(KaAI)팀, ‘Cloud Programming World Cup 2019’ 수상

image

국민대 자동차융합대학 소속팀 ‘KaAI (Kookmin automotive Artificial Intelligence)’가 지난 2019년 11월 14일 일본 도쿄에서 열린 ‘Cloud Programming World Cup 2019’ 본선에서 ‘Implementation of Digital Twin for Vehicle and its Surroundings’이라는 작품으로 Honorable Judge Award상(2등상)을 차지하고 상금 5만엔을 받았다.

올해 제7회를 맞이한 ‘Cloud Programming World Cup 2019’은 3차원 가상현실(VR), 도시 모델링, 교통 및 드라이빙 시뮬레이션 소프트웨어 등을 개발, 판매하는 일본의 ‘FORUM8’사에서 후원하는 국제 대학생 소프트웨어 경진대회이다. 지난 4월부터 11월까지 한국, 일본, 중국, 타이완, 베트남 등 5개국 39개 팀이 참여하여, 7개팀이 최종 본선 발표 무대에 올랐으며, 국민대 KaAI팀이 2위로 Honorable Judge Award상 (Future Transport Design Award) 상을 수상하였다.

KaAI팀은 송사헌와 송준하 학생(자동차융합대학 3년)을 중심으로 자동차IT융합학과 8명, 자동차공학과 2명으로 구성되어 있으며, 2018년 겨울방학때부터 지금까지 1년동안 ‘Vehicle Monitoring over the Internet toward Digital Twins’라는 프로젝트 주제로 대회를 준비하였다. 이번 대회에서는 라이더, 카메라, GPS, CAN 데이터를 Linux의 ROS를 이용해 수신하고, 가공 및 융합하여 시뮬레이션에 필요한 정보를 얻어내고, 이 정보를 TCP/IP를 이용해 시뮬레이터(UC-win Load)가 있는 Windows 컴퓨터로 전송하여, 실시간으로 운전 중인 차량과 그 차 주변의 차량들을 시뮬레이션 하는 디지털 트윈 세계를 개발, 구현함으로써 심사위원들에게 독창성과 기술의 완성도 부문에서 높은 평가를 이끌어냈다.

지도교수를 맡은 이상헌 국민대 자동차IT융합학과 교수는 “오랜 시간 노력한 학생들에게 고생했다”면서, “운전 중인 차량의 주변 장애물 데이터를 실제 차량에 센서들을 장착해 얻어내고, 이 데이터를 적절하고 훌륭히 이용하여, 자율 주행 완성에 꼭 필요한 통합 관제 센터인 디지털 트윈을 구축했다는 점에서 심사위원들로부터 높은 평가를 받은 것 같다”고 밝혔다.

위 KaAI 팀은 전 전세계 107개국, 680개의 대학, 1470개 팀이 참여한 Valeo Innovation Challenge 2018 대회(프랑스 파리)에서도 총 9개팀이 뽑힌 최종 결선에 진출하였으며, 2018 GM PACE Global Project 경진대회(미국 디트로이트)에서도 국내외 대학 및 본교 자동차운송디자인학과와 융합팀을 구성하여 디자인 부문 1위, 주행 테스트 2위의 성과를 기록한 바 있다.

한편, 국민대 자동차융합대학은 최근 교육부의 ‘4차 산업혁명 혁신 선도대학’ 사업에서 ‘자율주행 자동차’ 과제를 수행하면서 자동차 기술의 융합적 트렌드를 반영한 학제간 융합교육에 앞장서 왔으며, 특히 이상헌 교수는 과거 GM PACE 센터 운영 및 학생지도 경험을 살려 자신의 실험실을 열린 형태의 실험실로 전환시키고 인공지능과 자율주행자동차에 관심을 갖는 많은 학생들이 온라인 중심 자기주도적 학습과 프로젝트 및 경진대회 참여를 통하여 자동차+IT 융합 인력이 육성되는 KaAI School을 개설하여 많은 호응을 얻고 있다. 본 작품을 개발하고 대회를 참여하는데 교육부의 4차 산업혁명 혁신 선도대학 사업과 한국과학창의재단의 학부생 연구 프로그램(URP) 지원 사업의 지원이 있었다.

Pagination


© All rights reserved By Junha Song.