// Base64ToImg Function
cv::Mat Base64ToImg(string receive_data)
{
	// data1에 들어온 image의 헤더부분 나눠주기	nodejs에서 오는 이미지 데이터는 data:image/png;base64, 라는 header가 붙는다.
	istringstream iss(receive_data);
	string img_header = "";
	string img_base64 = "";
	getline(iss, img_header, ',');
	getline(iss, img_base64, ',');

	// base64 to image
	string dec_jpg = base64_decode(img_base64);
	vector<uchar> data(dec_jpg.begin(), dec_jpg.end());
	cv::Mat img = cv::imdecode(cv::Mat(data), 1);

	return img;
}


// ImgToBase64 Function
string ImgToBase64(cv::Mat img)
{
	// image to base64
	vector<uchar> buf;
	cv::imencode(".png", img, buf);
	auto *enc_msg = reinterpret_cast<unsigned char*>(buf.data());
	string encoded = base64_encode(enc_msg, buf.size());

	// Header 붙여주기
	string base64 = "data:image/png;base64," + encoded;

	return base64;
}

'Language > C++' 카테고리의 다른 글

C++ 시간 재기  (0) 2022.03.14
Mat 형식 Binary file로 저장 및 Binary file 불러오기  (0) 2022.02.22
opencv vector to Mat  (0) 2021.12.23
파일 랜덤 추출  (0) 2021.10.14
C++ 폴더 존재유무 및 생성  (0) 2021.10.08

SPP-Net

SPP-Net은 R-CNN의 단점을 보완한 모델입니다.

 

RCNN의 단점

     1. Selective Search를 통해 2k개의 RoI를 일일이 CNN에 넣어줘서 시간이 오래걸린다.

     2. Selective Search를 통해 2k개의 feature map들을 Crop/Warping 할때 이미지 왜곡이 발생합니다.

        (conv layers 다음 fc layers의 입력 크기를 맞춰주기 위해)

 

 


 

이를 극복하기 위해 SPP-Net에서는

 

     1. 원본 이미지를 CNN에 넣어줘 featuremap 생성

         → Selective Search를 통해 나온 2k개의 RoI를 projection 시켜줍니다.

         ※ 2000번의 CNN 연산을 1번으로 축소

 

     2. Crop/Warping을 SPP layer로 변경

        위의 사진과 같이 conv layers 후에 fc layers의 입력크기를 spp로 맞춰줍니다.

        이렇게 되면 원본 이미지의 왜곡 현상이 없앨 수 있습니다.

 

 


SPP layer

SPP layer는 convs layers와 fc layers 사이에서 이루어집니다.

우선 spatial bins의 개수를 정해줍니다.

예를 들면 50 bin = [6x6, 3x3, 2x2, 1x1], 30 bin = [4x4, 3x3, 2x2, 1x1] 가 있습니다.

여기서 어떠한 feature map이 들어와도 같은 크기의 output을 내기위해 아래와 같은 식이 적용됩니다.

 

 - Window Size = feature map size / pooling size (올림)

 - stride = feature map size / pooling size (내림)

 


SPP layers Example

3 x 3 spatial pyramid pooling

 - 256 x 13 x 13 feature map (13 x 13 feature map 256개)

 - 3 x 3 pooling size

 = Window Size = 13 / 3 → 5

 = stride = 13 / 3 → 4

 ※ 256 x 3 x 3 의 고정된 크기 출력 (3 x 3 feature map 256개)


 

위와 같이 여러가지 사이즈의 pooling을 해준뒤 쭉 이어 붙여준다음 fc layers에 입력값으로 넣어줍니다.

 

※동작 순서※

(1) Selective Search를 사용하여 약 2000개의 region proposals를 생성합니다.

(2) 이미지를 CNN에 통과시켜 feature map을 얻습니다.

(3) 각 region proposal로 경계가 제한된 feature map을 SPP layer에 전달합니다.

(4) SPP layer를 적용하여 얻은 고정된 벡터 크기(representation)를 FC layer에 전달합니다.

(5) SVM으로 카테고리를 분류합니다.

(6) Bounding box regression으로 bounding box 크기를 조정하고 non-maximum suppression을 사용하여 최종 bounding box를 선별합니다.


 

 

참고 자료

논문: arxiv.org/abs/1406.4729

 

블로그:

     - https://yeomko.tistory.com/14

     - https://nepersica.tistory.com/4

R-CNN 이 등장하기 전까지는 Sliding Windows와 CNN을 이용하여 Object Detection을 진행했었습니다.

