Python+Dlib+Opencvは人面採取と表情判別機能を実現するコードです。


一、dlib及びopencv-pythonライブラリの設置
私が使っているのはjupyter notebookなので、dlibとopencv-pythonをインストールする時は
在这里插入图片描述
このコマンドラインはインストールされています。
dlibの設置方法:
1.できれば、上の図のコマンドラインを直接使用して、以下のコマンドを入力します。
pip install cmake
pip install book
pip install dlib
visual studio 2019をインストールすれば直接pip install dlibができるはずです。少なくとも私はそうです。
第三文を実行する時にエラーが発生することが多いので、ここで第二の方法を提供します。
2.dlib公式サイトに行く:http://dlib.net/ またはhttps://github.com/davisking/dlib 圧縮パッケージをダウンロード
ダウンロードが完了したら、展開します。
dlibをインストールする前にBoostとCmakeをインストールする必要があります。dlib 19以降はvs 2015以上のIDEをインストールする必要があります。本人はインストールしたvs 2019です。
Cmakeインストール
公式サイトのインストールパッケージ:https://cmake.org/download/
私が降りるのは
在这里插入图片描述
直接インストールして環境変数を設定します。
ダウンロード
セットアップbook:ダウンロード先:http://www.boost.org/
在这里插入图片描述
vsがインストールされているのが2015以上のバージョンであれば、直接に次のステップを進めることができます。最新バージョンをインストールしたほうがいいです。そうでないと、b 2コマンドが見つかりません。
ダウンロードして解凍してbootst_に入ります。1_73_0フォルダでは、bootstrap.batバッチファイルを見つけて、ダブルクリックして実行します。実行が完了すると(コマンドラインが自動的に消えます。)2つのファイルb 2.exeとbjam.exeが生成されます。
在这里插入图片描述
この二つのファイルをブックマークにコピーします。1_73_0本のフォルダの下:
同じコマンドラインを開き、このフォルダに位置決めし、コマンドを実行します。
b 2 install
このセットアップには時間がかかります。我慢して待ってください。
b 2を用いてライブラリファイルをコンパイルする:
b 2-a Cwith-python address-model=64 toolset=msvc runtime-link=static
この前cmakeでダウンロードした64位はここで64と書きました。32位なら前の64を32に変えます。
インストールが完了したらbootst環境変数を設定します。
dlibをインストール
あなたのdlib解凍経路に入り、python setup.py installを入力してください。
成功したら、フォルダの中にdlibとdlib.eg-infoが見えます。この二つのフォルダをあなたのpythonにインストールされたディレクトリの下のLibファイルにコピーします。
――例えば私のpython環境はpython 2.7です。
――だからpython 2-7フォルダのPython 2-7\Lib\site-packagesに入れます。
――この時、すでにdlibの設定が完了しました。
opencv-pythonのインストール方法
Anaconda Promptに以下のコマンドを入力します。
pip install opencv-python
失敗している場合は、Anaconda Proptに以下のコマンドを入力することをおすすめします。
pip install-ihttps://pypi.tuna.tsinghua.edu.cn/simple opencv-python
二、dlibの68点モデル
dlibの68点モデルは、ネット上で大神が訓練した特徴予測器を使って、pythonコードの顔認識の特徴予測を行う。
三、Pythonは顔認識と表情判別を実現する。

"""
        ,          
"""
import sys
import dlib #       dlib
import numpy as np #       numpy
import cv2 #       OpenCv
 
class face_emotion():
 def __init__(self):
  #        get_frontal_face_detector
  self.detector = dlib.get_frontal_face_detector()
  # dlib 68   ,             
  self.predictor = dlib.shape_predictor("F:/face.dat")
 
  #  cv2     ,           ,         ,           
  self.cap = cv2.VideoCapture(0)
  #       ,propId       ,value      
  self.cap.set(3, 480)
  #   screenshoot    
  self.cnt = 0
 
 def learning_face(self):
 
  #           
  line_brow_x = []
  line_brow_y = []
 
  # cap.isOpened()   true/false          
  while (self.cap.isOpened()):
 
   # cap.read()
   #      :
   #      true/false,            /       
   #     ,       
   flag, im_rd = self.cap.read()
 
   #       1ms,   0       
   k = cv2.waitKey(1)
 
   #    
   img_gray = cv2.cvtColor(im_rd, cv2.COLOR_RGB2GRAY)
 
   #                   。      rects
   faces = self.detector(img_gray, 0)
 
   #             
   font = cv2.FONT_HERSHEY_SIMPLEX
 
   #        
   if (len(faces) != 0):
 
    #         68    
    for i in range(len(faces)):
     # enumerate                ,k   ,d faces    
     for k, d in enumerate(faces):
      #          
      cv2.rectangle(im_rd, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255))
      #          
      self.face_width = d.right() - d.left()
 
      #        68      
      shape = self.predictor(im_rd, d)
      #          
      for i in range(68):
       cv2.circle(im_rd, (shape.part(i).x, shape.part(i).y), 2, (0, 255, 0), -1, 8)
       # cv2.putText(im_rd, str(i), (shape.part(i).x, shape.part(i).y), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
       #   (255, 255, 255))
 
      #     n                
      mouth_width = (shape.part(54).x - shape.part(48).x) / self.face_width #       
      mouth_higth = (shape.part(66).y - shape.part(62).y) / self.face_width #       
      # print("            :",mouth_width_arv)
      # print("            :",mouth_higth_arv)
 
      #         10    ,           
      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.brow_k, self.brow_d = self.fit_slr(line_brow_x, line_brow_y) #          
      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) #                       
 
      brow_hight = (brow_sum / 10) / self.face_width #       
      brow_width = (frown_sum / 5) / self.face_width #       
      # print("            :",round(brow_arv/self.face_width,3))
      # print("            :",round(frown_arv/self.face_width,3))
 
      #       
      eye_sum = (shape.part(41).y - shape.part(37).y + shape.part(40).y - shape.part(38).y +
         shape.part(47).y - shape.part(43).y + shape.part(46).y - shape.part(44).y)
      eye_hight = (eye_sum / 4) / self.face_width
      # print("              :",round(eye_open/self.face_width,3))
 
      #      
      #   ,         
      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)
 
    #      
    cv2.putText(im_rd, "Faces: " + str(len(faces)), (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
   else:
    #        
    cv2.putText(im_rd, "No Face", (20, 50), font, 1, (0, 0, 255), 1, cv2.LINE_AA)
 
   #     
   im_rd = cv2.putText(im_rd, "S: screenshot", (20, 400), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
   im_rd = cv2.putText(im_rd, "Q: quit", (20, 450), font, 0.8, (0, 0, 255), 1, cv2.LINE_AA)
 
   #   s     
   if (k == ord('s')):
    self.cnt += 1
    cv2.imwrite("screenshoot" + str(self.cnt) + ".jpg", im_rd)
 
   #   q   
   if (k == ord('q')):
    break
 
   #     
   cv2.imshow("camera", im_rd)
 
  #      
  self.cap.release()
 
  #        
  cv2.destroyAllWindows()
 
if __name__ == "__main__":
 my_face = face_emotion()
 my_face.learning_face()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
四、参考文章
https://www.jb51.net/article/189876.htm
ここでPython+Dlib+Opencvについて人の顔の採集と表情の判別を実現する文章を紹介しました。Python Dlib Opencv人の顔の採集内容については、以前の文章を検索してください。または次の関連記事を引き続きご覧ください。これからもよろしくお願いします。