# 3D 鱼类重量测量系统 基于 ZED 立体相机的 3D 鱼类重量自动测量项目。通过深度图检测、点云处理、模板匹配和体积计算,实现鱼类的非接触式重量估算。 ## 项目概述 本项目旨在开发一个完整的 3D 鱼类重量测量系统,主要流程包括: 1. **鱼类检测与点云提取**:从 ZED 相机深度图中检测距离相机 30cm 内的鱼类,并提取对应的 3D 点云数据 2. **3D 点云对齐**:将检测到的鱼类点云与缩放后的模板鱼进行匹配对齐 3. **体积计算与重量估算**:基于对齐后的点云或网格计算体积,并估算鱼类重量 ## 系统架构 ``` ZED 相机数据流 ↓ [模块1] 鱼类检测与点云提取 ├─ 深度图处理(30cm 阈值过滤) ├─ 鱼类区域检测(YOLO检测 + SAM分割) └─ 3D 点云生成 ↓ [模块2] 鱼类跟踪与最佳点云选择 ├─ 多帧跟踪(IoU匹配、轨迹ID管理) ├─ 点云质量评估 ├─ 最佳点云选择(基于点数、完整性、姿态等) └─ 输出选定点云用于后续处理 ↓ [模块3] 3D 点云对齐 ├─ 模板鱼加载与缩放 ├─ 点云配准(ICP/特征匹配) └─ 对齐后的点云输出 ↓ [模块4] 体积计算与重量估算 ├─ 点云体素化 ├─ 体积计算 └─ 重量估算(基于密度) ``` python3 zed_reader.py --svo '/home/ubuntu/data/fish/2025-11-13-711fish/svo/HD1080_SN43186771_16-41-37.svo2' --use_yolo --show_yolo_bbox ## 模块说明 ### 模块 1:鱼类检测与点云提取 **功能**: - 从 ZED 相机读取深度图和 RGB 图像 - 检测深度值在 30cm 范围内的区域(鱼类检测) - 过滤深度值并生成对应的 3D 点云 - 保存点云数据为 PLY 格式 **相关文件**: - `fish_video_weight_evaluation.py`:主要的鱼类检测、分割、跟踪和点云生成脚本 - `zed_reader.py`:ZED 相机数据读取和处理模块 - `pointcloud_filter.py`:点云过滤和质量评估工具 - `seg.py`:SAM 分割模型初始化 **主要功能**: - 支持实时相机模式和 SVO 文件回放模式 - YOLO 检测 + SAM 分割 - 多帧跟踪和轨迹管理 - 深度图处理和点云生成 - 点云质量过滤(质心过滤、KDTree过滤、体素下采样) - 相机标定参数提取和保存 - 图像、点云和跟踪数据保存 ### 模块 2:AI 点云质量分类与平坦度评估 **功能**: - 使用 PointNet++ 分类器对点云进行质量评估 - 平坦度评估:使用 RANSAC 平面拟合评估点云平坦度 - 过滤质量差或不够平坦的点云 **实现要点**: - **AI 分类器**: - 使用训练好的 PointNet++ 模型(`pointcloud_classifier/Pointnet_Pointnet2_pytorch/`) - 将点云分为"好"(good)和"坏"(bad)两类 - 置信度阈值:默认 0.7(只保留高置信度的"好"点云) - 分类器训练数据来自手动标注的点云数据集 - **平坦度评估**: - 使用 RANSAC 算法拟合平面 - 平坦度分数 = 在平面上的点的百分比(0-100%) - 跳过不够平坦的点云(非正侧视图) - **点云质量检查**: - 最小点数:500 点 - 深度数据质量验证 - 离群点过滤 **相关文件**: - `fish_video_weight_evaluation.py`:集成分类器筛选逻辑 - `pointcloud_classifier/`:分类器训练和测试代码 - `utils/evaluate_flatness.py`:平坦度评估工具 - `pointcloud_filter.py`:点云过滤工具 **当前实现**: - ✅ AI 点云质量分类器(PointNet++) - ✅ 置信度阈值过滤 - ✅ 平坦度评估(RANSAC 平面拟合,默认阈值 90%) - ✅ 点云质量检查(最小点数500) - ✅ 深度统计记录(mean, median, std等) **已知限制**: - ⚠️ 平坦度过滤后,好的点云数量显著减少 - ⚠️ 顶部鱼类深度精度差,点云质量不佳 - ⚠️ 底部鱼类运动过大时,长度测量不准确,重量误差大 - 🔄 **待改进**:需要动作识别模型来捕获鱼类相对静止的关键时刻 ### 模块 3:3D 点云对齐与长度测量 **功能**: - 对所有通过质量筛选的候选点云进行对齐 - 测量每个对齐后点云的长度 - 选择最大长度的点云用于重量计算 **实现要点**: - **对齐流程**(只进行旋转和平移,**不缩放输入点云**): 1. 居中:将点云中心移到原点 2. 平面拟合:使用 SVD 拟合平面 3. 旋转到 XY 平面:将平面法向量旋转到 +Z 轴 4. 头尾检测:使用 PCA 检测主方向,确保头部指向 +X 5. 头尾验证:使用宽度分析验证头部在 +X,尾部在 -X 6. 模板缩放:将模板缩放到匹配输入点云的长度(不缩放输入点云) - **长度测量**: - 长度 = max(x) - min(x)(对齐后的 X 轴范围) - 在所有候选点云中选择最大长度 - **模板缩放**: - 模板会被缩放到匹配输入点云的长度 - 支持 `template_scale_factor` 参数进行额外缩放 **相关文件**: - `fish_align_cli.py`:点云对齐主程序 - `utils/head_tail_alignment.py`:头尾方向检测工具 **当前实现**: - ✅ 点云对齐(旋转和平移,保持原始尺度) - ✅ 头尾方向检测和验证 - ✅ 长度测量(max x - min x) - ✅ 最大长度选择 - ✅ 模板自动缩放 - ✅ 文件夹模式:批量处理多个点云文件 **待改进**: - ⏳ 多模板支持:为不同长度的鱼类(短、中、长)提供不同的模板(详见"待改进功能"部分) ### 模块 4:体积计算与重量估算 **功能**: - 使用最大长度对应的模板计算体积 - 基于体积和密度估算鱼类重量 - **估算误差:约 10%** **实现要点**: - **体积计算**: - 使用最大长度对应的缩放模板计算体积 - 模板会被缩放到匹配输入点云的最大长度 - 使用 trimesh 库计算封闭网格的体积 - **重量估算**: - 基于体积和密度计算重量 - 密度:1.0 g/cm³(可根据实际鱼类种类调整) - 输出单位:克(g)和千克(kg) **相关文件**: - `fish_measure_cli.py`:基于网格的体积和重量计算 - `fish_align_cli.py`:集成体积和重量计算(在对齐后自动计算) **重量估算公式**: ``` 重量(克) = 体积(立方厘米) × 密度(克/立方厘米) ``` **精度说明**: - 使用最大长度进行重量计算,确保捕获最大的鱼 - 估算误差:约 10% - 误差来源: - 点云质量(深度图精度、分割精度) - 模板匹配精度 - 体积计算方法 - 密度参数假设 ## 项目结构 ``` FishMeasure/ ├── README.md # 项目说明文档 ├── zed_reader.py # ZED 相机数据读取模块 ├── fish_measure_cli.py # 网格体积和重量计算工具 ├── fish_mesh_cli.py # 点云体素化和体积计算工具 ├── 2025_11/ # ZED 相机数据目录 │ └── *.svo2 # ZED 相机录制的视频文件 └── old_data/ # 历史测试数据 ├── *.ply # 点云文件 ├── *.obj # 网格文件 └── test_18cm/ # 测试数据示例 ``` ## 依赖环境 ### Python 版本 - Python 3.7+ ### 主要依赖库 ``` pyzed # ZED SDK Python 绑定 opencv-python (cv2) # 图像处理 numpy # 数值计算 trimesh # 3D 网格处理 open3d # 点云处理 scipy # 科学计算(形态学操作) ``` ### 安装依赖 ```bash pip install pyzed opencv-python numpy trimesh open3d scipy ``` ### ZED SDK 要求 - 需要安装 ZED SDK(从 [Stereolabs 官网](https://www.stereolabs.com/developers/) 下载) - 确保系统已正确配置 ZED SDK 环境 ## 使用流程 ### 完整工作流程 1. **AI 鱼类检测(YOLO + SAM)** - 使用 YOLO 模型对图像进行实时检测,识别鱼类边界框 - 使用 SAM(Segment Anything Model)对检测到的鱼类进行精确分割 - 仅当检测到鱼的边界框时,才继续后续处理 2. **3D 点云生成** - 基于 SAM 分割掩码和深度图生成 3D 点云 - 应用点云过滤(质心过滤、KDTree过滤、体素下采样)去除离群点 - 所有点云均由校准参数投影得到,单位为毫米 3. **AI 点云质量分类器筛选** - 使用训练好的 PointNet++ 分类器对生成的点云进行质量评估 - 分类器将点云分为"好"(good)和"坏"(bad)两类 - 只保留被分类为"好"且置信度超过阈值(默认 0.7)的点云 - 过滤掉质量差的点云,减少后续处理的计算量 4. **平坦度评估与过滤** - 对通过分类器筛选的点云进行平坦度评估 - 使用 RANSAC 平面拟合算法计算点云平坦度分数 - 平坦度分数 = 在拟合平面上的点的百分比(越高越平坦) - **跳过不够平坦的点云**:如果点云不够平坦,说明可能不是正侧视图,不适合进行重量估算 - **默认阈值:90%**(较高的阈值确保只保留最平坦的点云) - **注意**:高阈值会导致通过过滤的点云数量显著减少(详见"当前限制与观察"部分) - 工具:`utils/evaluate_flatness.py` 5. **鱼类对齐与长度测量** - 对所有通过平坦度检查的候选点云进行对齐处理 - 使用 `fish_align_cli.py` 进行对齐: - 平面化:将点云旋转到 XY 平面 - 头尾检测:确保头部指向 +X 方向 - 对齐:只进行旋转和平移(**不缩放输入点云**) - 模板缩放:将模板缩放到匹配输入点云的长度 - 测量每个对齐后点云的长度(max x - min x) - **选择最大长度**:在所有候选点云中,找到长度最大的点云 6. **重量计算** - 使用最大长度对应的模板进行重量计算 - 模板会被缩放到匹配最大长度,然后计算体积 - 基于体积和密度(1.0 g/cm³)计算重量 - **估算误差:约 10%** ### 完整流程示例 ```bash # 步骤 1-3: 处理SVO2文件,生成点云(使用AI分类器筛选) python fish_video_weight_evaluation.py \ --svo file.svo2 \ --save-output ./output \ --filter-pointcloud \ --use-pointcloud-classifier \ --pointcloud-classifier-threshold 0.7 ``` ### 批量处理示例 ```bash # 批量处理多个SVO2文件 python batch_process_svo2.py \ --svo-folder ./svo_files \ --output ./output_preview \ --filter-pointcloud \ --use-pointcloud-classifier \ --pointcloud-classifier-threshold 0.7 # 对每个SVO2文件的输出点云进行对齐和重量计算 for dir in ./output_preview/*/cloud; do python fish_align_cli.py \ --input-folder "$dir" \ --template ./template/template.obj \ --output_dir "${dir%/cloud}/aligned" done ``` ## 注意事项 1. **深度范围限制**:当前系统设计用于检测 30cm 内的鱼类,超出此范围的数据将被过滤 2. **点云质量**:点云质量直接影响体积计算精度,建议在良好光照条件下采集数据 3. **模板匹配**:需要准备合适的模板鱼模型,模板质量影响对齐效果 4. **密度参数**:默认密度为 1.0 g/cm³,实际应用中需要根据鱼类种类调整 ## 当前限制与观察 ### 平坦度过滤后的点云数量 经过平坦度过滤(默认阈值 90%)后,**好的点云数量显著减少**。这主要是因为: 1. **顶部鱼类的深度精度问题**: - 位于水面上方或接近水面的鱼类,由于深度图在水-空气界面处精度较差,生成的 3D 点云质量不佳 - 这些点云通常无法通过平坦度检查,因为深度数据不准确导致点云形状扭曲 2. **鱼类的运动问题**: - 位于底部的鱼类如果摆动幅度过大,且尾部不可见或被遮挡,会导致: - 点云不够平坦(无法通过平坦度检查) - 即使通过检查,长度测量也不准确(因为尾部缺失或变形) - 最终重量评估误差过大(可能超过 10% 的目标误差) - you can check 021545 fish ### 解决方案方向 为了捕获**鱼类相对静止且完整可见**的关键时刻,建议引入**视频动作识别模型**: 1. **动作识别模型的作用**: - 识别鱼类运动状态(静止、游动、摆动等) - 自动选择鱼类处于相对静止状态的帧 - 确保鱼类完整可见(头部和尾部都在视野内) 2. **预期效果**: - 提高通过平坦度检查的点云数量 - 提高长度测量的准确性 - 降低重量评估误差(接近或达到 10% 目标) 3. **实现建议**: - 使用预训练的视频动作识别模型(如 SlowFast、X3D、TimeSformer 等) - 在点云生成前对视频帧进行动作分析 - 只对"静止"或"缓慢移动"状态的帧进行点云生成和后续处理 - 可以结合跟踪信息,分析每条鱼的运动轨迹,选择最佳时刻 ### 当前工作流程的局限性 - **被动过滤**:当前系统只能被动地过滤掉质量差的点云,无法主动选择最佳时刻 - **依赖深度精度**:对深度图质量要求较高,水下环境中的深度精度问题会影响结果 - **运动模糊**:快速运动的鱼类会产生运动模糊,影响分割和点云质量 ## 下周计划 ### 1. 对齐点云的长度和高度测量误差分析 **目标**:评估对齐后点云的长度和高度测量准确性,并分析其对重量估计的影响。 **任务**: - [ ] 计算所有对齐后鱼点云的长度和高度 - [ ] 与真实测量值(ground truth)进行对比 - [ ] 绘制长度误差分布图(预测长度 vs 实际长度) - [ ] 绘制高度误差分布图(预测高度 vs 实际高度) - [ ] 使用测量到的长度和高度值,通过贝叶斯模型估计重量 - [ ] 绘制估计重量误差图(估计重量 vs 实际重量) - [ ] 分析长度/高度测量误差对重量估计误差的影响 - [ ] 识别测量误差较大的案例,分析原因 **预期输出**: - 长度测量误差统计(MAE, RMSE, 相关系数) - 高度测量误差统计(MAE, RMSE, 相关系数) - 基于测量值的重量估计误差统计 - 可视化图表:误差分布、散点图、残差图 ### 2. 多模板对齐与最佳候选选择 **目标**:使用多个不同高度/长度比例的模板进行对齐,选择最佳匹配以提高重量估计精度。 **任务**: - [ ] 准备4个模板,代表不同的高度/长度比例: - 模板1:高长比低(瘦长型) - 模板2:高长比中等(标准型) - 模板3:高长比高(粗短型) - 模板4:高长比极高(非常粗短型) - [ ] 对每个良好姿态的部分鱼点云,使用4个模板分别进行对齐 - [ ] 计算每个对齐的对齐分数(alignment score): - 可以使用点云重叠度、距离误差、形状相似度等指标 - [ ] 选择对齐分数最高的模板作为最佳候选 - [ ] 使用最佳候选模板计算重量 - [ ] 对比多模板方法与单模板方法的重量估计精度 - [ ] 分析不同鱼类型(不同高长比)与模板选择的对应关系 **实现细节**: - 对齐分数计算方法: - 点云重叠度:对齐后重叠区域的点数比例 - 平均距离误差:对齐后点云到模板表面的平均距离 - 形状相似度:基于点云特征的相似度度量 - 综合分数:加权组合上述指标 - 模板选择策略: - 选择综合分数最高的模板 - 或使用投票机制(多个指标都指向同一模板) **预期效果**: - 提高不同形状鱼类的重量估计精度 - 自动选择最适合的模板,减少人工干预 - 为不同鱼类型提供更准确的重量估算 ## 待改进功能 (TODO) ### 1. 尺度校正 - 参考物体检测 **问题**:点云尺度不准确,导致长度和重量估计误差。 **解决方案**: - 在水中放置已知尺寸的参考矩形物体 - 使用 YOLO 检测参考物体,SAM 分割 - 计算参考物体的检测长度 vs 真实长度,得到缩放因子 - 应用缩放因子校正鱼的点云,获得真实长度 - 基于真实长度进行重量估计 **任务**: - [ ] 训练 YOLO 检测参考物体 - [ ] 实现参考物体分割和长度测量 - [ ] 计算并应用缩放因子到鱼点云 - [ ] 验证尺度校正后的重量估计精度 ### 2. 基于深度学习的重量回归网络 **问题**:模板匹配方法选择模板困难,且精度有限。 **解决方案**: - 训练端到端回归网络,直接从点云预测重量(0-1范围,0.55 = 550g) - 数据增强:对150个样本的每个好点云进行大量增强(旋转、缩放、噪声等) - 生成 5k-10k 训练数据 - 使用 PointNet++ 或类似架构进行回归 **任务**: - [ ] 收集150个鱼的好的点云数据 - [ ] 实现数据增强管道(旋转、平移、缩放、噪声、点采样等) - [ ] 生成增强数据集(5k-10k样本) - [ ] 设计并训练回归网络(输入:点云,输出:重量 0-1) - [ ] 评估网络性能,对比模板匹配方法 ### 3. YOLO 关键点检测 - 鱼类方向识别 **问题**:当前对齐算法有时会错误地翻转鱼的方向(上下或左右),因为点云噪声导致头尾、上下检测不准确。 **解决方案**:使用 YOLO 检测鱼类的 4 个关键点(landmarks),直接从 2D 图像中获取方向信息。 **关键点定义**: 1. **头部(Head)**:鱼头的中心位置 2. **尾部(Tail)**:鱼尾的中心位置 3. **背部(Upper Body / Dorsal)**:鱼背部的最高点 4. **腹部(Lower Body / Ventral)**:鱼腹部的最低点 **任务**: - [ ] **数据标注**: - 在现有的鱼类检测数据集上标注 4 个关键点 - 使用标注工具(如 CVAT、LabelMe)进行标注 - 建立标注规范,确保一致性 - 目标:标注 500-1000 张图像 - [ ] **模型训练**: - 使用 YOLOv8-pose 或类似的关键点检测模型 - 训练关键点检测任务 - 评估关键点检测精度(PCK、OKS 等指标) - [ ] **集成到流程**: - 在 3D 点云生成前,使用关键点确定鱼的方向 - 将 2D 关键点投影到 3D 空间 - 使用关键点引导对齐算法,避免翻转错误 - [ ] **验证效果**: - 对比使用关键点前后的对齐准确率 - 分析关键点检测失败的案例 **预期效果**: - 准确识别鱼的头尾方向和上下方向 - 消除因点云噪声导致的翻转问题 - 提高整体流程的鲁棒性 ### 2. 多模板有效性测试 **问题**:当前使用单一模板进行对齐和重量计算,对于不同形状的鱼类可能不够准确。需要验证多模板方法的有效性。 **任务**: - [ ] **准备多个模板**: - 创建或获取 3-4 个不同高度/长度比例的鱼类模板 - 模板应覆盖常见的鱼类形状类型 - [ ] **设计对齐分数计算方法**: - Chamfer Distance(倒角距离) - Hausdorff Distance(豪斯多夫距离) - 点云重叠率 - 形状相似度(ICP 残差) - [ ] **测试多模板选择算法**: - 对测试集中的每个点云,使用所有模板进行对齐 - 记录每个模板的对齐分数 - 验证选择最高分数模板的策略是否有效 - [ ] **对比实验**: - 单模板方法 vs 多模板方法的重量估计精度 - 分析不同形状鱼类的模板选择模式 - 评估多模板方法的计算开销 - [ ] **记录结果**: - 创建测试报告,包含精度对比、案例分析 - 确定多模板方法是否值得在生产环境中使用 **预期效果**: - 量化多模板方法的改进幅度 - 确定最佳的模板数量和类型 - 为生产部署提供决策依据 ### 3. 代码重构 - 端到端流程整合 **问题**:当前代码分散在多个文件中,从点云到最终预测的流程需要手动执行多个步骤,不便于使用和维护。 **目标**:重构代码,将所有步骤整合到一个统一的流程中,实现从点云输入到重量预测的端到端处理。 **任务**: - [ ] **设计统一的流程接口**: ```python class FishWeightEstimator: def __init__(self, config): self.classifier = PointCloudClassifier(...) self.templates = load_templates(...) self.aligner = PointCloudAligner(...) self.weight_estimator = WeightEstimator(...) def estimate(self, pointcloud): # 1. 点云质量分类 if not self.classifier.is_good(pointcloud): return None # 2. 多模板对齐与选择 best_template, best_score = self.aligner.align_and_select( pointcloud, self.templates ) # 3. 长度和高度测量 length, height = self.aligner.measure(pointcloud) # 4. 重量估计 weight = self.weight_estimator.estimate( best_template, length, height ) return { 'weight': weight, 'length': length, 'height': height, 'template': best_template, 'alignment_score': best_score } ``` - [ ] **重构现有代码**: - 将点云分类代码封装为独立模块 - 将对齐代码封装为独立模块 - 将测量代码封装为独立模块 - 将重量估计代码封装为独立模块 - [ ] **创建配置系统**: - 使用 YAML 或 JSON 配置文件 - 支持配置模板路径、阈值参数、模型路径等 - [ ] **创建命令行工具**: ```bash # 单个点云处理 python estimate_weight.py --input pointcloud.ply --config config.yaml # 批量处理 python estimate_weight.py --input-folder ./pointclouds --config config.yaml --output results.csv ``` - [ ] **添加日志和错误处理**: - 详细的处理日志 - 错误分类和处理 - 结果保存和报告生成 - [ ] **编写文档和示例**: - 使用说明文档 - 代码示例 - API 文档 **预期效果**: - 简化使用流程,一键完成重量估计 - 提高代码可维护性和可扩展性 - 便于集成到其他系统中 ### 4. 预测长度与实际长度对比分析 **问题**:需要验证系统预测的鱼类长度与实际测量长度的准确性,识别长度预测的误差模式。 **解决方案**: - [ ] 收集预测长度和实际长度的配对数据 - [ ] 创建可视化脚本,绘制预测长度 vs 实际长度的散点图 - [ ] 计算长度预测的误差指标: - 平均绝对误差 (MAE) - 均方根误差 (RMSE) - 相关系数 - 误差分布直方图 - [ ] 分析误差模式: - 是否存在系统性偏差(预测值偏大或偏小) - 不同长度范围的误差是否不同 - 识别误差较大的案例 - [ ] 绘制对比图表: - 散点图:预测长度 vs 实际长度(理想情况下应该在对角线上) - 残差图:误差 vs 实际长度 - 误差分布图 **预期效果**: - 量化长度预测的准确性 - 识别长度预测中的系统性问题 - 为改进长度测量算法提供数据支持 ### 5. 上下对齐 (Up-Down Alignment) **问题**:当前系统只对齐了头部(最大 x 值),但没有对齐点云的上下部分(Y 轴方向)。部分点云的上下部分可能与模板鱼的上下部分不对齐,影响体积计算的准确性。 **解决方案**: - [ ] 实现上下对齐功能:确保部分点云的上下部分与模板鱼的上下部分对齐 - [ ] 对齐方法: - 计算部分点云和模板鱼在 Y 轴方向的范围(min y, max y) - 计算 Y 轴方向的平移量,使两者的中心或边界对齐 - 可选择对齐方式:中心对齐、顶部对齐、底部对齐 - [ ] 在对齐流程中添加 Y 轴对齐步骤(在头部对齐之后) - [ ] 验证对齐效果:确保对齐后点云和模板在 Y 轴方向的位置一致 **预期效果**: - 提高点云与模板的匹配精度 - 改善体积计算的准确性 - 减少因上下不对齐导致的重量估算误差 ### 6. 删除无用尾部 **问题**:部分点云可能包含鱼类的尾部区域,这些尾部区域: - 不贡献重量(很薄,体积很小) - 但会增加长度测量值 - 导致长度与重量的相关性不准确 - usually the big fish don't have tail visible, but for small fish it seesm they do **解决方案**: - [ ] 请相关人员删除模板鱼中无用的尾部部分 - [ ] 识别和标记尾部区域: - 使用宽度分析识别尾部(最窄的部分) - 或手动标记尾部区域 - [ ] 在体积计算时排除尾部区域: - 只计算头部到身体部分的体积 - 或对尾部区域应用不同的体积计算方法 - [ ] 更新长度测量方法: - 长度 = 头部到身体末端的距离(不包括尾部) - 或使用加权长度(尾部权重较低) **预期效果**: - 提高长度与重量的相关性 - 减少因尾部导致的长度测量误差 - 改善基于长度的重量预测准确性 ### 7. 基于高度和长度的多项式重量预测模型 **问题**:当前系统主要依赖体积计算重量,但高度和长度之间存在相关性,可以用于直接预测重量。 **解决方案**: - [ ] 开发多项式回归模型,基于高度和长度预测重量 - [ ] 模型形式: ``` 重量 = f(长度, 高度) 例如:重量 = a₀ + a₁×长度 + a₂×高度 + a₃×长度² + a₄×高度² + a₅×长度×高度 + ... ``` - [ ] 数据准备: - 收集已知重量、长度和高度的鱼类数据 - 从对齐后的点云中提取长度和高度特征 - [ ] 模型训练: - 使用 Ridge 回归或多项式回归 - 交叉验证选择最佳多项式阶数 - 评估模型性能(MAE, RMSE, R²) - [ ] 集成到现有系统: - 作为体积计算方法的补充或替代 - 可以结合两种方法(体积 + 多项式预测)进行加权平均 - [ ] 模型验证: - 在测试集上验证预测准确性 - 与体积计算方法对比 **预期效果**: - 提供更快速、更简单的重量预测方法 - 利用长度和高度的相关性提高预测精度 - 作为体积计算方法的补充,提供双重验证 ### 8. 多模板支持 **问题**:当前系统使用单一模板进行对齐和重量计算,对于不同长度的鱼类,重量估算精度不足。 **具体案例**: - 0218 鱼:长度 32cm,使用当前模板时重量估算不准确 - 需要根据鱼的长度调整模板的宽度或高度比例 **解决方案**: - [ ] 添加 3 种不同尺寸的鱼类模板(短、中、长) - [ ] 根据检测到的鱼类长度自动选择合适的模板 - [ ] 模板分类标准: - **短鱼模板**:适用于长度 < 25cm 的鱼类(需要调整宽度/高度比例) - **中等鱼模板**:适用于长度 25-35cm 的鱼类(当前模板) - **长鱼模板**:适用于长度 > 35cm 的鱼类(需要调整宽度/高度比例) - [ ] 实现模板自动选择逻辑:根据对齐后的点云长度(max x - min x)选择最匹配的模板 - [ ] 为每个模板单独训练或调整参数,确保不同长度范围的鱼类都能获得准确的重量估算 **预期效果**: - 提高不同长度鱼类的重量估算精度 - 减少因模板不匹配导致的重量误差 - 支持更广泛的鱼类尺寸范围 ### 9. 基于重量分组的模板优化分析 **问题**:不同重量范围的鱼类可能具有不同的高度与长度比例,使用单一模板可能导致某些重量范围的预测不准确。 **观察**: - 当前模型对重量 < 100g 的小鱼预测值一般偏小(低估) - 重量 > 300g 的大鱼可能有不同的高度与长度比例 - 需要分析不同重量范围的鱼类的几何特征差异 **解决方案**: - [ ] **分析高度与长度比例**: - 对所有鱼类数据计算高度/长度比例 - 按重量分组(< 100g, 100-300g, > 300g)分析比例分布 - 识别不同重量范围的几何特征差异 - 可视化比例分布和相关性 - [ ] **分析小鱼(< 100g)的模型性能**: - 收集重量 < 100g 的鱼类数据 - 对比模型预测值与真实值 - 分析预测误差模式(是否系统性偏小) - 检查小鱼的高度/长度比例是否与当前模板不匹配 - [ ] **为小鱼设计专用模板**: - 如果发现小鱼需要不同的高度/长度比例 - 创建或调整模板模型,使其更适合小鱼的几何特征 - 在小鱼数据上验证新模板的效果 - [ ] **分析大鱼(> 300g)的模型性能**: - 收集重量 > 300g 的鱼类数据 - 对比模型预测值与真实值 - 分析预测误差模式 - 检查大鱼的高度/长度比例是否与当前模板不匹配 - [ ] **为不同重量范围设计专用模板**: - 根据分析结果,为不同重量范围(< 100g, 100-300g, > 300g)设计或调整模板 - 实现模板自动选择逻辑:根据预测重量或实际测量选择合适模板 - 在各自的数据集上验证模板效果 **预期效果**: - 识别不同重量范围鱼类的几何特征差异 - 为小鱼和大鱼提供更准确的模板匹配 - 减少系统性预测误差(特别是小鱼的低估问题) - 提高整体重量估算精度 ### 10. 尾部检测不一致性问题 (Tail Detection Inconsistency) **问题**:点云中的尾部检测不一致,导致与模板对齐时产生约 4cm 的误差。 **详细描述**: - 由于鱼尾在图像中较细且容易模糊,部分鱼的点云有尾巴,部分没有 - 模板鱼总是有完整的尾巴 - 当没有尾巴的点云与有尾巴的模板对齐时,会产生约 4cm 的长度差异 - 这个差异会影响对齐质量和重量估算准确性 **影响**: - 长度测量误差:约 4cm(取决于鱼的大小) - 对齐分数不准确:无尾点云与有尾模板的匹配度降低 - 重量估算偏差:长度误差会传导到重量计算 **解决方案**: #### 方案 1:无尾模板 (Tail-less Template) - [ ] 创建无尾版本的模板鱼 - [ ] 在对齐时同时使用有尾和无尾模板 - [ ] 选择对齐分数更高的模板 - **优点**:实现简单,不需要修改对齐算法 - **缺点**:需要维护两套模板 #### 方案 2:尾部自动检测与模板裁剪 - [ ] 实现尾部检测算法: - 分析点云的宽度分布(尾部最窄) - 检测宽度急剧下降的位置作为尾部起点 - 如果没有检测到明显的尾部区域,认为尾部缺失 - [ ] 根据检测结果动态裁剪模板: - 如果输入点云没有尾部,裁剪掉模板的尾部区域 - 然后进行对齐 - **优点**:自适应处理,不需要额外模板 - **缺点**:尾部检测可能不准确 #### 方案 3:分段对齐 (Body-Only Alignment) - [ ] 将鱼分为头部、身体、尾部三个区域 - [ ] 只使用头部和身体区域进行对齐 - [ ] 忽略尾部区域的对齐误差 - [ ] 对齐分数只计算头部和身体区域 - **优点**:避免尾部不一致性影响对齐 - **缺点**:需要准确划分区域 #### 方案 4:Partial ICP (部分匹配ICP) - [ ] 使用 Trimmed ICP 或 Robust ICP 算法 - [ ] 这些算法可以处理部分重叠的情况 - [ ] 自动忽略没有对应点的区域(如缺失的尾部) - **优点**:算法成熟,鲁棒性好 - **缺点**:计算成本较高 #### 方案 5:基于关键点的对齐(推荐与 TODO #1 结合) - [ ] 使用 YOLO 检测的关键点(头、尾、上、下)进行对齐 - [ ] 如果尾部关键点置信度低或不可见,只使用头部和身体关键点 - [ ] 基于可见关键点计算对齐变换 - **优点**:结合 2D 信息,更准确判断尾部可见性 - **缺点**:需要先完成关键点检测功能 **建议实施顺序**: 1. 先实现方案 1(无尾模板),快速验证效果 2. 然后实现方案 2(尾部自动检测),提高自动化程度 3. 最终结合方案 5(关键点对齐),获得最佳效果 --- ### 11. 错误分析与改进 **问题**:当前系统存在多个误差来源,影响重量估算的准确性。需要系统性地分析和解决这些误差源。 **误差来源分析**: 1. **上下对齐误差** - **问题**:部分点云的上下部分(Y 轴方向)与模板鱼没有精确对齐, example `HD1080_SN43186771_18-48-33 , HD1080_SN43186771_18-24-25 (super big, 500g), HD1080_SN43186771_15-32-00` - **影响**:导致体积计算不准确,特别是对于高度变化较大的鱼类 - **解决方案**: - [ ] 实现 Y 轴方向的对齐算法 - [ ] 计算部分点云和模板在 Y 轴方向的范围和中心 - [ ] 应用 Y 轴平移使两者对齐 - [ ] 验证对齐效果 2. **头部对齐不精确** - **问题**:头部(最大 x 值)对齐不够精确,存在偏差 - **具体案例**:`HD1080_SN43186771_17-05-21, HD1080_SN43186771_18-39-16, HD1080_SN43186771_20-00-13` - 头部对齐存在明显误差 - **影响**:导致后续对齐和体积计算的基础不准确 - **解决方案**: - [ ] 改进头部检测算法(不仅使用最大 x 值,还要考虑头部形状特征) - [ ] 使用更精确的头部对齐方法(如特征点匹配) - [ ] 添加头部对齐验证步骤 - [ ] 对案例 `HD1080_SN43186771_17-05-21` 进行详细分析 3. **大鱼尾部缺失问题** - **问题**:对于大鱼(重量 > 300g),尾部可能不在点云中或部分缺失, eg: `HD1080_SN43186771_19-17-04, HD1080_SN43186771_20-00-13` - **影响**: - 长度测量不准确(尾部缺失导致长度偏短) - 体积计算不准确(尾部体积缺失) - 重量估算系统性偏小 - **解决方案**: - [ ] 检测尾部缺失情况(通过宽度分析或形状分析) - [ ] 对尾部缺失的大鱼使用不同的处理策略 - [ ] 考虑使用模板尾部进行补全 - [ ] 或使用基于身体部分的体积估算方法 4. **鱼形状与模板不匹配** - **问题**:部分点云的鱼形状与模板鱼的形状差异较大 - **影响**:即使对齐后,形状不匹配导致体积计算误差 - **可能原因**: - 不同种类的鱼形状差异 - 同一种鱼在不同生长阶段的形状变化 - 点云质量导致的形状扭曲 - **解决方案**: - [ ] 分析形状不匹配的具体模式 - [ ] 开发形状相似度评估指标 - [ ] 为不同形状的鱼提供多个模板选项 - [ ] 考虑使用可变形模板(deformable template) - [ ] 或使用基于点云直接计算体积的方法(不依赖模板) 5. **head tail alignemnt** - example : HD1080_SN43186771_03-12-09 **综合分析计划**: - [ ] 收集所有误差案例,按误差来源分类 - [ ] 量化每种误差源对最终重量估算的影响 - [ ] 优先解决影响最大的误差源 - [ ] 建立误差评估和报告机制 **预期效果**: - 系统性地识别和解决主要误差来源 - 提高重量估算的整体精度 - 减少因对齐和匹配问题导致的误差 - 为不同情况提供针对性的解决方案 ## 许可证 [待添加许可证信息] ## 贡献 欢迎提交 Issue 和 Pull Request! ## 联系方式 [待添加联系方式]