Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Hỗ trợ đồ án, khóa luận Web, App, AI - Uy tín, chất lượng!
Trang Chủ Hướng Dẫn Đồ Án Phân loại hình ảnh với CNN đơn giản
Hướng Dẫn Đồ Án

Phân loại hình ảnh với CNN đơn giản

Chia sẻ
Chia sẻ

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:

Cats vs Dogs Dataset

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ả catdog 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:

pip install matplotlib

Đá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)

Tham Gia Nhóm – Hỗ Trợ Lập Trình

Hỗ Trợ Đồ Án – ThueDoAn.vn

Liên quan
Hướng Dẫn Đồ Án

Checklist 10 bước kiểm tra cuối cùng trước khi nhấn nút nộp đồ án

Thời điểm chuẩn bị nhấn nút nộp đồ án luôn mang lại...

Hướng Dẫn Đồ Án

Tuyệt chiêu đối phó với những giảng viên hướng dẫn ‘khó tính’ nhất

Giai đoạn làm đồ án tốt nghiệp luôn đi kèm với vô...

Hướng Dẫn Đồ Án

Tại sao việc quản lý Source Code bằng Git lại quan trọng hơn bạn nghĩ?

Trong thế giới lập trình hiện đại, mã nguồn chính là linh...

Hướng Dẫn Đồ Án

Những chức năng ‘thừa’ khiến bạn tốn thời gian mà không được cộng điểm

Làm đồ án tốt nghiệp là một cuộc đua thực thụ với...

Hướng Dẫn Đồ Án

Cách xử lý khi đề tài bị trùng lặp ý tưởng với các khóa trước quá nhiều

Lựa chọn đề tài đồ án luôn là bước khởi đầu đầy...

Hướng Dẫn Đồ Án

Làm sao để giải trình với giảng viên khi code bị nghi ngờ là đi chép?

Trong quá trình thực hiện đồ án, việc tham khảo mã nguồn...

Hướng Dẫn Đồ Án

Cảnh báo: Những nguồn share code ‘rác’ trên mạng cần tuyệt đối tránh

Trong quá trình làm đồ án, việc tìm kiếm sự hỗ trợ...

Hướng Dẫn Đồ Án

Sai lầm khi chọn công nghệ quá khó so với năng lực thực tế của bản thân

Chọn đề tài và công nghệ cho đồ án luôn là bước...

Liên Hệ
Liên hệ để được tư vấn & hỗ trợ đồ án CNTT nhé bạn!