1. Inception 에 대한 해석

 

일반적으로 사용한는 inception은 좌측 이고 이를 일반화하면 우측 이다. (여러가지의 feature를 학습가능하다는 점이 이어진다 + 채널을 나누어 계산이 쉽다)

저자가 해석하는 inception 이 좋은 성능을 나타내는 이유는

1x1 conv는 채널간 계산(cross-channel correlation)을 실시하고 , 3x3 conv는 각 feature맵 안에서 연산(spatial correlations)을 수행하여 잘 분해해 계산했기 때문이라고 한다.

 

 

2.  xception

위에서 언급한 일반적인 버전의 inception 모듈의 1x1conv 를 하나로 합치고 3x3conv를 확장한 xception을 제안했다.

 

좌측 Depthwise Separable Convoltuion/  우측 Extreme Inception

채널 방향의 연산은 진행하지 않고, 공간 방향의 3x3 conv을 진행후에 1x1 conv를 진행하는 Depthwise Separable Convoltuion의 순서를 반대로 적용하여

 

연산량을 줄이고 파라미터의 갯수도 크게 줄일 수 있었다.

 

또한 inception v3 보다 나은 성능을 보였다.

 

3.  activation 의 위치

 

 Inception 모듈은 1x1 conv 이후에 ReLU activation을 거친다

 xception에서도  pointwise와 depthwise 사이에 activation을 추가할 수 있다.   하지만 xception 에서는 activation을 넣지않는 것이 성능이 더 높게 나왔다고 한다.

저자의 의견으로는 activation이 정보를  바꾸어 놓고 이후의 depthwise는 depth가 없이 연산하기 때문에 오히려 정보손실을 야기할 수 있다는 것이다.

 

실제로 저자의 의견이 맞는지 왜  inception은 되고 xception은 안되는지에 대해 관해서는 밝혀진게없다

 

pre-activation resnet에서 언급된 actvation의 위치에 따라서 성능이 바뀐다는 점만 기억하면 될 것같다

 

4. archi

 

pre-activation이 보이기도하고

 

역시나 GAP가 사용되었다

'CV > classification' 카테고리의 다른 글

[CV] Squeeze Net  (0) 2022.05.04
[CV] MobileNet  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02

GoogLeNet이후 구글의 연구로 나온 모델이며 영화 인셉션의 이름을 따서 만든 모델이다. 

vgg net의 영향을 받아 3x3conv 더 나아가 nx1conv 1xnconv 를 이용하여 구조는 복잡하지만 성능과 연산량을 잡은 효율적인 모델이다.

 

V2와 V3는 같은 구조를 가지고 최적화 방법만 다르기떄문에 v2를 기준으로 구조를 설명하겠다.

 

** General Design Principles

논문에 일반적인 cnn구조의 법칙을 설명하는 부분이 있어 간단히 정리해보고자한다

1)   representational bottleneck을 피하기 위해서는 극단적으로 feature맵을 줄여서는 안된다

 

2) 고차원의 것은 분할하여 계산하면 쉽다.

 

3)

 

 

 

1. Factorizing Convolutions

vgg의 영향을 받아 5x5를 3x3 두개의 연속으로 대체하는 방법을 선택했다. 이방법은 파라미터의 갯수면에서 유리한 방법이다.

 

그리고 3x3을 3x1 1x3 으로 쪼개는 방법을 통해 파라미터수(9 -> 6)를 줄였다.

좀 더 일반화하면 nxn은 1xn과 nx1로 분해 할 수 있고, n이 커질수록 파라미터를 더 많이 줄일 수 있다. 

 

위의 개념으로 일반 인셉션모델 (좌측)을 더욱 발전시켰다

 

2. auxiliary classifier

googlenet 에있던 auxiliary classifier가 큰도움이 되지않는다는 것을 알고 제외

 

 

