【강화학습】 CS285 Lecture 5 정리노트

(강화학습) CS285 Lecture 5 정리노트

**BackGround

Importance sampling

통계 및 머신 러닝 문제에서 많은 경우는 어떠한 확률 분포 p의 기댓값 (expected value)을 구하는 것(샘플들을 추출해, 그 샘플에 대한 실험을 하고 실험한 결과를 평균을 낸다.)과 밀접한 연관이 있다. Importance sampling은 효율적으로 기댓값을 추정하기 위해 고안되었으며, 확률 밀도 추정 및 강화 학습 등의 다양한 활용에 이용되고 있다. Importance sampling의 목적은 기댓값을 계산하고자 하는 확률 분포 p(x)의 확률 밀도 함수 (probability density function, PDF)를 알고는 있지만 p에서 샘플을 생성하기가 어려울 때, 비교적 샘플을 생성하기가 쉬운 q(x)에서 샘플을 생성하여 p의 기댓값을 계산하는 것이다. 우리는 [식 1]과 같이 q에서 생성된 샘플을 이용하여 p의 기댓값을 계산할 수 있다.

img

[식 1]에서 p(x)/q(x)를 likelihood ratio라고 하며, p를 nominal distribution, q를 importance distribution이라고 한다. Importance sampling에서는 p의 기댓값 Ex∼p[f(x)]를 [식 2]와 같이 추정한다.

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 img img img img img img img img img img img img img

【Docker】 docker 실습/ docker sudo 없이 실행하기

(docker) docker 실습/ docker sudo 없이 실행하기

1.원하는 docker ubuntu Image를 만들어보자

$ sudo docker run -it –name ubun18 ubuntu:latest bash

ls cat /etc/issue apt update apt install python
python sudo apt install python3-dev python3-pip pip3 –help pip3 install numpy python3 –version python3 exit

$ sudo docker start <container ID> $ sudo docker attach <container ID>

$ sudo docker container ls -q # container ID만 출력

$ docker commit <container ID> ub_with_numpy:1


2.tensorflow를 실행해보자

$ sudo docker pull tensorflow/tensorflow:latest

$ sudo docker run -it tensorflow/tensorflow bash

$ docker run -it –rm -v /home/junha/Documents:/tmp -w /tmp tensorflow/tensorflow bash

주피터 실행

$ docker run -it -p 8888:8888 tensorflow/tensorflow:nightly-py3-jupyter ( $ docker run –runtime=nvidia -it -rm -p 8888:8888 -p 6006:6006 tensorflow/tensorflow:nightly-gpu-py3-jupyter ) $ sudo docker run -it –rm -p 8888:8888 -p 6006:6006 –name tf16 tensorflow/tensorflow:1.6.0

tenserflow-gpu 실행

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

여기서 –rm은 container를 exit하면 자동으로 container를 삭제하는 옵션이다. 따라서 나는 아래와 같은 명령어를 많이 사용했다.

그리고 8888은 주피터를 위한 서버이고, 6006은 텐서보드를 위한 서버라고 한다.

$ docker run –runtime=nvidia -it -p 8888:8888 -p 6006:6006 –name tf16_rbox 6bdfac5fa12a

참고로 이미지는 나의 허브에 있는 이미지이다.

[sb020518/tf16_with_rbox latest 6bdfac5fa12a 2.99GB]


3.sudo 없이 실행하기

아래의 명령어를 순서대로 처준다.

$ sudo groupadd docker

$ sudo usermod -aG docker $USER #그대로 치기 users(whoami)로 바꾸지 마세요

$ reboot # 컴퓨터를 한번 껐다 켜준다.

이제 sudo 없이 docker가 실행이 될것이다. 하지만

WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied 이게 뜬다면, 아래의 2줄을 터미널에 차근히 입력해준다.

$ sudo chown “$USER”:”$USER” /home/”$USER”/.docker -R

$ sudo chmod g+rwx “$HOME/.docker” -R


4.docker image push하기

https://nicewoong.github.io/development/2018/03/06/docker-commit-container/

https://seulcode.tistory.com/227

정리

우선 docker hub에 로그인 한다.

$ docker login

이미지의 이름(태그)를 바꾸어서 복제를 한다.

$ docker tag <old image> <sb020518즉 userID>/<new docker-image-name[:tag-name]>

