728x90

*중급편 부터는 기초편과 중복되는 학습 내용을 스킵했습니다.*

 

 

1.대시보드 만들기

대시보드를 통해 연간매출,월매출,시도별매출을 연결 가능하다.

1-1.연간매출

 

1-2.월매출

 

1-3.시도별매출

 

1-4.대시보드 만들기

순서: 맨 밑에 대시보드 워크시트를 클릭 -> 왼쪽 상단 크기 항목 부분에 고정된 크기(데스크타 브라우저)로 설정 -> 왼쪽 시트란에 있는 연간, 월간, 시도 매출을 드래그 하여 아래 그림처럼 배치

-> 고객 세그먼트 범례는 아래 그림처럼 부동을 클릭하여 위치 자유롭게 설정 -> (아래 이어서)

-> 대시보드 메뉴의 동작 클릭 -> 동작 추가 -> 필터 -> 아래처럼 설정하게 되면 특정 연간 매출을 클릭시 월간, 시도별 매출에 영향을 준다

-> 같은 과정을 반복하여 월간 매출 클릭 시 연간 및 시도 별 매출에 변화를 주도록 설정한다. -> 고정된 크기에서 자동으로 변경하면 아래와 같이 만들어 진다.

공유하는 방법은 저장한 후, 곧이어 뜨는 웹 상의 url을 전달하는 방식으로 진행 할수 있다.(public 버전)

 

 

2. 스토리 만들기

2-1) 연간매출 비교

 

2-2) 제품 대분류 연간 매출 비교

 

2-3) 제품 대분류 분기별 매출비교

 

2-4) 제품 대분류 월별 매출비교

월(주문 일자)는 연속형으로 설정 후 분석패널에 있는 추세선 중 다항식을 선택한다.

 

2-5) 스토리 만들기

순서: 맨 아래 새 스토리 클릭 -> 나타내고자 하는 대시보드를 드래그 한 후, 캡션 박스 안에 스토리를 적는다. -> 다른 대시보드를 드래그 하여 아래 그림처럼 위치 시키면 추가가 된다.

 

완성된 스토리 보드

 

 

3. 퀙 테이블 계산하기

3-1) 누계

합계매출을 2개로 나뉜 뒤, 다른 하나는 퀵테이블의 누계를 클릭 후 이중 축을 걸어주면 위처럼 만들어진다.

 

3-2) 차이

연속형 분기를 열에 넣은 후, 매출 퀵테이블의 차이를 클릭하면 위와같으느 표현을 할수 있다. 바로 전 분기와의 차이를 볼수있다. 색상은 선반에 있는 분기를 색상에 넣어주면된다.

각 년도의 1월을 기준으로 12월까지 얼마나 차이가 있는지에 대한 테이블을 만들어 본다. 선반과 같이 넣어준 뒤, 퀵테이블을 차이를 클릭 한다. 그러면 직전과의 차이가를 보여준다. 내가 보고싶은 것은 각 년도별 1월을 기준으로 12월까지 얼마나 차이가 있는지이다. 즉 기준이 각 년도별 1월인 것이다. 이를 설정하기 위해서는 퀙테이블 윗칸에 있는 기준을 첫 번째로 설정한다. 이러면 기준은 2018년도 1월이다. 모든 값이 2018-01과 차이값을 출력한다. 따라서 각 패널마다 1월로 기준을 잡기 위해선 기준 칸 위에 위치한 다음을 사용하여 계산을 클릭 -> 패널(아래로)를 눌러주면 각 년도별 1월이 기준으로 설정된다.

 

3-3) 구성비율

퀵테이블의 구성비율을 선택 후, 계산 편집은 아까와 마찬가지로 패널을 아래로 설정하면 제품 대분류마다 중분류 제품의 비중을 볼수 있다.

 

3-4) 순위

구성비율대신 순위를 선택해준다. 그 후 중분류 내 순위를 보고자 한다면 패널 아래로 설정을 해준다. 매출 값 두개를 추가하여 하나는 전체순위로 변경하고 나머지는 매출로써 표현 해준다.

 

 

4.퀙 테이블 계산하기2

4-1) 비율차이 & 전년 대비 성장률

퀵테이블에서 각각 비율 차이(전월 대비 성장률) 및 전년도 대비 성장률을 만들어 준다. 매출도 따로 추가해준다. 열 선반에 지역을 넣어주면 각 지역별 정보를 볼수 있다.

 

4-2) 백분위수

고객명 필드 레이블에 아래 화살표 클릭 후 필드 -> 합계 클릭하면 매출의 합계를 기준으로 내림차순이 가능하다. 마크의 합계 매출에서 백분위수를 클릭 - > 테이블 계산 편집에서 내림 차순으로 정렬하면 수능처럼 상위 몇퍼센트 개념을 사용 할수 있다.

 

4-3) 이동평균

연속형 분기와 매출값으 아래처럼 넣은 후, 측정값을 이동평균으로 변경한다. 매출과 같은 축 선상에서 비교 하기 위해서 매출 값을 드래그 하여 결합된 축을 적용한다. 그러면 아래와 같은 그래프를 볼수 있다.

이미지에서 이전 값 5라고 적혀 있다. 현 시점이 2021년 4분기라면 이전 값 5개인 2020 분기3~2020 분기3 + 자기 시점인 2021 4분기까지 총 6개를 평균 낸다는 뜻이다.

 

4-4) YTD총계(Year To Data Total)-누적값 개념

퀵테이블의 YTD 클릭 후, 매출을 추가했다. 2018년 1월, 2월 합계가 2018년 2월의 YTD 칸에 표현되어있다. 각 년도별 누적값을 볼수 있다.

 

5.계산된 필드 만들기

5-1) 집계 계산식 만들기(새로운 필드 만들기)

계산식 필드에 들어가서 sum([수익])/sum([매출]) 을 생성하면 수익률 계산식 필드가 생긴다. 이를 위처럼 자리에 올려주면 0으로 출력한다. 디폴트 값이 정수이기 때문에 이를 백분율로 수정 후 소수 둘째자리까지 출력하게 설정한다.

 

5-2) IF 계산식 만들기

계산된 필드를 사용하여 2억을 기준으로 위 처럼 구분이 가능하다

첫번째 방법: if sum([매출]) >=200000000 then '2억 이상' else '2억 미만' END

두번째 방법: iiF(sum([매출])>=200000000,'2억 이상','2억 미만')

세번째 방법(권장): sum([매출])>200000000 <- 이 방법은 boolean을 사용하기 때문에 간단하게 표현이 가능하다. 또한 처리속도가 빠르다.

 

6. 매개 변수 만들기(1)

1) 범위형 매개 변수

매개변수의 값이 변화함에 따라 매출액 구분도 동적으로 변화 할수 있도록 실습해 본다. 매개변수 생성 후, 계산된 필드 에서 sum([매출])> 매개변수로 설정한다. 또한 참조선에도 매개변수를 걸어주면 위 그림처럼 나온다. 아래 내용은 실습 과정 중 일부분이다.

참조선에 매개변수를 넣고 레이블에는 사용자 지정으로 하여 작성자 마음대로 설정가능하다. 여기서, 매개변수를 색상에 넣지 않고, 매개변수를 걸어준 계산식 필드를 색상에 넣어 줘야한다.

 

