Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import numpy as np | |
| import cv2 | |
| from PIL import Image | |
| import insightface | |
| from insightface.app import FaceAnalysis | |
| import torch | |
| from torch import nn | |
| import torchvision | |
| # Gender model | |
| gender_model = torchvision.models.resnet50(weights=None) | |
| num_features = gender_model.fc.in_features | |
| gender_model.fc = nn.Linear(num_features, 2) | |
| def load_face_analysis_model(): | |
| app = FaceAnalysis(name='buffalo_l') | |
| app.prepare(ctx_id=0, det_size=(640, 640)) | |
| return app | |
| def detect_faces(img): | |
| app = load_face_analysis_model() | |
| faces = app.get(img) | |
| return faces | |
| def detect_gender(img_list, | |
| model, model_file='resnet50.pth', device='cpu'): | |
| model.load_state_dict(torch.load(model_file, map_location=device)) | |
| model.to(device) | |
| model.eval() | |
| results = [] | |
| transform = torchvision.transforms.Compose([ | |
| torchvision.transforms.Resize((224, 224)), | |
| torchvision.transforms.ToTensor(), | |
| torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
| ]) | |
| class_names = ['Female', 'Male'] | |
| for img in img_list: | |
| image = Image.fromarray(img).convert('RGB') | |
| image = transform(image).unsqueeze(0).to(device) | |
| with torch.no_grad(): | |
| outputs = model(image) | |
| _, predicted = torch.max(outputs, 1) | |
| res = class_names[predicted.item()] | |
| results.append(res) | |
| return results | |
| def swap_faces(target_image, source_image): | |
| if target_image is None or source_image is None: | |
| return None | |
| # Convert to OpenCV BGR | |
| target_img = cv2.cvtColor(np.array(target_image), cv2.COLOR_RGB2BGR) | |
| source_img = cv2.cvtColor(np.array(source_image), cv2.COLOR_RGB2BGR) | |
| res = target_img.copy() | |
| # Detect faces | |
| faces_target = detect_faces(target_img) | |
| faces_source = detect_faces(source_img) | |
| if len(faces_target) == 0 or len(faces_source) == 0: | |
| return target_image # yüz bulunmazsa orijinali döndür | |
| # Load swapper | |
| swapper = insightface.model_zoo.get_model('inswapper_128.onnx', | |
| download=False, | |
| download_zip=False) | |
| # İlk source yüzünü alıyoruz | |
| source_face = faces_source[0] | |
| for face in faces_target: | |
| res = swapper.get(res, face, source_face, paste_back=True) | |
| res = cv2.cvtColor(res, cv2.COLOR_BGR2RGB) | |
| return res | |
| # Gradio arayüzü | |
| with gr.Blocks() as demo: | |
| gr.Markdown("### Face Swapper Uygulaması") | |
| with gr.Row(): | |
| with gr.Column(): | |
| target_input = gr.Image(label="Hedef Resim", type="pil") | |
| source_input = gr.Image(label="Kaynak Resim", type="pil") | |
| process_button = gr.Button("Face Swap Yap", variant="primary") | |
| with gr.Column(): | |
| output_image = gr.Image(label="İşlem Sonucu") | |
| process_button.click( | |
| fn=swap_faces, | |
| inputs=[target_input, source_input], | |
| outputs=[output_image] | |
| ) | |
| demo.launch() | |