딥러닝

감정Ai(9)-RestNet을 만들어 얼굴 주요 특징점 검출하기

인생진리 2023. 5. 3. 19:51

 Keras와 Tensorflow 2.0을 이용해서 이 네트워크를 실제로 구축해볼 것이에요
첫 번째로 잔차 블록을 정의해봅시다


res_block 이라는 function을 먼저 만들어 볼 것이고요

그리고 이것들이 오퍼레이션들 이에요
(각 계층(layer)에서 수행되는 기본적인 수학적 연산이나 처리)

먼저, 메인 경로가 있고 그 뒤에 짧은 경로가 있죠
그 다음 이 둘을 합할 것이고요
이게 합성곱 부분이에요

떠올려보시면 잔차 블록 안에 Convolution - Identity - Identity 순서로 되어있죠
그래서 기본적으로 이거 하나와 그 다음 이 2개가 될거예요
그리고 이것 모두가 단 하나의 Res 블록이에요


Conv2D, MaxPooling2D, BatchNorm 그리고 Activation이 있어요


그리고 이것이 합성곱 블록에서 이 부분인 것이죠
그 다음 또 다른 Conv2D, BatchNorm, Activation 또 다른 Conv2D, BatchNorm이 있을 거예요

그리고 이 전체가 합성곱 블록의 메인 경로가 될 거예요

짧은 경로에는 기억 해보시면 메인 경로에 MaxPooling2D 레이어가 있기 때문에
짧은 경로에도 MaxPooling2D가 있어야해요


그래서 '# Short path'를 보시면 Conv2D, 그 다음 MaxPooling2D, 그 다음 BatchNorm이
있고 이게 기본적으로 이 부분이에요 두개 다 가져와서 합해줄 거예요


이 부분에 해줄 거예요
두개를 합하고 ReLU(Rectified Linear Unit) 활성화 함수에 적용해줄 거예요

여기까지가 기본적으로 첫 번째, 합성곱 블록이에요


두 번째는 Identity 블록 1이 될 거예요


먼저, Conv2D, BatchNorm, Activation이 있고
또 다른 Conv2D, BatchNorm, Activation 그리고 Conv2D, BatchNormalization이 있고
그리고, 여기 짧은 경로에는 아무 오퍼레이션도 필요하지 않아요
짧은 경로에서는 그냥 Identity mapping을 할 거예요


X와 X_copy를 합해줄 것이죠 
간단하게, 입력은 마지막에 있는 그대로 합해질 거예요

그러고 나서 또 다른 Identity 블록을 하나더 넣어주고 이게 Identity 블록 2가 될 거예요
똑같이, 입력 복사본을 만들어 주고
Conv2D, BatchNorm, Activation이 있고 또 다른 Conv2D, BatchNorm, Activation
또 다른 Conv2D, BatchNorm
그리고 모두 둘을 합한다음 활성화 함수에 적용해주면 기본적으로 잔차 블록을 구축해줄 거예요
여기에 많은 세부 내용들이 있다는 것을 알아주시고, 간단히 설명 하자면
Conv2D라고 하면 2차원에서 합성곱을 적용해요

여기에서는 필터의 실제 사이즈를 지정해주고 있고
kernel사이즈가 될 것이고 예를 들어 3 x 3, 5 x 5 이렇게 되겠죠
여기 'strides'를 지정해주는 건 합성곱을 적용할 때 얼마나 오른쪽, 왼쪽으로   움직일지를 정해주는 거예요

그래서, strides가 1이면 1픽셀 만큼만 움직이고 2이면 2픽셀만 스캔하고, 이런 식이죠
이건 정말 대략적으로 본 것이고 이제 실제로 셀을 실행시켜 봅시다


그리고 이제 메인 모델을 구축할 수 있어요
기억해보시면, 지금까지 Res-block만 만든 거예요



이제 최종 모델을 구축해야죠


여기 최종 모델을 보면 Zero padding 다음 Conv2D, BatchNorm, MaxPooling2D 그리고 Res-block, Res-block
그리고 AveragePooling, Flatten(), Dense 레이어, Dense 레이어, Dense 레이어
그리고 끝이에요



이제 여기에 이게 메인이에요

여기에 Zero padding이 있고
여기 Conv2D, BatchNorm, Activation,Max supporting 2D. MaxPooling2D가 있고
그 다음, Res-block 2개가 있을 거예요
기억해보시면, 이것들 각각 여기로 가서 이 res_block function 전체를 호출할 겁니다
그래서 Res-block 다음 Res-block이 올 거고 그 다음 Average Pooling을 해줄 거예요
그러고 나서, Dense 인공 신경망을 구축해줄 거예요
먼저, 특성 맵들을 펼치고 Dense(), Dropout(), Dense(), Dropout(),
그리고 Dense()를 이용할 거예요
Dropout()은 정칙화 기술이고 주로 네트워크 일반화 능력에 도움을 줘요
기본적으로 네트워크가 학습될 때 여기 경우에서는 뉴런 20 퍼센트 떨어뜨릴 거예요

