Files
FishServer/FishMeasure
..

3D 鱼类重量测量系统

仓库瘦身说明:为便于部署到 FishServer,已删除历史推理目录(如 output_weight_estimator/output-yolo-sam/)、训练数据集 datasets/project_jiuzhou01/ 前端工程及部分实验子项目数据。运行时仍需保留 sam_vit_h_4b8939.pthruns/train/.../best.ptweight_estimator/runs/dgcnn_20260312_171043/best.pt 等权重;详见仓库根目录 README.md

基于 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.pyZED 相机数据读取和处理模块
  • pointcloud_filter.py:点云过滤和质量评估工具
  • seg.pySAM 分割模型初始化

主要功能

  • 支持实时相机模式和 SVO 文件回放模式
  • YOLO 检测 + SAM 分割
  • 多帧跟踪和轨迹管理
  • 深度图处理和点云生成
  • 点云质量过滤质心过滤、KDTree过滤、体素下采样
  • 相机标定参数提取和保存
  • 图像、点云和跟踪数据保存

模块 2AI 点云质量分类与平坦度评估

功能

  • 使用 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等

已知限制

  • ⚠️ 平坦度过滤后,好的点云数量显著减少
  • ⚠️ 顶部鱼类深度精度差,点云质量不佳
  • ⚠️ 底部鱼类运动过大时,长度测量不准确,重量误差大
  • 🔄 待改进:需要动作识别模型来捕获鱼类相对静止的关键时刻

模块 33D 点云对齐与长度测量

功能

  • 对所有通过质量筛选的候选点云进行对齐
  • 测量每个对齐后点云的长度
  • 选择最大长度的点云用于重量计算

实现要点

  • 对齐流程(只进行旋转和平移,不缩放输入点云
    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                    # 科学计算(形态学操作)

安装依赖

pip install pyzed opencv-python numpy trimesh open3d scipy

ZED SDK 要求

  • 需要安装 ZED SDKStereolabs 官网 下载)
  • 确保系统已正确配置 ZED SDK 环境

使用流程

完整工作流程

  1. AI 鱼类检测YOLO + SAM

    • 使用 YOLO 模型对图像进行实时检测,识别鱼类边界框
    • 使用 SAMSegment 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%

完整流程示例

# 步骤 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

批量处理示例

# 批量处理多个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. 代码重构 - 端到端流程整合

问题:当前代码分散在多个文件中,从点云到最终预测的流程需要手动执行多个步骤,不便于使用和维护。

目标:重构代码,将所有步骤整合到一个统一的流程中,实现从点云输入到重量预测的端到端处理。

任务

  • 设计统一的流程接口
    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 配置文件
    • 支持配置模板路径、阈值参数、模型路径等
  • 创建命令行工具
    # 单个点云处理
    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)

  • 将鱼分为头部、身体、尾部三个区域
  • 只使用头部和身体区域进行对齐
  • 忽略尾部区域的对齐误差
  • 对齐分数只计算头部和身体区域
  • 优点:避免尾部不一致性影响对齐
  • 缺点:需要准确划分区域

方案 4Partial 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

联系方式

[待添加联系方式]