Advertisement
boolit

PhotoModeration

Jun 4th, 2023
934
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.35 KB | None | 0 0
  1. import face_alignment
  2. import numpy as np
  3.  
  4. class PhotoModeration:
  5.     def __init__(
  6.         self,
  7.         image_path: str,
  8.                 ) -> None:
  9.  
  10.         self.image_path = image_path
  11.         self.face_model = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False, device='cpu')
  12.  
  13.     def moderation_photo(self):
  14.         error = None
  15.         final_image = None
  16.         #get landmark
  17.         landmarks = self.face_model.get_landmarks_from_image(self.image_path)
  18.         if len(landmarks) != 1:
  19.             error = 'На фото не обнаружено лицо. Пожалуйста, загрузите другое фото.'
  20.         else:
  21.             x_array = landmarks[0][:,0]
  22.             y_array = landmarks[0][:,1]
  23.             #image show
  24.             image = mpimg.imread(self.image_path)
  25.             # проверка на крупное лицо
  26.             const_x = 0.44
  27.             const_y = 0.32
  28.             if abs(max(x_array) - min(x_array))/image.shape[0] > 0.7 or abs(max(y_array) - min(y_array))/image.shape[1] > 0.6:
  29.                 error = 'Лицо на фото слишком крупное. Пожалуйста, загрузите другое фото.'
  30.             else:
  31.                 X_face_center = np.mean(x_array)
  32.                 Y_face_center = np.mean(y_array)
  33.                 delta_x = (max(x_array) - min(x_array))/const_x/2
  34.                 delta_y = (max(y_array) - min(y_array))/const_y/2
  35.                 #photo resizing
  36.                 left_bound_x = int(X_face_center - delta_x)
  37.                 if left_bound_x < 0:
  38.                     left_bound_x = 0
  39.                 up_bound_y = int(Y_face_center - delta_y)
  40.                 if up_bound_y < 0:
  41.                     up_bound_y = 0
  42.                 cropped_image = image[up_bound_y:int(Y_face_center + delta_y), left_bound_x:int(X_face_center + delta_x), :]
  43.                 if cropped_image.shape[0] <= 250:
  44.                     error = 'Фото низкого качества. Пожалуйста, загрузите фото в хорошем качестве.'
  45.                 else:
  46.                     final_image = cropped_image
  47.         return error, final_image
  48. #если error не None выводим ошибку пользователю, если error = None сохраняем в базе фото пользователя
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement