Phân loại hình ảnh là một bài toán quen thuộc trong học máy (machine learning) và học sâu (deep learning). Trong bài viết này, chúng ta sẽ xây dựng một mô hình Convolutional Neural Network (CNN) để phân loại hình ảnh, sử dụng Python, TensorFlow và Keras. Đồ án AI này sẽ giúp bạn nắm vững các kỹ thuật xử lý ảnh và cách huấn luyện một mô hình CNN để phân loại các ảnh thành các nhóm.
Cài đặt môi trường và thư viện
Yêu cầu phần mềm
Để làm đồ án này, bạn cần cài đặt một số thư viện Python như TensorFlow, Keras, numpy và matplotlib. Cài đặt các thư viện này bằng pip:
pip install tensorflow matplotlib numpy
Môi trường phát triển
Bạn có thể sử dụng Google Colab hoặc môi trường Python trên máy tính cá nhân. Nếu sử dụng máy cá nhân, hãy đảm bảo cài đặt đúng phiên bản Python (3.8 trở lên) và GPU (nếu có).
Chuẩn bị dữ liệu cho mô hình
Trước khi bắt đầu xây dựng mô hình CNN, bạn cần chuẩn bị dataset. Dữ liệu cho bài toán phân loại hình ảnh có thể tải từ các nguồn miễn phí như Kaggle, Google Dataset Search hoặc từ các tập dữ liệu có sẵn như CIFAR-10, Cats vs Dogs.
Tải dataset
Một dataset phổ biến cho bài toán phân loại hình ảnh là Cats vs Dogs, bạn có thể tải về từ liên kết sau:
Sau khi tải về, giải nén và đổi tên thư mục cats_set thành cat, đổi tên thư mục dogs_set thành dog, tiếp theo đưa cả cat và dog vào thư mục dataset bạn cần tạo mới. Toàn bộ cấu trúc thư mục dự án như sau:
image_classifier_project/ ├── dataset/ │ ├── cat/ │ └── dog/ ├── train.py ├── evaluate.py ├── predict.py
Giải thích:
-
Thư mục dataset/ chứa các ảnh của từng lớp (mèo và chó) đã được phân loại thành các thư mục riêng.
-
File train.py chứa code để xây dựng và huấn luyện mô hình.
-
File evaluate.py dùng để đánh giá hiệu quả của mô hình trên bộ dữ liệu kiểm tra.
-
File predict.py phục vụ việc dự đoán ảnh mới.
Chuẩn bị dữ liệu
Bộ dữ liệu mà bạn sử dụng phải được sắp xếp theo cấu trúc thư mục. Nếu bạn đã tải “Dogs vs. Cats” từ Kaggle, hãy giải nén file zip và phân chia ảnh thành các folder “cat” và “dog”.
Ví dụ:
-
dataset/cat/ chứa ảnh có tên “cat.1.jpg”, “cat.2.jpg”, …
-
dataset/dog/ chứa ảnh “dog.1.jpg”, “dog.2.jpg”, …
Bạn có thể tự tạo script để chia dữ liệu thành các tập train và validation, hoặc sử dụng các công cụ xử lý dữ liệu như ImageDataGenerator của Keras.
Xây dựng mô hình CNN
Convolutional Neural Network (CNN) là mô hình học sâu cực kỳ hiệu quả trong xử lý hình ảnh. Nó giúp tự động trích xuất các đặc trưng có ý nghĩa từ ảnh mà không cần xử lý thủ công. Trong bài này, ta sẽ xây dựng một mô hình CNN đơn giản bao gồm các lớp Convolution, Pooling, Flatten và các lớp Dense để dự đoán nhãn của ảnh.
File: train.py
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Tiền xử lý dữ liệu
train_datagen = ImageDataGenerator(
rescale=1./255,
validation_split=0.2 # chia 20% dữ liệu làm validation
)
train_generator = train_datagen.flow_from_directory(
'dataset/',
target_size=(150, 150),
batch_size=32,
class_mode='binary', # dùng 'binary' nếu chỉ có 2 lớp; nếu nhiều lớp, sử dụng 'categorical'
subset='training'
)
validation_generator = train_datagen.flow_from_directory(
'dataset/',
target_size=(150, 150),
batch_size=32,
class_mode='binary',
subset='validation'
)
# Xây dựng kiến trúc CNN
model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(),
Dense(128, activation='relu'),
Dropout(0.5),
Dense(1, activation='sigmoid') # với 2 lớp, sử dụng sigmoid
])
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# Huấn luyện mô hình
history = model.fit(
train_generator,
epochs=30, # bạn có thể tăng số epoch nếu cần
validation_data=validation_generator
)
# Lưu mô hình sau khi huấn luyện
model.save('model_cnn.h5')
Lưu ý khi viết file train.py:
-
Hãy đặt file train.py ở thư mục gốc của dự án.
-
Dataset phải được đặt trong thư mục dataset/ theo cấu trúc đã nêu.
-
Nếu bạn phân loại nhiều lớp (nhiều hơn 2), chỉnh sửa class_mode và tầng output của mạng phù hợp (sử dụng softmax và categorical_crossentropy).
Huấn luyện và theo dõi kết quả
Khi huấn luyện, bạn nên quan sát đồ thị độ chính xác (accuracy) và độ lỗi (loss) trên tập train và validation. Bạn có thể dùng matplotlib để vẽ đồ thị từ biến history.history:
Ví dụ, có thể thêm đoạn code sau vào cuối file train.py để vẽ đồ thị:
Đặt code này ở cuối file train.py
import matplotlib.pyplot as plt
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(len(acc))
plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
Đảm bảo bạn đã cài đặt matplotlib bằng lệnh:
Đánh giá mô hình
Sau khi huấn luyện, bạn cần đánh giá độ chính xác của mô hình trên tập dữ liệu validation hoặc một tập dữ liệu kiểm tra riêng.
File: evaluate.py
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Tải mô hình đã huấn luyện
model = load_model('model_cnn.h5')
# Tiền xử lý dữ liệu cho tập đánh giá
datagen = ImageDataGenerator(rescale=1./255)
validation_generator = datagen.flow_from_directory(
'dataset/',
target_size=(150, 150),
batch_size=32,
class_mode='binary',
subset='validation'
)
loss, accuracy = model.evaluate(validation_generator)
print(f'Loss: {loss:.4f}')
print(f'Accuracy: {accuracy*100:.2f}%')
Dự đoán ảnh mới
Để test mô hình của bạn với một ảnh mới, hãy tạo file dự đoán.
File: predict.py
import tensorflow as tf
from tensorflow.keras.preprocessing import image
import numpy as np
# Tải mô hình
model = tf.keras.models.load_model('model_cnn.h5')
# Đường dẫn đến ảnh test (hãy tạo thư mục test/ và đưa ảnh cần dự đoán vào đó)
img_path = 'test/cat.jpg'
img = image.load_img(img_path, target_size=(150, 150))
img_array = image.img_to_array(img) / 255.0
img_array = np.expand_dims(img_array, axis=0)
# Dự đoán
pred = model.predict(img_array)
label = "Cat" if pred[0][0] < 0.5 else "Dog"
print(f'Kết quả dự đoán: {label}')
Lưu ý:
-
Hãy tạo thư mục test/ và đưa vào ít nhất một ảnh để thử nghiệm dự đoán.
-
Nếu bạn sử dụng dataset có nhiều hơn 2 lớp, hãy điều chỉnh tầng output và xử lý dự đoán theo cách phù hợp với nhãn.
Viết báo cáo và trình bày đồ án
Một bài báo cáo đồ án cần có phần giới thiệu đề tài, lý do chọn mô hình, công nghệ sử dụng, cách thu thập và xử lý dữ liệu, mô tả kiến trúc CNN, quá trình huấn luyện, kết quả đạt được và hướng phát triển. Bạn có thể đưa vào các bảng số liệu, đồ thị biểu diễn accuracy và loss theo epoch, v.v.
Bạn nên chia báo cáo thành các phần:
-
Giới thiệu
-
Tổng quan lý thuyết về CNN và phân loại ảnh
-
Mô tả bộ dữ liệu (đính kèm link dataset như trên)
-
Quy trình xử lý dữ liệu và huấn luyện mô hình
-
Kết quả và đánh giá
-
Kết luận và hướng phát triển
Kết luận
Đồ án phân loại hình ảnh với CNN không chỉ là bài tập lý thuyết mà còn giúp bạn nắm vững quy trình xây dựng mô hình học sâu từ việc chuẩn bị dữ liệu, định nghĩa kiến trúc, huấn luyện và đánh giá. Một mô hình đơn giản như ví dụ trên có thể được mở rộng và cải tiến bằng cách:
-
Sử dụng Transfer Learning với các mô hình tiên tiến như MobileNet, VGG16
-
Điều chỉnh hyperparameter để tăng độ chính xác
-
Triển khai ứng dụng dự đoán trong thời gian thực (ví dụ tích hợp với OpenCV để xử lý webcam)