2) 목록형 매개 변수

매개 단위를 통해 단위 변경을 한다. 목록형 매개 변수생성 후 계산된 필드로 걸어 준 뒤에 이미지 처럼 해당 계산식을 마크에 넣어준다.

매개변수 만들때 표시형식은 작성자가 임의로 변경 가능하다. 왼쪽 값을 매출액과 나누면 단위가 변경이 가능한데 해당 작업은 아래 계산식 필드를 통해서 진행된다.

728x90
728x90

minibatch

x,ydata를 위와 같이 하나씩 가져와서 업데이트를 진행할때의 문제점은 cost가 크다는 점이다. 만일 백만개 데이터가 있다면 이를 하나씩 접근해서 구하기엔 비효율적이다. 이를 해결하기 위해서 아래와 같이 접근할수 있다.

 

5개를 한번에 뽑아서 각 loss들의 평균을 구한 cost 가지고 편미분하여 theta를 업데이트한다. 5번 실행 할 것을 한번으로 끝낼수 있다는 장점이 있다.

배치를 이용하면 cost를 사용하게 되므로 위 그림과 같은 과정으로 업데이트가 이뤄진다.

dn 까지의 dataset이 있을때, 각 dataset 마다 superscript를 표시 할수 있다.

두개의 dataset 각각 loss를 구한 뒤, 평균을 내면 cost로 바뀐다. 배치 사이즈가 2라면 위 과정처럼 진행될 것이다. 이때 theta는 위 아래 동시에 같은값이 들어가게 된다.

cost는 1/n만큼 돌려주기 때문에, 각각 1/2만큼 전달된다.

super script만 바뀔뿐 값은 똑같으며, cost에선 각각 L1, L2에 대한 편미분 구하면 1/2 씩 같은 값을 얻는다. 해당 편미분(partial derivative)을 가지고 Chain rule를 이용하여 back propagation을 아래처럼 진행한다.

순서 1)

순서 2)

순서 3)

순서 4)

(정리)

두 갈래로 흩어진 편미분 값을 더해줘야 최종적인 편미분값을 구할 수 있기 때문에 위 처럼 식이 정리가 될수 있다. 따라서 2개가 아니라 배치가 5개라면 각 dataset의 편미분값을 1/5만큼 곱해준뒤 더하면 cost로 편미분 계산한 값과 동일해진다.

값을 n개로 확장한다면 위처럼 정리가 된다. cost는 전체 loss에 대한 편미분값을 1/n 씩 만큼만 반영하게 된다. 배치를 사용하게 되면 각 loss의 편미분 값의 1/n 씩 공평하게 반영한다는 개념을 알아야 한다.

이를 이용하여 gradient descent에 적용하면 위 처럼 식이 정리가 된다. theta는 각 loss의 편미분이 공평하게 반영된 값으로 업데이트가 된다. 그러면 무조건 평균으로 업데이트 해야 할까? 아니다. 각 상황에 따라 능력껏 변경하여 적용하면 나만의 딥러닝 테크닉을 만들 수 있다.

cost를 이용할 경우에 좋은 점은 학습 시 이상치에 대해서 대응이 가능해 진다. 가장 왼쪽에 위치한 노란색 점이 이상치라고 한다면 학습 시 오른쪽 그림처럼 세타값이 튀게 된다. 만일 다른 point들과의 loss 평균을 계산하게 되면 큰 값이 감소가 되어서

위처럼 다소 안정적인 학습 모습을 갖출수 있게 된다.

batch size를 더욱 더 키우게 된다면 dataset의 전체적인 특성을 잘 반영하게 된다. 아래 그림을 통해 자세히 알아보자.

x1,x3,x6은 predictor보다 위쪽에 위치해 있다. 이 세개의 개별적인 loss를 가지고 업데이트 시키면 predictor를 1,3,6 선에 맞게끔 키울 것이다. 반대로 2,4,5은 predictor 보다 낮은 위치에 있기 때문에 predictor를 아래로 끌어 내릴 것이다. 이렇게 되면 예측선이 왔다갔다 어느 장단에 맞출지 혼란 스럽게 될 것이다.

cost를 사용하여 모두가 대체로 만족할만한 특성을 반영 할수있다.(초록색)

 

 

vectorization

배치 사이즈가 n개 있을 때 위 처럼 벡터로 간단하게 표현할수있다(n개 라면 n 차원 벡터) cost는 평균이므로 스칼라 값이 된다. 이를 통해 jacobian matrices를 적용 할수 있다.

순서 1)

각 함수 별 theta를 편미분 해주면 x1~xn까지의 컬럼벡터가 만들어진다.

순서 2)

순서 3)

순서 4)

구한 jacobian matrices은 back propagation 할때 사용된다.

순서 1)

단지 곱셈만 해주면 된다. 이후에 과정도 같은 원리로써 구한 jacobian matrices를 곱셈 해주면 된다.

 

순서2)

순서3) 우리가 최종적으로 알고 싶은 업데이트 part

(정리)

jacobian이 적용되면서 달라진 점이 무엇이 있는지 알아 보자

파란 박스의 편미분값을 보면 빨간 벡터로 정리 할수 있겠다. 이는 각 dataset loss의 편미분 값들이다. 여기서 cost 함수가 하는 역할을

forward 일때는 전체적인 loss들의 평균값을 구해주고 back propagation 할때는 1/n 씩 반영 시키는 역할을 한다. 위 과정처럼 1*n의 row vactor가 각 loss의 편미분 값과 곱해진다. 이 점이 loss와 cost의 차이점이다.

728x90
728x90

1. 부분 전체 분석

1) 누적 막대 차트

1-1) 절대값을 토대로 누적막대차트 보기

-> 각 연도별로 100% 비율로 맞출려면 아래 그림처럼 테이블 아래로를 클릭해야 한다.

1-2) 상대값을 토대로 누적막대차트 보기

행 선반에 있는 합계(매출)를 누른 뒤 구성비율을 % 변경 후, 위와 마찬가지고 테이블을 아래로 버튼을 누르면 각 년도별 100%비율로 변경되어서 각 연도별로 어떤 변화가 있었는지 비교해보며 인사이트를 얻을수 있다.

 

2) 파이 차트

 

3) 도넛차트-파이차트에서 표현 못한 요약정보를 표시할수 있다.

두개의 파이차트를 겹쳐서 만들수 있다.

 

4) 트리맵- 구성비율이 비슷하 자잘한 항목이 많을때 유용하다

부분 전체 분석은 전체에서 각각의 멤버들의 값이 어느 정도의 비율을 차지하는지 살펴보는데 적합하다.다만, 멤버가 많은 경우에는 파이 차트 or 도넛 파트 구성은 가급적 피하는 것이 좋으며 이 경우에는 트리맵을 대안으로적용을 권장한다.

 

 

2. 태블로의 상관관계 분석

1) 분산형 차트

완성본

 

2) 데이터 설명

가장 낮은 수익을 기록한 이서준 고객 데이터를 위와 같이 데이터 설명을 누르면 자세한 내용을 확인을 할수있다.

극한값을 가진 레코드 때문에 전체적으로 수익이 감소 했음을 알수 있다.

만일 극한 값 레코드가 제거 된 상태라면 파란색 점에 위치 할거라는 예상 지점을 알려준다.

 