이제 hub로 push해보자

$ docker push <sb020518즉 userID>/<new docker-image-name[:tag-name]>

이와 같이 hub에 새로운 image가 생성된 것을 확인할 수 있다.

img

【Python】 2020.02 새로 안 사실

(Python) 2020.02 새로 안 사실

1. list의 인덱스는 무조건 // 연산자를 써야 한다.

list[i/2]를 사용하면 에러가 난다. / 연산자를 써서 나오는 결과는 무조건 float형이다. 그게 8/2 = 4.0 이 된다.

따라서 i/2가 4.0이라 할지라도 list[i//2]를 사용해야한다.

2. list에서 * 연산자를 함부러 쓰면 안된다.

[1] * 10 = [1,1,1,1,1,1,1,1,1,1] 이다.깊은 복사이다. (주소 복사 아님)

하지만 [[1]2]3 = [[1,1][1,1][1,1]] 에서 [1,1]들은 모두 얕은 복사이다. (포인터, 참조 복사임)

[1 for i in range(100)] 을 사용하는 것이 유리하다.

순서대로 ABC

img

A : 변수 for는!

0을 , 로 나누어 100개 나열해준다. []는 밖의 []가 묶어줌

[]을 ,로 나누어 100개 나열해준다. []는 밖의 []가 묶어줌

C : [] *는! <주의!! 리스트 복사만! sallaw copy이다! 주소복사임.. 사용하지 말것>

[ ]안에 있는 0을 ,로 나누어 100개 나열하고 []로 묶어 준다. [ 이건 깊은 복사 ]

[[ ]]안에 있는 []를 ,로 나누어 100개 나열하고 []로 묶어 준다. [ 이건 얕은 복사]

list의 * 연산자는 사용하지 말것.

3. list dir tuple을 사용한 함수 매개변수 전달만이 얕은 복사이다.

만약 output정보를 담을 매개변수를, 외부함수에 전달하고 싶으면 위와 같은 자료형의 변수를 사용해야 한다.

4. input이 0일 때 항상 문제가 발생한다.

백준이든 프로그래머스이든 input이 0과 max일 때 꼭 고려하기

5. sort를 하고 문제를 푼다.

주어진 문자열 리스트, 숫자 리스트에 대해 sort를 먼저 하는 행위는 시간초과의 위험이 있다.

하지만 sort를 사용해서 문제를 풀어야 하는 경우도 존재한다.

sort를 해서 문제를 푸는 것은 가장 마지막 방법으로 생각하자.

6. 내가 생각할 수 있는 풀이 방법이 이 1개라고 단어하지 말아라.

문제를 보고 풀이 방법 1개가 생각났다고 하자. 그럼 그 방법으로 풀려고 코딩하지 말아라.

시점을 바꿔서 다른 방법으로 풀이를 생각해 보아라.

7. copy

얕은 복사 : YES 참조 선언. A is B == True. 서로 id가 같음.

깊은 복사 : NO 참조 선언. A is B == False. 서로 id가 다름.

좀 더 자세히 공부해보자. [이 사이트 정리][추가 사이트]

8. 파이썬 객체와 변수

9. copy

- 파이썬에서 모든 것은 객체이다. 객체는 유일하고 ID는 변하지 않는다. 그 ID가 C처럼 실제 메모리 주소는 아니다.

- 변수는 그 객체를 가리키는 역할만 한다.

- 깊은 복사 : copy of value 얕은 복사 : copy of reference

mutable에서는 값이 변하면 객체 그냥 새로 만들어 버린다.

immutable에서는 단순복사 : copy of reference 얕은 복사 : copy of value + reference 깊은 복사 : copy of value

list, set, dict 객체들객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 가능(mutble)b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 객체가 수정가능하니 b를 위한 새로운 객체를 만들지 않는다.
int, float, complex, bool, string, tuple, frozen set 객체들객체가 만들어진 메모리 공간에 다가가 그 객체 값 수정 불가능(immutble)b=a연산자를 통한 복사로, 같은 객체를 가리킨다. 하지만 객체가 수정 불가능하니 b를 위한 새로운 객체를 만든다.

정수(int)

- 변수는 객체를 가리킬 뿐이다. 변수에 사칙연산을 하면, 사칙연산 결과의 객체가 새로 생기고, 그 객체를 변수가 가리킨다.

- 변수가 가리키고 있는 ‘객체’의 값을 비교하고 싶다면 ==연산자를 사용해야 한다.

- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.

- 0~255의 값을 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다.

실수(float)

- ‘객체의 값’이 같더리도 (같은 값을 가지는, 다른 메모리에 위치하는, 2개의 객체) Id가 다를 수 있다.

-a ~ z, A ~ Z, 0~9, _를 문자열의 요소로 가지는 객체는 모두 같은 메모리에 위치한다. 이를 제외한 나머지는 모두 바로 위 조건을 따른다. (하지만 input으로 받은 문자열은 어떤 값이든 다 다른 메모리에 위치한다.)

리스트(list)

- immutable객체 이므로 위 표의 조건을 따른다.

- immutable객체의 경우, 얕은 복사(shallow copy)와 깊은 복사(deep copy)간에 차이가 없다. 앝은 복사(copy.copy(Object)), 깊은 복사(copy.deepcopy(Object))으로 생성한 각각의 객체들은, == 연산자로 true이지만, Id를 확인하면 모두 다른 id이다.

- 하지만 2차원 이상 list는 얕은 복사와 깊은 복사가 다르다. 얕은 복사를 하면 이 2차원 list([ [], [] ])에서 ** 는 참조복사 된다.

- 2차원 이상의 list도 깊은 복사를 하고 싶으면, list 깊은 복사(deepcopy)를 해줘야 한다.

튜플(tuple)

- 튜플은 값 수정이 불가능하다. 하지만 같은 값을 가지는 객체 더라도 서로 id가 다르다.

- 튜플 내부의 원소가 mutable이면, 그 원소는 수정 가능하다. a = ([1, 2, 3]) » a[0].append(4) 가능!

항상 mutable한 객체가 문제이다.

immutable한 객체는 거의 문제가 되지 않는다. 값이 변하면 ‘바로 그냥 새로운 메모리 할당!’이라고 생각하자

10. 블로그 읽을 때, 마우스 잡지 말기!! -> 집중해서 또박또박 읽기. Just Do It

11. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.

image

12. 클래스 변수는 전역변수이고, 생성자 맴버 변수는 지역변수 이다.

만약 2개의 변수를 return하는 iter에 대해서,
for x in dataloader_iter : 를 사용하면 x에 len=2짜리 list로써 변수가 들어간다.
for x,y in dataloader_iter : 를 사용하면 x와 y에 iter가 주는 변수를 나눠가진다.

**13. **

【Algorithm】 [백준] 16549 숨바꼭질 3

문제는 다음과 같습니다.

https://www.acmicpc.net/problem/13549

  1. 수빈이는 *2배를 0초만에 갈 수 있다.

  2. 수빈이는 +1 -1을 각각 1초만에 갈 수 있다.

문제 풀이 - dynamic programming

  1. 0부터 N까지 먼저 채워놓고, N부터 차근차근 하나씩 앞으로 나가면서 해당 자리에 오는데 걸리는 최단시간을 찾는다.

img

def fineMaxTime(N,K):
    MaxTime = K-N
    i = 2
    while(1):
        dist = K - N*i
        if MaxTime <= abs(dist) :
            max_num_list = N*(i) if N != 0 else K+10    # 0문제 해결
            return MaxTime, max_num_list
        i += 1

def findtime(N,K):
    if N >= K :
        return (N-K)

    Maxtime, max_num_list = fineMaxTime(N,K)
    lst = [Maxtime+1] * (max_num_list+1)

    # complex case
    for i in range(N+1):
        lst[N-i] = i

    for i in range(N+1, max_num_list+1):
        if i % 2 == 1:
            lst[i] = lst[i-1]+1
        else :
            if lst[i-1]+1 > lst[i//2]:      # /연산을 해서 나오는 것의 자료형은 무조건 float
                lst[i] = lst[i//2]
                for j in range(1,100000):        # 뒤를 보고 숫자가 너무 크면 줄여준다.
                    if lst[i-j] > lst[i-j+1]+1:	 
                        lst[i-j] = lst[i-j+1]+1
                    else : break

            else : lst[i] = lst[i-1]+1
    return lst[K]
    
            
if __name__ == "__main__":
    N, K = map(int, input().split())
    print(findtime(N,K))

문제 풀이 - deque

img

  1. que알고리즘을 사용한다

  2. dist에 그 위치에 가는데 걸리는 시간을 계산한다.

원래 큐는 오른쪽에서 들어가서 오른쪽에서 나온다.(first input first output)

deque를 사용해서 스택과 큐를 동시에 사용할 수 있다.

deque(double-ended queue) 설명 :

  1. https://excelsior-cjh.tistory.com/96

  2. https://godoftyping.wordpress.com/2015/04/24/python-%EB%8D%B0%ED%81%ACdeque/

    from collections import deque

    MAX = 100000
    N, K = map(int, input().split())
    q = deque()
    dist = [-1] * MAX * 2
    dist[N] = 0
    q.append(N)
    solution_second = None

    while q:
        x = q.popleft()
        if x == K:
            solution_second = dist[K]
            break

        for op in (x, 1, -1):
            nx = x + op
            if 0 <= nx < MAX * 2 and dist[nx] == -1:
                if op == x:
                    dist[nx] = dist[x]
                    q.appendleft(nx)
                else:
                    dist[nx] = dist[x] + 1
                    q.append(nx)

【Algorithm】 [백준] 17404 RGB거리 2

주의해야 했던 점 :

첫번째 집과 마지막 집도 이웃이다.

처음에 생각했던 방법과 손코딩 :

가장 단순한 방법으로, 모든 경우의 수를 찾는 방법이다.

이를 위해 reculsive function을 사용했다. (재귀함수)

하지만 역시.. 시간 초과

img

정답 :

아래의 사이트 참고해서 공부할 것

https://m.blog.naver.com/occidere/220785383050

https://copy-driven-dev.tistory.com/m/78?category=837580

https://taekho-nology.tistory.com/100

【Ubuntu】 우분투 중지된 프로세스 처리

(Ubuntu) 우분투 중지된 프로세스 처리

중지된 프로세스 처리하기

https://studymake.tistory.com/621

가끔 ctrl c를 눌러야 프로세스가 종료가 되는데 실수로 ctrl z를 누루는 경우가 있다.

이때는 process가 중지된 상태로써 process가 좀비상태로 남아 있는 것이다.

이때 다음과 같은 명령어만 사용하면 된다.

$ jobs $ kill -KILL %

img

【Docker】 Docker 개념 및 기본 명령어

(Docker) Docker 개념 및 기본 명령어

공부하기 좋은 사이트 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

기본 명령어 공부한 동영상 : https://www.youtube.com/watch?v=pMY_wPih7R0&list=PLEOnZ6GeucBVj0V5JFQx_6XBbZrrynzMh&index=3

1. Docker의 기본 개념

[Docker를 사용하는 이유]

img

정리 : 프로그램을 주고 받을 때, 그 프로그램을 위한 환경까지 같이 주자!! VMware와 같은 가상머신보다 훨씬 가볍게, 낮은 layer에서 동작한다.

[Docker Architecture]

img

정리 : Registry는 docker hub이다. 그곳에 많은 이미지들이 저장되어 있다. 이미지를 pull해와서 나의 local docker에 저장해놓고, 내가 필요할 때만 image를 container에 올려서 새로운 os나 환경을 구동한다.

img

왼쪽이 docker가 사용하는 Layers이고 오른쪽이 윈도우에서 VMware를 사용했을때 Layers모습니다.

2. Docker 기본 명령어

현재 내가 가지 도커 버전 검색

ps. nvidia-docker는 docker설치 이후에 설치할 것. 장점 : cuda설치 하지 않고 tensorflow-gpu이용 가능

​ nvidia-docker2까지 설치할 것.

https://github.com/NVIDIA/nvidia-docker/

$ docker version

$ docker –version

나의 docker 사용 정보 확인

$ docker info

docker 설치 후 설치가 잘 되었나 확인

$ docker run hello-world

내가 원하는 이미지 검색 - official로 다운 받기

또는 docker hub에서 검색하기 https://hub.docker.com/

$ docker search

내 컴퓨터의 docker image가 무엇이 있는지 확인

$ docker images

$ docker image ls -a

내 컴퓨터의 docker container가 무엇이 있는지 확인

$ docker container ls -a

$ docker ps -a

docker 사용 중 메모리 정보 확인

$ docker system df

docker 이미지 hub에서 가져오기

$ docker pull <docker-image-name[:tag-name]>

Ex) $ sudo docker pull tensorflow/tensorflow:latest

이미지 container에 올리기

$ docker [container] run -it –name [-p 8888:8888] bash

Ex) $ sudo docker run -it –name ubun18 ubuntu:latest bash

실행한 docker에서 원한는 명령어 실행하기

이미지에서 원하는 프로세스만 실행하고 종료하기

$ docker run -it –name /bin/bash $ docker run ubuntu:latest /bin/echo 'Hello world'

Ex) $ sudo docker run -it –name ubun18 ubuntu:latest /bin/cat /etc/hosts

