白血病检测:从零开始构建一个 leukemia AI 检测系统
一、项目背景
白血病是一种严重的血液系统疾病,早期检测对于改善患者预后至关重要。近年来,机器学习和人工智能技术在医学图像分析领域取得了显著进展,为白血病的快速、准确检测提供了新的可能。
本文将分享一个完整的白血病细胞图像分类项目,涵盖了从数据获取、模型训练到应用部署的全流程。通过这个项目,你将了解如何利用开源数据和免费工具构建一个高效的白血病检测系统。
二、数据获取与处理
数据集引用
本项目使用的是 ISBI 2019 白血病细胞图像数据集,由 Anubha Gupta 等人提供。该数据集包含了急性淋巴细胞白血病(ALL)和正常造血细胞(HEM)的显微镜图像,可通过 The Cancer Imaging Archive 访问获取。
数据处理
数据处理是整个项目的基础。我们使用 Python 语言进行数据处理,主要步骤如下:
-
数据下载与解压 :利用 Kaggle API 下载数据集,并在 Google Colab 中进行解压。以下是关键代码:
# 安装 Kaggle 库 !pip install kaggle # 上传 Kaggle 凭证 from google.colab import files files.upload() # 配置 Kaggle API !mkdir -p ~/.kaggle !cp kaggle.json ~/.kaggle/ !chmod 600 ~/.kaggle/kaggle.json # 下载数据集 !kaggle datasets download -d andrewmvd/leukemia-classification # 解压数据集 !unzip leukemia-classification.zip
-
图像向量化 :将图像数据转换为适合机器学习模型处理的数值格式。我们采用了高效的 NumPy 向量化方法,而非慢速的 Pandas 迭代操作。以下是图像向量化的核心代码:
import os import numpy as np from tqdm import tqdm from skimage import io # 设置数据路径 path_training = '/content/C-NMC_Leukemia/training_data' folds = [os.path.join(path_training, d) for d in os.listdir(path_training) if os.path.isdir(os.path.join(path_training, d))] # 处理 ALL 类图像 data = [] img_count = 0 max_images = 1000 for fold in folds: path_all = os.path.join(fold, 'all') if os.path.exists(path_all) and img_count < max_images: img_files = os.listdir(path_all) for img_file in tqdm(img_files, desc=f"Processing ALL: {path_all}"): if img_count >= max_images: break img_path = os.path.join(path_all, img_file) img = io.imread(img_path) row = img.flatten() data.append(row) img_count += 1 X = np.vstack(data) df = pd.DataFrame(X) df['Class'] = 'ALL'
同理,对 HEM 类图像进行相同处理,并将两类数据合并,为后续模型训练做准备。
三、模型训练与优化
模型选择
在本项目中,我们选择了随机森林(Random Forest)作为分类模型。随机森林是一种集成学习算法,具有良好的泛化能力和可解释性,适用于处理高维图像数据。
模型训练
将处理后的数据集划分为训练集和验证集,使用训练集对随机森林模型进行训练。以下是模型训练的关键代码:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# 分离特征和标签
X = df_combined_train.drop('Class', axis=1)
y = df_combined_train['Class']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)
# 初始化并训练随机森林分类器
rf_model = RandomForestClassifier(
n_estimators=200,
class_weight='balanced',
min_samples_leaf=1,
random_state=42,
n_jobs=-1
)
rf_model.fit(X_train, y_train)
模型优化
为了提高模型的敏感性和特异性,我们对预测阈值进行了优化。通过调整阈值,可以在敏感性和特异性之间取得更好的平衡。以下是阈值优化的相关代码:
# 获取预测概率
y_pred_proba = rf_model.predict_proba(X_test)
# 确定类别索引
class_labels = rf_model.classes_
all_index = np.where(class_labels == 'ALL')[0][0]
# 设置自定义阈值
threshold = 0.35
y_pred = (y_pred_proba[:, all_index] >= threshold).astype(int)
y_pred = np.where(y_pred == 1, 'ALL', 'HEM')
# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
print(f"Test Accuracy: {accuracy:.4f}")
# 计算敏感性和特异性
tn, fp, fn, tp = confusion_matrix(y_test == 'ALL', y_pred == 'ALL').ravel()
sensitivity = tp / (tp + fn)
specificity = tn / (tn + fp)
print(f"Sensitivity (True Positive Rate): {sensitivity:.4f}")
print(f"Specificity (True Negative Rate): {specificity:.4f}")
通过对不同阈值下的敏感性和特异性进行分析,我们可以选择一个合适的阈值,以满足实际应用场景的需求。
四、应用开发与部署
应用开发
基于训练好的模型,我们开发了一个简单的 Web 应用,用户可以通过上传细胞图像进行白血病检测。应用使用 Gradio 框架构建,具有友好的用户界面和交互功能。以下是应用的关键代码:
import gradio as gr
import pickle
import numpy as np
import pandas as pd
# 加载模型
with open('random_forest_leukemia_full.pkl', 'rb') as f:
model_data = pickle.load(f)
rf_model = model_data['model']
threshold = model_data['threshold']
all_index = model_data['all_index']
class_labels = rf_model.classes_
# 图像预处理函数
def preprocess_image(image):
flattened = image.flatten()
df = pd.DataFrame([flattened])
return df
# 预测函数
def predict_leukemia(image):
if image is None:
return "Please upload an image."
processed_image = preprocess_image(image)
proba = rf_model.predict_proba(processed_image)
all_probability = proba[0, all_index]
prediction = "ALL" if all_probability >= threshold else "HEM"
result = f"Prediction: {prediction}\n"
result += f"Confidence: {all_probability:.2%}\n"
result += f"Threshold used: {threshold:.2f}\n\n"
if prediction == "ALL":
result += "This sample shows characteristics of Acute Lymphoblastic Leukemia (ALL)."
else:
result += "This sample appears to show normal hematopoietic cells (HEM)."
return result
# 创建 Gradio 界面
with gr.Blocks(title="Leukemia Cell Classification") as demo:
gr.Markdown("# Leukemia Cell Classification")
with gr.Tab("Make Prediction"):
gr.Markdown("Upload a microscopy image to determine if it shows ALL or HEM.")
with gr.Row():
with gr.Column():
input_image = gr.Image(type="numpy", label="Upload Cell Image")
predict_button = gr.Button("Predict", variant="primary")
with gr.Column():
prediction_result = gr.Textbox(label="Prediction Result", lines=8)
predict_button.click(
fn=predict_leukemia,
inputs=input_image,
outputs=prediction_result
)
# 其他标签页内容...
demo.launch()
应用部署
将开发好的应用部署到 Hugging Face 平台,用户可以通过链接直接访问和使用该应用。以下是部署后的应用效果截图:
五、常见问题解答(FAQ)
Q1:这个项目的准确率如何?
A1:在测试集上,该项目的准确率达到 0.85,敏感性为 0.89,特异性为 0.74。这些指标表明该模型在检测白血病细胞方面具有较好的性能,但仍有一定的改进空间。
Q2:如何获取项目中使用的数据集?
A2:项目中使用的白血病细胞图像数据集可通过 Kaggle 下载获取。
Q3:是否可以在自己的设备上运行该项目?
A3:是的,您可以在本地设备上运行该项目。只需确保安装了 Python 及相关依赖库,并按照项目代码进行配置和运行即可。
Q4:如何调整模型的敏感性和特异性?
A4:您可以通过修改预测阈值来调整模型的敏感性和特异性。例如,降低阈值可以提高敏感性,但可能会降低特异性;反之,提高阈值可以增加特异性,但可能会牺牲一定的敏感性。
Q5:该项目是否适用于实际的医疗诊断?
A5:需要强调的是,该项目目前仅用于研究和教育目的,不应用于实际的医疗诊断。其结果仅供参考,不能替代专业医生的诊断和治疗建议。
六、总结与展望
通过本项目,我们成功构建了一个基于机器学习的白血病细胞图像分类系统。从数据获取、处理到模型训练、优化,再到应用开发与部署,整个过程展示了机器学习技术在医学诊断领域的应用潜力。
然而,该项目仍存在一些局限性,如数据集规模有限、模型性能有待进一步提升等。未来,我们可以从以下几个方面进行改进和拓展:
-
数据增强 :通过数据增强技术扩充数据集,提高模型的泛化能力。 -
模型优化 :尝试使用更先进的深度学习模型,如卷积神经网络(CNN),以进一步提升分类性能。 -
多模态数据融合 :结合其他类型的医学数据(如临床指标、基因信息等),构建更全面的诊断模型。 -
临床验证 :与医疗机构合作,对模型进行大规模临床验证,评估其在实际医疗场景中的有效性和可靠性。
总之,随着人工智能技术的不断发展,我们有理由相信,未来的医学诊断将更加智能化、精准化,为人类健康事业做出更大的贡献。
希望本文对你有所帮助。如果你对该项目有任何疑问或建议,欢迎随时提出。让我们一起探索人工智能在医学领域的无限可能!