|
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") |
|
|
|
|
|
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 |
|
|
|
|
|
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] |
|
|
|
|
|
gr.Interface(fn=searchAll, inputs=gr.inputs.Image(), outputs=gr.Gallery()).launch(share=False) |
|
|