Un sistema de conteo de huevos y detección de grietas basado en RK3576 / RKNN / YOLO

Código fuente: https://github.com/doublelf/Egg_Counting_and_Damage_Detection
El conteo de huevos y la detección de grietas basados en el reComputer RK3576 se integran mediante el orquestador Conveyor/ en una pipeline unificada de control de calidad en cinta transportadora: cada fotograma ejecuta simultáneamente el modelo de conteo y el modelo de grietas; mediante un asociador por IoU se emparejan los "sucesos de cruce de línea" con las "detecciones de grietas", asignando finalmente a cada huevo un veredicto de cracked / dirty / intact.
- Conteo: proviene de
Automated-Egg-Counting-System/, detección de objetos de una sola clase + seguimiento por centroide + conteo por cruce de línea. - Detección de grietas: proviene de
crack_inspect/; por defecto utiliza una pipeline clásica de CV (CLAHE → top-hat negro → umbralización adaptativa → componentes conectados), sin depender de pesos adicionales; también puede cambiar a un modelo YOLOv8-seg mediante--inspector-mode yolo. - Orquestación:
Conveyor/src/egg_pipeline/enlaza ambos y escribe CSV / JSON / vídeo anotado opcional.
Inicio rápido
1. Clonar el repositorio
git clone https://github.com/doublelf/Egg_Counting_and_Damage_Detection
cd Egg_Counting_and_Damage_Detection2. Crear un entorno virtual e instalar las dependencias
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt3. Ejecutar la inferencia
El umbral de conteo se establece muy alto (--conf-counter 0.99) para asegurar estadísticas de cruce de línea estables; el umbral de grietas se mantiene en el valor por defecto (--conf-inspector 0.25); el umbral de asociación entre modelos se relaja a --associate-iou 0.1 para tolerar leves desplazamientos de las bounding boxes entre ambos modelos.
cd Conveyor
python run.py --video ./video2.mp4 --conf-counter 0.99 --conf-inspector 0.25 --associate-iou 0.1Primero debes ejecutar
cd Conveyor:run.pylee por defecto los modelos desdeconfig.yaml, y las rutas relativas se resuelven respecto aConveyor/.
Tabla de parámetros
| Parámetro | Por defecto | Descripción |
|---|---|---|
--video PATH | — | Ruta a un archivo de vídeo local (mutuamente excluyente con --webcam) |
--webcam [INDEX] | — | Usa una webcam; sin valor resuelve a 0; especifica --webcam 1 para usar el índice 1 |
--source STR | — | Sobrescribe directamente video.source (una cadena numérica se trata como índice de webcam; cualquier otra cadena, como ruta de archivo) |
--counter-weights PATH | — | Ruta a los pesos del modelo de conteo (YOLOv5) |
--inspector-weights PATH | igual que contador | Ruta a los pesos del modelo de grietas; se ignora cuando mode=classical |
--inspector-mode | classical | auto / yolo / classical; por defecto la pipeline clásica de CV, sin pesos extra |
--conf-counter FLOAT | 0.35 | Umbral de confianza del modelo de conteo |
--conf-inspector FLOAT | 0.25 | Umbral de confianza del modelo de grietas |
--associate-iou FLOAT | 0.3 | IoU mínima para asociar una bounding box de conteo con una de grietas; por debajo de este valor el huevo se registra como unknown |
--line-start X Y | [100, 240] | Punto inicial del cruce de línea (coordenadas en píxeles) |
--line-end X Y | [540, 240] | Punto final del cruce de línea (coordenadas en píxeles) |
--line-direction | down | down / up / any; dirección considerada al evaluar el cruce |
--no-display | desactivado | Desactiva la ventana de previsualización en directo, adecuado para servidores sin interfaz gráfica |
--save-video PATH | — | Escribe los fotogramas anotados en un archivo mp4 |
--frames-csv PATH | logs/frames.csv | Estadísticas por fotograma |
--crossings-csv PATH | logs/crossings.csv | Veredicto por huevo para cada cruce de línea |
--summary PATH | logs/summary.json | Resumen a nivel de trabajo |
--loop | desactivado | Al terminar el vídeo, vuelve a comenzar desde el principio |
--config PATH | config.yaml | Archivo de configuración YAML personalizado |
Para la lista completa, consulta python run.py --help.
Artefactos de salida
Tras la ejecución, se generan los siguientes archivos bajo Conveyor/logs/ (las rutas pueden redirigirse mediante la CLI):
-
logs/frames.csv: estadísticas por fotograma (índice de fotograma, marca de tiempo, conteo de huevos del fotograma actual, conteo acumulado de cruces, etc.). -
logs/crossings.csv: veredictos de cruce de línea por huevo. Significado de las columnas:Columna Significado frame_idx,timestamp,directionMomento y dirección del cruce track_idID estable asignado por el modelo de conteo colorwhite/brown/unknown(clasificado por el canala*de Lab)clsNombre de clase devuelto por el modelo de grietas, p. ej. brown-egg-crackcracked,dirty,intactCampos booleanos derivados is_defectivecracked or dirtymask_area_ratioFracción de la caja del huevo cubierta por la máscara de grietas iouIoU entre la caja de conteo y la caja de grietas sourceinspector(asociación exitosa) ounknown(sin solapamiento) -
logs/summary.json: conteo total + conteos por color + tasa de defectos. -
--save-video output/annotated.mp4(opcional): vídeo anotado con la línea de cruce, las bounding boxes, las máscaras de grietas y un HUD.
Salida de terminal de ejemplo:
[conveyor] Done. crossings=42 defective=3 frames=1280
[conveyor] Artifacts: frames=logs/frames.csv crossings=logs/crossings.csv summary=logs/summary.jsonArchivo de configuración
Todos los valores por defecto están centralizados en Conveyor/config.yaml; los flags de la CLI sobrescriben las claves correspondientes:
counter:
model:
weights: ../Automated-Egg-Counting-System/best.pt
device: auto
img_size: 640
conf_threshold: 0.35 # corresponde a --conf-counter
iou_threshold: 0.45
line:
start: [100, 240] # corresponde a --line-start
end: [540, 240] # corresponde a --line-end
direction: down # corresponde a --line-direction
min_track_length: 3
tracker:
max_lost_frames: 30
iou_match_threshold: 0.2
inspector:
model:
weights: ../Automated-Egg-Counting-System/best.pt
mode: classical # corresponde a --inspector-mode
conf_threshold: 0.25 # corresponde a --conf-inspector
filter:
crack_only: false
min_mask_pixels: 0
min_bbox_area: 16
association:
min_iou: 0.3 # corresponde a --associate-iou
video:
source: "0" # corresponde a --source / --video / --webcam
loop: falseSi las cajas de los dos modelos están sistemáticamente desalineadas (de modo que la caja de conteo y la caja de grietas apenas se solapan), puedes bajar cfg.association.min_iou; súbelo cuando observes emparejamientos claramente incorrectos.