bash상태에서 나가는 방법 2가지

$ exit # container를 stop해버리기

$ ctrl+P -> ctrl+Q(detach) # container에서 detech

이미지,컨테이너 삭제하기

$ docker container rm

$ docker image rm

사용하지 않는 이미지, 컨테이너 삭제하기

$ docker image prune

$ docker container prune

컨테이너 Up Down상태 바꾸기.

$ docker container stop

$ docker container start

detect한 container 위에 다시 올라가기

$ docker attach

이미 실행되어 있는 container에서 원하는 프로세스만 실행하기

$ docker exec -it /bin/cat /etc/hosts

container이름 바꾸기

$ docker container rename

3. 기본 docker 이미지 만들어 보기

$ docker run -it ubuntu:16.04 bash

# vi

command not found

# apt update

# apt install vim

$ sudo docker container ls -q # container ID만 출력

$ docker commit ub_with_vim:1

4. Directory 공유하기( –volume) (Bind mount a volume)

-v 옵션 이용하기

$ docker run -it -v /home/junha:/host_home ub_with_vim:1 bash

Docker 공부 사이트

https://subicura.com/2017/02/10/docker-guide-for-beginners-create-image-and-deploy.html

https://www.sangkon.com/hands-on-docker-part1/

https://www.44bits.io/ko/post/how-docker-image-work

