PRISM2.0 / backend /pipeline.py
devranx's picture
Initial deploy with LFS images and audio
d790e98
from backend.modules import visual_checks, text_checks, content_checks
import logging
import random
import time
# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# ==========================================
# REAL CLASSIFICATION LOGIC
# ==========================================
def classify_real(image_path):
"""Perform complete classification with detailed results using AI models."""
# Components to check
components = [
visual_checks.image_quality,
visual_checks.ribbon,
text_checks.tagline,
text_checks.tooMuchText,
content_checks.theme,
content_checks.body,
text_checks.cta,
text_checks.tnc,
visual_checks.gnc
]
# Collect all results
all_results = {}
for component in components:
try:
results = component(image_path)
all_results.update(results)
except Exception as e:
logger.error(f"Error in component {component.__name__}: {e}")
pass
# Calculate final classification
final_classification = 0
for result in all_results.values():
if isinstance(result, int):
if result == 1:
final_classification = 1
break
elif isinstance(result, str):
if result.startswith('1'):
final_classification = 1
break
# Determine Pass or Fail
classification_result = "Fail" if final_classification == 1 else "Pass"
# Prepare the table data
table_data = []
labels = [
"Bad Image Quality", "No Ribbon", "Empty/Illegible/Black Tagline", "Multiple Taglines",
"Incomplete Tagline", "Hyperlink", "Price Tag", "Excessive Emojis", "Too Much Text",
"Inappropriate Content", "Religious Content", "High Risk Content",
"Illegal Content", "Competitor References", "Bad CTA", "Terms & Conditions",
"Visual Gesture or Icon"
]
# Collect labels responsible for failure
failure_labels = []
for label in labels:
result = all_results.get(label, 0)
is_fail = False
if isinstance(result, int) and result == 1:
is_fail = True
elif isinstance(result, str) and result.startswith('1'):
is_fail = True
if is_fail:
failure_labels.append(label)
table_data.append([label, result])
# Return the final classification, result table data, and failure labels (if any)
return classification_result, table_data, failure_labels
# ==========================================
# DUMMY CLASSIFICATION FOR TESTING
# ==========================================
def classify_dummy(image_path):
"""
A dummy classification function that returns random results.
Useful for testing the frontend without running expensive models.
"""
# Simulate processing time
time.sleep(1)
all_results = {
"Bad Image Quality": 1,
"No Ribbon": random.choice([0, 1]),
"Empty/Illegible/Black Tagline": 1,
"Multiple Taglines": 1,
"Incomplete Tagline": 1,
"Hyperlink": 1,
"Price Tag": 1,
"Excessive Emojis": 1,
"Too Much Text": 1,
"Inappropriate Content": 1,
"Religious Content": 1,
"High Risk Content": 1,
"Illegal Content": 1,
"Competitor References": 0,
"Bad CTA": 0,
"Terms & Conditions": 0,
"Visual Gesture or Icon": 1
}
# Determine Pass/Fail based on results
final_classification = 0
for result in all_results.values():
if isinstance(result, int) and result == 1:
final_classification = 1
break
elif isinstance(result, str) and result.startswith('1'):
final_classification = 1
break
classification_result = "Fail" if final_classification == 1 else "Pass"
# Collect failure labels and prepare table data
labels = list(all_results.keys())
failure_labels = []
table_data = []
for label in labels:
result = all_results[label]
is_fail = False
if isinstance(result, int) and result == 1:
is_fail = True
elif isinstance(result, str) and result.startswith('1'):
is_fail = True
if is_fail:
failure_labels.append(label)
table_data.append([label, result])
return classification_result, table_data, failure_labels
# ==========================================
# TOGGLE CLASSIFIER HERE
# ==========================================
# Uncomment the one you want to use
# classify = classify_dummy
classify = classify_real