0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一种对红细胞和白细胞图像分类任务的主动学习端到端工作流程

新机器视觉 来源:DeepHub IMBA 作者:Adi Nissim, Noam Sieg 2022-08-13 10:27 次阅读

本文介绍一种对红细胞和白细胞图像分类任务的主动学习端到端工作流程。

通过细胞图像的标签对模型性能的影响,为数据设置优先级和权重。 许多机器学习任务的主要障碍之一是缺乏标记数据。而标记数据可能会耗费很长的时间,并且很昂贵,因此很多时候尝试使用机器学习方法来解决问题是不合理的。 为了解决这个问题,机器学习领域出现了一个叫做主动学习的领域。主动学习是机器学习中的一种方法,它提供了一个框架,根据模型已经看到的标记数据对未标记的数据样本进行优先排序。 细胞成像的分割和分类等技术是一个快速发展的领域研究。就像在其他机器学习领域一样,数据的标注是非常昂贵的,并且对于数据标注的质量要求也非常的高。针对这一问题,本篇文章介绍一种对红细胞和白细胞图像分类任务的主动学习端到端工作流程。 我们的目标是将生物学和主动学习的结合,并帮助其他人使用主动学习方法解决生物学领域中类似的和更复杂的任务。 本篇文主要由三个部分组成:
  • 细胞图像预处理——在这里将介绍如何预处理未分割的血细胞图像。
  • 使用CellProfiler提取细胞特征——展示如何从生物细胞照片图像中提取形态学特征,以用作机器学习模型的特征。
  • 使用主动学习——展示一个模拟使用主动学习和不使用主动学习的对比实验。

细胞图像预处理

我们将使用在MIT许可的血细胞图像数据集(GitHub和Kaggle)。每张图片都根据红细胞(RBC)和白细胞(WBC)分类进行标记。对于这4种白细胞(嗜酸性粒细胞、淋巴细胞、单核细胞和中性粒细胞)还有附加的标签,但在本文的研究中没有使用这些标签。 下面是一个来自数据集的全尺寸原始图像的例子: 6ec9d9ea-1a86-11ed-ba43-dac502259ad0.png  创建样本DF 原始数据集包含一个export.py脚本,它将XML注释解析为一个CSV表,其中包含每个细胞的文件名、细胞类型标签和边界框。 原始脚本没有包含cell_id列,但我们要对单个细胞进行分类,所以我们稍微修改了代码,添加了该列并添加了一列包括image_id和cell_id的filename列:

										
import os, sys, randomimport xml.etree.ElementTree as ETfrom glob import globimport pandas as pdfrom shutil import copyfile
annotations = glob('BCCD_Dataset/BCCD/Annotations/*.xml')df = []for file in annotations:  #filename = file.split('/')[-1].split('.')[0] + '.jpg'  #filename = str(cnt) + '.jpg'  filename = file.split('\')[-1]  filename =filename.split('.')[0] + '.jpg'  row = []  parsedXML = ET.parse(file)  cell_id = 0  for node in parsedXML.getroot().iter('object'):      blood_cells = node.find('name').text      xmin = int(node.find('bndbox/xmin').text)      xmax = int(node.find('bndbox/xmax').text)      ymin = int(node.find('bndbox/ymin').text)      ymax = int(node.find('bndbox/ymax').text)
      row = [filename, cell_id, blood_cells, xmin, xmax, ymin, ymax]      df.append(row)      cell_id += 1
data = pd.DataFrame(df, columns=['filename', 'cell_id', 'cell_type', 'xmin', 'xmax', 'ymin', 'ymax'])data['image_id'] = data['filename'].apply(lambda x: int(x[-7:-4]))data[['filename', 'image_id', 'cell_id', 'cell_type', 'xmin', 'xmax', 'ymin', 'ymax']].to_csv('bccd.csv', index=False)
裁剪 为了能够处理数据,第一步是根据边界框坐标裁剪全尺寸图像。这就产生了很多大小不一的细胞图像: 6eecf826-1a86-11ed-ba43-dac502259ad0.jpg6f027dcc-1a86-11ed-ba43-dac502259ad0.jpg6f17ab98-1a86-11ed-ba43-dac502259ad0.jpg6f30dfb4-1a86-11ed-ba43-dac502259ad0.jpg  裁剪的代码如下:

										
import osimport pandas as pdfrom PIL import Image

