>  기사  >  백엔드 개발  >  python3+dlib는 얼굴 인식 및 감정 분석을 구현합니다.

python3+dlib는 얼굴 인식 및 감정 분석을 구현합니다.

不言
不言원래의
2018-05-30 14:10:289353검색

이 문서에서는 python3+dlib가 얼굴 인식 및 감정 분석을 특정 코드와 단계를 통해 구현하는 방법을 자세히 설명합니다.

1. 소개

제가 하고 싶은 일은 얼굴 인식을 기반으로 한 표정(감정) 분석입니다. 인터넷에는 개발에 큰 편의를 제공하는 오픈 소스 라이브러리가 많이 있다는 것을 알았습니다. 얼굴 인식과 특징 보정을 위해 현재 더 많이 사용되는 dlib 라이브러리를 선택했습니다. Python을 사용하면 개발 주기도 단축됩니다.

공식 웹사이트의 dlib 소개는 다음과 같습니다. Dlib에는 광범위한 기계 학습 알고리즘이 포함되어 있습니다. 모두 고도로 모듈화되어 실행이 빠르며 깔끔하고 현대적인 C++ API를 통해 사용이 매우 간단하도록 설계되었습니다. 이는 로봇 공학, 임베디드 장치, 휴대폰 및 대규모 고성능 컴퓨팅 환경을 포함한 다양한 애플리케이션에 사용됩니다.

어플리케이션이 상대적으로 고급형이지만 PC에서 작은 감정 분석 소프트웨어를 만드는 것은 꽤 흥미롭습니다.

자신의 생각과 아이디어에 따라 식별 방법을 디자인하십시오. 요즘도 꽤 인기를 얻고 있는 케라스(Keras)는 입 모양의 변화를 감정 분석의 지표로 활용하는 것 같습니다.

입의 열림 비율, 눈의 열림 정도, 눈썹의 기울기 각도를 감정 분석의 세 가지 지표로 사용하는 것이 내 생각입니다. 하지만 사람마다 외모의 차이가 크고 얼굴 생김새도 다양하기 때문에 계산 방법도 상대적으로 간단합니다. 그래서 인식효율은 그리 높지 않습니다.

인식 규칙:

1. 얼굴 인식 프레임의 너비에 대한 입 벌림의 비율이 클수록 매우 행복할 수도 있고 극도로 화가 날 수도 있는 감정이 더 흥분됩니다.

2. 얼굴 인식 프레임 상단의 특징점 17-21 또는 22-26 사이의 비율과 인식 프레임의 높이 사이의 비율이 작을수록 눈썹이 더 강하게 올라가는 것을 의미합니다. 놀라움과 행복을 표현하세요. 눈썹이 기울어지는 각도. 기분이 좋을 때는 눈썹이 올라가는 경향이 있으며, 화가 나면 인상을 찌푸리는 동시에 눈썹을 더욱 세게 누르게 됩니다.

3. 눈을 가늘게 뜨세요. 사람들은 웃을 때 무의식적으로 눈을 가늘게 뜨고, 화가 나거나 놀라면 눈을 크게 뜹니다.

시스템 단점: 표정의 미묘한 변화를 포착할 수 없고 행복, 분노, 놀람, 자연스러움 등 사람의 감정을 대략적으로만 판단할 수 있습니다.

시스템 장점: 구조가 간단하고 사용하기 쉽습니다.

응용 분야: 스마일 캡쳐, 순간의 아름다움 캡쳐, 어린이 자폐증 완화, 인터랙티브 게임 개발.

인간 감정의 복잡성으로 인해 이러한 표현은 사람의 가장 깊은 감정 변동을 완벽하게 표현할 수 없습니다. 판단의 정확성을 높이려면 심박수 감지, 음성 처리 등 종합적인 평가가 필요합니다.

2. 개발 환경 설정:

1. 최신 버전의 dlib-19.10에는 이 버전의 vscode가 필요하므로 VS2015를 설치합니다. pythonlibs whl 파일(예: (opencv_python?3.3.0+contrib?cp36?cp36m?win_amd64.whl))

그런 다음 pip install을 사용하여 로컬로 설치합니다. 설치할 파일 위치에 주의하세요(예: C: downloadxxx.whl)


3. dlib 설치(whl 모드 설치):


여기에서 dlib의 다양한 버전의 whl 파일을 다운로드한 다음 루트에서 cmd를 엽니다. 직접 설치할 디렉토리가 그것입니다.


하지만 dlib에서 다양한 Python 예제 프로그램을 사용하는 방법을 배우려면 여전히 dlib 압축 패키지를 다운로드해야 합니다.


dlib 공식 웹사이트를 직접 방문하여 다운로드하세요: http://dlib.net/ml.html

whl 다양한 버전의 dlib 파일: https://pypi.python.org/simple/dlib/

4 . 얼굴 모델 기능 보정을 사용하려면 얼굴 모양 예측기도 필요합니다. 이는 자신의 사진으로 훈련할 수도 있고 dlib 작성자가 제공한 훈련된 예측기를 사용할 수도 있습니다.

