最近为了生计一直奔波,没有时间更新文章了。
前几天,群里面有个小伙伴,询问关于医疗疾病的一些相关训练和使用。
想着这几天有时间,就来玩一下这个“local disease label detection”。
由于一些原因,使用了一台性能不是很高的电脑,用来搭建和训练模型,大家可以做个参考。
主要看下显卡:GeForce GTX 1650 4G显存。(有能力的小伙伴可以升级下显卡)
这里为什么要强调下显卡呢,群里小伙伴想用resnet50来搭建和训练网络。这个网络有超过2500万个参数,这张显卡显然带动不了。所以就降低了参数,构建差不多20万的参数就可以了。
这里介绍下大体的思路,其实跟前面聊的差不多,分析此类问题,由于时间和样本的问题,我这里就简单的使用多分类任务来处理,当然,常规的可以使用目标识别任务来处理,这样可以定位出病灶位置。
首先,我们看下样本的主要数据。
这里我们选择使用,Image Index和Finding Labels 这两个数据。解释下,Image Index 是图片文件名 Finding Labels 是疾病名称。我整理下了,一共有14种疾病名称,但是这14种疾病可以同时存在多个疾病的组合情况。以下是样本包含的疾病名称
{
'肺不张',
'扩张型心脏',
'延迟折叠阶段',
'水肿',
'胸腔积液',
'肺气肿',
'纤维化',
'隔疝',
'阴影',
'肿块',
'没有发现',
'结节',
'肺纹理增加',
'肺炎',
'气胸'
}
搭建一个简单的网络模型
# 添加卷积层和池化层
model.add(Convolution2D(filters=32,kernel_size=(3, 3),padding='same', activation='relu', input_shape=(target_height, target_width, 3)))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Convolution2D(filters=32,kernel_size=(3, 3),padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
model.add(Convolution2D(filters=512, kernel_size=(3, 3),padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2),strides=(2,2)))
# 将特征图展平为一维向量
model.add(Flatten())
# 添加全连接层
model.add(Dense(128, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(15, activation='sigmoid'))
model.fit_generator(generator=generator_data(),
steps_per_epoch=math.ceil(len(train_data)/batch_size)+1,
epochs=10,
callbacks=[generatorCallback()])
在经过长达15个小时的训练之后,accuracy在超过80%之后,就得到了一个70M左右的模型。
使用模型进行测试展示效果如下:
结果中,我将概率最高的一类标红以便于寻找。
模型比较小,但是准确率还是非常高的。只是有一点遗憾,有些正片经过AI的预测,某一项疾病概率非常高,但是我又没法辨别是否真实存在,所以我不确定这个是预测错误还是真实预测到了?这个问题,如果有机会可以到实际的生产中去验证。当然这个模型肯定是要重新扩充和修改的。
以上就是粗略的解决思路,非常感谢大家!
如有疑问请到君羊:195889612