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

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

2021.07.30 - [기록 note] - 2021-07-29(Mask-RCNN_Segmentation)

 

2021-07-29(Mask-RCNN_Segmentation)

Semantic Segmentation이란 masking 정보를 씌어서 전체 이미지에서 문맥적으로 의미 있는 형태를 찾아내는 개념이다. Instance Segmentation과 차이점이 있다면 동일한 객체에 대한 표현방식에 있다. Semantic은

ghdrldud329.tistory.com

 

1.coco_annotations_mask_visuals(COCO_Dataset를 활용한 mask Segmentation)

https://colab.research.google.com/drive/1F38YmGcq6LSA43ZaWlce2MD2apMgkwmy?hl=ko#scrollTo=d-kbDnVO-q9H 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

2. opencv_mask_rcnn_inference(임의의 image inference)

https://colab.research.google.com/drive/1I572kbhtwBnTX8OJFg8O03NX2ZjaVjFI?hl=ko#scrollTo=Yqvx54DBQe_7 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

3.mm_mask_rcnn_inference(MMDetection)

https://colab.research.google.com/drive/1Y0sHPz102OLLVeNIXXgGvwryjGE4rmrd?hl=ko#scrollTo=TRvHk7ZOQb3D 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

 

4.mm_mask_rcnn_train_pascal_voc(Pascal VOC Datasets -> COCO Datasets 변경후 trained)

https://colab.research.google.com/drive/1UrgKD_lY6eAD5jVEGelEg78MmhX_ZMNR?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

5.mm_mask_rcnn_train_balloon(balloon Datasets -> COCO Datasets 변경후 trained)

https://colab.research.google.com/drive/1AZ8vWDp_H1ik3q7am-d_rYhaxR-uILOu?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

6. nucleus dataset로 실습(마찬가지로 COCO format으로 변경후 trained)

https://colab.research.google.com/drive/1xPmaW9u34OlGT6ZXF0OSvgUnchyUgQQs?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

728x90

'실습 note' 카테고리의 다른 글

딥러닝 수학 실습과제 모음 9~12  (0) 2021.09.04
딥러닝 수학 1~7 실습과제 모음  (0) 2021.08.13
EfficientDet 실습모음(2021-07-27~28)  (0) 2021.07.27
YOLO 실습 모음  (0) 2021.07.21
Single Shot Detector 실습  (0) 2021.07.19
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

EfficientDet 강의 실습내용입니다. EfficientDet에 대한 내용은 아래 링크에서 확인하실수 있습니다.

2021.07.26 - [기록 note] - 2021-07-26(RetinaNet & EfficientDet)

 

2021-07-26(RetinaNet & EfficientDet)

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

ghdrldud329.tistory.com

 

1.tf_hub_efficientdet_inference

https://colab.research.google.com/drive/15JRMlrmacnB7Ut9IeKfCxxWSccYosqWA#scrollTo=eMLvmKvEv6Ni

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

2.automl_efficientdet_inference

https://colab.research.google.com/drive/1zWBNc11Sz8OtCB5oJw1kQMf8OKae9JL0#scrollTo=Zgk_Em3veI4g

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

 

 

3.efficientdet_train_pascal_voc

https://colab.research.google.com/drive/1IC30WLeI-Oy1sMGRZv_ttrWcvSEPu5dD#scrollTo=EdTAZz-mx2kk

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

 

 

 

4.efficientdet_train_esri_challenge

GPU 부족으로 인해 모델 학습 중간에 에러가 발생했습니다 참고바랍니다.

https://colab.research.google.com/drive/1VSkAbrTPgs9Ark_KS2ZayPkWKAiyLCva#scrollTo=ITrzk70QXwOT

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.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

 

1. OpenCV DNN으로 YOLO Inference 실습

https://colab.research.google.com/drive/1PSbzcrL_KZl_rj4axCiBPvGBwLIZtwe8?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

2. Ultralytics Yolo v3_inference 실습

https://colab.research.google.com/drive/15E7yB1BZXXKu5Zewg6vOSkjEPenVAQ7f?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

3. Ultralytics yolov3_train_coco 실습

https://colab.research.google.com/drive/19wJejoTCr3MnmgH4HyEO2yi-i4T7PnHg?hl=ko 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

train: ../coco128/images/train2017 #이미지가 들어 있는곳

그렇다면 annotation 파일은 어딨을까? 코드 내부적으로 위 images를 lables 로 변경하여 자동으로 ann파일을 갖고 온다. ../coco128/labels/train2017 따라서 dataset 만들때 위 구조처럼 만들어 놔야 한다.

원본이미지의 너비가 640이라면 center x좌표는 320이며 Normalization화 하여 0.5, 예측BB의 너비가 200 이라면 200/640,

나머지 값 center Y, height도 원본이미지의 높이에 따라 Normalization한다.

 

 

 

 

 

728x90

+ Recent posts