이 정도 공부했으면… docker는 계속 파보면서 공부해야한다^^

앞으로 내가 공부할 것.

1. 초보 위한 도커 안내서 2강 3강

2. tensorflow pytorch 올려서 사용해보기

【Git】 Git 기초와 활용3 Readme/Rebase/onfig (terminal)

(Git) Git 기초와 활용3 Readme/Rebase/onfig (terminal)

https://www.youtube.com/watch?v=ys0lVeTHl7c&list=PLRx0vPvlEmdD5FLIdwTM4mKBgyjv4no81&index=15

아래의 내용은 다음의 내용을 요약 정리한 내용입니다.

https://www.youtube.com/watch?v=MFJIOqxK6k8&list=PLRx0vPvlEmdD5FLIdwTM4mKBgyjv4no81&index=11

1. Readme.md파일 작성하기

파일을 작성하기 위해서 마크 다운을 공부해야한다.

전체 git 마크 다운 공부할 때 참고할 사이트.

https://gist.github.com/ihoneymon/652be052a0727ad59601

핵심만 공부하기! https://ndb796.tistory.com/194?category=1029186

  1. #

# ## ###

#이 많아지면 글씨는 점점 작아진다. 5개까지 지원한다.

  1. ’’’ ‘’’

소스 코드 삽입하는 방법

