본문 바로가기
IT

파이썬을 통한 얼굴인식 프로그래밍 코딩

by PICK BANK 2022. 8. 19.

파이썬을 통해 얼굴인식을 프로그래밍 해봅시다.

 

우선  Google Colab을 준비합니다. 이것은 브라우저에서 파이썬으로 작업하기위한 프레임 워크입니다. 또한 GPU에 대한 액세스 권한을 부여합니다

 

1 단계. 모듈 연결

시작하기 전에 런타임을 GPU 가속으로 변경해 보겠습니다. 앞으로는 신경망이 작동하기 위해 이것이 필요할 것입니다. 이렇게하려면 Google Colab에서 '런타임''런타임 변경''하드웨어 GPU 가속기'를 클릭하십시오.

 

이제 필요한 라이브러리를 연결해 보겠습니다. Colab에는 이미 대부분의 라이브러리가 설치되어 있으므로 우리가해야 할 일은 가져 오는 것입니다.

 

cv2 이미지 업로드 및 처리를 위해;

dlib 사람의 탐지를 위해;

numpy 행렬로 작업합니다.

또한, 명령의 도움으로, 우리는 라이브러리를 설치합니다 - 그 도움으로 우리는 신경망으로 얼굴을 처리 할 것입니다.pip install face_recognitionface_recognition

 

참고 일반적으로 라이브러리에서 많은 프로세스(: 얼굴 감지)가 이미 함수로 래핑되어 있기 때문에 몇 줄의 코드만으로 전체 처리를 수행할 수 있습니다. 그러나 우리는 의도적으로 모든 것을 더 잘 이해할 수 있도록 "처음부터 몇 가지 일을"할 것입니다.face_recognition

 

2 단계. 초기 설정

이제 모든 도구와 코드베이스를 완전히 사용하려면 약간의 조정이 필요합니다.

 

얼굴 탐지기를 설정하여 시작하겠습니다. 먼저 명령을 사용하여 완성 된 모델로 파일을 다운로드하고 (, Zuckerberg가 영화 소셜 네트워크에서 Facebook을 시작한 팀입니다) 파일을 .dat 형식으로 압축 해제하십시오.

wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
bunzip2 shape_predictor_68_face_landmarks.dat.bz2

 

다음으로, 우리는 얼굴 탐지기를 만들고 다운로드 한 모델을 로 전송하여 인간 얼굴의 핵심 포인트 인 머리, , 코 및 입의 윤곽을 예측합니다

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

좋아요, 이제 우리는 콘텐츠 부분 인 사진 처리로 넘어갈 준비가되었습니다.

 

3 단계. 사진 업로드 및 처리

Python 변수에 사진을 업로드하려면 먼저 Google Colab의 파일 저장소에 업로드해야 합니다. 이렇게하려면 왼쪽 사이드 바에서 폴더 아이콘을 클릭하고 업로드를 선택하십시오.

 

 

이제 샘플로 사용할 사진을 업로드합니다. 이미지를 파이썬 변수로 "읽어야"합니다. 이것은 여러 가지 방법으로 수행 할 수 있지만 이미지를 행렬 형태로 즉시 표시하는 것이 더 편리합니다. 이것은 의 함수를 사용하여 수행 할 수 있습니다.

컬러 사진을 업로드하면 "행렬"은 차원을 가지며 여기서 3RGB(색상 채널 수)이며 픽셀 단위의 그림 크기입니다. 를 사용하여 이를 확인할 수 있습니다. 행렬의 각 숫자는 특정 색상 채널에 대한 픽셀 값입니다.

img = cv2.imread('conor.jpg')
img.shape #проверяем размерность матрицы
#(434, 770, 3)

다운로드 한 그림을보고 싶다면 다음이 필요합니다.

 

가져오기 명령 : .cv2_imshowfrom google.colab.patches import cv2_imshow

원하는 그림을 함수에 전달합니다.cv2_imshow cv2_imshow(img)

일부 작업에서는 컬러 이미지보다는 흑백 이미지를 처리하는 것이 좋습니다. 예를 들어, 색상의 존재는 얼굴 감지에 거의 영향을 미치지 않습니다 - 얼굴의 윤곽은 이미 명확하게 보입니다. 그러나 신경망의 경우, 이것은 근본적인 요점 일 수 있습니다 - 충분하지 않고, 사람들은 똑같이 보이며, 피부색은 다릅니다.

이제 컬러 사진을 흑백으로 번역해 보겠습니다.

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

 