3) 매개변수-화면을 동적으로 변화를 줌

순서: 매개변수 생성 -> 고객명 집합 조건 생성 후 색상에 대입 -> 참조선 테이블 생성 후 매개변수 조건으로 변경

완성본

 

 

3. 이중 축 VS 결합된 축

1) 이중 축(Dual Axis): 제한된 공간에서 복수개 값을 비교 시 사용

1-1 이중 축

축이 서로 다른 이유는 마크의 모양이 다르기 때문이다. 라인보다 원이 좀더 크다 보니까 범위가 크게 잡혀 있다. 이를 경우 축을 선택 후 축 동기화를 누르면 해결된다.

 

1-2 이중 축

 

2) 결합된 축(Combined Axis)

하나의 축으로 2020년도, 2021년도 매출값이 공유하게 된다. 비교가 가능해진다.

완성본

 

3) 이중 축 & 결합된 축 동시 적용

제주도는 매출이 작기 때문에 서울,경기도와 같은 축을 쓰면 변동성을 보기가 어렵다. 따라서 제주도만을 위한 축을 하나 생성하는데 아래 이미지 오른쪽 부분 검정색 실선에 대입하면 된다.

 

순서: 계산된 필드 수식을 사용하여 서울 분기별, 제주도 분기별 측정값 생성 -> 열 선반에 분기 -> 행 선반에 서울 및 제주도를 같은 축에 대입 -> 제주도 분기별 매출은 위 그림처럼 검정색 실선에 대입 -> 축 동기화 해제

 

 

4. 그룹VS집합

그룹은 항목 내에 멤버들을 묶어는 것이며, 집합은 집합에 포함 되는지 아닌지에 대한 것으로 두가지로만 나눌수 있다. 즉 그룹은 항목 별로 여러 그룹을 묶을 수 있지만 집합은 집합에 포함 or 미포함 구분만 가능하다.

 

1) 그룹

수도권/비수도권 매출 비교

순서: 분기별 자료와 매출 대입 -> 수도권/기타 그룹 생성 후 색상에 대입 -> 구성 비율 %로 설정 -> 테이블 아래로 설정 -> 불연속형으로 설정하여 각 분기별 분리 -> 축 바꾸기 -> 상수 라인 -> 색상 조정

 

2)집합- 매출 상위 11~20위만 출력

순서: 고객별 매출 순으로 정렬 -> 고객명 우측 클릭 후 집합 만들기 -> 상위 10명, 20명 각각 생성 -> 고객명 우측 클릭 후 결합된 집합 만들기 -> 10명,20명에 대한 차집합 생성 -> 11위~20위 집합그룹을 필터에 넣어서 해당되는 고객만 출력하면 아래와 같은 결과 얻는다

 

 

5. 테이블 구성하기

1) 계층 만들기

순서: 제품대분류+ 제품중분류 계층만든 후 이름을 제품분류로 설정 -> 제품명에서 가장 앞에 있는 제조사업을 변환 클릭 후 분할(스페이브바 기준으로)하여 제조사업 따로 생성

-> 만들어진 제조사 테이블을 제품분류 하위에 옮긴다(계층추가됨) -> 추가로 제품명을 제품분류에 추가 시킨다 -> 테이블 형태로 변경

 

2)총계 만들기

순서: 지역별 총계는 분석 패널에 총계을 대입하여 표현 가능 -> 시도 테이블 행 추가 -> 각 시도별 총계는 분석 패널의 총계를 소계 설정으로 추가 -> 시군구 테이블 행 추가 -> 분석 패널의 총계을 소계 추가 -> 주문일자 차원을 열 선반 추가 -> 분석 패널 총계의 행 설정 -> 분석 메뉴의 총계 -> 열 총계를 맨위로 설정 -> 행 총계를 맨 왼쪽으로 표현

 

 

6. 태블로 맵 만들기

1)지리적 역할 부여하기

맵에서는 계층을 만들지 않으면 일부 데이터가 누락되는 현상이 있다. (같은 지역명이 중복되어서 누락됨)

순서: 국가,시도,시군구 테이블에 abc 클릭 후 지리적 역할에 맞게 설정 -> 지역 테이블은 알맞은 지리적 역할이 없다. 시도보다 상위 개념이므로 만들기 칸에 들어가서 '시도' 클릭한다 -> 하위 개념인 시군구을 드래그 하여 상위 개념인 시도 테이블에 넣어서 계층을 만든다 -> 국가테이블은 가장위로 넣는다-> 시도 위에 지역을 넣어서 계층 생성한다

 

2)맵 차트 구현하기

순서: 시군구 클릭 -> 크기는 매출, 색상은 수익 -> 매출의 크기 조절과 테두리 설정(화이트)으로 구분하기 -> 필터에 시도 대입 -> 서울만 체크

순서: 시군구 클릭 -> 마크를 '맵'으로 설정 -> 색상은 수익 -> 맵 메뉴의 계층 -> 투명도를 100% 설정하면 우리나라만 볼수 있다.

728x90
728x90

1. Gradient Descent Method 2

실제 문제에서는 변수가 여러개 있으므로 위 그림처럼 convex한 모양을 가지고 있지 않을 것이다. 어떤 모양인지는 모르겠지만 핵심은 특정 포인트에 대한 gradient만을 알수 있다. 초록색 점 포인트의 gradient는 음수가 나왔음을 알수가 있는 것이다. 비유를 한다면, 껌껌한 밤에 땅에 기울기만을 느끼면서 우리는 본능적으로 기울기가 아래로 향하는 쪽으로 내려갈것이다.

그렇다면 산 아래쪽으로 내려가는 방향을 알려주는 것이 마이너스 gradient이다. 일반적으로 미분하여 나온 gradient는 값이 증가하는 방향을 기본적으로 가리킨다. 여기에 마이너스를 붙여주면 반대방향을 가리키므로 기울기가 감소하는 방향, 즉 0이 되는 지점을 가리키게 된다.

따라서, 실제 딥러닝에서는 전체적인 loss , cost 모양은 모른 채 업데이트를 진행하는 것이다.(위 볼록한 파란색 선 cost 모양은 단지 예 일뿐)

 

학습 시킬 세타가 2개 이상이라면 어떻게 진행될까?

bias까지 포함해서 학습시킬 대상은 세타1,세타0 이다. 이때, 두개의 세타를 가지고 편미분을 적용하여 gradient를 구한다.

loss는 (실제값 -예측값)^2 이다. 따라서 위 그림처럼 나타낼수 있으므로 해당 prediction 값이 세타1,세타0에 대한 함수로 바뀐 것이다. cost는 loss들의 평균값이다. 따라서 loss, cost 각각gradient를 구할수 있게 된다.

(cost 끝부분에 제곱이 빠짐)

세타1,세타0에 대한 편미분을 위 처럼 구하여 gradient를 구할수 있다.

따라서, 업데이트된 세타들은 위 과정을 통해 구해진다. 기존에 있는 세타들에 대해서 마이너스 gradient를 연산한다. 알파는 구해진 gradient값을 줄이는역할을 한다. 구해진 gradient를 곧이 곧대로 적용하면 값이 너무 크기 때문에 발산할 가능성이 높다. 그래서 learning late로 조절해야한다. 그래서 천천히 최적점에 가까워지도록 돕는다.

