AI Food Quality Visual Inspection System

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
AI Food Quality Visual Inspection System
Medium
~2-4 weeks
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1212
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    822

AI-контроль качества продуктов питания по визуальным признакам

Гнилое яблоко в партии, куриная тушка с кровоподтёком, хлеб с посторонними включениями — каждый такой дефект стоит дороже всей партии в случае отзыва с рынка. Визуальный контроль на конвейере традиционно делали люди, которые устают, отвлекаются и субъективно оценивают стандарты. AI-инспекция работает 24/7 с воспроизводимыми критериями.

Типичные задачи и методы

import cv2
import numpy as np
from ultralytics import YOLO
import segmentation_models_pytorch as smp
import torch
from PIL import Image

class FoodQualityInspector:
    def __init__(self, config: dict):
        # Детектор дефектов: YOLOv8l дообученный на пищевые дефекты
        self.detector = YOLO(config['detection_model'])

        # Сегментационная модель для точных контуров (для фруктов/овощей)
        self.seg_model = smp.Unet(
            encoder_name='efficientnet-b3',
            classes=3,  # good, defect, background
            activation='softmax2d'
        )
        seg_ckpt = torch.load(config['seg_model'])
        self.seg_model.load_state_dict(seg_ckpt)
        self.seg_model.eval()

        # Цветовые стандарты (HSV диапазоны)
        self.color_standards = config.get('color_standards', {})
        self.defect_area_threshold = config.get('max_defect_ratio', 0.03)

    def inspect(self, image: np.ndarray,
                 product_type: str) -> dict:
        result = {
            'product_type': product_type,
            'passed': True,
            'defects': [],
            'grade': 'A'
        }

        # Детекция дефектов (гниль, пятна, повреждения)
        det_results = self.detector(image, conf=0.4)
        defect_area_total = 0

        for box in det_results[0].boxes:
            cls = self.detector.model.names[int(box.cls)]
            bbox = list(map(int, box.xyxy[0]))
            area = ((bbox[2]-bbox[0]) * (bbox[3]-bbox[1]))
            img_area = image.shape[0] * image.shape[1]

            defect = {
                'type': cls,
                'bbox': bbox,
                'area_ratio': area / img_area,
                'confidence': float(box.conf)
            }
            result['defects'].append(defect)
            defect_area_total += area / img_area

        # Цветовой анализ (спелость, свежесть)
        if product_type in self.color_standards:
            color_result = self._color_check(image, product_type)
            result['color_analysis'] = color_result
            if not color_result['in_range']:
                result['defects'].append({
                    'type': 'color_deviation',
                    'deviation': color_result['deviation']
                })

        # Финальная оценка
        critical_defects = [d for d in result['defects']
                              if d['type'] in ['mold', 'rot', 'foreign_object']]
        if critical_defects:
            result['passed'] = False
            result['grade'] = 'REJECT'
        elif defect_area_total > self.defect_area_threshold:
            result['grade'] = 'C'
        elif result['defects']:
            result['grade'] = 'B'

        return result

    def _color_check(self, image: np.ndarray,
                      product_type: str) -> dict:
        """Проверка цвета продукта в HSV пространстве"""
        hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        standard = self.color_standards[product_type]

        lower = np.array(standard['hsv_lower'])
        upper = np.array(standard['hsv_upper'])
        mask = cv2.inRange(hsv, lower, upper)

        in_range_ratio = mask.sum() / 255 / mask.size
        return {
            'in_range': in_range_ratio > standard.get('min_ratio', 0.6),
            'ratio': float(in_range_ratio),
            'deviation': float(1 - in_range_ratio)
        }

Специфика по категориям продуктов

Фрукты и овощи: основные дефекты — гниль, ушибы, трещины, посторонние включения. Ключевая сложность — ушиб яблока виден только при определённом освещении. Решение: многоракурсная съёмка (3–4 камеры) или поляризованный свет.

Мясо и птица: кровоподтёки, загрязнения, неполная разделка. Мультиспектральная камера (NIR диапазон) лучше стандартного RGB для обнаружения кровоподтёков.

Хлеб и выпечка: трещины корки, посторонние включения, недопёк. Задача высококонтрастная — работает хорошо.

Рыба: свежесть определяется по цвету жабр, прозрачности глаз. Требует обученной модели на специфических признаках.

Кейс: линия сортировки яблок, 8 т/час

Конвейерная лента 1.2м шириной, скорость 0.3 м/с, 3 камеры (верх + 2 боковых).

Задача: сортировка на 3 категории: Premium (нет дефектов), Standard (мелкие), Juice (крупные дефекты).

  • YOLOv8m, дообученный на 4200 изображениях яблок (3 сорта)
  • Классы: bruise, rot_spot, scar, crack, size_small, size_large
  • Performance: обработка 1 кадра 720p за 12ms на Jetson Orin

Результаты после 2 недель эксплуатации:

  • Точность классификации Premium/Standard: 96.2%
  • Точность обнаружения гнили (recall): 98.7%
  • Потери от неправильной сортировки: снизились на 68% vs. ручной контроль
Продукт Срок разработки
Детектор дефектов одного продукта 4–6 недель
Мультипродуктовая система (3–5 видов) 8–12 недель
С интеграцией в производственную линию 10–16 недель