이제 다음 단계 인 얼굴 감지로 넘어갑니다.

 

4 단계. 얼굴 감지

우리는 이미 얼굴 탐지기를 설정했기 때문에 직접 탐지로 이동할 수 있습니다. 우리는 2 단계로 이것을 할 것입니다 :

 

얼굴이있는 사각형을 찾고 있습니다.

이 사각형에서 우리는 얼굴의 윤곽선과 요점을 예측합니다.

도움을 받으면 원하는 사각형의 좌표를 얻을 수 있습니다. 얼굴이 여러 개인 경우 몇 가지 포인트 세트가 있습니다. 특정 사람을 선택하려면 인덱스 (우리의 경우 제로)를 지정해야합니다.

face_rect = detector(img, 1)[0]

결과를 보려면 메서드를 사용하여 얼굴 주위에 프레임을 그리고 를 사용하여 사진을 볼 수 있습니다.  프레임은 영원히 사진에 남아 있으므로 나중에 이미지를 다시 업로드하는 것이 좋습니다.

 

이제 발견 된 사각형에 따르면 얼굴의 요점을 "예측"해야합니다. 이렇게 하려면 을 사용한 다음 점의 좌표를 추출합니다

points = predictor(img, face_rect)
landmarks = np.array([*map(lambda p: [p.x, p.y], points.parts())])

 

결과물에서 우리는 68 점을 얻었습니다.

 

이제 우리는 신경망으로 이미지를 처리하는 데 필요한 모든 정보를 가지고 있습니다 - 이미지와 얼굴의 요점 모두. 다음 단계로 넘어 갑시다.

 

5 단계. 신경망 처리

네트워크 처리의 기본 개념은 주요 기능 만 원래의 ""이미지에서 눈에 띄며, 이는 나중에 한 사람을 다른 사람과 구별하는 데 도움이된다는 것입니다. , 다차원 그림 행렬은 그림에서 얼굴을 특징 짓는 비교적 작은 숫자 벡터로 변환됩니다.

 

따라서 결과 벡터를 얻는 것은 매우 간단합니다 - 함수를 호출하십시오.

vector = face_recognition.face_encodings(img)[0]

 

참고 이미지만 인수로 전달했으며 이전에 받은 큐 포인트는 사용하지 않았습니다. 그 이유는 매우 간단합니다.이 함수는 "내부에서"프로세스를 이해하기 위해 이전에 수동으로 수행 한 것과 동일한 작업을 모두 수행합니다. 출력은 치수 128, 즉 사진에서 얼굴을 설명하는 128 개의 숫자의 벡터입니다. 그러나 이 벡터는 우리에게 거의 쓸모가 없습니다 - "신경망 기술"의 효과를 평가하려면 두 개의 서로 다른 사진에 대해 두 벡터를 비교해야합니다.

 

6 단계. 벡터 비교

얼굴을 서로 비교하기 위해 다음과 같이 진행할 것입니다.

 

우리는 새로운 사진을 업로드하고 이전 단계에서 이미 분해 된 처리를 수행합니다. 출력은 벡터입니다.

벡터를 서로 비교합니다.거리에 따라, 우리는 결정을 내립니다 - 사진에있는 같은 사람 또는 다른 사람.

질문이 생깁니다 - "벡터를 비교"한다는 것은 무엇을 의미합니까? 가장 쉬운 방법은 일부 메트릭에서 거리를 계산하는 것입니다. 우리는 일반적인 유클리드 메트릭을 선택할 것입니다. 불필요한 코드없이 계산하려면 의 함수가 허용됩니다.

 

먼저, 샘플 사진의 인물의 다른 사진을 업로드합시다.

 첫 번째 사진의 결과 벡터를 저장하고 두 번째 사진의 경우 거리를 계산하십시오

from scipy.spatial.distance import pdist

pdist([vector1, vector2], 'euclidean')

우리는 0.48의 대답을 얻습니다. 이것은 상당히 가까운 거리이며, 우리는 이것이 같은 사람이라고 결론 지었습니다 몇 가지 더 다른 사진으로 실험을 해봅시다. 라이브러리의 개발자는 0.6의 임계 값을 고수하는 것이 좋습니다  0.6을 초과하면 이것은 다른 사람입니다

 

우리는 얼굴 인식 분야 (및 일반적으로 신경 네트워크)에서 시작하는 데 필요한 주요 도구를 분석했습니다.

 

댓글