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
相关产品推荐
相关产品推荐

