从零构建100种中草药数据集标注系统:数据清洗与标注规范实战指南

1次阅读
没有评论

共计 2321 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

劣质标注数据引发的血泪教训

去年参与某个中草药识别项目时,我们遇到一个典型问题:模型总是把当归(Angelica sinensis)和独活(Angelica pubescens)混淆。这两种药材的叶片形态相似,但药效差异显著。追溯原因时发现:

从零构建 100 种中草药数据集标注系统:数据清洗与标注规范实战指南

  • 30% 的标注数据存在叶片边缘标注不精确(bounding box 超出实际轮廓)
  • 15% 的样本错误使用了俗名(如将 ” 香独活 ” 标为 ” 独活 ”)
  • 部分阴天拍摄的样本被误标为 ” 颜色异常 ”

这直接导致模型测试集准确率卡在 68% 无法提升。后来我们花费两周时间重新标注数据,最终准确率达到 83%。这个案例让我深刻认识到——优质标注数据比复杂的模型结构更重要。

数据采集与清洗实战

图像去重三件套

  1. 哈希去重 :用 OpenCV 的 img_hash 模块计算 pHash 值
import cv2

def remove_duplicates(image_folder):
    hashes = {}
    for img_path in Path(image_folder).glob('*.jpg'):
        img = cv2.imread(str(img_path))
        phash = cv2.img_hash.pHash(img)[0]
        if phash in hashes:
            os.remove(img_path)  # 删除重复图像
        else:
            hashes[phash] = img_path
  1. 模糊检测 :用 Laplacian 方差评估清晰度
def check_blur(image, threshold=100):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    fm = cv2.Laplacian(gray, cv2.CV_64F).var()
    return fm < threshold  # 返回 True 表示图像模糊 
  1. 光照均衡 :CLAHE 算法处理过暗 / 过亮样本

标注工具选型对比表

工具名称 适用场景 中草药项目适配度
CVAT 需要团队协作的大规模标注 ★★★★☆
LabelImg 快速单机标注 XML 格式 ★★★☆☆
VIA 无需安装的网页版标注 ★★☆☆☆

我们最终选择 CVAT,因其支持:
– 多边形标注(对不规则叶片关键)
– 属性标注(可记录采集地点 / 时间)
– 多人评审工作流

标注质量控制系统

多专家标注一致性校验

使用 Krippendorff’s alpha 系数衡量标注一致性:

from statsmodels.stats.inter_rater import aggregate_raters, krippendorff_alpha

# 模拟三位专家的标注结果(0/ 1 表示是否属于某类别)data = [[1,1,0],  # 样本 1
    [1,0,0],  # 样本 2
    [0,0,0]   # 样本 3
]

print(f"一致性系数: {krippendorff_alpha(data):.3f}")

经验值:
– α>0.8:标注质量优秀
– 0.6<α≤0.8:需要部分修正
– α≤0.6:必须重新标注

标注可视化检查

用 PIL 绘制标注区域与原始图像叠加:

from PIL import Image, ImageDraw

def visualize_annotations(image_path, annotations):
    img = Image.open(image_path)
    draw = ImageDraw.Draw(img)

    for anno in annotations:
        # 绘制多边形标注
        draw.polygon(anno['vertices'], outline='red', width=3)

        # 添加标签文本
        draw.text((anno['vertices'][0][0], anno['vertices'][0][1]-15), 
                 anno['label'], fill='yellow')

    return img

中草药标注特殊问题处理

叶片重叠标注规范

  1. 可见性原则 :只标注可见部分轮廓
  2. 遮挡处理 :用虚线标注被遮挡部分的推测轮廓
  3. 层次标记 :添加 z -index 属性表示叶片叠放顺序

颜色标注陷阱规避

建立光照 - 颜色对照参考系:

光照条件 颜色修正参数
强光直射 RGB 值×0.9 + 亮度 +10
阴天 饱和度×1.2 + 对比度×1.1
人工光源 白平衡校准到 5500K

学名映射表维护技巧

使用 pandas 构建别名 - 学名映射表:

import pandas as pd

name_mapping = pd.DataFrame([['当归', 'Angelica sinensis', {'别名': ['秦归', '云归']}],
    ['独活', 'Angelica pubescens', {'别名': ['香独活']}]
], columns=['中文名', '拉丁学名', '其他信息'])

# 快速查询
print(name_mapping[name_mapping['中文名'].str.contains('独活')])

开放性问题探讨

增量标注流程设计

当新增 10 种草药时,如何避免重新标注已有数据?建议方案:
1. 建立标注版本控制系统(类似 git)
2. 新旧标签体系建立映射关系
3. 对受影响样本进行定向重标

Active Learning 策略选择

在半自动标注中,哪种采样策略最适合中草药数据?
不确定性采样 :选择模型预测概率接近 0.5 的样本
多样性采样 :选择特征空间分布边缘的样本
混合策略 :先多样性后不确定性的两阶段方法

我们的实践发现,对于形态相似的草药(如不同品种的黄芪),多样性采样效果更好。

写在最后

构建高质量中草药数据集就像老中医抓药——差之毫厘谬以千里。本文提到的方法使我们项目的标注效率提升了 40%,但仍有改进空间。特别好奇大家如何处理这类问题:
– 当遇到《中国药典》中没有记载的民间草药时,如何建立标注标准?
– 对于需要显微识别的药材(如花粉形态),该采用什么标注形式?
欢迎在评论区分享你的实战经验!

正文完
 0
评论(没有评论)