하지만 Sliding Windows를 이용하면 연산량이 많고 Bounding Box (객체를 나타내주는 box)가 정확하지 않았습니다.

그래서 Region Proposals과 CNN을 결합한 R-CNN이 나오게 됐습니다.

 

R-CNN

 

R-CNN의 구조입니다.

       1. Input image에 Selective Search라는 알고리즘을 이용하여 Region Proposal 2000개를 추출합니다.

       2. 추출한 2천개의 영역을 각각 resize하여 CNN의 Input Data로 넣어줍니다.

       3. Output으로 4096개의 특징값을 뽑아줍니다.

       4. 특징값들을 SVM을 이용하여 class를 분류합니다.

       5. Bounding Box Regression을 적용하여 Bounding Box의 위치를 조정합니다.

 


Region Proposal

Region Proposal은 객체가 있을만한 위치를 추측하는 방법입니다.

R-CNN에서는 Selective Search라는 알고리즘을 이용하여 Region Proposal을 진행합니다.

 

Selective Search

    1. 아래의 4가지를 고려하여 초기 후보 영역을 다양한 크기와 비율로 생성합니다.

       - Color: 이미지의 색깔

       - Texture: 주변 픽셀값들의 변화량

       - Size: Region들의 사이즈

       - Fill: Bounding Box의 크기

 

    2. 그리디 알고리즘을 통해 비슷한 영역을 반복적으로 통합합니다.

       - 처음에 모든 영역에 대해 유사도를 계산하여 similarity set S를 생성합니다.

       - S에서 가장 큰 유사도값을 가진 영역 ri, rj에 대해 통합합니다.

       - ri, rj의 유사도 값은 S로부터 제거합니다.

       - 통합된 새로운 영역(rt)과 인접한 영역들(its neighbours)에 대해 유사도(St)를 계산합니다.

       - S와 R에 유사도(St)와 통합된 새로운 영역(rt)을 추가합니다.

 


Bounding Box Regression

Selective Search로 찾은 Box 위치는 정확하지 않기 때문에 Bounding Box Regression이 필요합니다.

즉, Predicted Box와 Ground Truth Box와의 차이를 줄여주는 Linear Regression Model입니다.

 

R-CNN의 학습하는 부분

       1. 이미지 넷으로 이미 학습된 모델을 가져와 fine tuning 하는 부분

       2. SVM Classifier를 학습시키는 부분

       3. Bounding Box Regression

 

 

 

 

 

참고:

 - https://nuggy875.tistory.com/21
 - Bounding Box Regression:

                1. https://towardsdatascience.com/bounding-box-prediction-from-scratch-using-pytorch-a8525da51ddc

                2. https://yeomko.tistory.com/13

 

- 코드 구현:

                1. https://wolfy.tistory.com/250

                2. https://herbwood.tistory.com/6

직선의 벡터방정식

 

     - 좌표평면에 y = mx가 있을때, 임의의점 (x, y)를 벡터로 표현해주기 위해서는

       y = mx 와 평행한 벡터를 잡고 스칼라배를 해주면 y = mx의 모든 점이 표현 가능합니다.

 

     1. y = mx는 (1, m) 이라는 점을 지납니다.

     2. 그렇다면 (1, m) 이라는 벡터값은 y = mx를 지나는 벡터입니다.

     3. 여기서 y = mx를 지나는 임의의 점 (x, y)의 벡터는 (1, m)의 벡터에 스칼라배를 해주면 표현이 가능합니다.

     4. (1, m) = V → (x, y) = tV

 

     - 벡터 방정식의 장점: 관계식 필요없이 어떠한 값만 대입했을때 값에 해당하는 좌표를 얻을 수 있습니다.

 

 

     - 다른 표현법

     1. y = mx라는 직선 위에 (2, 2m/3) 이라는 점이 있는지 체크해보기

     2. x = tV → 여기서, V = (1, m)

     3. t에 2를 넣으면 (2, 2m)이 나오므로 (2, 2m/3) 이라는 점은 y = mx를 지나지 않습니다.

 

     ※ y = mx + b 일때, (0, b) = V0

        x = V0 + tV1

 

     ※ 차원에 상관없이 확장하기 쉽다.

 

 

 


