使用 TensorFlow 在 Python 中进行皮肤癌检测
任何疾病,尤其是癌症的早期检测,对于治疗阶段都至关重要。朝着这个方向做出的努力之一是利用机器学习算法,借助 TensorFlow 等机器学习框架来检测和诊断皮肤癌。
传统的癌症检测方法非常耗时,需要专业的皮肤科医生。但是,借助 TensorFlow,不仅可以加快这一过程,还可以使其更准确和高效。此外,那些无法及时获得医生和皮肤科医生帮助的人,也可以暂时使用这种方法。
算法
步骤 1 − 导入 numpy、pandas、matplotlib 和 seaborn 等库,并加载图像数据集并将其存储为列表。
步骤 2 − 将此图像列表加载为 pandas 数据框,并提取列表中每个图像的两个标签。
步骤 3 − 为了简单起见,将标签转换为符号 0 和 1,并借助饼图比较每个标签下存在的图像数量。
步骤 4 − 如果不存在不平衡,则打印每个标签的一些图像。
步骤 5 − 将数据集拆分为训练集和测试集。
步骤 6 − 创建图像输入管道。
步骤 7 − 使用 EfficientNet 架构创建和编译模型。
步骤 8 − 至少训练模型 5 个 epoch。
步骤 9 − 可视化训练损失和验证损失之间的差异。
示例
在本示例中,我们将使用包含两种类型图像的皮肤癌数据集,您可以在此处找到它。然后,我们将借助 TensorFlow 开发一个模型,以便在无需大量训练的情况下获得所需的结果。为此,我们还将利用 EfficientNet 架构来获取预训练权重。
#import the required libraries
import numpy as np
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
from glob import glob
from PIL import Image
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow import keras
from keras import layers
from functools import partial
AUTO = tf.data.experimental.AUTOTUNE
import warnings
warnings.filterwarnings('ignore')
#load the dataset
images = glob('train/*/*.jpg')
len(images)
#create dataset and extract labels
images = [path.replace('', '/') for path in images]
df = pd.DataFrame({'filepath': images})
df['label'] = df['filepath'].str.split('/', expand=True)[1]
print(df.head())
df['label_bin'] = np.where(df['label'].values == 'malignant', 1, 0)
df.head()
#check if both types of files are same in number
x = df['label'].value_counts()
plt.pie(x.values,
labels=x.index,
autopct='%1.1f%%')
plt.show()
#printing the images of the two categories
for cat in df['label'].unique():
temp = df[df['label'] == cat]
index_list = temp.index
fig, ax = plt.subplots(1, 4, figsize=(15, 5))
fig.suptitle(f'Images for {cat} category . . . .', fontsize=20)
for i in range(4):
index = np.random.randint(0, len(index_list))
index = index_list[index]
data = df.iloc[index]
image_path = data[0]
img = np.array(Image.open(image_path))
ax[i].imshow(img)
plt.tight_layout()
plt.show()
#split the dataset into train and test
features = df['filepath']
target = df['label_bin']
X_train, X_val,\
Y_train, Y_val = train_test_split(features, target,
test_size=0.15,
random_state=10)
X_train.shape, X_val.shape
def decode_image(filepath, label=None):
img = tf.io.read_file(filepath)
img = tf.image.decode_jpeg(img)
img = tf.image.resize(img, [224, 224])
img = tf.cast(img, tf.float32) / 255.0
if label == None:
return img
return img, label
#create pipelines for image input
train_ds = (
tf.data.Dataset
.from_tensor_slices((X_train, Y_train))
.map(decode_image, num_parallel_calls=AUTO)
.batch(32)
.prefetch(AUTO)
)
val_ds = (
tf.data.Dataset
.from_tensor_slices((X_val, Y_val))
.map(decode_image, num_parallel_calls=AUTO)
.batch(32)
.prefetch(AUTO)
)
#building the model architecture using Keras API
from tensorflow.keras.applications.efficientnet import EfficientNetB7
pre_trained_model = EfficientNetB7(
input_shape=(224, 224, 3),
weights='imagenet',
include_top=False
)
for layer in pre_trained_model.layers:
layer.trainable = False
from tensorflow.keras import Model
inputs = layers.Input(shape=(224, 224, 3))
x = layers.Flatten()(inputs)
x = layers.Dense(256, activation='relu')(x)
x = layers.BatchNormalization()(x)
x = layers.Dense(256, activation='relu')(x)
x = layers.Dropout(0.3)(x)
x = layers.BatchNormalization()(x)
outputs = layers.Dense(1, activation='sigmoid')(x)
model = Model(inputs, outputs)
model.compile(
loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
optimizer='adam',
metrics=['AUC']
)
#train the model for 5 epochs
history = model.fit(train_ds,
validation_data=val_ds,
epochs=5,
verbose=1)
#checking the loss
hist_df = pd.DataFrame(history.history)
hist_df.head()
#plotting line graph
hist_df['loss'].plot()
hist_df['val_loss'].plot()
plt.title('Loss v/s Validation Loss')
plt.legend()
plt.show()
hist_df['auc'].plot()
hist_df['val_auc'].plot()
plt.title('AUC v/s Validation AUC')
plt.legend()
plt.show()
我们首先加载存储在本地系统中的图像,然后创建一个数据框来存储所有文件路径和加载的标签。存储的标签转换为二进制格式,其中恶性表示 1,其他标签表示 0。
代码的后面部分绘制了一个饼图,可视化标签类的分布并计算每个类的出现次数。
然后,我们从每个类别中随机选择 4 张图像,并使用 Matplotlib 在 1x4 网格中打印它们。decode_image() 函数读取图像文件,对其进行解码并调整图像大小。然后使用 fit() 方法训练模型并执行训练。然后,fit() 方法返回的历史对象用于提取训练损失和验证损失。然后将这些值存储在数据框中。
使用 Python 中的 Matplotlib 库绘制损失和验证损失值。
输出
filepath label 0 train/benign/100.jpg benign 1 train/benign/1000.jpg benign 2 train/benign/1001.jpg benign 3 train/benign/1002.jpg benign 4 train/benign/1004.jpg benign

Epoch 1/5
71/71 [==============================] - 28s 356ms/step - loss: 0.5760 - auc: 0.7948 - val_loss: 1.8715 - val_auc: 0.7951
Epoch 2/5
71/71 [==============================] - 25s 348ms/step - loss: 0.4722 - auc: 0.8587 - val_loss: 0.8500 - val_auc: 0.8602
Epoch 3/5
71/71 [==============================] - 24s 336ms/step - loss: 0.4316 - auc: 0.8818 - val_loss: 0.7553 - val_auc: 0.8746
Epoch 4/5
71/71 [==============================] - 24s 331ms/step - loss: 0.4324 - auc: 0.8800 - val_loss: 0.9261 - val_auc: 0.8645
Epoch 5/5
71/71 [==============================] - 24s 344ms/step - loss: 0.4126 - auc: 0.8907 - val_loss: 0.8017 - val_auc: 0.8795


结论
尽管 TensorFlow 在皮肤癌检测模型中表现足够出色,但它也存在一些缺点,例如需要使用高计算能力或大量内存。因此,尝试 PyTorch、Keras 和 MXNet 等其他框架,以探索机器学习领域中皮肤癌检测的更多可能性,也并非坏主意。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP