Un système de comptage d'œufs et de détection de fissures basé sur RK3576 / RKNN / YOLO

Code source : https://github.com/doublelf/Egg_Counting_and_Damage_Detection
Le comptage d'œufs et la détection de fissures basés sur le reComputer RK3576 sont intégrés par l'orchestrateur Conveyor/ dans une pipeline unifiée de contrôle qualité sur convoyeur : chaque image exécute simultanément le modèle de comptage et le modèle de fissures ; grâce à un associateur IoU, les "événements de franchissement de ligne" sont appariés aux "détections de fissures", attribuant finalement à chaque œuf un statut cracked / dirty / intact.
- Comptage : issu de
Automated-Egg-Counting-System/, détection d'objets à classe unique + suivi par centroïde + comptage par franchissement de ligne. - Détection de fissures : issue de
crack_inspect/; utilise par défaut une pipeline CV classique (CLAHE → top-hat noir → seuillage adaptatif → composantes connexes), sans dépendre de poids supplémentaires ; peut également basculer sur un modèle YOLOv8-seg via--inspector-mode yolo. - Orchestration :
Conveyor/src/egg_pipeline/relie les deux et écrit du CSV / JSON / vidéo annotée optionnelle.
Démarrage rapide
1. Cloner le dépôt
git clone https://github.com/doublelf/Egg_Counting_and_Damage_Detection
cd Egg_Counting_and_Damage_Detection2. Créer un environnement virtuel et installer les dépendances
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt3. Lancer l'inférence
Le seuil de comptage est fixé très haut (--conf-counter 0.99) pour garantir la stabilité des statistiques de franchissement ; le seuil de fissures conserve sa valeur par défaut (--conf-inspector 0.25) ; le seuil d'association inter-modèles est relâché à --associate-iou 0.1 pour tolérer de légers décalages de boîtes entre les deux modèles.
cd Conveyor
python run.py --video ./video2.mp4 --conf-counter 0.99 --conf-inspector 0.25 --associate-iou 0.1Vous devez d'abord faire
cd Conveyor:run.pylit par défaut les modèles depuisconfig.yaml, et les chemins relatifs sont résolus par rapport àConveyor/.
Tableau des paramètres
| Paramètre | Par défaut | Description |
|---|---|---|
--video PATH | — | Chemin d'un fichier vidéo local (mutuellement exclusif avec --webcam) |
--webcam [INDEX] | — | Utiliser une webcam ; sans paramètre cela correspond à 0 ; préciser --webcam 1 pour utiliser l'index 1 |
--source STR | — | Remplace directement video.source (une chaîne numérique est traitée comme un index de webcam, toute autre chaîne comme un chemin de fichier) |
--counter-weights PATH | — | Chemin des poids du modèle de comptage (YOLOv5) |
--inspector-weights PATH | idem compteur | Chemin des poids du modèle de fissures ; ignoré lorsque mode=classical |
--inspector-mode | classical | auto / yolo / classical ; par défaut la pipeline CV classique, aucun poids supplémentaire requis |
--conf-counter FLOAT | 0.35 | Seuil de confiance du modèle de comptage |
--conf-inspector FLOAT | 0.25 | Seuil de confiance du modèle de fissures |
--associate-iou FLOAT | 0.3 | IoU minimale requise pour associer une boîte de comptage à une boîte de fissures ; en dessous, l'œuf est enregistré comme unknown |
--line-start X Y | [100, 240] | Point de départ du franchissement (coordonnées en pixels) |
--line-end X Y | [540, 240] | Point d'arrivée du franchissement (coordonnées en pixels) |
--line-direction | down | down / up / any ; direction prise en compte lors du jugement de franchissement |
--no-display | désactivé | Désactive la fenêtre de prévisualisation en direct, adapté aux serveurs sans interface graphique |
--save-video PATH | — | Écrit les images annotées dans un fichier mp4 |
--frames-csv PATH | logs/frames.csv | Statistiques par image |
--crossings-csv PATH | logs/crossings.csv | Verdict par œuf pour chaque franchissement |
--summary PATH | logs/summary.json | Résumé au niveau du job |
--loop | désactivé | Une fois la vidéo terminée, revenir au début en boucle |
--config PATH | config.yaml | Fichier de configuration YAML personnalisé |
Pour la liste complète, consultez python run.py --help.
Artefacts produits
Après exécution, les fichiers suivants sont produits sous Conveyor/logs/ (les chemins peuvent être redirigés via la CLI) :
-
logs/frames.csv: statistiques par image (indice d'image, timestamp, nombre d'œufs de l'image courante, cumul des franchissements, etc.). -
logs/crossings.csv: verdicts de franchissement par œuf. Signification des colonnes :Colonne Signification frame_idx,timestamp,directionMoment et direction du franchissement track_idID stable attribué par le modèle de comptage colorwhite/brown/unknown(classé via le canala*de Lab)clsNom de classe renvoyé par le modèle de fissures, par ex. brown-egg-crackcracked,dirty,intactChamps booléens dérivés is_defectivecracked or dirtymask_area_ratioFraction de la boîte de l'œuf couverte par le masque de fissure iouIoU entre la boîte de comptage et la boîte de fissures sourceinspector(association réussie) ouunknown(aucun chevauchement) -
logs/summary.json: nombre total + effectif par couleur + taux de défauts. -
--save-video output/annotated.mp4(optionnel) : vidéo annotée avec la ligne de franchissement, les boîtes de détection, les masques de fissures et le HUD.
Exemple de sortie terminal :
[conveyor] Done. crossings=42 defective=3 frames=1280
[conveyor] Artifacts: frames=logs/frames.csv crossings=logs/crossings.csv summary=logs/summary.jsonFichier de configuration
Toutes les valeurs par défaut sont centralisées dans Conveyor/config.yaml ; les flags CLI surchargent les clés correspondantes :
counter:
model:
weights: ../Automated-Egg-Counting-System/best.pt
device: auto
img_size: 640
conf_threshold: 0.35 # correspond à --conf-counter
iou_threshold: 0.45
line:
start: [100, 240] # correspond à --line-start
end: [540, 240] # correspond à --line-end
direction: down # correspond à --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 # correspond à --inspector-mode
conf_threshold: 0.25 # correspond à --conf-inspector
filter:
crack_only: false
min_mask_pixels: 0
min_bbox_area: 16
association:
min_iou: 0.3 # correspond à --associate-iou
video:
source: "0" # correspond à --source / --video / --webcam
loop: falseSi les boîtes des deux modèles sont systématiquement décalées (de sorte que la boîte de comptage et la boîte de fissures ne se chevauchent quasiment pas), vous pouvez abaisser cfg.association.min_iou ; augmentez-le si vous constatez des erreurs d'appariement manifestes.