다운로드하려면 클릭하세요. //dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

3. 구현 아이디어

4. 구체적인 단계

먼저, 얼굴 인식을 위해 dlib를 사용하세요:)

import cv2
import dlib
from skimage import io

# 使用特征提取器get_frontal_face_detector
detector = dlib.get_frontal_face_detector()
# dlib的68点模型,使用作者训练好的特征预测器
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 图片所在路径
img = io.imread("2.jpg")
# 生成dlib的图像窗口
win = dlib.image_window()
win.clear_overlay()
win.set_image(img)

# 特征提取器的实例化
dets = detector(img, 1)
print("人脸数:", len(dets))

for k, d in enumerate(dets):
    print("第", k+1, "个人脸d的坐标:",
       "left:", d.left(),
       "right:", d.right(),
       "top:", d.top(),
       "bottom:", d.bottom())

    width = d.right() - d.left()
    heigth = d.bottom() - d.top()

    print('人脸面积为:',(width*heigth))
그런 다음 Shape_를 인스턴스화합니다. 예측자 객체를 사용하여 dlib 작성자를 사용하여 얼굴 특징 탐지기를 훈련하고 얼굴의 특징점을 보정합니다.

보정할 때 opencv의 원 방식을 사용하여 특징점 좌표에 워터마크를 추가합니다. 내용은 특징점의 일련번호와 위치입니다.

 # 利用预测器预测
    shape = predictor(img, d)
    # 标出68个点的位置
    for i in range(68):
      cv2.circle(img, (shape.part(i).x, shape.part(i).y), 4, (0, 255, 0), -1, 8)
      cv2.putText(img, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
    # 显示一下处理的图片,然后销毁窗口
    cv2.imshow('face', img)
    cv2.waitKey(0)

이제 68개의 특징점 정보를 얻었습니다. 다음으로 이 68개의 특징점의 좌표 정보를 각 표현에 대한 판단 지표로 기반으로 종합적인 계산을 수행해야 합니다.

위에서 언급한 내 판단 지수를 바탕으로 먼저 입이 열리는 비율을 계산합니다. 카메라와 사람의 거리로 인해 얼굴 인식 프레임의 크기가 다르기 때문에 비율을 선택합니다. 판단지수.

지표의 표준 값을 선택하기 전에 행복한 얼굴의 여러 사진을 분석하세요. 행복할 때 평균 입 벌림 비율을 계산합니다.

다음은 인간의 눈썹을 가로채기 위한 데이터 처리 방법입니다. 선형 함수 직선에 맞추기 위해 왼쪽 눈썹의 5개 특징점에 대해 선형 피팅을 수행하여 피팅된 직선의 기울기를 대략적으로 나타냅니다. 눈썹.

# 眉毛
          brow_sum = 0  # 高度之和
          frown_sum = 0  # 两边眉毛距离之和
          for j in range(17,21):
            brow_sum+= (shape.part(j).y - d.top()) + (shape.part(j+5).y- d.top())
            frown_sum+= shape.part(j+5).x - shape.part(j).x
            line_brow_x.append(shape.part(j).x)
            line_brow_y.append(shape.part(j).y)

          self.excel_brow_hight.append(round((brow_sum/10)/self.face_width,3))
          self.excel_brow_width.append(round((frown_sum/5)/self.face_width,3))
          brow_hight[0]+= (brow_sum/10)/self.face_width    # 眉毛高度占比
          brow_width[0]+= (frown_sum/5)/self.face_width    # 眉毛距离占比

          tempx = np.array(line_brow_x)
          tempy = np.array(line_brow_y)
          z1 = np.polyfit(tempx, tempy, 1) # 拟合成一次直线
          self.brow_k = -round(z1[0], 3)  # 拟合出曲线的斜率和实际眉毛的倾斜方向是相反的

我计算了25个人脸的开心表情的嘴巴张开比例、嘴巴宽度、眼睛张开程度、眉毛倾斜程度,导入excel表格生成折线图:

通过折线图能很明显的看出什么参数可以使用,什么参数的可信度不高,什么参数在那个范围内可以作为一个指标。

同样的方法,计算人愤怒、惊讶、自然时的数据折线图。

通过对多个不同表情数据的分析,得出每个指标的参考值,可以写出简单的表情分类标准:

# 分情况讨论
            # 张嘴,可能是开心或者惊讶
            if round(mouth_higth >= 0.03):
              if eye_hight >= 0.056:
                cv2.putText(im_rd, "amazing", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)
              else:
                cv2.putText(im_rd, "happy", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)

            # 没有张嘴,可能是正常和生气
            else:
              if self.brow_k <= -0.3:
                cv2.putText(im_rd, "angry", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)
              else:
                cv2.putText(im_rd, "nature", (d.left(), d.bottom() + 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
                      (0, 0, 255), 2, 4)

五、实际运行效果:

识别之后:


위 내용은 python3+dlib는 얼굴 인식 및 감정 분석을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Python의 @classmethod다음 기사:Python의 @classmethod