import gradio as gr import numpy as np import cv2 import os from imutils import resize import pickle from sklearn.preprocessing import LabelEncoder from sklearn.svm import SVC import numpy as np import cv2 from imutils import resize def calc_embeddings(all_files, names): detector = cv2.dnn.readNetFromCaffe( "../deploy.prototxt.txt", "../res10_300x300_ssd_iter_140000.caffemodel" ) embedder = cv2.dnn.readNetFromTorch("../openface.nn4.small2.v1.t7") knownNames = [] knownEmbeddings = [] total = 0 for file in all_files: name = names[total] path = os.path.join(os.getcwd(), name, file) # f = open(f"/celeb_dataset/'{name}'/{file}", "rb") f = open(path, "rb") file_bytes = np.asarray(bytearray(f.read()), dtype=np.uint8) image = cv2.imdecode(file_bytes, 1) image = resize(image, width=600) (h, w) = image.shape[:2] imageBlob = cv2.dnn.blobFromImage( cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0), swapRB=False, crop=False, ) detector.setInput(imageBlob) detections = detector.forward() if len(detections) > 0: i = np.argmax(detections[0, 0, :, 2]) confidence = detections[0, 0, i, 2] if confidence > 0.5: box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") face = image[startY:endY, startX:endX] (fH, fW) = face.shape[:2] if fW < 20 or fH < 20: continue faceBlob = cv2.dnn.blobFromImage( face, 1.0 / 255, (96, 96), (0, 0, 0), swapRB=True, crop=False ) embedder.setInput(faceBlob) vec = embedder.forward() knownNames.append(name) knownEmbeddings.append(vec.flatten()) total += 1 with open("../unknownEmbeddings.pkl", "rb") as fp: l = pickle.load(fp) with open("../unknownNames.pkl", "rb") as fp: n = pickle.load(fp) for i in l: knownEmbeddings.append(i) knownNames = knownNames + n return knownEmbeddings, knownNames def recognize(embeddings, names): le = LabelEncoder() labels = le.fit_transform(names) recognizer = SVC(C=1.0, kernel="linear", probability=True) recognizer.fit(embeddings, names) return le, recognizer def run_inference(myImage): os.chdir("celeb_dataset") celebs = [] scores = dict() for celeb in os.listdir(): files = [] names = [] if celeb in celebs: continue name = celeb celebs.append(name) for file in os.listdir(celeb): files.append(file) names.append(name) embeddings, names = calc_embeddings(files, names) le, model = recognize(embeddings, names) detector = cv2.dnn.readNetFromCaffe( "../deploy.prototxt.txt", "../res10_300x300_ssd_iter_140000.caffemodel", ) embedder = cv2.dnn.readNetFromTorch("../openface.nn4.small2.v1.t7") (h, w) = myImage.shape[:2] imageBlob = cv2.dnn.blobFromImage( cv2.resize(myImage, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0), swapRB=False, crop=False, ) detector.setInput(imageBlob) detections = detector.forward() for i in range(0, detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > 0.5: box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") face = myImage[startY:endY, startX:endX] (fH, fW) = face.shape[:2] if fW < 20 or fH < 20: continue faceBlob = cv2.dnn.blobFromImage( face, 1.0 / 255, (96, 96), (0, 0, 0), swapRB=True, crop=False ) embedder.setInput(faceBlob) vec = embedder.forward() preds = model.predict_proba(vec)[0] j = np.argmax(preds) proba = preds[j] name = le.classes_[j] # text = "{}: {:.2f}%".format(name, proba * 100) scores[name] = proba * 100 result = sorted(scores.items(), key=lambda x: x[1], reverse=True) return result iface = gr.Interface( fn=run_inference, inputs="image", outputs="label", live=True, interpretation="default", title="Who do you look Like?!", ) iface.launch()