그리고 이것으로 무엇을 할거냐면 실제 네트워크가 

뉴런들 사이의 상호 의존을 기피하는 것을 보실거예요 이렇게 하면
네트워크 성능을 올릴 수 있고, 네트워크의 일반화 능력 또한 올릴수 있습니다
그리고 여기는 제 모델이 될 거예요 model_1_facialKeyPoints라고 했고
이게 첫 번째 모델이 될 거예요

 


코드실행전에 라이브러리 불어와야해요


 Res-block  함수에 maxpool로적혀 코드 에러 가 나서 고쳤어요


나왔습니다 자, 여기 모델 요약이 있고

보시다시피, 여기에서 우리가 방금 구축한 실제 모델을 볼 수 있어요
기본적으로 우리가 정의한 모든 레이어 하나하나 여기 적혀있어요
Zero padding도 있고 Conv1, Activation, MaxPooling.. 그리고 여기에 다양한 레이어들이 모두 있죠


그리고 여기로 스크롤을 내려보면.. 정말 큰 네트워크에요
그리고 이건 정말 놀라운 것이라는 것을 알아주세요 특정 일을 위한

인간의 지능과 동등한 뇌를 만든 것과 같은 거예요
약인공지능에서는 정말 강력합니다 정말 멋진 일을 할 거예요 그리고 이게 얼마나 강력한지 여러분에게 보여드릴게요
파라미터의 총 개수는, 총 1,800만개의 파라미터가 있어요
이 파라미터들의 최고의 값을 찾기위해 1,800만 파라미터들을 위한 최적화를 한다고 생각해 보세요

그리고, 이제 미니 과제를 할 시간이네요
여러분은 Res-block에서 MaxPooling 레이어 2개를 없애서 네트워크 구조를
바꿔보는 실험을 해보시고 모델도 확인해보세요


제가 여러분께 해보라고 한건 처음 MaxPooling 레이어를 지워보는 것이었는데요
실제로 해봅시다 여기 위로 와서Res-block에 있는 MaxPooling 레이어를지워봅시다
여기에 있는 MaxPooling 라인을 주석처리 해주면 되고 여기 짧은 경로에도 똑같이 해줘야죠
MaxPooling2D를 주석처리 해줄거예요


기억해보시면 제가 방금 한 것은 실제 Res-block에 Convolution 블록과 2개의 Identity 블록이 있죠
그리고, Convolution 블록.. 여기에 있죠 저는 MaxPooling2D를 지워주었고
짧은 경로에 있는 MaxPooling2D도 지워주었어요
만약 두 경로 둘다 똑같이 해주지 않으면 여기의 각자의 차원이 달라질 거예요
그래서 이후 합쳐보아도 작동하지 않을 겁니다

그러니 같은 차원이도록 꼭 두 경로 모두 주석처리 해주어야 해요
그리고 셀을 실행해보기 전에, 여러분들은 파라미터가 몇개인지 기억하셔야 해요
지금 우리는 1,800만개의 학습가능한 파라미터들이 있고 이제 가서 셀을 실행시켜 봅시다



MaxPooling 레이어를 지운 후의 학습가능한 파라미터 개수가 몇개인지 확인해 봅시다
여기 2억 6천 3백만개의 파라미터들이 있어요 규모를 상상해 보세요
기본적으로, MaxPooling을 적용하는 것은 특성맵의 사이즈를 줄이기 위해서였죠
학습가능한 파라미터의 개수를 줄일 거예요
하지만 여기, MaxPooling 레이어를 지우면 파라미터 개수를 보면 미쳤어요
2억 6천만개의 파라미터들이 있는 거예요 거의 10억의 4분의 1인 거죠



다시 돌아가서 메인 모델에 있죠, 여기로 와서
그리고 stage #4가 되겠죠 그러고 나서 res_block에 'stage = 4'로 바꾸어 주고 차원이 같도록
이제 실제로 실행시켜 봅시다


우리가 실제로 모델을 학습시킬 때 실제로 실험해보고
몇개의 파라미터가 필요한지에 대해 알 수 있게 될거예요
자, 여기 5억 2천만개의 파라미터가 있어요
거의 10억의 반절이에요 추가적으로 Res-block을 넣은 후에 말이에요 

Keras를 이용 하면 우리의 삶을 더욱 쉽게 해줍니다

이게 그저 뭐 코드 몇줄처럼 보이지만 그 뒤에는 거대한 네트워크들이 있고
가장 최첨단의 네트워크예요

그러니, 여러분 여러분이 AI가 처음이시라면이게 최첨단의,굉장한 기술이고
실제로 여러분의 앱을 개발할 때 그대로 적용할 수있고
실제로 현실의 어플리케이션을 구축할 때에 사용할 수 있고
이건 정말 배우기에 정말 훌륭한 기술이에요