Files
FishServer/FishMeasure/README.md
2026-04-08 19:32:23 +08:00

883 lines
35 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3D 鱼类重量测量系统
> **仓库瘦身说明**:为便于部署到 `FishServer`,已删除历史推理目录(如 `output_weight_estimator/`、`output-yolo-sam/`)、训练数据集 `datasets/`、`project_jiuzhou01/` 前端工程及部分实验子项目数据。运行时仍需保留 **`sam_vit_h_4b8939.pth`**、`runs/train/.../best.pt`、`weight_estimator/runs/dgcnn_20260312_171043/best.pt` 等权重;详见仓库根目录 [`README.md`](../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.py`ZED 相机数据读取和处理模块
- `pointcloud_filter.py`:点云过滤和质量评估工具
- `seg.py`SAM 分割模型初始化
**主要功能**
- 支持实时相机模式和 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 # 科学计算(形态学操作)
```
### 安装依赖
```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 模型对图像进行实时检测,识别鱼类边界框
- 使用 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%**
### 完整流程示例
```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)
- [ ] 将鱼分为头部、身体、尾部三个区域
- [ ] 只使用头部和身体区域进行对齐
- [ ] 忽略尾部区域的对齐误差
- [ ] 对齐分数只计算头部和身体区域
- **优点**:避免尾部不一致性影响对齐
- **缺点**:需要准确划分区域
#### 方案 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
## 联系方式
[待添加联系方式]