우리는 얼굴 표정과 주요 포인트 탐지 모델 둘을 합쳐 볼 거예요
기억해보시면, 지금까지 우리는 두 모델, 주요 얼굴 포인트 인식을 위한 모델과
실제 감정을 인식 즉, 감정을 분류하는 모델을 각각 학습시켰어요
그럼 계속해서 실제로 두 모델을 하나로 합치고 합쳐진 예측결과를 만들도록 해봅시다
자, 여기에 predict라는 함수를 만들어 놨고요, X_test를 입력으로 가져갈 거예요
그리고 해 볼 것은, 두 예측을 하는 거예요
첫 번째는 첫 번째 모델에서 나올 거예요 'model_1_facialKeyPoints가 있고
predict 메소드를 적용하고 X_test 데이터를 줄 거고 그러면 첫 번째 탐지 결과가 나올 거예요
그리고 이걸 df_predict라고 해 줄 거고 그리고 난 다음에는 또 다른 예측을 만들어 볼 건데
이건 Model 2에서 나오겠죠 그래서 'model_2_emotion'에 predict 메소드를 적용하고
X_test를 넣어줄 거고 그리고 여기들 중 argmax도 얻어줄 거예요
💡argmax는 주어진 배열에서 최대값의 인덱스를 반환하는 함수입니다. 일반적으로 NumPy, TensorFlow, PyTorch와 같은 라이브러리에서 사용할 수 있습니다. 이 함수는 배열의 축(axis)을 기준으로 최대값의 인덱스를 찾으며, 원-핫 인코딩된 배열에서 원래의 레이블을 찾는데 유용하게 사용됩니다.
기억하시나요?
이제 출력을 얻을 건데 이 출력 형태가 [0, 1, 0, 0, 0] 또는 예를 들어 [1, 0, 0, 0, 0] 이런식으로 되어있었죠
그래서 모델에 있는 5가지 출력들 중에서 가장 높은 예측결과를 얻을 거예요
그리고 이게 df_emotion이 될 것이고요
그리고 여기에서는 배열을 (856,)에서 (856, 1)로 형태를 바꿔줄 거예요
이를 위해서, numpy .expand_dimensions를 (np.expand_dims) 사용해 줄 건데요
즉, df_emotion을 가져와서 확장, 이 포맷이 되도록 형태를 바꿔줄 거고
그러고 나서 이 예측들을 데이터 프레임으로 바꿔줄 거예요
그래서 'pd.DataFrame'이라고 해주면 되고
💡예를 들어, (856,) 형태의 1차원 배열은 다음과 같이 생겼습니다:
[1, 2, 3, ..., 856]
np.expand_dims를 사용하여 차원을 추가하면 (856, 1) 형태의 2차원 배열이 됩니다:
[ [1], [2], [3], ..., [856]]
딥러닝 모델을 학습할 때, 데이터와 레이블의 형태는 일반적으로 (샘플 수, 특징 수) 또는 (샘플 수, 레이블 수)와 같은 형태여야 합니다. 따라서 (856,)에서 (856, 1)로 배열의 형태를 변경하여 모델에 적합한 형태로 만드는 것입니다.
df_predict를 가지고와서, 여기에 있는 것이죠 그리고 이걸 데이터 프레임으로 바꿔줄 거예요
데이터 프레임, df_predict로 변환을 마치면 이게 모델1의 예측이에요
이제 감정 예측을 더할 수 있죠
이제 주요 얼굴 포인트와 감정 예측과 함께 하나의 거대한 데이터 프레임에 들어가 있는 거예요
그리고 이제 df_predict가 있고 여기에 'emotion' 이라는 열을 추가할 거고 내용은 df_emotion이 되겠죠
그리고 기본적으로 이제 이 'predict' 함수를 호출해서 X_test, 즉 테스트 데이터를 줄 수 있고
이제 모델에서 합쳐진 예측을 만들어낼 수 있게 돼요, 상당히 멋있죠
계속해서 실제로 테스트해 봅시다 함수를 실행하면 df_predict를 만들어낼 거예요
그리고 계속해서 데이터 프레임의 head도 확인해 봅시다
여러분, 이건 배우기에 정말 대단한 스킬이에요 우리는 이제 두 모델에서 나온 결과들을 합칠 수 있게 되었고
자, 보시다시피 여기에 모델이 만들어낸 실제 예측들이 있어요
left_eye_center_x가 있고left_eye_center_y가 있죠 왜냐고요?
right_eye_center_x가 있고right_eye_center_y가 있고 계속해서 x, y.. x, y 이렇게 있어요
그리고 그 위에는, 두 번째 모델에서 만들어낸 감정 예측도 있을 거예요
이 이미지를 주고서 이 사람이 기쁜지 아닌지 알려줄 수 있고
그 사람의 얼굴의 주요 포인트들도 알려줄 수 있죠.
그리고 이 것을 거의 85%의 정확도로 할 수 있어요
우리가 지금까지 여기에서 해온 것은 상당히 독특한 거예요 왜냐하면 우리는 지금까지 2개의 모델을 개발했는데
하나는 분류를 하고 여기 특정 클래스들이 있죠
그리고 또다른 모델은 회귀작업을 하는데에 사용되었죠 이제 연속 출력을 예측하는 거예요
자, 이제 우리는 분류에 대해 배웠고 회귀에 대해 배웠어요
그리고 이제 미니 과제를 하러 가봅시다
제가 여러분께 원하는 것은 예측된 감정과 주요 얼굴 포인트들과 함께
16개의 이미지 그리드를 그리는 겁니다
그리고 봅시다 그리드를 만들어 줄 건데, 이를 위해 plt.subplots를 4 x 4로,figsize는 24 x 24가 되도록 해 줄 거에요
그리고 여기에서는 for loop를 만들어줄 거고 loop는 0부터 시작해서 16이 될 때까지 반복할게요
그래서, range는 16으로 해주고 그리고 이미지를 보여줄 거예요
이를 위해 'axes[i].imshow'를 해주고 i 번째의 X_test를 보여줄 거에요
💡squeeze() 함수는 배열에서 크기가 1인 축(차원)을 제거하는 데 사용됩니다. 이 함수는 배열의 형태를 조정하여 불필요한 차원을 줄이는 데 도움이 됩니다.
예를 들어, (1, 3, 1, 2) 형태의 배열이 있다고 가정해봅시다. 이 배열에 squeeze() 함수를 적용하면, 크기가 1인 차원이 제거되어 (3, 2) 형태의 배열이 됩니다.
다음은 Python과 NumPy를 사용한 예제입니다:
arr = np.array([[[[1, 2]]], [[[3, 4]]], [[[5, 6]]]])
이 배열의 형태는 다음과 같습니다:
- 가장 바깥쪽 괄호에 3개의 원소가 있으므로 첫 번째 차원의 크기는 3입니다.
- 그 다음 괄호에 1개의 원소가 있으므로 두 번째 차원의 크기는 1입니다.
- 그 다음 괄호에도 1개의 원소가 있으므로 세 번째 차원의 크기는 1입니다.
- 마지막 괄호에 2개의 원소가 있으므로 네 번째 차원의 크기는 2입니다.
print("Original array shape:", arr.shape) # 출력: (3, 1, 1, 2)
squeezed_arr = np.squeeze(arr)
print("Squeezed array shape:", squeezed_arr.shape) # 출력: (3, 2)
위 예제에서 원본 배열의 형태는 (3, 1, 1, 2)입니다. squeeze() 함수를 적용한 후 배열의 형태는 (3, 2)가 됩니다.
이 함수는 특히 딥러닝 모델의 출력 결과를 처리할 때 유용하게 사용됩니다. 예를 들어, 모델이 이미지 분류 문제를 해결하는 경우, 출력 결과는 (1, 클래스 수) 형태의 배열일 수 있습니다. 이 때 squeeze() 함수를 사용하여 배열의 차원을 줄이면, 결과를 더 쉽게 해석하고 처리할 수 있습니다.
그러고 나서 제목에는 감정을 적을 거에요 그래서 'axes[i].set_title'을 해주고
모델에서 만들어낸 실제 예측들을 보여주고 싶어요 사진에 부합하는 감정이 되겠죠
그러고 나서 실제 주요 얼굴 포인트들을 출력할 거에요
기억해보시면, 전에도 프린트 했었죠 여기 있는 모든 각각의 열에 대해서
x, y를 프린트하고 그 다음 x, y를 프린트하고 이런식으로 했었어요
이 모든 데이터 포인트들의 실제 좌표들이죠
이를 위해서 'axes[i].plot'을 해주고 여기에서는 x 좌표와 그 뒤의 y좌표를 표시할 거예요
그리고 이건 빨간색 마크로 한다는 것이고 이 마크는 x모양일 거예요
그럼 가서 직접 해봅시다
그리고 자, 여기 나왔네요 그럼 가서 조금 더 자세히 봐봅시다
자, 여기는 예측이 '기쁨'인것 같네요
그리고 주요 얼굴 포인트들도 잘 됐어요
똑같이 예측결과가 또 '기쁨'으로 나왔고
여기 예를 들어, 예측을 '슬픔'으로 한 것을 보면 잘 됐어요
그리고 여기에 있는 주요 얼굴 포인트도 상당히 정확하게 탐지됐어요
놀랍죠 자, 축하해요
이제 여러분들은 주요 얼굴 포인트들과 함께 감정을 예측하는 2개의 복잡한 AI를 개발할 수 있게 되었어요
'딥러닝' 카테고리의 다른 글
감정Ai(20) - TensorFlow 2.0 Serving에서 학습된 모델 제공 (0) | 2023.05.04 |
---|---|
감정Ai(19) - 전개를 위해 훈련된 모델 저장하기(교육을 받은 두 모델 모두 구축 부분) (0) | 2023.05.04 |
감정Ai(17) - 얼굴 표정 분류기 모델 평가하기 (0) | 2023.05.04 |
감정Ai(16) - 핵심성과지표 분류기 이해하기(정확도, 정밀도, 재현율 차이) (0) | 2023.05.04 |
감정Ai(15)- 얼굴 표정 분류 모델 만들고 훈련하기 (0) | 2023.05.04 |