使用简单方法在图像中检测血细胞-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
对象检测的基础是数据的外观。现在,本文将介绍可用于解决对象检测问题的不同深度学习架构。让我们首先讨论我们将要处理的问题陈述。
目录
1.理解问题陈述:血细胞检测
2.数据集链接
3.解决物体检测问题的简单方法
4.实现简单方法的步骤
·加载数据集
·数据探索
·为简单方法准备数据集
·创建培训和验证集
·定义分类模型架构
·培训模式
·做出预测
5.结论
理解问题陈述血细胞测试
问题陈述
对于一组给定的血细胞图像,我们必须检测图像中的白细胞。现在这是来自数据集的示例图像。如您所见,您可以看到一些红涩阴影区域和蓝涩或紫涩区域。
在上图中,红涩阴影区域是红细胞(RBC),紫涩阴影区域是白细胞(WBC),一些小的黑涩突起是血小板。
如图所示,我们有多个对象和多个类。
为了简单起见,我们将其转化为单类单对象问题。这意味着我们将只考虑白细胞。
因此,只有一类白细胞,其余的都被忽略了。此外,我们将只保留单个白细胞的图像。
因此,具有多个白细胞的图像将从数据集中删除。
下面是我们将如何从该数据集中选择图像。
因此,我们删除了图像2和图像5,因为图像5没有白细胞,而图像2有两个白细胞,其他图像保留在数据集中。类似地,测试集将只有一个白细胞。
现在,对于每个图像,我们在白细胞周围都有一个边界框。如图所示,我们的文件名为1.jpg。这些是白细胞周围边界框的边界框坐标。
在下一节中,我们将介绍一种解决此对象检测问题的简单方法。
一种解决目标检测问题的简单方法
在本节中,我们将讨论解决对象检测问题的简单方法。因此,让我们首先了解任务。我们必须检测血细胞图像中的白细胞,如下图所示。
现在,最简单的方法是将图像分成多个块,因此对于这张图像,将图像分成四个块。
我们对每个块进行分类,所以第一块没有白细胞,第二块有白细胞,而第三块和第四块没有白血球。
我们已经熟悉分类过程以及如何构建分类算法。因此,我们可以很容易地将这些单独的块分为是和否来表示白细胞。
现在,在下图中,具有白涩单元格的块(绿涩框)可以表示为边界框,因此在这种情况下,我们将获取该块的坐标值并将其返回到白涩单元格的边界框。
现在,为了实现这个方法,我们首先需要准备我们的训练数据。
现在可能有一个问题,为什么我们需要准备培训数据?我们已经有了这些图像和边界框。
我们的训练数据采用以下格式,其中我们有白细胞边界框和边界框坐标。
现在,请注意,我们有完整图像的边界框坐标,但我们将图像分成四个块。我们需要所有四个块的边界框坐标。下一个问题是我们如何做到
假设我们有一个大小为(640*480)的图像。所以原点是(0,0)。上图有x轴和y轴,其中坐标值为(640480)。
现在,让我们找到中点,即(320240)。一旦我们有了这些值,我们就可以很容易地找到每个块的坐标。因此,对于第一个块,我们的Xmin和Ymin将为(0,0),而Xmax和Ymax将为(320240)。
同样,我们可以在第二.第三和第四个街区找到它。一旦我们有了这些块的坐标值或边界框值。下一个任务是确定这个区块中是否有白细胞。
这里我们可以清楚地看到,区块2有白细胞,而其他区块没有。然而,我们无法在数据集中的每个块的每个图像上手动标记白细胞。
现在在下一节中,我们将实现一个简单的方法。
实施简单方法的步骤
在上一节中,我们讨论了一种简单的对象检测方法。现在让我们定义在血细胞检测问题上实现该方法的步骤。
以下是需要遵循的步骤:
1.加载数据集
2.数据探索
3.为简单方法准备数据集
4.创建培训和验证集
5.定义分类模型架构
6.培训模式
7.做出预测
让我们继续下一节来实现上述步骤。
1.加载所需的库和数据集
因此,让我们从加载所需的库开始。Numpy.pandas和matchlotlib用于可视化数据。我们加载了一些库来处理和调整图像大小,最后加载了torch库。
#导入所需库
将numpy导入为np
将熊猫导入为pd
将matplotlib.pyplot导入为plt
%matplotlib内联
导入操作系统
从PIL导入图像
from skiage.transform导入调整大小
进口焊炬
从火炬进口nn
现在我们将固定一个随机种子值。
#固定随机种子值以停止潜在的随机姓种子=42
rng=np.random.RandomState(种子)
这里,我们将安装驱动器,因为数据集存储在驱动器上。
#安装驱动器
从google.colab导入驱动器
drive.mount(‘/content/drive’)
现在,因为驱动器上的数据是以zip格式提供的。我们必须解压缩数据,这里我们将解压缩数据。
因此,我们可以看到所有图像都被加载并存储在名为images的文件夹中。在这个文件夹的末尾,我们有一个CSV文件,它是traine.CSV。
#从驱动器中解压缩数据集
! 解压缩/内容/驱动器/我的驱动器/火车_zedkk38.zip
2.数据探索
阅读CSV文件,找出”train.CSV”文件中存储的信息。
##读取目标文件
数据=pd.read_csv(‘train.csv’)
数据形状
打印CSV文件的前几行。我们可以看到文件有image_name和cell_type,它们将代表红细胞或白细胞等。最后,这个特定对象在这个特定图像中的边界框坐标。data.head()
因此,如果我们检查红细胞.白细胞和血小板的计数。我们将看到红细胞的数量最多,其次是白细胞和血小板。
数据单元格类型值计数()
现在,为了简单起见,我们将只考虑白细胞。因此,我们只选择了白细胞数据。
现在我们有了这些图像的image_name和cell_type WBC。还有边界框坐标。
(data.loc〔data〔’cell’type’〕==’WBC’〕).head()
让我们看看原始数据集中的一些图像及其形状。
我们可以看到这些图像的形状是(480640,3)。这是一个具有三个通道的RGB图像。这是数据集中的第一个图像。
图像=plt.imread(‘图像/’+’1.jpg’)
打印(image.shape)
plt.imshow(图片)
下一步是用这个图像创建一个块。我们将学习如何将这幅画分成四部分。现在我们知道图像的形状是(640480)。所以这张图片的中点是(320240),中心是(0,0)。
因此,我们有图像中所有这些块的坐标,在这里我们将使用这些坐标创建块。
这些坐标的格式为Ymin.Ymax.Xmin和Xmax。这里我们的(Ymin,Ymax)是(0240),(Xmin,Xmax)则是(0320)。这基本上代表了第一个块。
类似地,对于接下来的第二.第三和第四个块,我们有image_2.image_3和image_4。这是一个可以从图像创建块的过程。
#从图像创建4个补丁
#格式ymin.ymax.xmin.xmax
图像_1=图像[0:240,0:320,:]
图像_2=图像[0:240,320:640,:]
图像_3=图像[240:480,0:320,:]
图像_4=图像[240:480,320:640,:]
现在我们需要为这些块分配一个目标值。为了做到这一点,我们计算并集的交集,并且我们必须找出交集区域和并集区域。
所以相交区域是特定的矩形。为了找到该区域,我们需要找到矩形的Xmin.Xmax.Ymin和Ymax的坐标。
定义iou(框1,框2):
Irect_xmin,Irect_ymin=max(框1[0],框2[0]),max(盒1[2],框2])
Irect _xmax,Irect _ ymax=min(方框1[1],方框2[1]),min(方框3[3],方框2[3])
如果Irect_xmax<Irect__xmin或Irect_ymax<Ilect_ymin:
目标=inter_面积=0
否则:
inter _ area=np.abs((Irect _xmax-Irect _ xmin)*(Irect_ymax-Ilect _ymin))
框1_面积=(框1[1]-框1[0])*(框1[3]-框1[2])
框2面积=(框2〔1〕-框2〔0〕)*
活接头面积=箱1面积+箱2面积-箱间面积
iou=inter_面积/union_面积
目标=int(iou>0.1)
返回目标
我们有来自训练CSV文件的原始边界框坐标。当我使用这两个值作为我们定义的”iou”函数的输入时,目标是1。
您也可以尝试使用不同的块,或根据您将获得的目标值。
框1=〔320,640,0,240〕
方框2=〔93,296,1,173〕
iou(框1,框2)
输出为0。现在下一步是准备数据集。
3.为简单方法准备数据集
我们只考虑并探索了数据集中的单个图像。因此,让我们对数据集中的所有图像执行这些步骤。这是我们掌握的完整数据。
data.head()
现在,我们正在转换这些细胞类型,红细胞是0,白细胞是1,血小板是2。
data〔’cell’type’〕=data〔’cell’type’〕.替换({’RBC’:0,’WBC’:1,’血小板’:2})
现在我们必须选择一个只有一个白血球的图像。
因此,我们首先创建一个数据集副本,然后只保留白细胞并删除包含多个白细胞的任何图像。
##仅保留单个WBC
data_wbc=data.loc〔data.cell〕type==1〕.copy()
data_wbc=data_wbc.drop_duplicates(子集=〔’image_name’,’cell_type’〕,keep=False)
现在我们已经选择了图像。我们将根据输入图像大小设置块坐标。
我们正在逐个读取图像并存储该特定图像的WBC边界框坐标,并使用我们在这里定义的块坐标从该图像中提取块。
然后我们使用自定义IoU函数来查找每个块的目标值。最后,我们将块大小调整为标准大小(224224,3)。这里,我们为每个块创建最终输入数据和目标数据。
#创建空列表
X=〔〕
Y=〔〕
#设置补丁坐标
补丁_1坐标=[0,320,0,240]
补丁_2_坐标=[320,640,0,240]
补丁_3坐标=[0,320,240,480]
补丁_ 4 _坐标=[320,640,240,480]
对于idx,data_wbc.iterrows()中的行:
#读取图像
image=plt.imread(‘images/’+row.image_name)
bb_坐标=〔row.xmin,row.max,row.jmin,row.ymax〕
#提取补丁
补丁_1=图像[patch _1坐标[2]:补丁_1坐标[3],补丁_1座标[0]:补丁_1_座标[1],:]
patch _2=图像〔patch _2坐标〔2〕:patch _2_2坐标〔3〕,patch _2_3坐标〔0〕:patch_2坐标〔1〕,:〕
补丁_3=图像[patch _3坐标[2]:补丁_3坐标[3],补丁_3座标[0]:补丁_33座标[1],:]
patch _4=图像[patch _4_坐标[2]:patch _4]坐标[3],patch _4-_坐标[0]:patch _ 4_坐标[1],:]
#设置默认值
target _1=target _2=target _3=target_4=inter_area=0
#找出补丁是否包含对象
##用于补丁_1
目标_1=iou(补丁_1坐标,bb坐标)
##用于补丁_2
target_2=iou(补丁_2_坐标,bb_坐标)
##用于补丁_3
目标_3=iou(补丁_3坐标,bb坐标)
##用于补丁_4
目标_4=iou(补丁_4坐标,bb坐标)
#调整补丁大小
补丁_1=调整大小(补丁_1,(224,224,3),保留_范围=True)
补丁_2=调整大小(补丁_2,(224,224,3),保留_范围=True)
补丁_3=调整大小(补丁_3,(224,224,3),保留_范围=True)
补丁_4=调整大小(补丁_4,(224,224,3),保留_范围=True)
#创建最终输入数据
十. 扩展(〔补丁_1,补丁_2,补丁_3,补丁_4〕)
#创建目标数据
Y. 延伸([target _1,target _2,target _3,target_4])
#将这些列表转换为单个numpy数组
X=np.数组(X)
Y=np.数组(Y)
现在,让我们打印原始数据和刚刚创建的新数据的形状。我们可以看到,我们最初有240张图片。
现在我们将这些图像分成四个部分,即(960224224,3)。这是图像的形状。
#每幅图像4个补丁
数据_ wbc.shape.X.shape和Y.shape
让我们快速查看一下我们刚刚创建的其中一个图像。这是我们的原始图像。这是原始图像的最后一块或第四块。我们可以看到,分配的目标是1。
图像=plt.imread(‘图像/’+’1.jpg’)]
plt.imshow(图片)
如果我们检查任何其他块,假设我想检查此图像的第一个块,这里我们将目标设置为0。您将得到第一个块。
同样,可以确保所有图像都转换为块,并相应地指定目标。
plt.imshow(X[0].ast类型(‘uint8’)),Y[0]
4.准备培训和验证集
现在我们有了数据集。我们将准备我们的培训和验证套件。现在请注意,我们的图像形状是(224224,3)。
#每幅图像4个补丁
数据_ wbc.shape.X.shape和Y.shape
输出为:
((240, 6),(960, 224, 224, 3),(960,))
在PyTorch,我们首先需要有渠道。因此,我们将使用形状(3224224)移动轴。
X=np.移动轴(X,-1,1)
十. 形状
输出为:
(960, 3, 224, 224)
现在,我们标准化图像像素值。
X=X/X最大()
使用训练测试分割功能,我们将创建一个训练集和一个验证集。
从sklearn.模型_选择导入列车_测试_拆分
X_列车,X_有效,Y_列车,Y_有效=列车_试验_分裂(X,Y,试验_大小=0.1,随机_状态=种子)
X_列车形状.X_有效形状.Y_列车形状和Y_有效形状
上述代码的输出为:
((864, 3, 224, 224),(96, 3, 224, 224),(864,),(96,))
现在,我们将训练集和验证集转换为张量,因为它们是”numpy”数组。
X_列车=火炬.FloatTensor(X_列车)
Y_列车=火炬.FloatTensor(Y_列车)
X_有效=火炬.FloatTensor(X_无效)
Y_有效=火炬.FloatTensor(Y_有效)
5.模型构造
现在,我们想建立我们的模型。这里我们安装了一个库,它是PyTorch模型摘要。
! pip安装pytorch-型号-摘要
这仅用于在PyTorch中打印模型摘要。现在让我们从这里导入summary函数。
从pytorch_模型_摘要导入摘要
这是我们为该方法定义的架构。
我们定义了一个时序模型,包括Conv2d层.3个输入通道.64个滤波器.5个滤波器和2个步骤。对于这个Conv2d层,有ReLU激活功能。窗口大小为4.步长为2的混合层,然后是卷积层。
现在平坦化Conv2d层的输出,最后是完整的连接层和S形激活函数。
##模型架构
模型=nn.顺序(
nn.Conv2d(in_通道=3,out_通道=64,内核_大小=5,步幅=2)
nn.ReLU()
nn.MaxPool2d(内核_大小=4,步幅=2)
nn.Conv2d(in_channel=64,out_channels=64,kernel_size=5,step=2)
nn.Flatten()
线姓(40000,1)
nn.Sigmoid()
)
在此处打印模型,这将是我们定义的模型架构。
打印(模型)
使用摘要功能,我们可以查看模型摘要。因此,这将为我们返回每个层的输出形状,以及每个层的可训练参数的数量。现在我们的模型准备好了。
打印(摘要(模型,X列〔:1〕))
现在,模型已准备好进行训练。
6.培训模式
让我们训练这个模型。所以我们需要定义损失函数和优化函数。我们将二元交叉熵定义为损失和Adam优化器。然后我们将模型传输到GPU。
这里,我们从输入图像中提取批次来训练模型。
##损耗和优化器
标准=torch.nn.BCELoss()
优化器=torch.optim.Adam(model.parameters(),lr=0.001)
##GPU设备
如果torch.cuda.可用():
model=model.cuda()
criteria=criteria.cuda()
因此,我们从x_train中提取批次并使用这些批次。我们将训练总共15个时代的模型。我们还设置了一个优化器。Zero_grad()并将输出存储在此处。
现在我们正在计算损耗并存储所有损耗,并执行反向传播和更新参数。此外,我们打印每个历元后的损失。
在产出中,我们可以看到损失在每个时期都在减少。因此,完成了该模型的训练。
#型号批量
批次_尺寸=32
#定义培训阶段
模型.train()
对于范围(15)中的历元:
#设置初始损耗为0
列车_损失=0.0
#随机选取图像,无需批量替换
排列=torch.randperm(X_train.size()[0])
#跟踪培训损失
训练_损失=〔〕
#用于批量培训的循环
对于范围(0,X列.size()[0],批次_size)中的i:
#从随机生成的值中提取索引
指数=排列〔i:i+批次_大小〕
#获取批次的图像和标签
批次_x,批次_y=x_列〔索引〕,y_列〔指数〕
如果torch.cuda.可用():
批次_x,批次_y=批次_x.cuda().float(),批次_y.cuda().float()
#清除所有累积坡度
优化器.zero_grad()
#小批量计算
输出=型号(批次_x)
#计算小批量的损失
损失=标准(outputs.squeze(),批次_y)
#存储每个小批量的损失
培训_ loss.append(loss.item())
#计算坡度
向后损失()
#更新参数
优化器.step()
培训_损失=平均np(培训_损失)
print(‘epoch:t’,epoch,’t训练损失:t’,训练_损失)
7.做出预测
现在让我们用这个模型来做预测。因此,在这里,我只从验证集中获取前五个输入,并将它们传输到Cuda。
输出=模型(X_有效〔:5〕.to(‘cuda’)).cpu().deach().numpy()
这是我们拍摄的前五幅图像的输出。现在我们可以看到前两个的输出没有白血球或白血球。
输出
这是输出:
阵列([0.00641595]
[0.01172841],
[0.99919134],
[0.01065345],
[0.00520921]],dtype=float32)
绘制图像。我们可以看到这是第三张图片。这里的模型显示有一个白血球,我们可以看到这张图片中有一个红血球。
plt.imshow(np.transpose(X有效[2]))
类似地,我们可以检查另一个图像,因此我们将得到第一个图像。
您可以看到输出图像。这个图像是我们的输入块。这个街区没有白血球。
plt.imshow(np.transpose(X有效〔1〕))
这是一种非常简单的方法来预测或识别带有白细胞的图像块或部分。
结论
使用简单的方法了解使用图像数据集的血细胞检测的实际实现。这是解决业务问题和开发模型的真正挑战。
处理图像数据时,必须分析一些任务,例如边界框.计算IoU值和评估指标。本文的下一个层次(未来任务)是图像可以有多个对象。任务是检测每个图像中的对象。我希望这些文章能帮助您了解如何使用图像数据检测血细胞以及如何建立检测模型。我们将使用这项技术并将其应用于医学分析领域。
600学习网 » 使用简单方法在图像中检测血细胞-600学习网