3. Efficient Grid Size Reduction

 representational bottleneck이란 cnn에서 주로 사용되는 pooling으로 인해 feature map의 size가 줄어들면서 정보량이 줄어드는 것을 의미한다.

 Figure9를 보면 사이즈를 줄이다 representational bottleneck이 발생하고  풀링을 이후에하면 연산량이 너무 많은 문제점이 있다.

 

 inception V2에서는 representational bottleneck를 막기위해 Figure10 처럼 반은 풀링 반은 stride = 2 conv representational bottleneck을 해소한다고한ㄷ.

 

4. archi

 

'CV > classification' 카테고리의 다른 글

[CV] MobileNet  (0) 2022.05.03
[CV] Xception  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02

ResNet은 처음으로 인간이 분류할떄의 5%라는 벽을 넘은 최초의 분류모델이자

후속연구에 큰 기여를 한 모델이다. 분류모델뿐만아니라 detection 과 segmentation 부분에서도 좋은 성능을 보였다고 한다.

resnet은 15년에 14년의 googlenet보다 9배깊은 레이어를 활용하여 두배에 가까운 성능을 냈다.

 

 

1. Residual learning 

 

resnet 이전에 일반적인 cnn의 구조를 이용의 학습하면 어느정도 이상 깊어진 구조는 training error가 잘 줄지 않는 학습이 잘 되지않는 문제를 가지고 있었다 이에 논문의 저자들이 제안한 방법이 

 

short cup, skip connection, identity mapping 등으로 불리는 Residual learning 이다

 

 

이전의 학습된 정보를 conv이후의 결과와 더하는 방법이다

바로 H(x)를 학습하는 것은 어려우므로 대신 F(x) = H(x)-x 를 학습한다.  H(x)는 현재 block을 거친 값이고 x는 그 전 까지의 값이니 결국 잔차(Residiual)를 가지고 학습을 했다는 것이다.

 

concat이 아님에 주의

 

Residual Mapping은 간단하지만, Overfitting, Vanishing Gradient 문제가 해결되어 레이어를 깊게 쌓을 수 있었고 자연스럽게 성능상승으로 이어졌다.

우측 resnet의 경우는 레이어가 깊어짐에도 loss가 더 낮은것을 확인 가능하다

 

2. archi

 

resnet 34

주목할만한 점

1) 풀링이 처음에만 사용되고 스트라이드를 이용하여 Feature map의 size를 줄이고 있고 (학습을 통해서 줄인다.)

점선의 short cup에서는 차원을 맞춰주기위해

 zero padding

 1x1 Filter (Stride = 2)

두 옵션을 사용한다. 

 

2) vgg넷의 영향을 받아 3x3conv를 사용한다

 

3) bn도 같이 사용한다.

 

4) GAP를 사용한다. 

 - 레이어가 깊어지면 앞선에서 특징을 잘 추출했다고 가정하여 연산량을 감소시킬수 있기에~

 

5) agumentation 사용

 

3. bottle neck

 

resnet 50 101 152 에서는 연산량을 줄이기 위해 보틀넥구조를 사용한다. 

 

4. 후속논문

 

1) 여러 숏컷구조

여러가지 숏컷기법을 사용해봣지만 오리지날이 제일 좋은 성능을 보였다.

 

 

2) pre-activation

 

 

conv 연산 이전에 activation을 거치게하는 preactivation 구조를 제안했다

-  최적화를 쉽게 한다.

 기존 ResNet은 short cut 을 거쳐서 입력값과 출력값이 더해지고, ReLU 함수를 거친다. 더해진 값이 음수이면 ReLU 함수를 거쳐서 0이 된다. 층이 깊다면 이 증상의 영향이 더 커지게 되어 더 많은 값이 0이 되어 수렴이 어려워질 것이다.

 pre-activation 구조는 더해진 값이 ReLU 함수를 거치지 않아, 음수 값도 그대로 이용하게 된다. 실제로 학습 곡선을 살펴보면 제안된 구조가 초기 학습시에 loss를 더 빠르게 감소시킵니다.

 