3.실제 내용

하이퍼링크 넣기

    • +

순서가 없는 목차 나열하기

인용구문 처리하기

> “그냥 해라” -이충권-

  1. |—|

표만들기

이름영어정보수학

—|—|—|—|

나동빈98점87점100점
홍길동97점78점93점
이순신89점93점97점
  1. 굵은 글씨는 ** ** 중간 선은 ~~

raw : 가나 다라마바사 아야어야아자차카

output : 가나 다라마바사 아야어야아자차카

2. Archive(필요 X)

$ git archive –format=zip master -o Master.zip

​ #output이 다음과 같은 이름으로 다운받아진다

내가 가진 git폴더 내부의 내용들만 압축파일로 만들어서 친구에게 전해주고자 할 때

3. Rebase 명령어

이 명령어는 commit을 수정하거나 삭제하고자 할 때 사용한다.

우선 최근 commit내용을 다음으로 확인한다.

$ git log

최근(HEAD) 3개의 commit내역에 대해서 commit내용 변경을 원할 때, 다음을 사용한다.

아래의 3의 숫자를 바꿔 최근 몇번째 commit내용까지 수정을 원하는지 정할 수 있다.

ghrdms

$ git rebase -i HEAD~3 OR $ git rebase -i <commit code ex) 54ab4bf3561sdf81sd9f156h1 # 이 시점 이후의 모든 commit보여준다.