x축 방향은 세타1이 업데이트되는 방향, y축은 세타0이 업데이트 되는 방향을 가리킨다. 각각 세타들이 업데이트 되면서 최적점에 가까워진다. 하지만 실제는 위 그림처럼 이쁜 원 모양이 아니다. 한쪽으로 쏠린 모양을 가지고 있다.

 

제대로 학습 시 이런 모양을 가진다. 해당 모양의 문제점은 세타들간의 학습 속도가 상당히 차이다 많이 난다는 것이다. 세타1 초반 부분에서는 업데이트가 빠른 진도를 보일때 세타0은 조금 밖에 업데이트가 되질 않는 모습이 그 예이다. 각 세타의 업데이트 속도가 달라서 학습이 제대로 안되는 것이 딥러닝의 문제점 중 하나이다.

 

이번엔 n차원으로 확정시켜보자

학습시킬 params는 세타n부터 bias까지 포함된 세타0까지가 될것이다. 해당 loss는 n+1 차원의 gradient가 나오게 된다.cost는 loss들의 평균이므로 큰 틀은 바뀌지 않는다.

 

N+1차원의 gradient 벡터가 만들어진다. 구해진 벡터를 가지고 gradient descent(경사하강법)를 구한다. 이때 마이너스를 넣어 줌으로써 loss를 감소 시키는 방향으로 갈수 있다.

 

gradient descent 할때는 n+1까지 있는 각 세타들이 위 그림처럼 각자 업데이트를 하는 것이다.

 

cost도 같은 원리이다. loss들을 모두 더해서 평균 낸 것이 cost이다 평균낸 값에서 각 세타들을 편미분하여 gradient vector를 만든다.

 

핵심은, 세타가 1개든, 100개든 몇 만개든 그 원리는 변하지 않고 아래처럼 업데이트가 진행된다는 점이다.

 

 

2. Learning late

아래 내용은 학습 이해를 돕기위해서 y=세타x, 즉 학습 시킬 파라미터가 1개임을 미리 알려드립니다.

위 그림에서 말하과 하는 것은 lr을 높일수록 최저점에 빨리 수렴하다는 점이다. 그렇다면 무조건 lr이 큰게 좋을까? 그렇지 않다. 실제에서는 lr을 키워서 최적점에 빨리 수렴하는 모습은 보기 힘들다. lr을 키우게 되면 아래처럼 나타날 가능성이 농후하기 때문이다.

오른쪽 그림의 보라색 lr을 보면 반대편 같은 위치로 포인트가 업데이트가 되었다. 기울기 절대값을 보면 크기가 같으므로 계속 같은 자리를 왔다갔다 할것이다. 이보다 안좋은 케이스가 빨간색lr이다. 업데이트를 시켰는데 그 전 포인트 보다 기울기 값이 증가한 경우이다. 이렇게 되면 왔다갔다 하되 최적점과 더욱 멀리 떨어진 곳으로 이동 할것이다(발산하게 됨)

세타가 2개일때의 lr의 시각화를 보면 아래와 같다

0번 초기값을 시작으로 왼쪽그림은 왔다갔다 하면서 최적점에 수렴한다. 반면 왼쪽그림은 점점 발산하는 모양을 취한다. 참고로 왼쪽그림처럼 왔다갔다하는 형태는 발산의 여지가 있으므로 옳지 못한 학습과정이다. 한개 세타가 발산하면 전체 모델이 발산하기 때문에 애초에 작은 lr을 시작으로 학습 시키는 것이 옳다. 아래를 통해서 확인해 본다.

 

가장 왼쪽그림은 지그재그 없이 안정적으로 최적점에 수렴되어 가고 있는 반면, lr이 커질수록 x축 세타1은 지그재그 형태를 띈다. 눈여겨 볼 것은 이때의 세타0와 세타1의 서로다른 학습 속도 인 것이다. 오른쪽으로 갈수록 서로간의 속도가 맞지 않게 된다. 이는 곧 발산의 여지를 주게 된다. 따라서 가장 왼쪽그림처럼 작은 lr을 사용하는 것이 옳다.

 

3. for a single sample: 이론

x_data에 100의 데이터가 있다고 가정할때, 각각의 100개의 세타(가중치)가 업데이트가 되면 이를 1epoch라 부른다. 즉 100번의 iteration = 1epoch

 

 

x=0, y=y^ 일 경우엔 값이 0이 되므로 학습이 일어나지 않는다. 그래서 x와 y값에 따라서 학습이 어떻게 진행이 되는지 알아본다.

 

실제값이 예측값보다 클때

1) x>0

세타+2ax(y-y^)는 기존의 세타보다 조금 커지게 업데이트 된다. 그렇다는건 y=세타x 에서 세타가 살짝 커졌다는 의미이다. 이러한 과정을 통해 실제 y값과 예측값 y값의 차이는 줄어들게 된다.

 

1) x<0

2ax(y-y) 부분이 음수가 되므로 기존 세타 보다 작게 업데이트가 될것이다. 이때 중요한 것이 y=세타x이다. 세타가 작아지고 x가 음수 이므로 오히려 커졌음을 알수 있다. 값이 커졌으므로 이 또한 실제 y값과 예측값 y값의 차이는 줄어든다.

 

실제값이 예측값보다 작을때

예측값이 더 크므로 값이 감소하는 방향으로 학습이 이뤄져야한다.

1) x>0

작아진 세타값에 양수인 x가 있으므로 예측값이 감소했고, 이에따라 실제값과 예측값의 차이도 감소한다.

 

1) x<0

x가 음수이므로 세타+2ax(y-y) 값은 기존 세타보다 커지게 된다. 하지만 예측값 y = 세타x이므로 값이 감소했음을 알수 있다. 이에따라 실제값과의 차이 줄어든다.

즉 모든 case가 실제값과 가까워지는 방향으로 학습이 된다.

728x90
728x90

iflearn의 태블로 강의내용입니다.혹시 태블로 관심 있으신 분은 iflearn에서 무료로 수강 하시면 됩니다

 

*본 강의에 앞서

 

측정값

측정값은 #모양으로 아래에 배치가 되어있고, 차원은 그 위에 배치되어 있다. (#은 숫자타입을 뜻함)

기본 속성으로 합계로 설정되어 있어서 매출을 더블클릭할 경우 매출의 합계가 자동으로 계산된다.

수입은 합계가 타당하지만 할인율도 합계로 계산되다 보니까 1637로 표현되었다. 할인율은 평균으로 계산되도록 아래와 같이 수정 해야한다

시트가 바뀌면 할인율 집계방식은 본래대로 합계로 계산된다. 이를 고치기 위해서는 아래와 같은 방법을 통해서 해당 컬럼에 대한 기본 집계방식을 수정하면 된다.

 

차원

-현재view에 만들어진 1개의 차트를 어떻게 나눠서 볼건지를 결정

전체를 드래그 하면 전체 합계를 볼수 있다.

 

 

막대차트

태블로는 막대차트를 권장/추천을 하고 있다. 따라서 차원/측정값을 선택하면 기본 그래프가 막대차트로 시각화하게 된다.

