vialcald's picture
Update app.py
583b045
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)