def crop_cell(row):  """  crop_cell(row)
  given a pd.Series row of the dataframe, load row['filename'] with PIL,  crop it to the box row['xmin'], row['xmax'], row['ymin'], row['ymax']  save the cropped image,  return cropped filename  """  input_dir = 'BCCDJPEGImages'  output_dir = 'BCCDcropped'  # open image  im = Image.open(f"{input_dir}{row['filename']}")
  # size of the image in pixels  width, height = im.size
  # setting the points for cropped image  left = row['xmin']  bottom = row['ymax']  right = row['xmax']  top = row['ymin']
  # cropped image  im1 = im.crop((left, top, right, bottom))  cropped_fname = f"BloodImage_{row['image_id']:03d}_{row['cell_id']:02d}.jpg"  # shows the image in image viewer  # im1.show()
  # save image  try:      im1.save(f"{output_dir}{cropped_fname}")  except:      return 'error while saving image'
  return cropped_fname
if __name__ == "__main__":  # load labels csv into Pandas DataFrame  filepath = "BCCDdataset2-masterlabels.csv"  df = pd.read_csv(filepath)
  # iterate through cells, crop each cell, and save cropped cell to file  dataset_df['cell_filename'] = dataset_df.apply(crop_cell, axis=1)
以上就是我们所做的所有预处理操作。现在,我们继续使用CellProfiler提取特征。

使用CellProfiler提取细胞特征

CellProfiler是一个免费的开源图像分析软件,可以从大规模细胞图像中自动定量测量。CellProfiler还包含一个GUI界面,允许我们可视化的操作。 首先下载CellProfiler,如果CellProfiler无法打开,则可能需要安装Visual C ++发布包,具体安装方式参考官网。 打开软件就可以加载图像了, 如果想构建管道可以在CellProfiler官网找到其提供的可用的功能列表。大多数功能分为三个主要组:图像处理,目标的处理和测量。常用的功能如下: 图像处理 - 转为灰度图: 6f442eac-1a86-11ed-ba43-dac502259ad0.png  目标对象处理 - 识别主要对象 6f5dc132-1a86-11ed-ba43-dac502259ad0.png  测量 - 测量对象强度 6f81633a-1a86-11ed-ba43-dac502259ad0.png  CellProfiler可以将输出为CSV文件或者保存指定数据库中。这里我们将输出保存为CSV文件,然后将其加载到Python进行进一步处理。 说明:CellProfiler还可以将你处理图像的流程保存并进行分享。

主动学习

