VanKee's picture
update app.py with correct delete_cache
e2ea3b1
"""
AI vs Real Face Detection Game - Simplified Version
Interactive Gradio web application that allows users to test their ability to distinguish
between AI-generated faces and real human faces through a game-based approach.
"""
import os
import sys
import logging
import argparse
import gradio as gr
# Add src directory to Python path
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
from src.image_manager import ImagePool
from src.model_inference import FaceDetectorModel
from src.game_logic import GameState
from src.utils import calculate_bg_color
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def initialize_app():
"""Initialize application, load model and image pool"""
logger.info("Starting application initialization...")
try:
# Load image pool
logger.info("Loading image pool...")
image_pool = ImagePool(ai_dir="image/ai", real_dir="image/real")
logger.info(f"Image pool loaded successfully: {image_pool.total_ai} AI images, {image_pool.total_real} real images")
# Load AI model
logger.info("Loading AI detection model...")
model = FaceDetectorModel(model_path="model/best_mobilenet_finetuned.keras")
logger.info("Model loaded successfully")
# Warmup model
logger.info("Warming up model...")
model.warmup()
# Create game state
game_state = GameState()
game_state.images = image_pool.create_game_set()
game_state.next_round()
logger.info("Application initialization complete!")
return image_pool, model, game_state
except Exception as e:
error_msg = f"Application initialization failed: {e}"
logger.error(error_msg)
raise RuntimeError(error_msg)
def format_score(player_score, ai_score, current_round, total_rounds):
"""Format score display"""
return f"""### Score
**You**: {player_score}
**AI**: {ai_score} \n
**Progress**: {current_round}/{total_rounds}
"""
def create_app():
"""Create Gradio application"""
image_pool, model, game_state = initialize_app()
with gr.Blocks(
title="AI vs Real Face Detection Game",
delete_cache=(86400,86400)
) as app:
gr.Markdown("# AI vs Real Face Detection Game")
gr.Markdown("Test your ability to distinguish AI-generated faces from real human faces!")
state = gr.State(game_state)
with gr.Tabs():
# ==================== Game Mode ====================
with gr.Tab("Game Mode"):
with gr.Row():
with gr.Column(scale=1):
score_display = gr.Markdown(
value=format_score(0, 0, 1, 20)
)
ai_button = gr.Button("AI Generated", variant="primary", size="lg")
human_button = gr.Button("Real Human", variant="secondary", size="lg")
next_button = gr.Button("Next", size="lg")
reset_button = gr.Button("Reset Game", size="sm")
feedback_display = gr.Markdown(value="Guess if this is AI-generated or a real human?")
with gr.Column(scale=3):
image_display = gr.Image(
label="Face Image",
value=game_state.current_image_path
)
# ==================== Detector Mode ====================
with gr.Tab("Detector Mode"):
with gr.Row():
with gr.Column(scale=1):
detector_result_display = gr.Markdown(value="Click button to view random image")
detector_next_button = gr.Button("Next Random Image", variant="primary", size="lg")
detector_confidence_display = gr.Markdown(value="")
with gr.Column(scale=3):
detector_image_display = gr.Image(label="Face Image")
# ==================== Game Mode Event Handlers ====================
def on_guess_ai(state_value):
ai_prediction, ai_confidence = model.predict(state_value.current_image_path)
state_value.record_guess("AI", ai_prediction, ai_confidence)
feedback = state_value.last_result
if state_value.game_over:
feedback = state_value.get_final_result()
return [
format_score(state_value.player_score, state_value.ai_score,
state_value.current_round, state_value.total_rounds),
feedback,
gr.update(interactive=False),
gr.update(interactive=False),
gr.update(visible=not state_value.game_over),
state_value
]
def on_guess_human(state_value):
ai_prediction, ai_confidence = model.predict(state_value.current_image_path)
state_value.record_guess("Human", ai_prediction, ai_confidence)
feedback = state_value.last_result
if state_value.game_over:
feedback = state_value.get_final_result()
return [
format_score(state_value.player_score, state_value.ai_score,
state_value.current_round, state_value.total_rounds),
feedback,
gr.update(interactive=False),
gr.update(interactive=False),
gr.update(visible=not state_value.game_over),
state_value
]
def on_next_picture(state_value):
state_value.next_round()
return [
state_value.current_image_path,
"",
gr.update(interactive=True),
gr.update(interactive=True),
gr.update(visible=False),
format_score(state_value.player_score, state_value.ai_score,
state_value.current_round, state_value.total_rounds),
state_value
]
def on_reset_game(state_value):
state_value.reset()
state_value.images = image_pool.create_game_set()
state_value.current_round = 0
state_value.next_round()
return [
state_value.current_image_path,
format_score(0, 0, 1, 20),
"New game started! Guess if this is AI-generated or a real human?",
gr.update(interactive=True),
gr.update(interactive=True),
gr.update(visible=False),
state_value
]
# ==================== Detector Mode Event Handlers ====================
def on_detector_next():
import random
label = random.choice(["AI", "Human"])
image_path = image_pool.get_random_image(label)
prediction, confidence = model.predict(image_path)
result_text = f"### AI Prediction: {prediction}\n\n**True Label**: {label}\n\n"
if prediction == label:
result_text += "✓ Correct prediction!"
else:
result_text += "✗ Incorrect prediction"
confidence_text = f"**Confidence**: {confidence * 100:.1f}%"
return [image_path, result_text, confidence_text]
# Bind events
ai_button.click(
fn=on_guess_ai,
inputs=[state],
outputs=[score_display, feedback_display, ai_button, human_button, next_button, state]
)
human_button.click(
fn=on_guess_human,
inputs=[state],
outputs=[score_display, feedback_display, ai_button, human_button, next_button, state]
)
next_button.click(
fn=on_next_picture,
inputs=[state],
outputs=[image_display, feedback_display, ai_button, human_button, next_button, score_display, state]
)
reset_button.click(
fn=on_reset_game,
inputs=[state],
outputs=[image_display, score_display, feedback_display, ai_button, human_button, next_button, state]
)
detector_next_button.click(
fn=on_detector_next,
inputs=[],
outputs=[detector_image_display, detector_result_display, detector_confidence_display]
)
return app
def main():
"""Main entry function"""
parser = argparse.ArgumentParser(description="AI vs Real Face Detection Game")
parser.add_argument("--port", type=int, default=7860, help="Server port")
parser.add_argument("--share", action="store_true", help="Create public URL")
parser.add_argument("--debug", action="store_true", help="Debug mode")
args = parser.parse_args()
if args.debug:
logging.getLogger().setLevel(logging.DEBUG)
try:
app = create_app()
logger.info(f"Launching application on port: {args.port}")
app.launch(
server_port=args.port,
share=args.share,
)
except Exception as e:
logger.error(f"Application launch failed: {e}")
sys.exit(1)
if __name__ == "__main__":
main()