마우스를 클릭하면 매출액의 내림차순으로 정렬할수 있다. 레이블을 마킹하고 싶다면 아래와 같이 실행한다.

2억 이하/이상 색으로 구분

내림차순으로 정렬한 데이터에서 매출 평균을 기준삼아 색으로 구분해본다.

계산된 필드 선택을 누른다.

매출 평균보다 크면 True, 아니면 False 계산식을 통해 구분을 해줄수 있다.

직접 만든 계산식을 색상 부분에 넣어주면 아래와 같이 구분이 된다.

평균라인을 위와 같이 넣어주면 평균 선을 나타낼수 있다.

파란색으로 된 필드는 불연속형, 초록색으로 된 필드는 연속형으로 구분된다.

위 막대차트에서 모두 같은 색깔로 통일이 되어있다. 이를 구분하기 위해서는 2가지 방법이 있다. 첫번째 방법은 고객 세그먼트 별로 색 구분이고 두번째 방법은 매출이 크냐 작냐에 따라 구분하는 방법이 있다.

첫번째 방법은 아래와 같이 실행한다.

고객 세그먼트는 파란색 불 연속형 이므로 각각 끊어서 볼수 있다.

두번째 방법은 아래와 같이 실행한다.

가장 오른쪽을 보면 아래와 같이 최소값부터 최대값까지 그라데이션으로 표현을 해줄수 있다.

매출은 연속형이므로 이와 같은 결과를 얻을수 있다.

연속형vs불연속형 라인그래프

열이 날짜 속성이므로 연속된 값이 쭉 이어지는 라인 그래프가 만들어진다. 이를 막대그래프로 보고 싶다면 마우스가 가리키는 부분을 클릭후 막대그래프로 눌러주면 된다.

+로 된 의미는 계층이 있다는 뜻이다. 이를 눌러보면 분기 그래프가 생성된다.

또 분기 열 앞에 +가 또 있다. 이를 눌러주면 아래와 같은 그래프가 생성된다.

각 분기내에서 월별로 쪼개며, 이를 또 쪼개면 일별로 만들수 있다.

년 컬럼을 위 처럼 누르면 아래 처럼 나오는데

마우스가 가리키는 그레이 선을 기준으로 위에 위치한 년,분기,월,일은 불연속형이며 아래는 연속형이라 부른다. 이 둘의 차이점은 회색 글자로 그 예를 볼수 있다. 불 연속형 분기를 보면 오직 분기만 있다. 반면 연속형 분기를 보면 각 해당 년도에 따른 분기를 볼수 있다. 아래는 연속형 분기를 선택했을때 표현되는 그림이다. 연속형이므로 행,열이 모두 초록색으로 표현되어 있다.

패널은 각 회색그리드를 기준으로 삼는다. 따라서 최소/최대를 클릭 후 패널을 선택하면 각 패널마다 최소/최대값을 보여준다. 테이블은 위 4개의 패널을 통합된 하나의 기준으로 삼는다.

728x90
728x90

Semantic Segmentation이란 masking 정보를 씌어서 전체 이미지에서 문맥적으로 의미 있는 형태를 찾아내는 개념이다. Instance Segmentation과 차이점이 있다면 동일한 객체에 대한 표현방식에 있다. Semantic은 동일 객체를 같은 색으로 분류했고 Instance는 Object Detection처럼 개별 객체에 masking 정보가 적용된다. 지금부터 배울 Mask-RCNN은 Instance Segmentation의 대표적인 방법이다. 이에 앞서 Semantic 지식이 필요하다. 왜냐하면 Mask-RCNN은 Faster-RCNN과 Semantic Segmentation 기법 중에 하나인 FCN이 결합된 형태이기 때문이다. 따라서 Semantic Segmentation 의 FCN에 대한 사전 지식이 있어야 한다.

 

위 그림처럼 Semantic Segmentation은 각각 개별 Class 별로 Segmentation(분할)을 시킨다. Semantic Segmentation은 기법 상으로는 Pixel Wise Classification이라고도 부른다. 이미지의 각 픽셀마다 어떤 Class에 속하는지 결정하여 이에 알맞은 Masking을 적용하기 때문이다. 가령 픽셀(0,0)은 나무, (0,1)도 나무 class라고 결정되면 이에 맞는 마스킹 정보를 적용하는 것이다. 마치 컴퓨터 기본 게임인 지뢰 찾기와 비슷한 모양일 것이다.

 

위 그림처럼 각 Class별로 Classification을 수행하는 것이 Segmentic Segmentaion이다.

convolution에서는 차원축소가 되면서 압축된 차원으로 변경이 되면서 추상적인 level이 올라간다(위치 특성은 사라지지만 이미지의 핵심적인 정보는 압축되어 추상적으로 변화가 됨) 반면 Deconvolution은 압축된 FM을 원본 사이즈와 유사하게 사이즈를 늘려나가면서 hidden factor들을 찾는다. 즉, 원본 이미지에서 찾을 수 없었던 특성들을 찾아내는 것이 encoder-Decoder model이다. FCN을 기점으로 Dilated FCN까지 발전되어 가고 있다.

 

Mask R-CNN은 Faster R-CNN이라고 해도 무방하다. 단지 masking을 하기 위해서는 FCN이 필요하기때문에 추가가 된 것이다. Faster R-CNN은 ROI Pooling이 있는데, 이것은 Segmentation을 하기엔 정확도가 떨어진다. 그래서 Pooling이 아닌 ROIAlign을 적용한다.

FCN(Fully Convolutional Network for Semantic Segmentation)

-FCN은 fully connected layer 없이 구성된 layer

 

Semantic Segmentation model은 Encoder-Decoder model 이 대부분이다. Encoder-Decoder model의 목적은 응축된 FM을 기반으로 하여 재창조/재해석을 하는데에 의미를 둔다.

 

FCN은 1차원으로 Flatten을 시키는 것이 아닌 convolutional 하게 만들어서 가로세로가 있고 4096의 depth가 있도록 만든다. 맨 마지막의 output FM convolution은 depth가 1000개이다. 1000개 depth의 의미는 각 1000개 Class에 대한 확률 값을 나타낸다(ImageNet은 1000개의 Class를 가진다) 만일 고양이라는 Class가 10번째에 해당된다면 depth 1000개 중에서 10번째를 뽑는다. 그러면 위 그림 Heatmap of cat FM을 볼 수가 있게 된다. 각 색깔의 정도는 그리드 당 (원본이미지가 아니기 때문에 픽셀이 아니다) 고양이일 확률이 각각 적혀있다.

확률이 높을수록 빨간색으로 표현이 된다. 강아지가 124번째에 해당된다면 124번 FM을 뽑으면 확률 값을 알 수 있을 것이다. Semantic은 픽셀마다 Class를 분류해야 하므로 FM의 그리드가 아닌 픽셀 단위로 계산을 해야 한다. 즉, 픽셀 * 픽셀로 예측을 하기 위해서는 depth가 1000개인 layer을 업샘플링하여 원본 이미지와 비슷한 크기로 만들어 줘야 한다.

 

21인 이유는 Pascal VOC이기 때문이다. class20개+background 1개 =21개 원본 이미자가 224라면 4096 depth layer은 7*7이다(21 depth layer 동일 크기) 32배로 줄어든 상태를 32배로 쭉 늘려버린다. 업 샘플링된 정보와 masking이 서로 계속 network를 학습시키는 것이다.

 

