Spaces:
Sleeping
Sleeping
| # import gradio as gr | |
| # import requests | |
| # import base64 | |
| # from PIL import Image | |
| # import io | |
| # gr.set_page_config(page_title="AI Image Detector", page_icon="🔍") | |
| # gr.title("AI Image Detector") | |
| # gr.write("Upload an image to check if it's AI-generated") | |
| # api_key = NVIDIA_API_KEY | |
| # gr.session_state.api_key = api_key | |
| # def process_image(image_bytes, api_key): | |
| # header_auth = f"Bearer {api_key}" | |
| # invoke_url = "https://ai.api.nvidia.com/v1/cv/hive/ai-generated-image-detection" | |
| # # Convert image bytes to base64 | |
| # image_b64 = base64.b64encode(image_bytes).decode() | |
| # payload = { | |
| # "input": [f"data:image/png;base64,{image_b64}"] | |
| # } | |
| # headers = { | |
| # "Content-Type": "application/json", | |
| # "Authorization": header_auth, | |
| # "Accept": "application/json", | |
| # } | |
| # try: | |
| # response = requests.post(invoke_url, headers=headers, json=payload) | |
| # response.raise_for_status() | |
| # result = response.json() | |
| # # Check if response contains the expected structure | |
| # if 'data' in result and len(result['data']) > 0: | |
| # first_result = result['data'][0] | |
| # if 'is_ai_generated' in first_result: | |
| # return { | |
| # 'confidence': first_result['is_ai_generated'], | |
| # 'sources': first_result.get('possible_sources', {}), | |
| # 'status': first_result.get('status', 'UNKNOWN') | |
| # } | |
| # gr.error("Unexpected response format from API") | |
| # return None | |
| # except requests.exceptions.RequestException as e: | |
| # gr.error(f"Error processing image: {str(e)}") | |
| # return None | |
| # # File uploader | |
| # uploaded_file = gr.file_uploader("Choose an image...", type=['png', 'jpg', 'jpeg']) | |
| # if uploaded_file is not None and api_key: | |
| # # Display the uploaded image | |
| # image = Image.open(uploaded_file) | |
| # gr.image(image, caption="Uploaded Image", use_container_width=True) | |
| # # Convert image to bytes | |
| # img_byte_arr = io.BytesIO() | |
| # image.save(img_byte_arr, format=image.format) | |
| # img_byte_arr = img_byte_arr.getvalue() | |
| # # Process the image | |
| # with gr.spinner("Analyzing image..."): | |
| # result = process_image(img_byte_arr, api_key) | |
| # if result and result['status'] == 'SUCCESS': | |
| # confidence = result['confidence'] | |
| # sources = result['sources'] | |
| # gr.write("---") | |
| # gr.write("### Result") | |
| # # Determine if image is AI-generated (using 50% threshold) | |
| # is_ai_generated = "Yes" if confidence >= 0.5 else "No" | |
| # # Display result with appropriate styling | |
| # if is_ai_generated == "Yes": | |
| # gr.error(f"Is this image AI-generated? **{is_ai_generated}**") | |
| # # Show top 3 possible sources if AI-generated | |
| # if sources: | |
| # gr.write("Top possible AI models used:") | |
| # sorted_sources = sorted(sources.items(), key=lambda x: x[1], reverse=True)[:3] | |
| # for source, prob in sorted_sources: | |
| # if prob > 0.01: # Only show sources with >1% probability | |
| # gr.write(f"- {source}: {prob:.1%}") | |
| # else: | |
| # gr.success(f"Is this image AI-generated? **{is_ai_generated}**") | |
| # # Show confidence score in smaller text | |
| # gr.caption(f"Confidence score: {confidence:.2%}") | |
| # elif not api_key and uploaded_file is not None: | |
| # gr.warning("Please enter your NVIDIA API key first") | |
| # # Add footer with instructions | |
| # gr.markdown("---") | |
| # gr.markdown(""" | |
| # --- | |
| # ### How to use: | |
| # 1. Upload an image (PNG, JPG, or JPEG) | |
| # 2. Wait for the analysis result | |
| # 3. Get a ** Yes/No ** answer based on whether the image is AI-generated | |
| # """) | |
| import gradio as gr | |
| import requests | |
| import base64 | |
| from PIL import Image | |
| import io | |
| import os | |
| def process_image(image): | |
| """Process the uploaded image using NVIDIA's AI detection API""" | |
| # Get API key from environment variable for security | |
| api_key = os.getenv('NVIDIA_API_KEY') | |
| if not api_key: | |
| raise ValueError("NVIDIA API key not found in environment variables") | |
| header_auth = f"Bearer {api_key}" | |
| invoke_url = "https://ai.api.nvidia.com/v1/cv/hive/ai-generated-image-detection" | |
| # Convert PIL Image to bytes | |
| img_byte_arr = io.BytesIO() | |
| image.save(img_byte_arr, format='PNG') | |
| image_bytes = img_byte_arr.getvalue() | |
| # Convert image bytes to base64 | |
| image_b64 = base64.b64encode(image_bytes).decode() | |
| payload = { | |
| "input": [f"data:image/png;base64,{image_b64}"] | |
| } | |
| headers = { | |
| "Content-Type": "application/json", | |
| "Authorization": header_auth, | |
| "Accept": "application/json", | |
| } | |
| try: | |
| response = requests.post(invoke_url, headers=headers, json=payload) | |
| response.raise_for_status() | |
| result = response.json() | |
| if 'data' in result and len(result['data']) > 0: | |
| first_result = result['data'][0] | |
| if 'is_ai_generated' in first_result: | |
| confidence = first_result['is_ai_generated'] | |
| sources = first_result.get('possible_sources', {}) | |
| # Format the result message | |
| is_ai_generated = "<span style='color:red'>### Yes</span>" if confidence >= 0.5 else "<span style='color:green'>### No</span>" | |
| result_message = f"\n ### Is this image AI-generated? {is_ai_generated}\n" | |
| result_message += f"\n Confidence score: {confidence:.2%}\n\n" | |
| if is_ai_generated == "Yes" and sources: | |
| result_message += "\n **Top possible AI models used** :\n" | |
| sorted_sources = sorted(sources | |
| .items(), key=lambda x: x[1], reverse=True)[:3] | |
| for source, prob in sorted_sources: | |
| if prob > 0.01: | |
| result_message += f"- {source}: {prob:.1%}\n" | |
| return image, result_message | |
| return image, "Error: Unable to process image analysis results" | |
| except requests.exceptions.RequestException as e: | |
| return image, f"Error processing image: {str(e)}" | |
| def create_demo(): | |
| """Create and return the Gradio interface""" | |
| demo = gr.Interface( | |
| fn=process_image, | |
| inputs=gr.Image(type="pil", label="Upload Image"), | |
| outputs=[ | |
| gr.Image(type="pil", label="Analyzed Image" | |
| ), | |
| gr.Markdown(label=" ## Analysis Results") | |
| ], | |
| title="AI Image Detector", | |
| description="Upload an image to check if it's AI-generated", | |
| article=""" | |
| ### How to use: | |
| 1. Upload an image (PNG, JPG, or JPEG) | |
| 2. Click the 'Submit' button | |
| 3. Get a detailed analysis of whether the image is AI-generated alongside the Model that might be used in generation. | |
| """, | |
| css=".footer {display: none;}" | |
| ) | |
| return demo | |
| # Create and launch the application | |
| if __name__ == "__main__": | |
| demo= create_demo() | |
| demo.launch( | |
| show_api=False, | |
| show_error=False, | |
| share=False, | |
| quiet=True | |
| ) |