今天笔者刚刚开始亚博体育春节假期,但看到最新的疫情通报,死亡病例在几天之内已经由之前的2例,直线上升到了17例。

而且为防止疫情扩散武汉自今日10点起也开始停运公交、地铁,各离汉通道暂时关闭,在这里笔者遥祝在武汉及周边的各位友人,平平安安,身体健康。

做为一名IT从业者,笔者最佩服的就是信息融合的跨界能力,前文300秒就完成第一超算1万年的计算量,量子霸权真时代要来了吗曾经介绍过,科学家使用机器学习的方法来给量子计算机调优参数。所以在阅读疫情的相关材料后,笔者总结了一下,AI在很多方面应该可以跨界,能帮上一些忙。   

  AI诊断医学影像,可能被用于疾病初筛

我看到不明肺炎的诊断标准是

1.发热(≥38℃);

2.具有肺炎或急性呼吸窘迫综合征的影像学特征;

3.发病早期白细胞总数降低或正常,或淋巴细胞分类计数减少;

  1. 经抗生素规范治疗3~5天,病情无明显改善。

而且钟南山院士等多名专家也介绍了,此次冠状病毒肺炎在发病初起,血常规检测结果几乎没有什么有价值的线索,但是医学影像方面会有异常,由于影像诊断不是量化指标,很难像血结果那样指向明确,人工判断有一定的难度,而且也如钟院士所言,冬季流感本来就高发,如果血液检测没有定量的结果,那么仅靠人工进行影像学的筛查,来判断是否需要进一步确诊,可能会带来一定不确定因素。

人工智能在处理医学影像方面这些年来的进展还是相当不错的,2018年谷歌著名的AI女神李飞飞就曾经发表过一篇针对胸片影像进行深度学习检测的论文《Thoracic Disease Identification and Localization with Limited Supervision》

其模型工作原理也比较简单,先用Resnet进行特征提取,接下来通过全卷积网络进行分类,输出每种分类的得分,再使用多实例学习来学习多种类型图像,最后输出 图像类别以及对应区域的位置。

而且在医疗影像处理方面,国家大厂也是成绩斐然。比如在前年的肺结节检测大赛 (LUNA16)上,阿里云 ET 就在1186 个肺结节(75% 以上为小于 10mm 的小结节)的样本中, 在 7 个不同误报率下发现的肺结节平均成功率达到 89.7%。(注:LUNA大赛中使用召回率,是指在样本数据中成功发现的结节占比,这里使用成功率替代),下图显示了 ET 在不同误报次数下的召回率情况。

在模型结构设计上,ET 针对医学影像的特性,采用多通道、异构三维卷积融合算法、有效地利用多异构模型的互补性来处理和检测在不同形态上的肺结节,提高了对不同尺度肺结节的敏感性;同时使用了带有反卷积结构的网络和多任务学习的训练策略,提高了检测的准确度。

 而去年年末,国内顶级AI实验室腾讯优图,也将医疗 AI 深度学习预训练模型 MedicalNet

只要安装CUDA,从github上将该项目克隆下来

python train.py --gpu_id 0
虽然受时间限制,笔者还没有跑完训练脚本。根据Github上的资料显示,MedicalNet 提供的预训练网络可迁移到任何 3D 医疗影像的 AI 应用中,包括但不限于分割、检测、分类等任务。尤其值得一提的是,MedicalNet 特别在小数据医疗影像 AI 场景,能加快网络收敛,提升网络性能,这个特性比较本次疫情确诊样本相当稀缺的情况。

  AI胸片图像辅助动手实践

笔者在网上看到了胸片图像的分类数据集,

其中已经按照正常,细菌性肺炎和病毒性肺炎分好类了,其中病毒性肺炎的文件名中带有virus字样,细菌性肺炎中带有batiria字样。

那么接下来就是一个简单的图像分类的问题,这种方案简单的卷积神经网络就可以完成,笔者试验了一下以下代码可以调通,具体如下: 

import keras
import pandas as pd
import numpy as np
import os
from tensorflow import set_random_seed
from keras.models import Sequential
from keras.layers import Dropout
from keras.optimizers import Adam
from keras.layers import Dense, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import BatchNormalization
from keras.preprocessing.image import ImageDataGenerator

#定义文件路径
homepath='E:/ZhangLabDataset/'
#简单分类模型使用4层卷积,2层全连接,激活函数使用relu
np.random.seed(1)
set_random_seed(2)
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), activation="relu", padding="same",
input_shape=(128,128,1)))
model.add(Conv2D(filters=32, kernel_size=(3,3), activation="relu", padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"))
model.add(Conv2D(filters=64, kernel_size=(3,3), activation="relu", padding="same"))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(1024,activation="relu"))
model.add(BatchNormalization())
model.add(Dropout(rate=0.4))
model.add(Dense(2, activation="softmax"))
model.compile(Adam(lr=0.001),loss="categorical_crossentropy", metrics=["accuracy"])
gen = ImageDataGenerator(keras.utils.Sequence)
train_batches = gen.flow_from_directory(os.path.join(homepath,"train"),model.input_shape[1:3],color_mode="grayscale",shuffle=True,seed=1,batch_size=128)
valid_batches = gen.flow_from_directory(os.path.join(homepath,"val"), model.input_shape[1:3],color_mode="grayscale",shuffle=True,seed=1,batch_size=16)
test_batches = gen.flow_from_directory(os.path.join(homepath,"test"), model.input_shape[1:3], shuffle=False,color_mode="grayscale", batch_size=4)
model.compile(Adam(lr=0.0001),loss="categorical_crossentropy", metrics=["accuracy"])
model.fit_generator(train_batches,validation_data=valid_batches,epochs=4)
model.save('model.mdl')

不过苦于没有这轮武汉肺炎的资料数据,也无法评判具体帮助有多大,但是我想胸片的影像方面数据集已经够大了,也许能够帮助缓存目前检测试剂不足的问题。 

  AI深度学习,也许对防止超级传染者有帮助

在钟南山院士谈到本次疫情的防控时特别提到了要小心超级传染者的出现,而超级传染者是指一个人传染10个人以上的患者,比如非典期间,广东一男子染病50天,先后传染130余人,包括18位亲属及几十名医务人员,再比如2015年中东呼吸综合征(MERS)在韩国也出现了一名超级传染者,先后传染了数十几医护人员及亲属。

而如果对于历次呼吸道感染疫情的患者数据进行汇总,将传播能力进行分类,这是一个机器学习的经典任务。不过考虑到样本的数量可能不够,而且在病档资料中该患者做为传染源传染人数的记录可能也有缺失,所以利用AI防止超级传播者的方案未必能够奏效