평면의 벡터 방정식

 

     - 평면을 표현하기 위해서는 벡터가 2개 필요합니다.

     - 좌표 평면상 (3, 2) 라는 좌표가 있고, Standard Unit Vector로 바꾸면, e1 = (1, 0), e2 = (0, 1)

       (3, 2) → 3e1 + 2e2 이렇게 됩니다.

       여기서, e1 = (1, 0) 이고, e2 = (0, 1) 이기 때문에

       두개 벡터에 각각 스칼라배를 취함으로써 좌표 평면 전체를 표현할 수 있습니다.

 

     ※ 단, e1과 e2가 평행한 벡터면 평면을 표현할 수 없습니다.

        평행하면 방향이 같이 때문에 덧셈이 가능하므로 하나의 벡터로 취급된다.

 

     ※ 두 벡터가 독립적이다: 두 벡터가 평행하지 않다.

     ※ 두 벡터가 종속적이다: 두 벡터가 평행하다.

 

 

 

     - 평면 벡터 방정식의 표현

       3차원에서 어떠한 평면에 점(a) 하나를 찍고,

       원점에서부터 (a) 까지의 벡터를 V1,

       그리고 평면을 표현하기 위해서는 두개의 벡터가 필요하므로

       평면 위에 임의의 점을 2개 찍은후 (a)를 기준으로 벡터를 생성합니다. V2, V3

 

       ※ 여기서 평면의 임의의점 X는

           X = V1 + t0 x V2 + t1 x V3 가 됩니다.

 

 


예제

'수학 > 선형대수' 카테고리의 다른 글

03. Dot Product의 성질 - 선형대수  (0) 2021.11.09
02. Norm과 Dot Product - 선형대수  (0) 2021.11.09
01. 벡터 (Vector) - 선형대수  (0) 2021.11.09
선형함수와 비선형함수  (0) 2021.06.11

Dot Product의 성질로 들어가기전 코사인 법칙부터 살펴보겠습니다.

증명에 대한 내용은 링크에 걸어두었습니다.

 

제 2 코사인 법칙

증명: https://jwmath.tistory.com/267

 

 

 

1. Dot Product의 기하학적 의미

 

      - 제 2 코사인 법칙과 비교를 하면

      - a = || V2 - V1 ||

      - b = || V2 ||

      - c = || V1 ||

 

      - 위에 정의해준 a, b, c 를 제 2 코사인 법칙에 대입을 해줍니다.

      - 여기서 지난 게시글에 올렸다시피 || V || = sqrt( V · V ) 를 이용해 치환을 해줍니다.

      - 전개 후 식을 정리하면 V1 · V2 = ||V2|| ||V1|| cosθ = ||V1|| ||V2|| cosθ 가 됩니다.

 

      - 즉, ||V2|| cosθ 만큼의 길이(사영, Projection)을 ||V1|| 과 곱한것입니다.

 

      ※ θ가 둔각일때는 -를 곱해주어야 합니다.

 

      ※ 수직일때!

         - V1 · V2 = ||V2|| ||V1|| cosθ 에서 수직이면 θ = 90도 이므로 cosθ = 0 이 됩니다.

         - 즉, θ = 90도 일때 V1 · V2 = 0

 


2. 벡터의 사영 (Projection)

 


3. 코시-슈바르츠 부등식 (Cauchy-Schwarz Inequality) 증명

 


4. 삼각 부등식 (Triangle Inequality) 증명

 

'수학 > 선형대수' 카테고리의 다른 글

04. 벡터 방정식  (0) 2021.11.10
02. Norm과 Dot Product - 선형대수  (0) 2021.11.09
01. 벡터 (Vector) - 선형대수  (0) 2021.11.09
선형함수와 비선형함수  (0) 2021.06.11

Norm과 Dot Product

 

1. norm (노름): 벡터의 길이, ||V||

      - Vector V = (V1, V2) 가 있다면, 아래와 같이 표현 (피타고라스 이용)

      - n차원에서의 norm 공식은 아래와 같다.

 


2. norm의 성질

 

      - 길이이기 때문에 0 이상의 값을 가진다.

      - ||KV|| = |K| x ||V||, K는 임의의 수, 길이이기 때문에 무조건 양수

 


3. 단위벡터 (Unit Vector)

 

      - 길이가 1인 Vector

      - 단위벡터로 만들어주기 위해서는 1/||V||를 스칼라배 해주면 됩니다.

      - Standard Unit Vector: 아래와 같이 기본이 되는 Unit Vector

      ※ Standard Unit Vector의 표현:

               - e1: 첫번째 원소가 1인 Vector - ex) (1, 0), (1, 0, 0), ...

               - e2: 두번째 원소가 1인 Vector - ex) (0, 1), (0, 1, 0), ...

               - e3: 세번째 원소가 1인 Vector - ex) (0, 0, 1), ...

 

 