그러면 vi 창이 나온다. (-i옵션이 interaction을 나타내어 vi를 띄어준다)

img

내가 수정하고 싶은 commit부분을 reword로 바꿔주고 엔터를 치면, 새로운 vi화면이 나온다.

(하늘색 부분에 옵션이 있고 설명이 있다. )

drop이라는 키워드를 사용하면, 특정 commit이 삭제 된다.

그리고 그 commit자체가 처음부터 실행되지 않은 것처럼, 파일과 코드들도 다시 원래로 돌아온다. (삭제 혹은 생성)

(이때 commit삭제는 충돌이 일어날 가능성이 많으므로, 팀프로젝트에서는 하지 않는 것이 좋다.)

img

새로 나온 vi화면에서 내가 원하는 내용의 commit으로 바꾸고 Enter를 해준다.

4. config 명령어

$ git config –list # 나의 컴퓨터의 git 사용자를 말해준다.

만약 사용자를 지정해 놓지 않았다면, 다음 명령어를 사용해서 컴퓨터에 사용자 정보를 넣어준다.

$ git config –global user.name junha1125

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

새로운 깃 repository만들기.

$ mkdir $ cd $ git init # 깃 프로젝트가 하나 생성되었다. $ cd ./git && ls # 이 내부에 있는 config파일에 사용자가 정의되어 있다. 바꿀 수 있다.

그리고 다시 원래 위치로 돌아가서

$ cd $ git congit user.name junha3

위와 같이 특정 repo에서 user가 새로 만들어졌다면, 이 user가 global user 보다 우선이다.

(추가적으로 config명령어를 통해 정말 많은 환경설정을 할 수 있으니 나중에 참고해 공부하기 바란다.)

5. commit을 했던 날짜와 시간을 바꾸기

$ git log

$ git rebase -f 54ab4bf3561sdf81sd9f156h1

pick -> edit -> :wq -> 엔터

$ GIT_COMMITER_DATE=”Oct 1 10:00:00 2018 +0000” git commit –amend –no-edit –date “Oct 1 10:00:00 2018 +0000”

$ git rebase –continue # 변경된 내역을 반영하겠다.

Git commit내용을 하나하나 살펴보면서 바꾸고 싶다면.. (링크)

$ git filter-branch

【Paper】 RBox-CNN Rotated Bounding Box 논문 리뷰

RBox-CNN Rotated Bounding Box based CNN for ShipDetection in Remote Sensing Image

0.Abstract

- 이 논문은 RBox-CNN 모델을 제안한다.

- Faster RCNN을 배이스로 사용한다.

- RPN(region proposal network)에서 RRoi(rotation region of interest)를 찾아낸다.

- ROI pooling layer에서 diagonal ROI pooling layer도 추가했다.

​ * 더 좋게 보정된 regression할 rocation을 찾아낸다.

- 선박 검출 문제에서 좋은 검출 결과를 얻었다.

- 항공 사진(원격 탐사 이미지) 객체 검출에 중요한 성과를 얻었다.

1.Introduction

- 원격 탐사 이미지(remote sensing technology) 사용의 중요성이 증가하고 있다. 이 사진은 항구 관리, 해군 전시 상황에서 많이 사용될 수 있지만, 복잡한 backgorund처리와 밀집된 배들을 처리하기에 어려움을 격고 있었다.

- 요즘 핫한 CNN을 사용하고, Faster RCNN을 사용할 것이다.

- 일반적인 BBox는 배경까지 포함하는 수직 직사각형이므로 정확한 분석이 어렵다. 도한 거기에 NMS을 시행한다면 잡아야할 객체를 잡지 못하는 문제가 발생하기도 한다.

(NMS : 객체 중복 검출을 막기위해 겹치는 영역의 BBox들 중에 신뢰도가 가장 높은 Box만 남겨놓는 방법.)

