You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras/TensorFlow多标签图像分类的CSV数据格式与标签处理方法

医学影像长文本标注拆分与TensorFlow/Keras适配方案

实现逻辑

整个流程分两步:

  • 按指定分隔符拆分整段医学报告,清洗无效片段后控制单张图像对应5-7个独立语义标签
  • 基于全数据集标签表做二值编码,输出符合Keras多标签分类输入要求的numpy数组

具体实现代码

基础依赖导入

import pandas as pd
import numpy as np
import re
import os
from PIL import Image

标签拆分与清洗

按照英文句号、逗号做分隔符拆分,同时过滤无效内容、控制单样本标签数量:

def split_and_clean(raw_report):
    # 正则匹配.和,作为分隔符,自动跳过连续分隔符的情况
    segments = re.split(r'[.,]', raw_report)
    valid_segs = []
    for seg in segments:
        seg = seg.strip().lower()
        # 过滤空内容、全为脱敏占位符XXXX、长度过短的无效片段
        if not seg or len(seg.replace('x', '').strip()) < 3 or len(seg) < 5:
            continue
        valid_segs.append(seg)
    # 控制单图标签数在5-7区间
    if len(valid_segs) > 7:
        # 优先保留含病灶相关描述的标签,正常描述靠后截断
        lesion_kws = ['effusion', 'pneumothorax', 'edema', 'consolidation', 'cardiomegaly', 'opacity', 'lesion', 'emphysema', 'scarring', 'fracture']
        valid_segs = sorted(valid_segs, key=lambda x: -sum(1 for kw in lesion_kws if kw in x))[:7]
    # 标签数不足5个时补通用无异常标签
    while len(valid_segs) < 5:
        valid_segs.append('no additional finding')
    return valid_segs

# 读取原始CSV数据集
df = pd.read_csv("dataset.csv")
df["labels_per_img"] = df["labels"].apply(split_and_clean)

标签转模型可识别numpy格式

Keras多标签分类要求标签为形状(样本总数, 标签类别总数)的二值数组,每个位置取值0/1对应该标签是否在当前样本中出现:

# 构建全数据集标签映射表
all_labels = []
for labs in df["labels_per_img"]:
    all_labels.extend(labs)
unique_labels = sorted(list(set(all_labels)))
label2id = {lab: idx for idx, lab in enumerate(unique_labels)}
num_classes = len(unique_labels)

# 生成二值标签数组
label_np = np.zeros(shape=(len(df), num_classes), dtype=np.int8)
for row_id, labs in enumerate(df["labels_per_img"]):
    for lab in labs:
        label_np[row_id, label2id[lab]] = 1

对接模型训练

如果内存足够可以一次性加载所有图像,和标签数组组成训练输入;内存不足可以放到tf.data流水线里按需加载:

# 示例:一次性加载图像(默认resize到224*224适配常见分类模型,归一化到0-1区间)
IMG_SIZE = (224, 224)
def read_img(img_name, root_dir="images/"):
    img = Image.open(os.path.join(root_dir, img_name)).convert("RGB")
    img = img.resize(IMG_SIZE)
    return np.array(img, dtype=np.float32) / 255.0

img_np = np.array([read_img(uid) for uid in df["uid"]])

# 最终输入格式:img_np形状为(样本数, 224, 224, 3),label_np形状为(样本数, num_classes),可直接传入model.fit
# 注意:多标签分类模型最后一层用sigmoid激活,损失函数选binary_crossentropy,不要用softmax和categorical_crossentropy

优化提示

  • 拆分后如果存在语义重复的标签(比如no pneumothorax和no evidence of pneumothorax),可以手动做映射合并,降低标签维度减少冗余
  • 脱敏占位符XXXX占比过高的标签可以直接丢弃,避免引入无意义特征
  • 如果需要更细粒度的标签,可以在拆分后对短文本做关键词提取,进一步压缩标签长度统一语义

内容的提问来源于stack exchange,提问作者albert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:06:20