학습을 하게 되면서 업샘플링 가중치도 업데이트가 된다. 문제점은 7*7을 바로 224*224 바로 업 샘플링되면서 원본이 가지고 있는 정보가 상당히 뭉개진다는 점이다. 아래 이미지를 통해 좀 더 자세히 알아본다.

 

7*7을 32배로 업 샘플링하면 FEN-32s 이미지처럼 명확하지 않고 뭉개지는 것처럼 보이게 된다. 그리고 가장 오른쪽에 보면 업샘플링 과정 그림이 짤막하게 그려져 있다. 업 샘플링할 때는 보관법(Bilinear Interpolation)을 사용한다. 똑같진 않더라도 최대한 비슷하게 복구하려 한다. 본론으로 돌아와서 이 문제점을 해결하기 위해서 나온 방법이 FM을 혼합시키는 것이다.

 

ResNet의 skip connetion과 비슷한 개념이다. 7*7*4096을 2배 업샘플링하여 Pool4와 합친다. 하친 정보를 16배 업샘플링을 시킨다. 업샘플링시킨 FM을 통해 픽셀*픽셀 예측한 것을 FCN -16s라 한다. FCN-8s는 Pool3까지 포함된 것을 가리킨다.

 

주로 FCN-8s를 사용한다.

 

Faster R-CNN 과정에서 BR(박스 예측) & Classification을 진행한다. 여기에 추가로 Binary Mask Prediction을 실행한다. 즉, Classification 하고 난 뒤 BB안에 있는 픽셀들이 Mask 이냐 아니냐를 결정하게 된다.

 

RPN은 객체가 있을만한 영역을 추천해주는 역할을 수행한다. 이를 통해 나온 FM들을 ROI Pooling을 통해 7*7 균일한 크기로 맞추게 된다. 그 후 FC layer로 들어가게 된다.

 

Mask RCNN은 ROI Pooling대신 ROI Align이 사용된다. 대체가 되는 이유는 ROI Pooling를 쓰게 되면 인접 pixel 공간 정보를 훼손시킵니다. input 크기가 7*7과 딱 맞아떨어지지 않고 20*20이라면 2.85***로 소수점이 나타납니다. 이때 ROI Pooling은 이 소수점을 없애버립니다. 그래서 Align을 통해 보관법으로 보완하게 됩니다. 그 후 FC을 통해 예측과 Classification을 진행합니다. Classification이 되었다면 mask 영역만 prediction을 해주면 된다.

 

ROI Pooling의 문제점

원본 이미지가 800*800이고, RPN 영역이 665*665이라면 VGG 통과하여 1/32로 사이즈가 줄어든다. 665/32 = 20.78인데 그냥 20으로 계산해버린다. 여기서 추가로 ROI Pooling 7*7로 나누게 되면 2.86 -> 2로 사이즈 down이 일어난다. 즉, quantized가 두 번 발생된다.

 

ROI영역(추천된 영역)이 3*3이고, ROI Pooling이 2*2라고 할 때, 딱 맞게 나눌 수 없기 때문에 위 빨간 박스처럼 불균등하게 네 등분을 하여 max pooling을 진행하게 된다. Masking은 픽셀 단위로 예측해야 하기 때문에 이러한 손실은 성능에 악영향을 끼칠 수밖에 없는 것이다.

 

ROI Align

그리드*그리드로 하게 되면 잘리는 부분이 발생한다. 따라서 짤리는 부분이 없도록 소수점까지 Align(맞추다)을 하자는 개념이다. 위 빨간 박스가 그리드 개념으로 했을 때의 경우이다. 반면 ROI-Align은 소수점까지 포함시켜서 검정 박스처럼 표기가 가능하다. 소수점까지 고려하여 맞춘 뒤 각 그리드 안에서 네 개의 포인트를 기준으로 빨간 선 처럼 사분면을 나눈다. 각 검정 포인트들은 Bilinear Interpolation을 통해 구한다. 구하는 방법은 오른쪽 그림처럼 각 거리비율을 통해 별표가 그려진 자리의 값을 구한다.

그렇게 각 검정 포인트를 구했다면 이 네개의 포인트를 가지고 maxpooling 실행한다. 쯕 빨간색 선으로 나눠진 사분면 안에서 maxpooling이 이뤄지는데 그 각각의 값은 보관법으로 구해진 값이다.

 

소수점이 있으면 있는 그대로 가장 오른쪽 빨간 박스처럼 그려버린다. 그 후 2*2로 나누면 네 개의 그리드가 생긴다. 각 그리드에 네개의 포인트를 보간법으로 채우고 그 안에서 max Pooling을 실행한다. 이 같은 작업을 네번 반복한다. (2*2로 나누면 네개의 그리드가 생기므로)

 

각 그리드가 2.97 크기로 맞춘다(녹색 그리드 부분). 녹색 박스에서 각 그리드 개별로 위에서 언급했던 사분면을 나눈 뒤 보관법을 적용하고 maxpooling을 실행하게 된다.

 

AP75일 때를 비교하면 약 5%가 증가했다. 따라서 보다 더 정밀한 작업에 있어서는 ROI Align이 유리하다고 볼 수 있다.

 

Mask RCNN의 feature Etractor는 ResNet+FPN을 사용했다.

 

Mask RCNN loss을 보면 Faster RCNN의 Lcls+Lbbox loss에다가 Lmask까지 포함된 걸 확인할 수 있다. Classification Loss는 Pascal VOC 라면 20개의 softmax로 계산이 된다. Smooth L1 Loss는 1보다 작으면 L2형식으로 적용하고 그게 아니면 L1형식으로 계산된다.

 

BB별로 Classification이 적용된다. Mask는 Person이 그려진 BB안에서 mask 인가요 아닌가요? 를 예측만 하면 된다. (픽셀마다 mask인지 예측)

 

mask prediction은 class를 찾는 게 아니라 이미 특정 class로 분류가 된 BB안에서 해당되는 객체 픽셀마다 돌아다니면서 예측을 하는 것이다. 그래서 오른쪽 그림처럼 예측이 완료된 Mask를 원본 사이즈 크기로 맞춘다면 원본 이미지에 오버랩을 시키면 해당되는 객체만 색깔이 다르게 출력된다.

 

실습내용은 아래 링크에서 확인할수 있습니다.

2021.08.02 - [실습 note] - Mask-RCNN 실습모음(2021-07-29~02)

 

Mask-RCNN 실습모음(2021-07-29~02)

이론 내용은 아래 링크에서 확인할수 있습니다. 2021.07.30 - [기록 note] - 2021-07-29(Mask-RCNN_Segmentation) 2021-07-29(Mask-RCNN_Segmentation) Semantic Segmentation이란 masking 정보를 씌어서 전체 이..

ghdrldud329.tistory.com

 

728x90
728x90

RetinaNet 

RetinaNet이 나오기 전까지는 one-stage 는 수행 시간이 짧아서 좋지만 수행능려은 faster RCNN보다 떨어진다는 인식이 있었다. one-stage의 고질병이던 작은 객체검출 문제를 개선시킴

 

