import gradio as gr import tensorflow as tf import numpy as np import cv2 from mtcnn.mtcnn import MTCNN from numpy import asarray from annoy import AnnoyIndex import json from facerecognition import facenet, facenet_pytorch from dotenv import load_dotenv import os from util import file_helper, ml_math load_dotenv() # model = tf.lite.Interpreter('model/face_net.tflite') # model.allocate_tensors() tree_path = file_helper.download_gdrive(os.getenv('TREE_ID'), dir='tmp') dataset_path = file_helper.download_gdrive(os.getenv('DATASET_ID'), dir="tmp") model_facenet = facenet.Facenet(tree_path) model_facenet_pytorch = facenet_pytorch.FacenetPytorch(tree_path) # data = np.load(dataset_path) # url_ids = data.f.url_ids # image_urls = data.f.image_urls face_url = data.f.face_url def find_images(image, model): print('using model: ', model) print((image).shape) face_ai = model_facenet_pytorch if model == 1 else model_facenet t = AnnoyIndex(512, 'angular') t.load(face_ai.face_tree_path()) # image = cv2.resize(image, (512,512)) faces = face_ai.extract_faces(pixels = image) print(f'{len(faces)} face detected...') if len(faces) == 0: return 'Foto Wajah Tidak Terdeteksi, pastikan kamu upload foto yang ada wajahnya ya...' if len(faces) > 1: return f'{len(faces)} wajah terdeteksi! UPLOAD FOTO HANYA DENGAN 1 WAJAH' result = [] face_emb = face_ai.get_embedding(faces[0]) nns = t.get_nns_by_vector(face_emb, 20) for n in nns: # result.append(drive_ids[n]) face_origin = t.get_item_vector(n) distance = ml_math.cosine(face_emb, face_origin) print(f'{n} --> {distance}') if distance < 0.7: continue # link = image_urls[url_ids[n]] # f'https://drive.google.com/uc?export=view&id={drive_ids[n]}' link = face_url[n] result.append(link) if len(result) == 0: return ''' Foto Serupa Tidak Ditemukan, Tips: - Gunakan foto terupdate, - Jika kamu punya foto saat lari, lebih baik gunakan foto itu, - Jangan menggunakan foto blur, - Jangan upload foto yang menggunakan aksesoris yang tidak kamu gunakan saat lari (semisal kacamata) ''' # return json.dumps(result) # link_format = [f'{i+1}. {link}' for i, link in enumerate(result)] link_format = [f' ' for i, link in enumerate(result)] message = f''' ### LINK DOWNLOAD {len(result)} photo di temukan, klik untuk memperbesar: {"

".join(link_format)} ''' # return f'### Download foto kamu dari {len(result)} link berikut: ' + ' \n'.join(result) return message models = ['Facenet','Facenet Pytorch'] gr_inputs = [ "image", gr.Dropdown(models, type='index', value=models[0], label='Pilih Salah Satu') ] gr.Markdown('Upload Foto Wajah Kamu (Pastikan hanya terdapat SATU wajah pada)') iface = gr.Interface(fn=find_images, inputs=gr_inputs, outputs="markdown") iface.launch()