Spaces:
Sleeping
Sleeping
| from run import process | |
| import time | |
| import subprocess | |
| import os | |
| import argparse | |
| import cv2 | |
| import sys | |
| from PIL import Image | |
| import torch | |
| import gradio as gr | |
| TESTdevice = "cpu" | |
| index = 1 | |
| def mainTest(inputpath, outpath): | |
| watermark = deep_nude_process(inputpath) | |
| watermark1 = cv2.cvtColor(watermark, cv2.COLOR_BGRA2RGBA) | |
| return watermark1 | |
| def deep_nude_process(inputpath): | |
| dress = cv2.imread(inputpath) | |
| h = dress.shape[0] | |
| w = dress.shape[1] | |
| dress = cv2.resize(dress, (512, 512), interpolation=cv2.INTER_CUBIC) | |
| watermark = process(dress) | |
| watermark = cv2.resize(watermark, (w, h), interpolation=cv2.INTER_CUBIC) | |
| return watermark | |
| def inference(img): | |
| global index | |
| bgra = cv2.cvtColor(img, cv2.COLOR_RGBA2BGRA) | |
| inputpath = f"input_{index}.jpg" | |
| cv2.imwrite(inputpath, bgra) | |
| outputpath = f"out_{index}.jpg" | |
| index += 1 | |
| print(time.strftime("START!!!!!!!!! %Y-%m-%d %H:%M:%S", time.localtime())) | |
| output = mainTest(inputpath, outputpath) | |
| print(time.strftime("Finish!!!!!!!!! %Y-%m-%d %H:%M:%S", time.localtime())) | |
| return output | |
| from PIL import Image | |
| def load_image_from_file(file_path, new_height=None): | |
| """ | |
| Load an image from a file and optionally resize it while maintaining the aspect ratio. | |
| Args: | |
| file_path (str): The path to the image file. | |
| new_height (int, optional): The new height for the image. If None, the image is not resized. | |
| Returns: | |
| Image: The loaded (and optionally resized) image. | |
| """ | |
| try: | |
| img = Image.open(file_path) | |
| if new_height is not None: | |
| # Calculate new width to maintain aspect ratio | |
| aspect_ratio = img.width / img.height | |
| new_width = int(new_height * aspect_ratio) | |
| # Resize the image | |
| img = img.resize((new_width, new_height), Image.LANCZOS) | |
| return img | |
| except FileNotFoundError: | |
| print(f"File not found: {file_path}") | |
| return None | |
| except Image.UnidentifiedImageError: | |
| print(f"Cannot identify image file: {file_path}") | |
| return None | |
| except Exception as e: | |
| print(f"Error loading image from file: {e}") | |
| return None | |
| title = "Undress AI" | |
| description = "β Input photos of people, similar to the test picture at the bottom, and undress pictures will be produced. You may have to wait 30 seconds for a picture. π Do not upload personal photos π There is a queue system. According to the logic of first come, first served, only one picture will be made at a time. Must be able to at least see the outline of a human body β" | |
| examples = [ | |
| [load_image_from_file('example9.webp')], | |
| [load_image_from_file('example2.png')], | |
| [load_image_from_file('example1.png')], | |
| [load_image_from_file('example5.webp')], | |
| [load_image_from_file('example6.webp')], | |
| [load_image_from_file('example8.webp')], | |
| ] | |
| css = """ | |
| body { | |
| background-color: rgb(3, 7, 18); | |
| color: white; | |
| } | |
| .gradio-container { | |
| background-color: rgb(3, 7, 18) !important; | |
| border: none !important; | |
| padding: 5px !important; | |
| } | |
| #example_img .hide-container{ | |
| height:100%; | |
| width:100%; | |
| transition: transform 0.5s ease; | |
| } | |
| #example_img { | |
| width:100%; | |
| height:100%; | |
| } | |
| #example_img img{ | |
| height:40px; | |
| width:40px; | |
| transition: transform 0.5s ease; | |
| } | |
| #example_img .container{ | |
| height:40px; | |
| width:40px; | |
| transition: transform 0.5s ease; | |
| } | |
| footer {display: none !important;} | |
| """ | |
| js=''' | |
| <script> | |
| window.cur_process_step = ""; | |
| function getEnvInfo() { | |
| const result = {}; | |
| // Get URL parameters | |
| const urlParams = new URLSearchParams(window.location.search); | |
| for (const [key, value] of urlParams) { | |
| result[key] = value; | |
| } | |
| // Get current domain and convert to lowercase | |
| result["__domain"] = window.location.hostname.toLowerCase(); | |
| // Get iframe parent domain, if any, and convert to lowercase | |
| try { | |
| if (window.self !== window.top) { | |
| result["__iframe_domain"] = document.referrer | |
| ? new URL(document.referrer).hostname.toLowerCase() | |
| : "unable to get iframe parent domain"; | |
| }else{ | |
| result["__iframe_domain"] = ""; | |
| } | |
| } catch (e) { | |
| result["__iframe_domain"] = "unable to access iframe parent domain"; | |
| } | |
| return result; | |
| } | |
| function isValidEnv(){ | |
| envInfo = getEnvInfo(); | |
| return envInfo["e"] == "1" || | |
| envInfo["__domain"].indexOf("nsfwais.io") != -1 || | |
| envInfo["__iframe_domain"].indexOf("nsfwais.io") != -1 || | |
| envInfo["__domain"].indexOf("127.0.0.1") != -1 || | |
| envInfo["__iframe_domain"].indexOf("127.0.0.1") != -1; | |
| } | |
| window.postMessageToParent = function(img, event, source, value) { | |
| // Construct the message object with the provided parameters | |
| console.log("post start",event, source, value); | |
| const message = { | |
| event: event, | |
| source: source, | |
| value: value | |
| }; | |
| // Post the message to the parent window | |
| window.parent.postMessage(message, '*'); | |
| console.log("post finish"); | |
| window.cur_process_step = "process"; | |
| return img; | |
| } | |
| function uploadImage(image, event, source, value) { | |
| // Ensure we're in an iframe | |
| if (window.cur_process_step != "process"){ | |
| return; | |
| } | |
| window.cur_process_step = ""; | |
| console.log("uploadImage", image ? image.url : null, event, source, value); | |
| // Get the first image from the gallery (assuming it's an array) | |
| let imageUrl = image ? image.url : null; | |
| if (window.self !== window.top) { | |
| // Post the message to the parent window | |
| // Prepare the data to send | |
| let data = { | |
| event: event, | |
| source: source, | |
| value: imageUrl | |
| }; | |
| window.parent.postMessage(data, '*'); | |
| } else if (isValidEnv()){ | |
| try{ | |
| sendCustomEventToDataLayer({},event,source,{"image":imageUrl}) | |
| } catch (error) { | |
| console.error("Error in sendCustomEventToDataLayer:", error); | |
| } | |
| }else{ | |
| console.log("Not in an iframe, can't post to parent"); | |
| } | |
| return; | |
| } | |
| window.onDemoLoad = function(x){ | |
| let envInfo = getEnvInfo(); | |
| console.log(envInfo); | |
| if (isValidEnv()){ | |
| var element = document.getElementById("pitch_desc_html_code"); | |
| if (element) { | |
| element.parentNode.removeChild(element); | |
| } | |
| } | |
| return ""; | |
| } | |
| </script> | |
| ''' | |
| desc_html=''' | |
| <div style="background-color: #f0f0f0; padding: 10px; border-radius: 5px; text-align: center; margin-top: 20px;"> | |
| <p style="font-size: 16px; color: #333;"> | |
| For the full version and more exciting NSFW AI apps, visit | |
| <a href="https://aiporndude.org/categories/nudify-ai?utm_source=hf_deep-nude-ai&utm_medium=referral" style="color: #0066cc; text-decoration: none; font-weight: bold;" rel="dofollow">AiPornDude.org</a>! | |
| </p> | |
| </div> | |
| ''' | |
| with gr.Blocks(css=css, head=js) as demo: | |
| width=240 | |
| height=340 | |
| with gr.Row(equal_height=False): | |
| with gr.Column(min_width=240): # Adjust scale for proper sizing | |
| gr.HTML(value=desc_html, elem_id='pitch_desc_html_code') | |
| image_input = gr.Image(type="numpy", label="", height=height) | |
| gr.Examples(examples=examples, inputs=image_input, examples_per_page=10, elem_id="example_img") | |
| process_button = gr.Button("Nude!",size="sm") | |
| def update_status(img): | |
| processed_img = inference(img) | |
| return processed_img | |
| image_input.change(fn=lambda x:x , inputs=[image_input], outputs=[gr.State([])], js='''(img)=>window.uploadImage(img,"process_finished","demo_hf_deepnude_gan_card", "")''') | |
| process_button.click(update_status, inputs=image_input, outputs=image_input, js='''(i) => window.postMessageToParent(i, "process_started", "demo_hf_deepnude_gan_card", "click_nude")''') | |
| demo.load(fn=lambda x:x, inputs=[gr.State([])], outputs=[gr.State([])], js='''(x)=>window.onDemoLoad(x)''') | |
| demo.queue(max_size=10) | |
| demo.launch() | |