基于 RK3576 / RKNN / YOLO 的鸡蛋计数与裂纹检测系统

源码:https://github.com/doublelf/Egg_Counting_and_Damage_Detection
基于 reComputer RK3576 的鸡蛋计数与裂纹检测,二者由 Conveyor/ 编排器整合为一条统一的传送带质检流水线:每一帧同时运行计数模型与裂纹模型,借助 IoU 关联器把“越线事件”与“裂纹发现”配对,最终对每一颗蛋给出 cracked / dirty / intact 的判定。
- 计数:源自
Automated-Egg-Counting-System/,单类目标检测 + 质心跟踪 + 越线计数。 - 裂纹检测:源自
crack_inspect/,默认采用经典 CV 路线(CLAHE → 黑帽 → 自适应阈值 → 连通域),不依赖额外权重;亦可通过--inspector-mode yolo切到 YOLOv8-seg 模型。 - 编排:
Conveyor/src/egg_pipeline/把两者串起来,并写出 CSV / JSON / 可选标注视频。
快速开始
1. 拉取代码
git clone https://github.com/doublelf/Egg_Counting_and_Damage_Detection
cd Egg_Counting_and_Damage_Detection2. 创建虚拟环境并安装依赖
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt3. 执行推理
计数阈值设得很高(--conf-counter 0.99)是为了保证越线统计稳定;裂纹阈值保持默认(--conf-inspector 0.25);跨模型关联阈值放宽到 --associate-iou 0.1 以适配两个模型框位的轻微偏移。
cd Conveyor
python run.py --video ./video2.mp4 --conf-counter 0.99 --conf-inspector 0.25 --associate-iou 0.1必须先
cd Conveyor:run.py默认从config.yaml读取模型,相对路径以Conveyor/为基准。
参数速查表
| 参数 | 默认 | 说明 |
|---|---|---|
--video PATH | — | 本地视频文件路径(与 --webcam 互斥) |
--webcam [INDEX] | — | 使用摄像头;不传值取 0,可显式指定 --webcam 1 |
--source STR | — | 直接覆盖 video.source(数字串被当作摄像头索引,路径字符串被当作文件) |
--counter-weights PATH | — | 计数模型权重(YOLOv5) |
--inspector-weights PATH | 同上 | 裂纹模型权重;mode=classical 时忽略 |
--inspector-mode | classical | auto / yolo / classical;默认走经典 CV 路线,不需额外权重 |
--conf-counter FLOAT | 0.35 | 计数模型置信度阈值 |
--conf-inspector FLOAT | 0.25 | 裂纹模型置信度阈值 |
--associate-iou FLOAT | 0.3 | 计数框与裂纹框关联的最小 IoU,低于此值记为 unknown |
--line-start X Y | [100, 240] | 越线起点(像素坐标) |
--line-end X Y | [540, 240] | 越线终点(像素坐标) |
--line-direction | down | down / up / any;越线方向判定 |
--no-display | 关闭 | 关闭实时预览窗口,适合无图形界面的服务器 |
--save-video PATH | — | 把带标注的画面写入 mp4 |
--frames-csv PATH | logs/frames.csv | 每帧统计输出 |
--crossings-csv PATH | logs/crossings.csv | 每次越线的逐颗蛋判定 |
--summary PATH | logs/summary.json | 任务级汇总 |
--loop | 关闭 | 视频播放完毕后从头循环 |
--config PATH | config.yaml | 自定义 yaml 配置文件 |
完整列表见 python run.py --help。
输出产物
执行后会在 Conveyor/logs/ 下生成(路径可通过 CLI 重定向):
-
logs/frames.csv:每帧的统计(帧序号、时间戳、当帧蛋数、累计越线数等)。 -
logs/crossings.csv:逐颗蛋 的越线判定,列含义:列 含义 frame_idx,timestamp,direction越线时刻与方向 track_id计数模型分配的稳定 ID colorwhite/brown/unknown(Lab a* 通道判别)cls裂纹模型给出的类别名,例如 brown-egg-crackcracked,dirty,intact派生布尔值 is_defectivecracked or dirtymask_area_ratio蛋框内被裂纹 mask 覆盖的比例 iou计数框与裂纹框的 IoU sourceinspector(匹配成功)或unknown(无重叠) -
logs/summary.json:总数 + 各颜色计数 + 不合格率。 -
--save-video output/annotated.mp4(可选):带越线、检测框、裂纹 mask、HUD 的标注视频。
终端输出示例:
[conveyor] Done. crossings=42 defective=3 frames=1280
[conveyor] Artifacts: frames=logs/frames.csv crossings=logs/crossings.csv summary=logs/summary.json配置文件
所有默认参数集中在 Conveyor/config.yaml,CLI 标志会覆盖其中对应键:
counter:
model:
weights: ../Automated-Egg-Counting-System/best.pt
device: auto
img_size: 640
conf_threshold: 0.35 # 对应 --conf-counter
iou_threshold: 0.45
line:
start: [100, 240] # 对应 --line-start
end: [540, 240] # 对应 --line-end
direction: down # 对应 --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 # 对应 --inspector-mode
conf_threshold: 0.25 # 对应 --conf-inspector
filter:
crack_only: false
min_mask_pixels: 0
min_bbox_area: 16
association:
min_iou: 0.3 # 对应 --associate-iou
video:
source: "0" # 对应 --source / --video / --webcam
loop: false如果两个模型框位系统性偏移(计数框与裂纹框几乎不重叠),可下调 cfg.association.min_iou;若出现明显误匹配,则上调此值。