- 과적합방지

pre-activation은 더해진 값이 BN을 거쳐서 정규화 된 뒤에 conv에 입력된다. 따라서 overfitting을 방지한다고 저자는 추측한다.

'CV > classification' 카테고리의 다른 글

[CV] Xception  (0) 2022.05.03
[CV] Inception V2, V3  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02

 

 

1. inception module

hebb's rule를 본따 inception module을 설계한다.

더 다양한 Feature를 추출하기 위해 여러 개의 Convolution을 병렬적으로 사용 했다.

 

channel 을 줄여 계산량을 줄이기 위해서 1x1conv를 사용하였다. (bottle neck)

주목할 점은 여러 conv를 지나간이후 resnet처럼 +가 아닌 depth간의 concat연산을 한다는 점이다

 

여기서 왜  풀링은 1x1 conv를 이후에 했냐는 의문점이 생길 수 있는데 이는

풀링은 학습이 아닌 단순계산의 차원이기때문에 파라미터가 없을 뿐아니라 채널수를 조정하지 못하기때문에 1x1 conv를 이후에 시행한다.

 

또한 vgg를 알고 있다면 5x5를 왜 3x3으로 쪼개지 않았냐는 의문이 생길 수 있는데 이는

googlenet과 vggnet이 같은 대회에서 발표했기 때문이고 이것은  이후 v2에 반영된다.

 

2. architi

 

위에서 보았던 인셉션 모듈을 여러개 스태킹한 모습을 보이고 중간중간에 미리 결과를 냐는 auxiliary classifiers 를 두어 추후에 가중치를 곱한후 더하여 로스를 계산하고 다시 학습한다.

그리고 auxiliary classifiers는 학습 시에만 사용되고, Test 할 때는 제거한다 (학습을 도와주기 위한 용도로만 사용).

최종 분류기에 GAP를 사용했다는 점도 특징적이다. 이후에 FC층을 한번 사용하여 더 많은 조합을 기대했다.

'CV > classification' 카테고리의 다른 글

[CV] Inception V2, V3  (0) 2022.05.03
[CV] ResNet  (0) 2022.05.03
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02
[CV] ZF Net 리뷰  (0) 2022.05.01

VGG넷은 이전의 논문과 비교했을 때 굉장히 깊은 레이어들을 쌓아 완성한 모델이다.

연구의 핵심은 네트워크의 깊이에 따라 성능이 어떻게 변할까에 대한 내용인데

깊이의 영향만을 사용하고자 3x3conv만을 사용했다. 이 3x3conv의 가능성이 많은 주목을 받았고 후대의 연구에 큰 영향을 받았다고 한다. 

 

 

 

1. achite

vgg net은 총 6가지의 모델이 있는데 가장 우측의 2가지 vgg-16, vgg19를 주로 사용한다고 한다. (성능면에서 )

ILSVRC 2014에 최종 제출할 때는 7개 모듈의 Ensemble한 결과를 제출 했고 최종 성적은 2등이다.

 

 

3. 3x3 conv

 

3x3 conv 두개를 연속적으로 사용하면  5x5를 사용한 경우와 같은 영역을 확인 할 수 있다.

 

5x5 = 25 params 인데 반해

3x3x2 = 18params 로 적은 파라미터 갯수를 가진다.

이렇게 파라미터 갯수가 적어짐에 따라 레이어를 더 깊게 가져갈 수 있었다고한다.

 

 

그렇다고 vggnet 자체의 파라미터의 개수가 적은 것은 아니다 오히려 타 network보다 방대한 양의 파라미터를 가지고 있다 이는 FC층의 영향이다

 

 

추가적으로 3x3conv 사이에 relu 비선형성이 더 추가되기에 더 풍부한 특성을 추출가능하다.