我们现在已经有了训练需要的搜有数据,现在可以开始试验使用主动学习策略是否可以通过更少的数据标记获得更高的准确性。我们的假设是:使用主动学习可以通过大量减少在细胞分类任务上训练机器学习模型所需的标记数据量来节省宝贵的时间和精力。 主动学习框架 在深入研究实验之前,我们希望对modAL进行快速介绍:modAL是Python的活跃学习框架。它提供了Sklearn API,因此可以非常容易地将其集成到代码中。该框架可以轻松地使用不同的主动学习策略。他们的文档也很清晰,所以建议从它开始你的一个主动学习项目。 主动学习与随机学习 为了验证假设,我们将进行一项实验,将添加新标签数据的随机子抽样策略与主动学习策略进行比较。开始用一些相同的标记样本训练2个Logistic回归估计器。然后将在一个模型中使用随机策略,在第二个模型中使用主动学习策略。 我们首先为实验准备数据,加载由Cell Profiler创建的特征。这里过滤了无色血细胞的血小板,只保留红和白细胞(将问题简化,并减少数据量) 。所以现在我们正在尝试解决二进制分类问题 - RBC与WBC。使用Sklearn Label的label encoder进行编码,并拆分数据集进行训练和测试。

										
# imports for the whole experimentimport numpy as npfrom matplotlib import pyplot as pltfrom modAL import ActiveLearnerimport pandas as pdfrom modAL.uncertainty import uncertainty_samplingfrom sklearn import preprocessingfrom sklearn.metrics import , average_precision_scorefrom sklearn.linear_model import LogisticRegression
# upload the cell profiler features for each celldata = pd.read_csv('Zaretski_Image_All.csv')
# filter plateletsdata = data[data['cell_type'] != 'Platelets']
# define the labeltarget = 'cell_type'label_encoder = preprocessing.LabelEncoder()y = label_encoder.fit_transform(data[target])
# take the learning features onlyX = data.iloc[:, 5:]
# create training and testing setsX_train, X_test, y_train, y_test = train_test_split(X.to_numpy(), y, test_size=0.33, random_state=42)
下一步就是创建模型:

										
dummy_learner = LogisticRegression()
active_learner = ActiveLearner(estimator=LogisticRegression(),query_strategy=uncertainty_sampling())
dummy_learner是使用随机策略的模型,而active_learner是使用主动学习策略的模型。为了实例化一个主动学习模型,我们使用modAL包中的ActiveLearner对象。在“estimator”字段中,可以插入任何sklearnAPI兼容的模型。在query_strategy '字段中可以选择特定的主动学习策略。这里使用“uncertainty_sampling()”。这方面更多的信息请查看modAL文档。 将训练数据分成两组。第一个是训练数据,我们知道它的标签,会用它来训练模型。第二个是验证数据,虽然标签也是已知的但是我们假装不知道它的标签,并通过模型预测的标签和实际标签进行比较来评估模型的性能。然后我们将训练的数据样本数设置成5。

										
# the training size that we will start withbase_size = 5
# the 'base' data that will be the training set for our modelX_train_base_dummy = X_train[:base_size]X_train_base_active = X_train[:base_size]y_train_base_dummy = y_train[:base_size]y_train_base_active = y_train[:base_size]
# the 'new' data that will simulate unlabeled data that we pick a sample from and label itX_train_new_dummy = X_train[base_size:]X_train_new_active = X_train[base_size:]y_train_new_dummy = y_train[base_size:]y_train_new_active = y_train[base_size:]
我们训练298个epoch,在每个epoch中,将训练这俩个模型和选择下一个样本,并根据每个模型的策略选择是否将样本加入到我们的“基础”数据中,并在每个epoch中测试其准确性。因为分类是不平衡的,所以使用平均精度评分来衡量模型的性能。 在随机策略中选择下一个样本,只需将下一个样本添加到虚拟数据集的“新”组中,这是因为数据集已经是打乱的的,因此不需要再进行这个操作。对于主动学习,将使用名为“query”的ActiveLearner方法,该方法获取“新”组的未标记数据,并返回他建议添加到训练“基础”组的样本索引。被选择的样本都将从组中删除,因此样本只能被选择一次。

										
# arrays to accumulate the scores of each simulation along the epochsdummy_scores = []active_scores = []# number of desired epochsrange_epoch = 298# running the experimentfor i in range(range_epoch):  # train the models on the 'base' dataset  active_learner.fit(X_train_base_active, y_train_base_active)  dummy_learner.fit(X_train_base_dummy, y_train_base_dummy)
  # evaluate the models  dummy_pred = dummy_learner.predict(X_test)  active_pred = active_learner.predict(X_test)
  # accumulate the scores  dummy_scores.append(average_precision_score(dummy_pred, y_test))  active_scores.append(average_precision_score(active_pred, y_test))
  # pick the next sample in the random strategy and randomly  # add it to the 'base' dataset of the dummy learner and remove it from the 'new' dataset  X_train_base_dummy = np.append(X_train_base_dummy, [X_train_new_dummy[0, :]], axis=0)  y_train_base_dummy = np.concatenate([y_train_base_dummy, np.array([y_train_new_dummy[0]])], axis=0)  X_train_new_dummy = X_train_new_dummy[1:]  y_train_new_dummy = y_train_new_dummy[1:]
  # pick next sample in the active strategy  query_idx, query_sample = active_learner.query(X_train_new_active)
  # add the index to the 'base' dataset of the active learner and remove it from the 'new' dataset  X_train_base_active = np.append(X_train_base_active, X_train_new_active[query_idx], axis=0)  y_train_base_active = np.concatenate([y_train_base_active, y_train_new_active[query_idx]], axis=0)  X_train_new_active = np.concatenate([X_train_new_active[:query_idx[0]], X_train_new_active[query_idx[0] + 1:]], axis=0)  y_train_new_active = np.concatenate([y_train_new_active[:query_idx[0]], y_train_new_active[query_idx[0] + 1:]], axis=0)