(IoU : 즉 a영역을 객체라고 분류를 했다면, 그 영역을 ground truth영역과 비교해서 iou가 0.5이상이면, a영역과 ground truth영역에 대한 regression 학습을 시키는 방법. 당연히 분류(클래스)에 대한 학습도 한다. 만약 객체라고 분류한 a영역의 IOU가 0.5이하 이면 그것으로 BBox regression 학습시키지 않는다.)

- 따라서 이러한 문제를 해결하기 위해 rotated BBox를 사용 해보고자 했다. 또 diagonal region-of-interest pooling layer 내용도 제안할 예정이다.

2.Related Work(최근에 시행된 관련 연구들)

3.Methodology(방법론)

- Faster R-CNN with rotation anchors

- RBox and DRoI pooling llayer

3.1 Rotated Dounding Box Anchor

\1. RBox 는 (x,y (center-point), h(짧은 모서리), w(긴 모서리), theta(시계 반대방향으로 돌아간 정도)) 5가지 원소를 가지는 튜플이다. theta는 [-pi/2,pi/2]의 범위를 가진다.

img

\2. RBox regression(loss) 는 오른쪽 그림과 같다. 여기서 smooth loss는 Fast-RCNN에서 정의된 내용이다.

img

img

Faster rcnn 유투브 강의자료 참조

3.2 RoI and DRoI pooling layer

- 그냥 pooling layer를 사용하는것이 아니고, rotated RoI pooling layer를 사용한다.

img

- rotated RoI pooling layer : Box를 수평한 방향으로 다시 회전시킨 후에, Rescale처리를 하는 방법.

(a) : 원래 이미지를 RBox로 예측한 모습

(b) : 회전 후 max pooling적용 -> crop한것 처럼 보임

(c) : diagnal RoI Pooing을 적용. (b)만을 이용한다면, 선박 위의 작은 물체들이 사라지거나 너무 안보이는 현상이 일어난다. 따라서 있는 그대로의 물체를 바라보기 위해 diagnal RoI를 적용한다.

최종 Achitecture

img

3.3 Loss function

img

최종 loss function은 다음과 같이 정의한다.

이때, p는 예측값 score이다 (softmax처리 한)

​ l은 실제 정답 값 score(one hot)

​ Lloc는 위의 수식에 있다.

4 experiments

5 conclusion

img

img

img

img

img

img

【Git】 Git 기초와 활용2 branch/conflict/log (terminal)

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

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

따로 공부하면 좋은 사이트

https://backlog.com/git-tutorial/kr/stepup/stepup2_1.html

ps. terminal에 작성한 gedit은 우분투 기본 텍스트 편집기 입니다. (윈도우의 메모장)

1. Branch 다루기

Master branch : 자동적으로 생성되고, 가장 중심이 되는 Branch이다.

다음과 같은 구조로 프로젝트가 이어나가도록 한다.

img

Merge : 합치기. 나눈 branch를 하나로 합치는 작업. 위의 사진의 2번째 노드에서 다른 branch와 만나 융합하는 작업이다.

Branch 관련 명령어

$ git branch

다음과 같이 별다른 branch를 만들지 않았다면, master만 있다.

$ git branch

새로운 branch를 만드는 방법.

$ git checkout NewBranchName $ git branch

내가 진짜 작업할 branch를 고르는 명령어

img

만약 파일을 수정하고, add하고 commit까지 해줬더라면, HEAD가 새로운 branch만 가리킨다.

img

만약 에러가 있어서 HEAD가 master와 origin/master까지 모두 가리키고 있다면, remote repo에 branch만들어주면 된다.

remote에도 나의 branch 추가해주기

$ git push –set-upstream origin junhaB

다음과 같이 한번 해주면 remote repository에 branch가 추가된것을 확인할 수 있다.

그리고 각각의 branch에 들아가서 add, commit을 따로따로 수행할 수 있다.

내가 어떤 branch에 들어가 있는지에 따라서, 파일들의 내용들이 완전히 바뀌는 것을 확인할 수 있다.

$ git log $ git status #내가 작업하는 branch가 어디인지 확인하능.

를 통해서 어디에서 작업하고 있고 어디에서 수정했는지 확인이 가능하다, (HEAD가 가리키는 방향)

img

img

img