검출해야할 객체보다 백그라운드가 많아서 대부분 앵커박스들이 백그라운드에 학습값으로 치중이 된다. 반면 적은 수의 foreground에서 정보를 가져와야하는데 백그라운드 정보 때문에 압도가 된다. 따라서 Object Detection은 본질적으로 이런 문제를 안고 있다.

 

 

동적으로 Cross entropy를 조절하는 방법이 focal Loss이다.

 

focal Loss

focal Loss는 Cross entropy에 가중치를 부여하는 개념이다.

위 그림이 Focal loss의 factor 가중치이다. Focal Loss에 분류하기 쉬운 문제(Easy Negative Examples : Backgrounds)보다 분류하기 어려운 문제(Hard Positive Examples : object(foreground))에 더 많은 가중치(factor 감마)를 적용함으로써 Object 검출에 더욱 집중하여 학습 진행한다. 따라서 잘 검출된 객체와 그렇지 못한 객체 사이의 loss값의 차이를 더욱 분명하게 구별할수있다.

 

well-classified 구간을 보면 p값이 증가할수록 loss가 급격히 감소를 하게 된다. p값이 작은 것들, 즉 작은 객체 + just background은 loss 값이 상대적으로 크다. loss값이 크므로 이를 감소시키기 위한 학습이 진행된다. 결론적으로 p값이 낮게 측정된 것들을 위주로 학습 하게끔 만드는 것이 Focal loss의 역할 인것이다.

 

FPN

a) sliding window안에 detect할 객체가 들어오지 않아서 크기을 단계별로 줄여나가면서 detect하는 방법인데, 이는 computing 과 detecting시간이 너무 오래 걸린다는 단점이 있어서 요즘은 잘 사용하지 않는다

b) 일반적인 방법으로는 b처럼 최상위에 있는 FM을 detect한다. 하지만 최상위 FM은 상당히 추성적이다. 핵심적인 정보는 갖고 있을지언정 위치특성은 없기때문에 정확도가 떨어진다.

c) 그래서 c처럼 각 레벨에 있는 FM을 detect하는 방법을 취한다. 대표적으로 SSD가 그 예로 들수 있겠다. 하지만 FM이 상위로 갈수록 손실되는 정보는 있기 때문에 이를 보완하기 위해

d) d방법인 FPN을 이용한다. FM이 상위로 올라 갈수록 resolution이 떨어지게 된다. 그래서 d처럼 skip connection을 이용한다.

빨간줄과 연결된 오른쪽 FM의 resolution 특성을 보완해 준다. 이러한 보완작업을 하기 위해서는 먼저 오른쪽 가장 위에 있는 FM을 upsampling하여 크기를 키워줘야 한다.(왼쪽 FM와 크기가 같아야 합칠수 있으므로) up-sampling을 하게 되면 유추를 해서 크기를 키우기 때문에 정보가 손실이 된다. 이를 왼쪽의 FM이 정보를 보완한다.

 

m5는 conv5를 up-sampling 하지 않고 그대로 받은 후 3*3 conv 실행한다. m4부터는 2배로 up-sampling 후 1*1로 채널을 마춘 conv4을 더해줘서 정보를 보완해 준다. 나머지도 같은 원리로 계산이 된다. 각 m5~m2에서 3*3conv를 연산하여 intermediate layer를 생성한다. intermediate layer로 classification&Regression을 실행한다. m2~5을 3*3 conv를 해주는 이유는 Aliasing effect를 제거하기 위해서다. 위 처럼 서로다른 정보가 합쳐지면 본래 가지고 있던 정보가 자칫 다른 의미로 해석이 될수있다. 왜곡될 가능성을 내포하기 때문에 3*3conv를 통해 희석을 시키는 것이다. 마치 이미지에서 뿌옇게 만들기 위한 블러링 필터와 같은 느낌인것 같다.

 

3*3을 거친 P5~P2 layter 에서 앵커박스르 적용한다. 9개의 앵커가 개별 포인트에 모두 찍히게 된다. P2로 갈수록 FM크기가 커지므로 당연히 앵커 박스의 수도 증가한다. 총 앵커박스를 합치면 약 십만개이다. 십만개 앵커박스로 분류와 예측 학습을 실행한다.

 

 

EfficientDet

EfficientDet의 핵심 2가지는 BiFPN, Compound Scaling이다.

 

BiFPN(Bi directional FPN)

BiFPN은 PANet에서 조금 개량된 버전이다. PANet과 큰 차이점은 repeated block, 즉 반복으로 사용할수 있다는 점이다. PANet은 위 그림 과정이 전부이다. 하지만 BiFPN은 위와 같은 BiFPN 블락을 몇개씩 사용가능 하다는 것이다. BiFPN 블락을 몇개 사용할건지 정하는 것은 Compound Scaling을 통해 정한다.

 

각 화살표마다 학습된 가중치를 활용하는 기법이다. 값이 갑자기 커지는 것을 방지하고자 사용된 가중치를 가지고 Fast Normalized fusion을 적용한다.

 

이미지 해상도, 필터수, 네트웍 깊이 와같은 구성요소를 따로 따로 최적화 하기 보다는 모두 조화롭게 최적화하는 방법을 적용하여 모델의 성능을 극대화한 것이 EfficientNet이다

 

제일 좋은 차를 만들기 위한 구성 요소 세가지 마력, wheel, 타이어가 있다고 가정한다. 단순하게 가장 좋은 차를 만들려면 비싸고 좋은 성능을 보이는 구성요소만 뽑아서 조합하면 된다. 하지만 현실은 그와 반대일 가능성도 있다는 것이다. 가장 좋은 것들을 모아놓아도 서로 조화롭게 어우러 지지않으면 수행능력은 기대치를 밑돌게 된다. 마치 눈, 코, 입 따로 봤을땐 원빈인데 얼굴 전체를 보면 갸우뚱하는 경우를 예로 들수 있다. 그러면 마력 , wheel, 타이어를 어느정도 비율 or 크기로 가져가면 최적화가 될수 있는가를 계산하는 것이 Compound Scaling이다.

 

compound scaling을 통해 각 모델별로 최적의 값을 찾아 낼수 있다. 이 개념을 EfficientDet에도 똑같이 적용시킬수 있다. BB, Neck,head 에서 최적의 값을 CS를 통해 찾을수 있다.

 

위 Depth 식처럼 기본적으로 3개가 설정되어 있어서 BiFPN Layer가 3개는 무조건 사용된다. width는 bottom-up에서 사용될 채널 수를 가리킨다.

위 그림처럼 feature fusion될때 3*3 separable convolution이 사용이 되며 이때의 채널수를 width가 결정해준다.

깊은 depth일땐 Relu보다 SiLU가 더 효과적이라고 구글에서 발표했다. scale jittering은 이미지에서 특정 부분을 crop한 후 확대시키는 기법이다.

soft NMS은 위 그림처럼 겹치는 박스들을 제거하지 말고 confidence을 낮춰서 제거를 방지하는 역할을 수행한다.

 

위 실습 내용은 아래 링크에서 확인 가능합니다.

2021.07.27 - [실습 note] - EfficientDet 실습모음(2021-07-27~28)

 

EfficientDet 실습모음(2021-07-27~28)

