import cv2 import numpy as np import random from PIL import Image, ImageEnhance, ImageFilter class FaceAugmentor: #Low light def low_light(self, face_bgr): face_rgb = cv2.cvtColor(face_bgr, cv2.COLOR_BGR2RGB) img = Image.fromarray(face_rgb) img = ImageEnhance.Brightness(img).enhance(0.45) img = ImageEnhance.Contrast(img).enhance(0.7) img = img.filter(ImageFilter.GaussianBlur(radius=1)) return cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) #Bright light def bright(self, face): return cv2.convertScaleAbs(face, alpha=1.3, beta=10) # Contrast 3shan lw camera mokhtlfa def contrast(self, face): return cv2.convertScaleAbs(face, alpha=1.2, beta=0) #Color jitter def color_jitter(self, face): hsv = cv2.cvtColor(face, cv2.COLOR_BGR2HSV).astype(np.float32) hsv[..., 1] *= random.uniform(0.8, 1.2) hsv[..., 2] *= random.uniform(0.8, 1.2) hsv = np.clip(hsv, 0, 255).astype(np.uint8) return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) # ---- Noise (low quality webcam) ---- def add_noise(self, face): noise = np.random.normal(0,0.9, face.shape).astype(np.uint8) return cv2.add(face, noise) #Rotation def rotate(self, face, angle=5): h, w = face.shape[:2] M = cv2.getRotationMatrix2D((w // 2, h // 2), angle, 1.0) return cv2.warpAffine(face, M, (w, h)) #Partial crop def partial_crop(self, face): h, w = face.shape[:2] return face[int(0.15*h):int(0.9*h), int(0.1*w):int(0.9*w)] def generate(self, face): variants = [ self.low_light(face), self.bright(face), self.contrast(face), self.color_jitter(face), self.add_noise(face), self.rotate(face, 25), self.rotate(face, -25), self.partial_crop(face), ] #random.shuffle(variants) return variants[:7]