Python 语言 用 TensorFlow 训练图像分类模型 ResNet50 识别猫狗 + 模型部署为 API

Python阿木 发布于 1 天前 4 次阅读


使用 TensorFlow 训练 ResNet50 图像分类模型并部署为 API

随着深度学习技术的不断发展,图像分类已经成为计算机视觉领域的一个重要研究方向。在众多图像分类模型中,ResNet50因其优异的性能和广泛的适用性而备受关注。本文将介绍如何使用 TensorFlow 框架训练一个基于 ResNet50 的图像分类模型,用于识别猫和狗,并将训练好的模型部署为一个 API 服务。

环境准备

在开始之前,请确保您的环境中已经安装了以下依赖项:

- Python 3.6+
- TensorFlow 2.x
- NumPy
- Matplotlib
- OpenCV

您可以使用以下命令安装所需的库:

bash
pip install tensorflow numpy matplotlib opencv-python

数据集准备

为了训练图像分类模型,我们需要一个包含猫和狗图像的数据集。这里我们使用一个公开的数据集——Dogs vs. Cats,它包含了约25,000张猫和狗的图像。

python
import os
import shutil

定义数据集路径
data_dir = 'path/to/dataset'
train_dir = os.path.join(data_dir, 'train')
validation_dir = os.path.join(data_dir, 'validation')

创建训练和验证目录
os.makedirs(train_dir, exist_ok=True)
os.makedirs(validation_dir, exist_ok=True)

将数据集分为训练集和验证集
def split_dataset(data_dir, train_dir, validation_dir, train_ratio=0.8):
train_files = []
validation_files = []
for filename in os.listdir(data_dir):
if filename.endswith('.jpg'):
file_path = os.path.join(data_dir, filename)
if os.path.isfile(file_path):
if os.path.basename(file_path).startswith('dog'):
if len(train_files) < train_ratio 25000:
train_files.append(file_path)
else:
validation_files.append(file_path)
else:
if len(train_files) < train_ratio 25000:
train_files.append(file_path)
else:
validation_files.append(file_path)

将文件移动到相应的目录
for file_path in train_files:
shutil.move(file_path, train_dir)
for file_path in validation_files:
shutil.move(file_path, validation_dir)

split_dataset(data_dir, train_dir, validation_dir)

数据预处理

在训练模型之前,我们需要对图像进行预处理,包括调整图像大小、归一化等。

python
import tensorflow as tf

def preprocess_image(image_path, label):
image = tf.io.read_file(image_path)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [224, 224])
image = tf.cast(image, tf.float32) / 255.0
return image, label

def load_dataset(train_dir, validation_dir, batch_size=32):
train_ds = tf.keras.preprocessing.image_dataset_from_directory(
train_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(224, 224),
batch_size=batch_size)

validation_ds = tf.keras.preprocessing.image_dataset_from_directory(
validation_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(224, 224),
batch_size=batch_size)

return train_ds, validation_ds

train_ds, validation_ds = load_dataset(train_dir, validation_dir)

模型构建

接下来,我们将使用 TensorFlow 的 Keras API 构建一个基于 ResNet50 的图像分类模型。

python
from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input

def create_model():
base_model = ResNet50(weights='imagenet', include_top=False)
base_model.trainable = False 冻结基础模型

inputs = tf.keras.Input(shape=(224, 224, 3))
x = base_model(inputs, training=False)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
x = tf.keras.layers.Dense(2, activation='softmax')(x)

model = tf.keras.Model(inputs=inputs, outputs=x)
return model

model = create_model()
model.summary()

模型训练

现在,我们可以使用训练数据集来训练我们的模型。

python
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])

history = model.fit(train_ds, epochs=10, validation_data=validation_ds)

模型评估

训练完成后,我们可以使用验证数据集来评估模型的性能。

python
test_loss, test_acc = model.evaluate(validation_ds)
print(f"Test accuracy: {test_acc}")

模型部署

为了将训练好的模型部署为一个 API 服务,我们可以使用 TensorFlow Serving 或其他模型部署工具。以下是一个使用 TensorFlow Serving 部署模型的示例。

bash
启动 TensorFlow Serving
tensorflow_model_server --port=8501 --model_name=cat_dog_model --model_base_path=/path/to/model

使用 curl 调用 API
curl -X POST http://localhost:8501/v1/models/cat_dog_model:predict -d '{"instances": [{"image": "base64_encoded_image"}]}'

总结

本文介绍了如何使用 TensorFlow 训练一个基于 ResNet50 的图像分类模型,并将其部署为一个 API 服务。通过以上步骤,您可以快速构建一个能够识别猫和狗的图像分类系统。随着深度学习技术的不断发展,相信未来会有更多高效、便捷的模型部署方法出现。