1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class EmotionRecognition: def __init__(self): self.detector = dlib.get_frontal_face_detector() self.predictor = dlib.shape_predictor(DATA_PATH)
def learning_face(self, path): im_read = cv2.imread(path, 1) face_list = self.detector(cv2.cvtColor(im_read, cv2.COLOR_RGB2GRAY), 0) if len(face_list) != 0: for i in range(len(face_list)): for k, d in enumerate(face_list): box_width = d.right() - d.left() appear = self.predictor(im_read, d) mouth_higth = (appear.part(66).y - appear.part(62).y) / box_width brow_x = [] brow_y = [] for j in range(17, 21): brow_x.append(appear.part(j).x) brow_y.append(appear.part(j).y) z1 = np.polyfit(np.array(brow_x), np.array(brow_y), 1) brow_k = -round(z1[0], 3) eye_hight = ((appear.part(41).y - appear.part(37).y + appear.part(40).y - appear.part(38).y + appear.part(47).y - appear.part(43).y + appear.part(46).y - appear.part(44).y) / 4) / box_width upload_qiniu(path) if round(mouth_higth >= 0.03): if eye_hight >= 0.056: send_face_data_save(path, "3") return json.dumps({"state": "success", "result": "amazing"}) else: send_face_data_save(path, "4") return json.dumps({"state": "success", "result": "happy"}) else: if brow_k <= -0.3: send_face_data_save(path, "1") return json.dumps({"state": "success", "result": "angry"}) else: send_face_data_save(path, "2") return json.dumps({"state": "success", "result": "nature"}) break return json.dumps({"state": "error", "result": "no face"})
|