wickedreg's picture
Update app.py
6c19680 verified
raw
history blame
3.81 kB
import numpy as np
import pandas as pd
import gradio as gr
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
import json
import cv2
from ultralytics import YOLO
# ======================= МОДЕЛЬ ===================================
model = YOLO("yolov11m_best.pt")
# ================== ЧТЕНИЕ НАЗВАНИЙ И ЦЕН =======================
with open('Fruit_Veggies_Price.json', 'r', encoding='utf-8') as file:
fruits_data = json.load(file)
# =========================== ДЕТЕКЦИЯ ПЛОДА ============================
def detect_fruit(image, weight: float):
# Считываем изображение
# Предполагается, что image - это объект PIL Image
image_cv = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
# Выполняем детекцию
detections = model.predict(source=image_cv, conf=0.5)
# Проверка на наличие детекций
if len(detections) == 0:
return image, "Фрукт не обнаружен", None, None
result_np_image = detections[0].plot()
result_np_image = cv2.cvtColor(result_np_image, cv2.COLOR_BGR2RGB)
detected_fruit = None
for det in detections.xyxy[0]: # Предполагается, что вы используете ультралайтики и доступ к детекциям
label = model.names[int(det[5])] # название фрукта
if label in fruits_data:
detected_fruit = label
break
if not detected_fruit:
return result_np_image, "Фрукт не обнаружен", None, None
fruit_name = fruits_data[detected_fruit]["name"]
price_per_kg = fruits_data[detected_fruit]["price_per_kg"]
total_price = round(price_per_kg * weight, 2)
return result_np_image, fruit_name, weight, total_price
# =========================== ЧЕК ============================
def create_receipt(fruit_name, weight, total_price):
receipt_img = Image.new("RGB", (300, 200), color="white")
draw = ImageDraw.Draw(receipt_img)
try:
font = ImageFont.truetype("arial.ttf", 18)
except IOError:
font = ImageFont.load_default()
draw.text((10, 10), "Чек", fill="black", font=font)
draw.text((10, 50), f"Продукт: {fruit_name}", fill="black", font=font)
draw.text((10, 80), f"Вес: {weight} кг", fill="black", font=font)
draw.text((10, 110), f"Цена за кг: {fruits_data[fruit_name]['price_per_kg']} руб.", fill="black", font=font)
draw.text((10, 140), f"Сумма: {total_price} руб.", fill="black", font=font)
with BytesIO() as output:
receipt_img.save(output, format="PNG")
output.seek(0)
return output.getvalue()
# ======================= ИНТЕРФЕЙС ============================
def gradio_interface(image, weight):
if weight <= 0:
return image, "Вес должен быть больше 0", None
image, fruit_name, weight, total_price = detect_fruit(image, weight)
if not fruit_name:
return image, None # Вернуть пустой чек
receipt = create_receipt(fruit_name, weight, total_price)
return image, receipt
image_input = gr.Image(label="Изображение")
weight_input = gr.Number(label="Вес (кг)")
image_output = gr.Image(label="Распознанный фрукт", type="numpy")
receipt_output = gr.Image(label="Чек", type="numpy")
gr.Interface(
fn=gradio_interface,
inputs=[image_input, weight_input],
outputs=[image_output, receipt_output],
title="Определение плода и создание чека",
description="Загрузите изображение, введите вес и получите чек"
).launch()