(5x5 Convolution 대신에 3x3 Convolution을 두 번 사용 하는 경우 그 성능이 약 7% 향상 됐다고 한다)

'CV > classification' 카테고리의 다른 글

[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02
[CV] ZF Net 리뷰  (0) 2022.05.01
[CV] Alex Net 리뷰  (0) 2022.05.01

Network in Network 2013 

 

계산량을 줄일 수 있는 1x1 conv를 제안한 논문

 

가장큰 특징이라 한다면 1x1 conv와 global average pooling 을 실시했다는 점이다. 

 

 

1. 1x1conv 의 효과 

  • weight와 비선형성 추가 가능
  • channel의 크기를 마음대로 조절가능
  • 연산량감소

 

1-1. 비선형성 추가 와 weigt 추가

 1x1 conv이후에도 여느 conv처럼 relu같은 activa을 거치게 되는데 이는 비선형성을 추가 하게 된다. 즉 다양한 특징을 추출이 가능하다는 것이다.

 

 그렇다면 왜 선형 act을 쓰지않는 것일가 

 간단히 말하면  Wx+b도 W(Wx+b)+b도 W(W(Wx+b)+b)+b도 결과적으로는 선형식이기 떄문에 비슷한 가중치를 가질 수 밖에 없지만  W(f(Wx+b))+b 이렇게 중간에 f라는 비선형함수를 넣으면 더 풍부한 표현이 가능하기 때문이다.,

 

1-2. weight 추가

위의 그림을 예를들어 1x1conv의 계산과정을 보면 각 channel마다 1x1x32의 값이 곱해저 6x6x32의 output을 내게 된다.

즉 각 층의 위치마다의 선형결합을 의미하는 값이라는 것이다. 이는 같은 위치의 값에 대한 mlp의 fc와 비슷한 효과를 내게 되고  이후 비선형성도 추가하기떄문에 하나의 층을 더 쌓는 의미가 있다

본 논문에서는  mlpconvlayer라는 표현으로 표현하고있다.

 

1-3. channel크기의 조절

 

일반적으로 이미지의 row와 column을 줄이고 싶다면 pooling을 사용한다. channel에 대해 줄이는 것이 바로 1x1 conv이다.

만약 위의 예처럼 192개의 채널이 너무 크다 싶으면 1x1x32필터를 이용하여 채널을 줄일 수 있다.

채널의 개수를 유지할 경우에는 위 1-1,1-2의 의미가 있다.

 

1-4. 연산량감소 

 

https://hwiyong.tistory.com/45

Channel 수를 줄였다가 다시 늘이는 부분을 Bottleneck 구조라고 표현하기도 한다.

위의 param의 갯수를 보면 1x1con를 사용한 것이 계산량이 많이 감소한 것을 확인할 수 있다.

 

 

 

2. global average pool (GAP)

 

https://alexisbcook.github.io/2017/global-average-pooling-layers-for-object-localization/

이때까지의 대부분의 CNN모델은 후의 FC레이어들에서 많은 파라미터수를 차지했는데 GAP는 학습해야할 파라미터가 없다. 학습파라미터가 별로 없다는 것은 과적합을 방지한다는 측면으로 해석될 수 있기도하다. 그리고 

global average pool은 각각의 feature map을 평균한 것 이기 때문에 feature map의 특성을 가지고 있다고 할 수 있는데 이는 모델의 해석에 도움을 줄 수 있는 특징을 가진다.

 

위의 시도는 GAP이전의 단계에서 특징을 잘 추출했다는 가정하에 이루어질 수 있는 시도이지만 연산량을 많이 줄일 수 있는 기법이라는데에서 의미가 있다.

 

 

 

 

https://www.youtube.com/watch?v=c1RBQzKsDCk 

 

위영상을 많이 참고했다.

'CV > classification' 카테고리의 다른 글

[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] ZF Net 리뷰  (0) 2022.05.01
[CV] Alex Net 리뷰  (0) 2022.05.01

1. ZF Net이란

 

zf는 저자인  zeiler 와 fegus 의 이름을 딴 것이다.zf은 alex넷을 조금 변형시켜 이는 새로운 구조를 제안한 것은 아니지만cnn의 중간 과정을 확인할 수 있게 비주얼라이징함으로써 . 어떤 크기의 conv와 chanel이 최적의 조합인지 판단할 수 있다.

 

 

2. 시각화 과정

 

alex넷에서 제안했던 conv와 pooling 그리고 relu activ 를 역으로 연산하여 각 레이어가 나타내는 것을 확인하려하였다.

 

2-1. unpooling

max pooling 은 크기내에서 가장 큰값만 남기게 되는데 역방향으로 진행할떄는 어떤 위치에서 남게된 값인지 알기가 어려웠다. 

이에 저자들은 맥스풀링시에 위치를 저장하도록하여 언풀링이 가능하도록하였다.

 

2-2.  relu

렐루의 경우 0이상은 그대로 유지하고 0아래는 0을 리턴하게되는데 

저자들은 음의 값의 경우 복원하지않아도 큰 문제가 되지 않는다고 한다.

이에 역과정 역시 relu의 정방향과 같은 방법으로 진행한다.

 

 

2-3. deconv

수학적으로 역 연산을 실행하여 deconv한다.

 

 

3. 각 layers

 

레이어 1에서는 수평 수직전같은 단순한 특징 점점 깊어 질수록 여러 선이나 코너의 결함으로 더 자세한 특징을 짚어내는 것을 확인할 수 있다.

이런 시각화로 어떤 레이어에서 좋은 특징을 뽑아내고있는지 등 cnn의 구조가 적절했는지를 확인 할 수 있었다.

추가적으로 각 레이어별로 몇 epoch부터 특징을 제대로 잡아냈는지 즉 잘 학습을 했는지를 확인하엿는데 (특징이 수렴하였는지)

앞쪽의 레이어들은 낮은 epoch에도 특징이 수렴했지만 뒷쪽의 레이어들은 좀더 많은 epoch가 필요함을 확인할 수 있었다.

 

 

https://www.youtube.com/watch?v=46TlWpZgKRE 

위 영상을 많이 참고했다.

'CV > classification' 카테고리의 다른 글

[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02
[CV] Alex Net 리뷰  (0) 2022.05.01

이미지 인식 대회의 2012년 winner였던 alex net의 논문을 리뷰한다.

당시 압도적인 성능을 보였던 뿐만아니라 후대의 신경망들에 큰 영향을 미쳤다

 

 

1. Architecture

 

총 8개의 층을 가지는데 5개의 conv층 + 3개의 fc층을 가지며 GPU 두개로 병렬처리한다. 

  • ReLU
  • gpu 2대 병렬처리
  • Local response norm
  • overlapping pooling
  • dropout
  • agumentation

이러한 특징을 가진다.

 

 

 

2. Dataset

 

  • train 1.2m / validation 50000 / test 15000 images 
  • 모든이미지를 256*256으로 통일 시켜 사용 (256*256*3)
  • 직사각형 이미지의 경우 짧은 면을 256으로 조정하고 가운데를 중심으로 자름

 

3. Architecture Detail

 

  3-1. ReLU

전통적으로 쓰이던 tanh나 sigmoid를 사용하지 않고 ReLU를 사용했다.

아래 그래프에서 보이듯 error가 0.25에 도달하기까지의 epoch가 많이 차이난다.

 3-2. Multiple GPUs

당시 gpu로는 메모리가 부족으로 사용했다. 몇개의 레이어에서만 서로의 값을 공유한다.

(alexnet에서는 어쩔수 없었지만 이 방법이 후대의 경량화 모델에 많은 영감을 주었다)

 

 3-3. Local Response Nomalization

 ReLU를 Saturated 부분이 없지만 그 값이 무한히 커질 가능성이 있어 너무 큰 값이 주변 값들을 무시할 수도 있다.

 

AlexNet에서는 ReLU 결과 값을 Normalization 하여 일반화 된 모델을 만들기 위해 Local Response Normalization (LRN) 을 사용했다.

 

논문에서는  k=2, n=5, alpha = 10**-4,  beta = 0.75 를 사용했다.

채널중에서 n = 5기 때문에 만약 7번째 채널을본다면

5,6,7,8,9 이렇게 앞뒤로 같은 위치의 액티배이션값을 제곱한 한것을 분모에 두어 정규화한다. 

lateral inhibition

이는 lateral inhibition(측면억제)이라는 실제 우리의 뇌에서 일어나는 증상을 본따 만든것으로 위의 그림을 보면 흰색선에 집중하지 않는다면 회색의 점이 봉니는데 이는 흰색으로 둘러싸인 사각형에서 억제를 발생시키기 때문에 흰색이 반감ㅇ되어 보이는것 입니다. LRN도 이렇게 relu로 아주 커진 값을 주변에 맞게 억제하는 방향을 원합니다.

 

 3-4. Overlapping Pooling

 

 오버래핑 풀링은 stride를 풀링 사이즈보다 작게 가져가 겹치는 부분이 생기게 하는 기법인데 이런 풀링 방법을 적용하여 과적합을 방지했다고 한다.  

 예를 들어 위 예의 경우 2번째 사각형의 5는 왼쪽 사각형의 4에비에 큰 자극임에도 불구하고 일반 풀링의 경우 5는 사라지게 된다 하지만 오버래핑풀링의 경우 5의 정보가 남게 되는 것이다.

 이는 오버피팅을 방지하는 효과를 가져왔지만 풀링 이후의 사이즈가 작아지는 정도가 일반 풀링에 비해 크긱 때문에 연산량 메모리 측면에서 좋지않아 추후의 모델에서는 잘 사용되지않는 테크닉이다

 

3-5. Drop out

 

과적합을 방지하기 위해서 drop아웃을 사용했다. 이는 학습시에만 사용되었으며 예측시에는 사용되지않느다.

 

co-adaptation

 = 신경망의 학습 중, 어느 시점에서 같은 층의 두 개 이상의 노드의 입력 및 출력 연결강도가 같아지면, 아무리 학습이 진행되어도 그 노드들은 같은 일을 수행하게 되어 불필요한 중복이 생기는 문제를 말한다. 

0.5의 드롭아웃을 줘서 co-adaptation을 막았다.

 

3-6. Agumentation

 

256으로 자른이미지를 총 10로 증강시키는 기법을 사용햇다

 

가운데 이미지 + 좌상단 이미지 + 우상단이미지 + 좌하단 + 우하단 이미지 이렇게 5개와

좌우로 반전한것의 5개를 활용해서 10개의 이미지로 증강하여 사용한다. 

 

'CV > classification' 카테고리의 다른 글

[CV] ResNet  (0) 2022.05.03
[CV] GoogLeNet  (0) 2022.05.02
[CV] VGG Net 리뷰  (0) 2022.05.02
[CV] Network in Network 리뷰  (0) 2022.05.02
[CV] ZF Net 리뷰  (0) 2022.05.01

내가 좋아하는 침착맨님 , 윈도우 배경으로 만드는 것은 전게시물에 있다 그 결과물을 바탕으로 얼굴을 인식하여 모자이크를 해주는 프로그램이다.

 

 

import dlib
import cv2
import numpy as np
from imutils import face_utils,resize
# cap = cv2.VideoCapture(0) 
cap = cv2.VideoCapture('remove.avi')
if not cap.isOpened(): 
    exit() 

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
width = round(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS) 

# 저장 파일명, 코덱, FPS, 크기 (width, height)
out = cv2.VideoWriter('mosaic_chim.avi', fourcc, fps, (width, height))

    
while True:
    ret, frame = cap.read()
    if not ret:
        break
        
    img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces =  detector(img_gray)
    for face in faces:
        landmarks = predictor(img_gray, face)
        points = face_utils.shape_to_np(landmarks)
        rect = cv2.boundingRect(points)
        x,y,w,h = rect

#         cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 1)
        
        mosaic = frame[y:y+h, x:x+w].copy()
        mosaic = cv2.resize(mosaic, dsize=None, fx=0.1, fy=0.1, interpolation=cv2.INTER_NEAREST)
        mosaic = cv2.resize(mosaic, dsize=(w,h), interpolation=cv2.INTER_NEAREST)
        frame[y:y+h, x:x+w] = mosaic
        
    out.write(frame) 
    cv2.imshow('camera', frame)
    if cv2.waitKey(1) == ord('q'): # 사용자가 q 를 입력하면 
        break
        
out.release() 
cap.release()
cv2.destroyAllWindows()

 

 

dlib은 얼굴과  라이브러리이다. python에서는 pip로 쉽게 설치할 수 있다.

dlib로 face detection, face landmark detection 등을 수행가능하다. 

 

 

shape_predictor_68_face_landmarks.data로 사람얼굴의 68가지 랜드마크를 인식하고

외접하는 사각형을 만들어 그부분의 해상도를 극히 낮추어 씌운 방식이다.

'CV > open cv' 카테고리의 다른 글

[cv] python 픽셀아트 만들기  (0) 2022.04.14

 

이미지를 받아오고 panel에 들어온 값에 따라 해상도(?)를 설정하여 픽셀의 형태로 만드는 코드

 

import cv2

file_name = 'rosicky.jpg'
image = cv2.imread(file_name)

panel = np.zeros([100,400], np.uint8)
cv2.namedWindow('panel')

def nothing(x):
    pass

cv2.createTrackbar('FX', 'panel', 1,100, nothing)
cv2.createTrackbar('FY', 'panel', 1,100, nothing)

return_name = file_name.replace('.','_pixel.')

while True:
    
    # 트랙바의 위치에 따라 변수에 값할당
    fx = cv2.getTrackbarPos('FX', 'panel') / 100
    fy = cv2.getTrackbarPos('FY', 'panel') / 100

    pixel = cv2.resize(image, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)
    pixel = cv2.resize(pixel, dsize=(int(image.shape[1]*1),int(image.shape[0]*1)), interpolation=cv2.INTER_NEAREST)
    
    cv2.imshow('image', image)
    cv2.imshow('pixel', pixel)
    cv2.imshow('panel', panel)
    
    if cv2.waitKey(1) == ord('s'):
        cv2.imwrite(return_name, pixel)
    if cv2.waitKey(1) == ord('q'):
        break

cv2.waitKey(0)
cv2.destroyAllWindows()

 

pixel = cv2.resize(image, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_NEAREST)

pixel = cv2.resize(pixel, dsize=(int(image.shape[1]*1),int(image.shape[0]*1)), interpolation=cv2.INTER_NEAREST)

 

이미지의 사이즈를 조정하는 방법 중 제일 퀄리티가 떨어지게되는 INTER_NEAREST 옵션을 사용하여 줄이고 다시 원래크기로 복원하여 해상도를 낮게 만들어 픽셀화한다.

panel에 크기를 줄이는 가중치를 받아와 실시간으로 결과가 어떻게 변하는지를 확인할 수 있도록함

 

s를 입력시 동명의 이름에 _pixel이 붙은 상태로 저장이되고 

q를 입력시 종료된다.

'CV > open cv' 카테고리의 다른 글

[cv] 얼굴인식하여 얼굴부분만 모자이크하기  (2) 2022.04.14

+ Recent posts