import gradio as gr import pickle import numpy as np import cv2 import imutils from PIL import Image from cv2 import CascadeClassifier from fastai.vision.all import * import os os.system('wget https://www.dropbox.com/s/q2498c2ww9q2yx0/noticiasFotos.zip') os.system('unzip noticiasFotos.zip') def hamming(a, b): return bin(int(a) ^ int(b)).count("1") # Cargamos el árbol y los hashes tree = pickle.loads(open("treeHaar.pickle", "rb").read()) hashes = pickle.loads(open('hashesHaar.pickle', "rb").read()) detector = CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml') def convert_hash(h): return int(np.array(h, dtype="float64")) def dhash(image, hashSize=8): gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) resized=cv2.resize(gray, (hashSize+1, hashSize)) diff = resized[:, 1:] > resized[:, :-1] return sum([2 ** i for (i, v) in enumerate(diff.flatten()) if v]) def face_detector(image): image = np.array(PILImage.create(image)) image = imutils.resize(image, width=500) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) l=[] rects = detector.detectMultiScale(gray, scaleFactor=1.05, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE) for (x, y, w, h) in rects: l.append(image[y:y+h, x:x+w]) return l def searchAll(img): sol = [] for (i, face) in enumerate(face_detector(img)): sol = sol + search(face) return sol # Definimos una función que se encarga de llevar a cabo cada búsqueda def search(img, dist=10): queryHash = convert_hash(dhash(img)) treeResults = sorted(tree.get_all_in_range(queryHash, dist)) return [Image.open(hashes.get(h, [])[9:]) for (d, h) in treeResults] # Creamos la interfaz y la lanzamos. gr.Interface(fn=searchAll, inputs=gr.inputs.Image(), outputs=gr.Gallery()).launch(share=False)