|
|
import requests |
|
|
import base64 |
|
|
import json |
|
|
|
|
|
def test_gradio_api(): |
|
|
"""Test the Gradio /api/predict endpoint""" |
|
|
|
|
|
sample_image_path = "test_image.jpg" |
|
|
|
|
|
try: |
|
|
with open(sample_image_path, "rb") as image_file: |
|
|
image_base64 = base64.b64encode(image_file.read()).decode('utf-8') |
|
|
except FileNotFoundError: |
|
|
print("Please add a test_image.jpg file to test the API") |
|
|
return |
|
|
|
|
|
url = "http://localhost:7860/api/predict" |
|
|
|
|
|
payload = { |
|
|
"data": [ |
|
|
image_base64, |
|
|
"mobilenet", |
|
|
0.5, |
|
|
0.4 |
|
|
] |
|
|
} |
|
|
|
|
|
response = requests.post(url, json=payload) |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
print("Success!") |
|
|
print(f"API Response: {json.dumps(result, indent=2)}") |
|
|
|
|
|
|
|
|
if "data" in result and len(result["data"]) > 0: |
|
|
detection_data = result["data"][0] |
|
|
if "faces" in detection_data: |
|
|
print(f"Detected {len(detection_data['faces'])} faces") |
|
|
print(f"Processing time: {detection_data.get('processing_time', 'N/A'):.3f} seconds") |
|
|
print(f"Model used: {detection_data.get('model_used', 'N/A')}") |
|
|
|
|
|
for i, face in enumerate(detection_data['faces']): |
|
|
print(f"Face {i+1}:") |
|
|
print(f" Confidence: {face['confidence']:.3f}") |
|
|
print(f" Bounding box: {face['bbox']}") |
|
|
print(f" Landmarks: {face['landmarks']}") |
|
|
else: |
|
|
print("No face detection data in response") |
|
|
else: |
|
|
print("Unexpected response format") |
|
|
else: |
|
|
print(f"Error: {response.status_code}") |
|
|
print(response.text) |
|
|
|
|
|
def test_health_check(): |
|
|
"""Test the Gradio app health""" |
|
|
url = "http://localhost:7860/" |
|
|
|
|
|
response = requests.get(url) |
|
|
|
|
|
if response.status_code == 200: |
|
|
print("Gradio app is running!") |
|
|
print("You can access the web interface at: http://localhost:7860") |
|
|
else: |
|
|
print(f"Health check failed: {response.status_code}") |
|
|
|
|
|
def test_direct_api_call(): |
|
|
"""Test direct API call format that Thunkable would use""" |
|
|
sample_image_path = "test_image.jpg" |
|
|
|
|
|
try: |
|
|
with open(sample_image_path, "rb") as image_file: |
|
|
image_base64 = base64.b64encode(image_file.read()).decode('utf-8') |
|
|
except FileNotFoundError: |
|
|
print("Please add a test_image.jpg file to test the API") |
|
|
return |
|
|
|
|
|
url = "http://localhost:7860/api/predict" |
|
|
|
|
|
|
|
|
payload = { |
|
|
"data": [image_base64, "mobilenet", 0.5, 0.4] |
|
|
} |
|
|
|
|
|
headers = { |
|
|
"Content-Type": "application/json" |
|
|
} |
|
|
|
|
|
print("Testing Thunkable-compatible API call...") |
|
|
response = requests.post(url, json=payload, headers=headers) |
|
|
|
|
|
if response.status_code == 200: |
|
|
result = response.json() |
|
|
print("β
Thunkable API call successful!") |
|
|
|
|
|
|
|
|
if "data" in result and result["data"]: |
|
|
detection_result = result["data"][0] |
|
|
print(f"Faces detected: {detection_result.get('total_faces', 0)}") |
|
|
print(f"Model used: {detection_result.get('model_used', 'unknown')}") |
|
|
print(f"Processing time: {detection_result.get('processing_time', 0):.3f}s") |
|
|
else: |
|
|
print("β Unexpected response format") |
|
|
else: |
|
|
print(f"β API call failed: {response.status_code}") |
|
|
print(response.text) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
print("Testing RetinaFace Gradio API...") |
|
|
print("=" * 50) |
|
|
|
|
|
print("\n1. Health Check:") |
|
|
test_health_check() |
|
|
|
|
|
print("\n2. Gradio API Test:") |
|
|
test_gradio_api() |
|
|
|
|
|
print("\n3. Thunkable-Compatible API Test:") |
|
|
test_direct_api_call() |
|
|
|
|
|
print("\n" + "=" * 50) |
|
|
print("Testing complete!") |
|
|
print("\nFor Thunkable integration:") |
|
|
print("- Use URL: http://localhost:7860/api/predict") |
|
|
print("- Method: POST") |
|
|
print("- Body format: {\"data\": [\"base64_image\", \"mobilenet\", 0.5, 0.4]}") |
|
|
print("- Response will be in: response.data[0]") |
|
|
|