|
|
import json |
|
|
import pandas as pd |
|
|
from PIL import Image |
|
|
from aiohttp import ClientSession |
|
|
from io import BytesIO |
|
|
import asyncio |
|
|
from Data.model import fridgeModel, drinksModel |
|
|
from Data.data import pepsi_items, competitor_items, water_items |
|
|
|
|
|
class ImageFetcher: |
|
|
async def fetch_image(self, url, session): |
|
|
try: |
|
|
async with session.get(url) as response: |
|
|
if response.status == 200: |
|
|
img_data = await response.read() |
|
|
return Image.open(BytesIO(img_data)) |
|
|
else: |
|
|
print(f"Failed to fetch image from {url}, status code: {response.status}") |
|
|
return None |
|
|
except Exception as e: |
|
|
print(f"Exception during image fetching from {url}: {e}") |
|
|
return None |
|
|
|
|
|
class DetectionFilter: |
|
|
@staticmethod |
|
|
def filter_detection(detection_dict, category_list): |
|
|
filtered = {} |
|
|
for name, count in detection_dict.items(): |
|
|
if name in category_list: |
|
|
filtered[name] = count |
|
|
return filtered |
|
|
|
|
|
class ImageDetector: |
|
|
def __init__(self, model, thresh): |
|
|
self.model = model |
|
|
self.thresh = thresh |
|
|
|
|
|
async def detect_items(self, urls, session): |
|
|
detection = {} |
|
|
fetcher = ImageFetcher() |
|
|
try: |
|
|
for url in urls: |
|
|
image = await fetcher.fetch_image(url, session) |
|
|
if image: |
|
|
results = self.model(image, conf=self.thresh) |
|
|
if len(results) > 0: |
|
|
data = json.loads(results[0].tojson()) |
|
|
df = pd.DataFrame(data) |
|
|
|
|
|
if 'name' in df.columns: |
|
|
name_counts = df['name'].value_counts().sort_index() |
|
|
for name, count in name_counts.items(): |
|
|
if name in detection: |
|
|
detection[name] += count |
|
|
else: |
|
|
detection[name] = count |
|
|
else: |
|
|
print(f"No 'name' column found in the DataFrame for URL: {url}") |
|
|
else: |
|
|
print(f"No results found for image from URL: {url}") |
|
|
else: |
|
|
print(f"No image fetched for URL: {url}") |
|
|
except Exception as e: |
|
|
print(f"Error during detection: {e}") |
|
|
return detection |
|
|
|
|
|
class ImageProcessor: |
|
|
def __init__(self): |
|
|
|
|
|
self.fridge_model = fridgeModel |
|
|
self.drinks_model = drinksModel |
|
|
|
|
|
async def process_images(self, fdz_urls, citem_urls): |
|
|
async with ClientSession() as session: |
|
|
|
|
|
fridge_detector = ImageDetector(self.fridge_model, thresh=0.8) |
|
|
drinks_detector = ImageDetector(self.drinks_model, thresh=0.6) |
|
|
|
|
|
fdz_detection = await fridge_detector.detect_items(fdz_urls, session) |
|
|
citem_detection = await drinks_detector.detect_items(citem_urls, session) |
|
|
|
|
|
|
|
|
filter_tool = DetectionFilter() |
|
|
pepsi = filter_tool.filter_detection(citem_detection, pepsi_items) |
|
|
competitor = filter_tool.filter_detection(citem_detection, competitor_items) |
|
|
water = filter_tool.filter_detection(citem_detection, water_items) |
|
|
|
|
|
|
|
|
sku_detection = {} |
|
|
if pepsi: |
|
|
sku_detection["pepsico"] = pepsi |
|
|
if competitor: |
|
|
sku_detection["competitor"] = competitor |
|
|
if water: |
|
|
sku_detection["water"] = water |
|
|
|
|
|
|
|
|
response = { |
|
|
"fdzDetection": fdz_detection, |
|
|
"skuDetection": sku_detection |
|
|
} |
|
|
|
|
|
return response |
|
|
|