结果如下:

										
plt.plot(list(range(range_epoch)), active_scores, label='Active Learning')plt.plot(list(range(range_epoch)), dummy_scores, label='Dummy')plt.xlabel('number of added samples')plt.ylabel('average precision score')plt.legend(loc='lower right')plt.savefig("models robustness vs dummy.png", bbox_inches='tight')plt.show()
6f99b278-1a86-11ed-ba43-dac502259ad0.png  策略之间的差异还是很大的,可以看到主动学习只使用25个样本就可以达到平均精度0.9得分!而使用随机的策略则需要175个样本才能达到相同的精度! 此外主动学习策略的模型的分数接近0.99,而随机模型的分数在0.95左右停止了!如果我们使用所有数据,那么它们最终分数是相同的,但是我们的研究目的是在少量标注数据的前提下训练,所以只使用了数据集中的300个随机样本。

总结

本文展示了将主动学习用于细胞成像任务的好处。主动学习是机器学习中的一组方法,可根据其标签对模型性能的影响来优先考虑未标记的数据示例的解决方案。由于标记数据是一项涉及许多资源(金钱和时间)的任务,因此判断那些标记那些样本可以最大程度地提高模型的性能是非常必要的。 细胞成像为生物学,医学和药理学领域做出了巨大贡献。以前分析细胞图像需要有价值的专业人力资本,但是像主动学习这种技术的出现为医学领域这种需要大量人力标注数据集的领域提供了一个非常好的解决方案。 本文引用:
  • GitHub — Shenggan/BCCD_Dataset: BCCD (Blood Cell Count and Detection) Dataset is a small-scale dataset for blood cells detection.

  • Blood Cell Images | Kaggle

  • Active Learning in Machine Learning | by Ana Solaguren-Beascoa, PhD | Towards Data Science

  • Carpenter, A. E., Jones, T. R., Lamprecht, M. R., Clarke, C., Kang, I. H., Friman, O., … & Sabatini, D. M. (2006).

  • CellProfiler: image analysis software for identifying and quantifying cell phenotypes. Genome biology, 7(10), 1–11.

  • Stirling, D. R., Swain-Bowden, M. J., Lucas, A. M., Carpenter, A. E., Cimini, B. A., & Goodman, A. (2021).


审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像分类
    +关注

    关注

    0

    文章

    87

    浏览量

    11838
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130553
  • 预处理
    +关注

    关注

    0

    文章

    32

    浏览量

    10409

