Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| import cv2 | |
| import matplotlib.pyplot as plt | |
| import insightface | |
| from insightface.app import FaceAnalysis | |
| from insightface.model_zoo import get_model | |
| import tempfile | |
| # Initialize face analysis app | |
| app = FaceAnalysis(name='buffalo_l') | |
| app.prepare(ctx_id=0, det_size=(640, 640)) | |
| # Load the face swapper model | |
| swapper = get_model('inswapper_128.onnx', download=False, download_zip=False) | |
| def swap_faces(img1, img2): | |
| face1 = app.get(img1)[0] | |
| face2 = app.get(img2)[0] | |
| img1_swapped = img1.copy() | |
| img2_swapped = img2.copy() | |
| img1_swapped = swapper.get(img1_swapped, face1, face2, paste_back=True) | |
| img2_swapped = swapper.get(img2_swapped, face2, face1, paste_back=True) | |
| return img1_swapped, img2_swapped | |
| def main(): | |
| st.title("Face Swap App") | |
| # Upload source image | |
| source_image = st.file_uploader("Upload Source Image", type=["jpg", "jpeg", "png"]) | |
| # Upload target image | |
| target_image = st.file_uploader("Upload Target Image", type=["jpg", "jpeg", "png"]) | |
| if source_image is not None and target_image is not None: | |
| # Read images | |
| img1 = cv2.imdecode(np.frombuffer(source_image.read(), np.uint8), 1) | |
| img2 = cv2.imdecode(np.frombuffer(target_image.read(), np.uint8), 1) | |
| # Swap faces | |
| img1_swapped, img2_swapped = swap_faces(img1, img2) | |
| # Display original and swapped images | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.subheader("Source Image") | |
| st.image(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB), channels="RGB") | |
| with col2: | |
| st.subheader("Target Image") | |
| st.image(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB), channels="RGB") | |
| st.subheader("Swapped Images") | |
| col3, col4 = st.columns(2) | |
| with col3: | |
| st.image(cv2.cvtColor(img1_swapped, cv2.COLOR_BGR2RGB), channels="RGB", caption="Source with Target Face") | |
| # Save button for Source with Target Face | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp_file: | |
| cv2.imwrite(tmp_file.name, img1_swapped) | |
| st.download_button( | |
| label="Download Source with Target Face", | |
| data=open(tmp_file.name, "rb").read(), | |
| file_name="source_with_target_face.jpg", | |
| mime="image/jpeg" | |
| ) | |
| with col4: | |
| st.image(cv2.cvtColor(img2_swapped, cv2.COLOR_BGR2RGB), channels="RGB", caption="Target with Source Face") | |
| # Save button for Target with Source Face | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp_file: | |
| cv2.imwrite(tmp_file.name, img2_swapped) | |
| st.download_button( | |
| label="Download Target with Source Face", | |
| data=open(tmp_file.name, "rb").read(), | |
| file_name="target_with_source_face.jpg", | |
| mime="image/jpeg" | |
| ) | |
| if __name__ == "__main__": | |
| main() | |