EfficientDet 강의 실습내용입니다. EfficientDet에 대한 내용은 아래 링크에서 확인하실수 있습니다. 2021.07.26 - [기록 note] - 2021-07-26(RetinaNet & EfficientDet) 2021-07-26(RetinaNet & EfficientDet) R..

ghdrldud329.tistory.com

 

728x90
728x90

실습 링크

2021.07.20 - [기록 note] - 2021-07-20(Yolo)

 

2021-07-20(Yolo)

간략한 개요 *V2는 V1보다 성능 개선 되었지만 SSD보다는 떨어짐 V1 448*448이미지를 7*7 Grid로 만들면 위 그림처럼 49개의 sell이 생성된다. 생성된 각각의 셀(작은 정사각형) 이 하나의 Object에 대한 dete

ghdrldud329.tistory.com

 

간략한 개요

*V2는 V1보다 성능 개선 되었지만 SSD보다는 떨어짐

 

 

V1

448*448이미지를 7*7 Grid로 만들면 위 그림처럼 49개의 sell이 생성된다. 생성된 각각의 셀(작은 정사각형) 이 하나의 Object에 대한 detection을 수행한다. 기존 two-stage에서는 객체의 위치를 찾기 위해서 연산이 작동 되는데, 이 수행시간을 줄이기 위해서 Grid 개념을 적용한 것이다. 또한 위 분홍색 박스처럼 하나의 sell이 2개의 BB후보를 기반으로 BB를 예측한다. 따라서 하나의 셀은 2개의 BB후보를 기반으로 Object 하나를 예측한다. 단점은 sell하나 당 하나의 Object만 검출 한다는 것이다. sell안에 2개 이상의 객체가 있다 하더라도 하나만 검출이 되며, 하나의 sell 범위를 벗어나는 큰 객체는 검출이 불가능하다. (7*7=49sell * 2후보, 98개의 BB)

Classification, Regression을 하기 위해서 Dense layer 적용해야한다.

7*7*30에서 30은 어떤 의미 인가?

빨간색 sell은 분홍색 박스 처럼 2개의 BB후보를 가지고 있다. 2개의 BB후보는 강아지 Object를 예측하는데 개별 BB별로 5개씩 정보를 가지고 있다. 5개의 정보는 x,y,w,h 이다.

 

x,y는 예측한 BB후보의 센터좌표이다. confidence Score는 예측한 BB가 Object냐 아니냐를 나타내는 점수이다. 후보 BB에 얼마나 강아지 객체가 포함이 되었는지 나타내느 점수인 것이다. 나머지 20개는 Pascal VOC 기준 20개 클래스의 확률이다. 이때 주의할점은

각 후보 BB별로 5개씩 생긴 정보 중 GT와 가장 많이 겹치는(Iou가 가장 높은 것) BB를 대표로 적용한다. 대표로 뽑힌 BB가 어떤 객체 인지 20개의 클래스별로 확률을 나타내는 것이다.

 

S: 그리드 sell을 나타낸다(7*7Grid 라면 S^2 = 49). 즉 모든 셀을 돌아가면서 loss을 구하게 된다.

B: Bounding Box를 나타낸다. 따라서 B = 2

추가로, 동그라미 표시가 된 것은 숫자 1을 나타낸다. ij는 결국 98개의 BB를 말하는 것인데, 98개 중 Object 인것만 1을 곱한다는 것이다. 즉 위에서 말한 대표 BB에만 1, 그 외 객체을 담고 있지 않은 BB들은 0을 곱하게 된다.

 

제곱근을 취한 이유: 위 분홍색 박스에서 왼쪽은 큰 객체, 오른쪽은 작은 객체를 나타낸다. 큰 객체는 사이즈 크므로 편차값 자체도 상당히 커질수가 있다. 이를 막기 위해서 제곱근을 취한다.

 

Ci: 예측된 confidence score 이다. Object 일 확률 P(0)*Iou

Ci^: GT이므로 1 값을 가진다.

람다noobj: 책임있는 않는BB들도 책임이 있기때문에 가중치를 매긴다. 대표 BB가 아닌 나머지 하나의 BB에 대해서도 Iou를 구해서 가중치 0.5만큼 더해준다.

 

클래스별로 틀린 예측확률들을 위 공식으로 계산한다.

one-stage 전략은 가장 많은 예측BB를 생성 후 NMS를 통해 필터링을 하는 것이다.

위 사람을 예를 들어 본다면, 겹치는 박스가 confidence 0.9 짜리 1개와 0.65짜리 1개 잇다고 가정하겠다. 이때 이둘의 Iou값이 Iou Threshold 값보다 크다면 0.65 짜리 BB가 삭제되어서 가장 높은 confidence 값을 가진 BB만 살아 남게 된다.

 

한 sell이 하나의 object만을 책임지기 떄문에 한 sell안에 있는 여러 객체를 검출하지 못한다. (V2에서는 해당 문제점을 해결)

 

 

V2

V1은 7*7*30의 FM을 가지는 반면 V2는 13*13*125 FM을 가진다. detector1~5는 Anchor Box 1~5를 가리킨다. 5개의 Anchor Box들 각각 BB별 25개 정보를 가지고 있기 때문에 125개이다. 이 의미는 한 셀안에서의 Anchor box들이 개별적으로 정보를 가지므로 V1과 다르게 한 셀 안에 여러 객체를 검출할수 있게 된다.

 

Anchor box 만드는 방식을 Direct Location Prediction 이라 한다. 분홍색 점이 Cx,Cy이다. 셀 중심점 tx,ty에 시그모이드를 적용해서 값이 0~1사이를 벗어나지 못하도록 설정한다. 그렇게 되면 bx,by는 아무리 커봤자 cell 중심을 크게 벗어나지 못하게 된다. 이 덕분에 BB가 뜬금없는 위치에서 Object Detect를 하지 않게 된다.

 

26*26*512 FM을 13*13*2048로 reshap한 후 13*13*1024와 merge를 시킨다. 따라서 26*26*2048에 존재하는 작은객체의 특징들을 살려보고자 하는 방법이다. (요즘에는 사용하지 않는다고 한다)

 

 

V3

V3에는 FPN이 적용이 되는데 위 그림처럼 상위에 있던 FM의 추성적인 특징들을 하위 FM의 상세한 특징들과 merge 됨으로써 예측 정확성을 올릴 수가 있게 된다. FPN유무가 V2와 가장 다른 점이다.

 

FPN의 output Feature 갯수가 13*13, 26*26, 52*52 이렇게 세개의 FM이 출력된다. 각 FM 당 3개의 Anchor Box가 존재 한다. 13*13 FM의 3개 Anchor Box, 나머지 2개 FM도 각각 3개씩 할당 된다. 여기서 얻게된 Anchor box들을 가지고 Detection 진행한다.

 

FPN을 통해 만들어진 3개의 FM을 가지고 각자 loss값을 구하면서 예측을 진행한다. 최종적으로는 NMS을 통해 필터링을 거치게 된다.

각 FM당 3개의 anchor box가 존재한다. 위 그림에서 3개의 box가 있다. 그 안에 내용물은 (BB의 중심점과 w,h + objectness Score + 20개 Class(pascal VOC 기준). 13*13은 상대적으로 큰 객체을 detect 하고 사이즈가 커질수록 작은 객체 검출에 유리하다.

728x90

+ Recent posts