共计 1490 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点:中草药标注的特殊性
中草药数据标注与普通物体检测相比有三大难点:
- 形态相似性高 :比如金银花和山银花的花瓣差异仅 3 - 5 毫米,标注时容易混淆
- 药用部位多样 :同一株植物可能需要标注叶片(如薄荷)、根茎(如黄芪)或花朵(如菊花)等不同部位
- 生长阶段影响 :幼株和成熟株的形态差异大(如人参需标注芦头、艼、纹等特征)
工具选型:Labelme vs CVAT 实战对比
经过实际测试,两种工具在草药标注中的表现:
- Labelme 优势:
- 支持多边形标注(适合不规则叶片轮廓)
- JSON 格式易与 Python 生态集成
-
轻量级安装(适合小团队)
-
CVAT 优势:
- 多人协作标注功能
- 内置质量审查工作流
- 支持视频帧标注(适合记录生长过程)
核心实现
数据清洗代码示例
import cv2
import numpy as np
def clean_herb_images(img_path):
"""
中草药图像预处理流水线
:param img_path: 原始图像路径
:return: 处理后的图像
"""
# 1. 读取并自动旋转(解决手机拍摄方向问题)img = cv2.imread(img_path)
exif = img.info.get('exif', {})
# 2. 背景去除(基于 HSV 色域)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_green = np.array([35, 43, 46])
upper_green = np.array([77, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
# 3. 形态学处理(消除细小噪点)kernel = np.ones((5,5), np.uint8)
cleaned = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
return cv2.bitwise_and(img, img, mask=cleaned)
标注规范设计要点

图示:叶片标注需包含主脉(红色)和叶缘(蓝色)双重轮廓
- 整体标注 :整株植物外接矩形(适用于 YOLO)
- 局部标注 :
- 叶片:沿锯齿状边缘标注多边形
- 花朵:花蕊与花瓣分层标注
- 根茎:表面纹理 ROI 区域
- 属性标注 :
- 生长阶段(幼苗 / 成熟)
- 采集季节(影响有效成分含量)
质量控制
标注一致性检查
使用混淆矩阵分析不同标注员的结果(示例数据):
| 真实 \ 预测 | 当归 | 白芷 | 党参 |
|---|---|---|---|
| 当归 | 87 | 5 | 8 |
| 白芷 | 3 | 92 | 5 |
| 党参 | 11 | 4 | 85 |
类别平衡策略
- 过采样 :对稀有品种(如雪莲)进行旋转、颜色抖动等增强
- 欠采样 :对大众品种(如枸杞)随机抽取样本
- 分层划分 :确保每类在训练 / 验证集的分布一致
避坑指南
光照问题解决方案
- 拍摄时使用灰卡做色彩校准
- 代码自动校正:
def correct_illumination(img): lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) l, a, b = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8)) return cv2.merge([clahe.apply(l), a, b])
相似品种鉴别
建立特征比对表辅助标注:
| 特征 | 黄芪 | 红芪 |
|---|---|---|
| 根部横纹 | 环纹明显 | 纵纹为主 |
| 断面颜色 | 黄白色 | 淡红色 |
模型适配建议
- YOLO 系列 :
- 调整 anchor box 尺寸匹配细长叶片比例
- 使用 K -means++ 重新聚类先验框
- UNet 分割 :
- 叶片边缘标注需闭合且精确到像素级
- 添加茎秆中心线的辅助损失函数
改进实验建议
- 测试 Labelbox 的智能预标注功能在草药数据上的表现
- 尝试用 SAM 模型自动生成叶片掩码作为标注起点
- 验证不同色彩空间(HSV/Lab)对分类准确率的影响
正文完
发表至: 未分类
近一天内