4. 벡터간의 거리

 

      - norm으로의 표현: d(V1, V2) = || V2 - V1 ||

 


5. Dot Product (Scalar Product):

 

      - 어떤 V1과 V2를 곱했을때 어떤 Scalar 값이 나오게 정의

 

      - 교환법칙 성립 O - V1 · V2 = V2 x V1

      - 분배법칙 성립 O - u · (V1 + V2) = u · V1 + u · V2

      - 위의 증명과 같이 || V || = V · V 가 성립한다.

'수학 > 선형대수' 카테고리의 다른 글

04. 벡터 방정식  (0) 2021.11.10
03. Dot Product의 성질 - 선형대수  (0) 2021.11.09
01. 벡터 (Vector) - 선형대수  (0) 2021.11.09
선형함수와 비선형함수  (0) 2021.06.11

벡터 (Vector)

  1. 물리량:
    • 스칼라 (Scala): 크기 ex) 온도 (ºC), 길이 (mm, cm, m ...) ...
    • 벡터 (Vector): 크기 + 방향 ex) 속도, 힘 ...
  2. 벡터의 표현
    • 그림:
    • 기호:

  3. 벡터의 "=" 조건: 방향과 크기가 같을때

  4. 벡터의 연산
    • 덧셈:
    • 뺄셈: 교환법칙 성립X, V3 = V1 + (-V2) 와 같다.
    • 곱셈:
      • 스칼라배 (Scalar multiplication): n x Vector

  5. 위치벡터: 좌표평면상 점 하나로 벡터를 표현하는 방법
    • 좌표평면상 V1과 V2는 같은 벡터지만 다르게 표현이 됩니다.
    • 통일된 벡터의 표현을 위해 시작점을 원점으로 옮깁니다.
    • 그렇다면 유일성 보장, 끝점으로만 벡터 표현 가능
    • 위치벡터의 공식:
      • P1 = (x1, y1), P2 = (x2, y2)
      • P1P2 = (x2-x1, y2-y1)

 

'수학 > 선형대수' 카테고리의 다른 글

04. 벡터 방정식  (0) 2021.11.10
03. Dot Product의 성질 - 선형대수  (0) 2021.11.09
02. Norm과 Dot Product - 선형대수  (0) 2021.11.09
선형함수와 비선형함수  (0) 2021.06.11

이번 포스팅은 Inception-v2~3 입니다.

아래는 간단한 요약입니다.

  • Inception v2: 5x5 → 3x3 + 3x3 으로 변경, 3x3 → 1x3 + 3x1로 변경
  • Inception v3: Hyperparameter 변경
    1. Optimizer: SGD → RMSProp
    2. Label smoothing
    3. BN-auxiliary

 


이번 포스팅에서 다룰 Inception v2, v3 논문의 제목입니다.

논문의 링크는 아래 출처란에 적어놓았으니 참고해주시길 바랍니다.

 

 

Factorization into smaller convolutions

논문상 3.1 Factorization into smaller convolutions에 있는 내용입니다.

5 x 5 또는 7 x 7 filter는 연산량이 많기 때문에 Layer를 나눕니다.

예를 들어, 5 x 5 filter를 3 x 3 + 3 x 3으로 나누는 겁니다. (VGG에서 가져오신것 같다.)

즉, Figure 4 → Figure 5 로 변형을 시키는 것입니다.

  • 5 x 5 = 25 → 3 x 3 + 3 x 3 = 18 약 28% 감소

 

 

비대칭 합성곱 (Asymmetric Convolutions)

또한 여기서 멈추지 않고 3x3 convolution을 1x3 + 3x1로 변경하였습니다.

  • 3 x 3 = 9 → 1 x 3 + 3 x 1 = 6 약 33% 감소

 

 

보조 분류기 (Utility of Auxiliary Classifiers)

 

 

 

 

 

 

Reducing resolutions

해상도를 줄이는 방법에는 2가지 방법이 있습니다.

  1. stride의 크기를 1보다 큰 수로 설정합니다.
  2. pooling을 이용하여 줄입니다.

 

 

 

 

 

 

 

 

 

출처:

'Deep Learning > Pytorch' 카테고리의 다른 글

27_Pytorch_Custom_Dataset  (0) 2021.12.02
23_Pytorch_EfficientNet  (0) 2021.11.24
24_Pytorch_MobileNet - 연산량 number of operations  (0) 2021.10.12
22_Pytorch_RNN_Practice  (0) 2021.10.07
21_Pytorch_RNN  (0) 2021.10.06

+ Recent posts