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 недель |