branch 삭제하는 방법.(local repo에서만 삭제 된다.)

$ git branch -d $ git branch -D junhaB # junhaB에서 수정된 내용이 있더라도 commit을 안했더라도 강제 삭제

remote repo의 branch도 삭제하기

$ git push origin –delete

merge

$ git checkout master # master branch에 먼저가서 $ git merge # 이것과 융합한다. (합친다) 두개를 같게 만든다. $ git merge --no-f # git log graph를 그렸을때 branch에 대한 정보가 추가 된다.

2. Branch사이의 충돌 처리

2개의 branch에서 서로 다른 파일을 수정했다면, merge할 때, conflict(충돌)이 발생하지 않는다.

하지만 같은 파일을 수정했었더라면, merge할 때 충돌이 발생한다.

img

다음과 같이 같은 파일을 변경하고 Master로 돌아가서 merge를 시행하면, 어느 파일에 충돌이 발생한지 나온다.

충돌한 파일에 들어가면 «« 부터 »» 가 충돌한 부분이고,

master의 상태로 놔두고 싶다면, 초록색 박스를 남기고 빨간색 부분을 다 지우고

NewBracnh의 상태로 놔두고 싶다면, 파란색 박스를 남기고 빨간색 부분을 다 지우면 된다.

그리고 다음과 같이 그냥 다시 merge하면 안된다. add와 commit과정을 다시 하고 merge를 해야한다.

img

그리고 변경한 내용을 전부 remote repository에 올리려면 다음의 명령어

$ git push -f

img

3. Remote Repository 관리하기

$ git remote

해당 local repo에서 remote와 관련된 것이 무엇인지 보여준다.

기본적으로 origin을 보여준다.

origin에 대한 자세한 정보를 보고 싶다면,

$ git remote show origin

을 사용한다.

일반적으로 하나의 local repo와 하나의 remote repo를 연동시켜 놓는다.

하지만 하나의 local repo와 여러개의 remote repo를 연동 시켜 놓는것도 가능하다.

이때 사용가능한 명령어들은 다음과 같다.

$ git remote add test # 새로운 remote repo와 연결 $ git remote rename test temp # remote repo이름 바꿈 $ git remote -v # 전체 연결된 remote repo들을 확인해본다. $ git log origin/master # 특정 remote repo의 특정 branch에 대한 log를 확인하는 방법 $ git log temp/junhaB # 특정 remote repo의 특정 branch에 대한 log를 확인하는 방법

하지만 위에서 말했듯이 일반적인 경우에 local repo와 remote repo를 하나씩 연동하기 때문에

이 명령어들은 필요할때 찾아봐서 이용하면 된다. 즉 몰라도 된다.ㅎㅎ

4. Log 다루기

기본 적으로 다음의 명령어로 log를 확인할 수 있다.

$ git log $ git log –stat # 어떤 코드에 얼마나 많은 양의 수정을 했는지 그려준다

-p 옵션

$ git log -p

정확히 어떤 변경을 했는지, 코드 내부의 내용까지 보여주면서 log정보를 보여준다.

pretty옵션

$ git log –pretty=oneline 출력 결과 1a19ea5a514a2525815ec23b87bb6f2cd8b4781b (HEAD -> master, origin/master) commend ad875c560f0f6ce50e791efe6d1c2a9b51c73b45 commend 3793893ad7f56190be06b916ed3b1cc67443108a add line of aa 42b8cb2c1a42b8c12bf4d4f47e67c5ba6236ac0e add junha.py. 수정 readme 1916e39cf972406de7f89407ab35587e450342d0 first commit[readme.md]

commit했던 것들을 깔끔하게 보여준다.

pretty에 대한 공부는 아래의 페이지를 이용하면 좋다.

http://www.dreamy.pe.kr/zbxe/CodeClip/3766623

복잡하면 이것만 사용하기 :

$ git log –pretty=format:”%h -> %an : %s” –graph

그리고 아래의 명령어를 사용해서 내가 원하는 commit으로 돌아갈 수 있다.

$ git reset –hard

img

reset한 것을 다시 원래 대로 돌리고 싶다면 다음의 명령어를 사용한다. (by )

$ git reflog # 출력값 확인하기 $ git reset –hard HEAD@{위의 출력에서 하나 선택}

img

Pagination


© All rights reserved By Junha Song.