原文标题:​细胞图像数据的主动学习

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于启扬 i.MX8M Mini核心板的全自动细胞分析仪应用解决方案

    全自动细胞分析仪是医院临床检验应用非常广泛的仪器之一,用来检测红细胞、血红蛋白、白细胞、血小板等项目。基于光学原理和图像分析技术,通过光学镜头和相机等设备捕获
    的头像 发表于 03-09 08:00 98次阅读
    基于启扬 i.MX8M Mini核心板的全自动<b class='flag-5'>细胞</b>分析仪应用解决方案

    安泰ATA-7050高压放大器在微流控细胞分选中的应用

    微流控细胞分选是一种用于分离和鉴定生物样本中特定类型细胞的技术,其原理基于将生物细胞通过微通道进行操纵和区分。微流控细胞分选的原理主要基于流
    的头像 发表于 03-01 16:56 166次阅读
    安泰ATA-7050高压放大器在微流控<b class='flag-5'>细胞</b>分选中的应用

    YOLOv8+PyQT5打造细胞计数与识别应用说明

    YOLOv8对象检测模型基于自定义数据集训练红白细胞检测模型,然后通过工具导出模型为ONNX,基于OpenVINO实现模型推理,完成细胞检测识别,根据检测到的细胞类别与数目,统计,在PyQT5打造的界面上显示输出检测结果。
    的头像 发表于 01-15 17:22 534次阅读
    YOLOv8+PyQT5打造<b class='flag-5'>细胞</b>计数与识别应用说明

    荧光显微镜细胞图像检测实战

    图像数据集是 U2OS 细胞高通量化学筛选的一部分,其中包含 200 种生物活性化合物的示例。治疗效果最初是使用细胞绘画测定(荧光显微镜)成像的。该数据集仅包括每种化合物的单个视场的 DNA 通道
    的头像 发表于 01-07 15:44 257次阅读
    荧光显微镜<b class='flag-5'>细胞</b><b class='flag-5'>图像</b>检测实战

    ATA-2031高压放大器在细胞分选中的应用研究

    细胞分选是一项重要的实验技术,用于从复杂的细胞混合物中分离出特定类型的细胞。在细胞生物学和医学研究领域,准确地分选目标细胞对于实现各种研究目
    的头像 发表于 12-14 11:14 196次阅读

    用于癌细胞转移亚型无标记分层的微流控流式细胞仪+深度学习

    细胞变形性(Cellular deformability)是医学上评价细胞生理状态的一种很有前景的生物标志物。
    的头像 发表于 10-27 09:58 1659次阅读
    用于癌<b class='flag-5'>细胞</b>转移亚型无标记分层的微流控流式<b class='flag-5'>细胞</b>仪+深度<b class='flag-5'>学习</b>

    解密GPU工作流程 | 从数据到图像

    在现代计算机图形领域,GPU(GraphicsProcessingUnit,图形处理器)是不可或缺的组成部分,负责加速图形渲染和计算任务。本文将简单介绍GPU工作流程,包括其从数据输入到图像输出
    的头像 发表于 10-16 18:22 588次阅读
    解密GPU<b class='flag-5'>工作流程</b> | 从数据到<b class='flag-5'>图像</b>

    细胞细胞注释详解之singleR细胞注释

    除了对每个细胞的所属细胞类型进行评分外,singleR还会对seuret聚类结果中每个cluster中各细胞类型比例进行分析,评估每个cluster所属的细胞类型。结果由
    的头像 发表于 09-21 17:34 1386次阅读
    单<b class='flag-5'>细胞</b><b class='flag-5'>细胞</b>注释详解之singleR<b class='flag-5'>细胞</b>注释

    卷积神经网络算法流程 卷积神经网络模型工作流程

    卷积神经网络算法流程 卷积神经网络模型工作流程  卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于目标跟踪、图像识别和语音识别等领域的深
    的头像 发表于 08-21 16:50 1581次阅读

    用于单细胞谱系追踪图像引导的微流控系统

    细胞谱系追踪是生物学研究中一个长期未解决的问题。微流控技术具有解决这一问题的潜力,因为其能够以一种快速、可控和高效的方式操纵和处理单细胞
    的头像 发表于 08-18 09:10 828次阅读
    用于单<b class='flag-5'>细胞</b>谱系追踪<b class='flag-5'>图像</b>引导的微流控系统

    心肌细胞搏动时钙离子浓度的变化与细胞收缩在时间上的先后分析

    色荧光的Fluo-8被用于钙离子浓度的监测,而明场的相差(phase contrast)成像则是采用了600-680nm的红光。通过对单个细胞中钙离子浓度和相差图像的分析,可以看出钙离子的浓度上升是稍稍领先于心肌细胞的收缩的。
    的头像 发表于 08-03 06:49 338次阅读
    心肌<b class='flag-5'>细胞</b>搏动时钙离子浓度的变化与<b class='flag-5'>细胞</b>收缩在时间上的先后分析

    斑马鱼双色双光子lightsheet成像

    双色的3维lightsheet成像。样品是3天大小的斑马鱼,红色和绿色的荧光探针分别标记着红细胞和胰岛细胞,为了能够尽可能缩短3维图像的采集时间,以防红细胞在血管中的移动影响成像质量,
    的头像 发表于 07-24 07:08 306次阅读
    斑马鱼双色双光子lightsheet成像

    VR细胞制备与质控虚拟实验室

    VR细胞制备与质控虚拟实验是一种基于虚拟现实技术的实验,它可以帮助学生在计算机上进行细胞制备流程的虚拟仿真实验。这种技术可以提供更加逼真的学习
    的头像 发表于 07-18 15:21 264次阅读

    半导体制冷技术应用--血细胞分析仪

    细胞分析仪是广泛应用于医疗领域的血液检测仪器,能检测出血液参数中红白细胞总数、血小板和血红蛋白等多种血液项目,并通过计算给出各细胞相关参数,得出来的参数能为医生诊断和治疗患者提供有效依据,是临床
    的头像 发表于 06-30 15:54 403次阅读
    半导体制冷技术应用--血<b class='flag-5'>细胞</b>分析仪

    基于微纳流控平台的细胞外囊泡荧光标记新策略

    细胞外囊泡(EVs)是由细胞主动释放的、具有膜结构的纳米级囊泡,携带核酸、蛋白质和脂质等生物活性分子,从而实现细胞间的物质交换。然而长期以来,由于其百纳米级的尺寸特性,难以实现可靠的可
    的头像 发表于 05-25 16:36 686次阅读
    基于微纳流控平台的<b class='flag-5'>细胞</b>外囊泡荧光标记新策略