Ein Ei-Zähl- und Risserkennungssystem basierend auf RK3576 / RKNN / YOLO

Quellcode: https://github.com/doublelf/Egg_Counting_and_Damage_Detection
Die Ei-Zählung und Risserkennung basierend auf dem reComputer RK3576 werden durch den Conveyor/-Orchestrator in eine einheitliche Fließband-Qualitätsprüfungs-Pipeline integriert: Jeder Frame führt gleichzeitig das Zählmodell und das Rissmodell aus; über einen IoU-Assoziator werden "Linienüberquerungs-Ereignisse" mit "Risserkennungen" verknüpft, sodass am Ende jedes Ei eine Bewertung als cracked / dirty / intact erhält.
- Zählung: aus
Automated-Egg-Counting-System/, Einklassen-Objekterkennung + Schwerpunkt-Tracking + Linienüberquerungs-Zählung. - Risserkennung: aus
crack_inspect/, standardmäßig klassische CV-Pipeline (CLAHE → Black-Hat → adaptive Schwellenwertbildung → zusammenhängende Komponenten), ohne zusätzliche Gewichte auszukommen; kann via--inspector-mode yoloauch auf ein YOLOv8-seg-Modell umgeschaltet werden. - Orchestrierung:
Conveyor/src/egg_pipeline/verknüpft die beiden und schreibt CSV / JSON / optionales annotiertes Video.
Schnellstart
1. Code klonen
git clone https://github.com/doublelf/Egg_Counting_and_Damage_Detection
cd Egg_Counting_and_Damage_Detection2. Virtuelle Umgebung anlegen und Abhängigkeiten installieren
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt3. Inferenz ausführen
Der Zählschwellenwert ist sehr hoch angesetzt (--conf-counter 0.99), um stabile Linienüberquerungs-Statistiken zu gewährleisten; der Riss-Schwellenwert bleibt auf dem Standardwert (--conf-inspector 0.25); der modellübergreifende Zuordnungsschwellenwert ist auf --associate-iou 0.1 gelockert, um leichte Verschiebungen der Bounding Boxes zwischen den beiden Modellen zu tolerieren.
cd Conveyor
python run.py --video ./video2.mp4 --conf-counter 0.99 --conf-inspector 0.25 --associate-iou 0.1Sie müssen zuerst
cd Conveyorausführen:run.pyliest Modelle standardmäßig ausconfig.yaml, und relative Pfade werden gegenConveyor/aufgelöst.
Parameter-Übersicht
| Parameter | Standard | Beschreibung |
|---|---|---|
--video PATH | — | Pfad zu einer lokalen Videodatei (schließt sich gegenseitig mit --webcam aus) |
--webcam [INDEX] | — | Webcam verwenden; ohne Wert wird 0 verwendet; mit --webcam 1 explizit Index 1 wählen |
--source STR | — | Überschreibt direkt video.source (Ziffernfolge wird als Webcam-Index behandelt, jeder andere String als Dateipfad) |
--counter-weights PATH | — | Pfad zu den Gewichten des Zählmodells (YOLOv5) |
--inspector-weights PATH | wie Zähler | Pfad zu den Gewichten des Rissmodells; wird bei mode=classical ignoriert |
--inspector-mode | classical | auto / yolo / classical; standardmäßig klassische CV-Pipeline, keine zusätzlichen Gewichte erforderlich |
--conf-counter FLOAT | 0.35 | Konfidenzschwellenwert des Zählmodells |
--conf-inspector FLOAT | 0.25 | Konfidenzschwellenwert des Rissmodells |
--associate-iou FLOAT | 0.3 | Minimaler IoU, um eine Zählbox mit einer Rissbox zu verknüpfen; darunter wird das Ei als unknown vermerkt |
--line-start X Y | [100, 240] | Startpunkt der Linienüberquerung (Pixelkoordinaten) |
--line-end X Y | [540, 240] | Endpunkt der Linienüberquerung (Pixelkoordinaten) |
--line-direction | down | down / up / any; Richtung, die bei der Überquerungsbewertung berücksichtigt wird |
--no-display | aus | Live-Vorschaufenster deaktivieren, geeignet für Server ohne grafische Oberfläche |
--save-video PATH | — | Annotierte Frames in eine mp4-Datei schreiben |
--frames-csv PATH | logs/frames.csv | Statistik pro Frame |
--crossings-csv PATH | logs/crossings.csv | Pro-Ei-Bewertung für jede Linienüberquerung |
--summary PATH | logs/summary.json | Job-Ebenen-Zusammenfassung |
--loop | aus | Nach dem Ende des Videos vom Anfang an fortsetzen |
--config PATH | config.yaml | Benutzerdefinierte YAML-Konfigurationsdatei |
Die vollständige Liste finden Sie unter python run.py --help.
Ausgabe-Artefakte
Nach der Ausführung werden folgende Dateien unter Conveyor/logs/ erzeugt (Pfade können über die CLI umgeleitet werden):
-
logs/frames.csv: Statistiken pro Frame (Frame-Index, Zeitstempel, Eierzahl im aktuellen Frame, kumulierte Überquerungsanzahl usw.). -
logs/crossings.csv: Pro-Ei-Linienüberquerungs-Bewertungen. Bedeutung der Spalten:Spalte Bedeutung frame_idx,timestamp,directionÜberquerungszeitpunkt und -richtung track_idVom Zählmodell zugewiesene stabile ID colorwhite/brown/unknown(Klassifikation über den Lab-a*-Kanal)clsVom Rissmodell zurückgegebener Klassenname, z. B. brown-egg-crackcracked,dirty,intactAbgeleitete boolesche Felder is_defectivecracked or dirtymask_area_ratioAnteil der Eibox, die von der Rissmaske bedeckt ist iouIoU zwischen Zählbox und Rissbox sourceinspector(erfolgreiche Zuordnung) oderunknown(keine Überlappung) -
logs/summary.json: Gesamtanzahl + Anzahl pro Farbe + Ausschussrate. -
--save-video output/annotated.mp4(optional): annotiertes Video mit Überquerungslinie, Erkennungsboxen, Rissmasken und HUD.
Beispielhafte Terminalausgabe:
[conveyor] Done. crossings=42 defective=3 frames=1280
[conveyor] Artifacts: frames=logs/frames.csv crossings=logs/crossings.csv summary=logs/summary.jsonKonfigurationsdatei
Alle Standardwerte sind in Conveyor/config.yaml zentralisiert; CLI-Flags überschreiben die entsprechenden Schlüssel:
counter:
model:
weights: ../Automated-Egg-Counting-System/best.pt
device: auto
img_size: 640
conf_threshold: 0.35 # entspricht --conf-counter
iou_threshold: 0.45
line:
start: [100, 240] # entspricht --line-start
end: [540, 240] # entspricht --line-end
direction: down # entspricht --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 # entspricht --inspector-mode
conf_threshold: 0.25 # entspricht --conf-inspector
filter:
crack_only: false
min_mask_pixels: 0
min_bbox_area: 16
association:
min_iou: 0.3 # entspricht --associate-iou
video:
source: "0" # entspricht --source / --video / --webcam
loop: falseWenn die Boxen der beiden Modelle systematisch versetzt sind (sodass Zählbox und Rissbox kaum überlappen), können Sie cfg.association.min_iou verringern; erhöhen Sie diesen Wert, wenn deutliche Fehlzuordnungen auftreten.