본문 바로가기

TIL

[TIL 2024. 05. 22] 얼굴인식으로 나잇값 추측 | 깃허브

얼굴인식으로 나잇값 추측

정확도 이슈로 이미 모두 수정한 deepface코드를 쓸 수 없다는 판단을 내리고, 상대적으로 좀 더 정확하게 나잇값을 추측해주는 gtp-4o를 이용해서 해당 얼굴인식 파트를 작성했다.

 

일단 초기에 생각했던 얼굴인식 관련 로직의 흐름은 다음과 같다.

 

1. opencv를 활용해서 웹캠으로 사용자의 얼굴 사진을 찍는다

2. 그 사진을 gpt-4o에게 넘겨주어 나잇값에 대한 반환값을 얻는다

3. gtp-4o의 대답 중에 나잇값에 대한 정보만 추출한다

4. 해당 나잇값을 통해 if문을 통해 template에 대한 분기를 처리해준다 (고령층/비고령층)

 

우선 이전에 deepface사용시 작성했던 analyze()를 사용하는 코드의 일부분을 재사용해서 ret과 frame을 가져오는 것까지는 성공하고, 이에 대한 print문도 찍어보니 결과값은 잘 넘어오는 것 같았다.

 

하지만 반복해본 테스트의 결과, 카메라에 사람 얼굴이 없거나 카메라에 덮개가 씌어있어도 일단 웹캠이 어떤 사진이든 "찍기만 하면" 다음 코드과정으로 넘어가버리는 문제가 있음을 확인했다.

 

즉, frame에 대해서 사람의 얼굴이 포함되어 있는 사진인지에 대한 검증 로직이 추가로 필요했다.

 

그 결과로 수정한 코드가 다음과 같다

얼굴 검증 로직 추가 (112, 124, 125줄)

 


두번째 오류는 계속 다음과 같은 오류메시지를 반환하는 문제를 해결하는 것이었다

ValueError: The truth value of an array with more than one element is

ambiguous. Use a.any() or a.all()

 

frame(img에 대한 numpy array)에 대한 얼굴 검증 로직이 추가된 img가 들어있는 변수인 faces중 어떤 요소를 선택해야 할지 모르겠다는 내용의 오류메시지라고 생각했다.

 

즉, while=True인 동안 제대로 된 얼굴사진이 될 때까지 반복하게 될텐데 여기서 어떤 사진을 나잇값 분석에 사용할지가 모호하니 이에 대한 옵션을 지정해주라는 에러 메시지였다.

 

그래서 에러 메시지가 시키는대로 if faces:를 "if faces.all()"과 "if faces.any()"를 써보니 이제 이 오류는 해결되어 다른 에러 메시지가 떴다..ㅎ

 

일단은 어떤 사진이라도 얼굴이 포함된 사진을 쓰라는 의미에서 "if faces.any()"를 사용하여 코드 작성을 계속했다.

 

(cf. 화요일 진행하다 보니 현준님이 파이참을 쓰시는데 계속 .any()에서 오류가 난다고 하셔서 이를 len(faces) > 0으로 수정했다)


 

문제 해결 후 서버를 돌리고 얼굴인식을 진행하니 또 다음과 같은 오류메시지가 떴다.

'dict' object has no attribute 'headers'

 

어디가 문제인지 몰라 print문을 엄청 찍어봤더니, 이제 사진으로 저장되고 이에 대한 gpt-4o의 응답을 받아오고 return문 직전의 print문까지 잘 넘어오는 것을 확인할 수 있었다.

 

그래서 기존의 response.json()을 여러가지로 수정해봤다.

오류메시지 중에 HttpResponse의 결과가 None이라는 내용도 있어서 JsonResponse를 생각하게 됐다.

 

response
response.json()
JsonResponse() -> ##위치인자가 하나 빠졌다는 오류 메시지##
JsonResponse(response)
JsonResponse(response.json())

 

결과적으로 마지막 JsonResponse(response.json())으로 문제를 해결할 수 있었다.


깃허브 conflict시 merge

현준님네 pair programming그룹과 merge를 진행하는 과정에서 발생한 conflict가 해결과정이다.

 

1. 먼저 현준님 사이드에서 push(to_remote_feature/template로)하고 dev와 merge(pr)진행 -> 깃허브 상에서 automatically merge가능해서 진행

2. 우리쪽에서 push하고 dev와 merge 진행하려니 conflict발생

3. 권장사항대로 로컬로 와서 conflict해결하고 다시 push진행하기로 함

(1) git push -u origin feature/face

(2) git switch dev

(3) git pull

(4) git switch feature/face (dev의 포인터를 땡겨오려는 위치로 이동해서 merge해야함)

(5) git merge dev (-> conflict 발생)

(6) IDE의 소스 컨트롤에서 conflict해결

(7) merge commit남기고, push하기

(8) 깃허브(remote repo)에서 pr날리고, dev와 merge진행

 

cf. 로컬 merge 중에 merge 되돌리기

git merge --abort

잘못 완료된 merge되돌리기