Phân loại hình ảnh đồ ăn là một bài toán thú vị trong thị giác máy tính, đặc biệt khi dữ liệu có nhiều lớp và hình ảnh có độ đa dạng cao. Với sự hỗ trợ của các mô hình học sâu pretrained như MobileNet, việc xây dựng một hệ thống phân loại ảnh trở nên đơn giản và hiệu quả hơn.
Nếu bạn đã từng xem bài Tạo mô hình phân loại ảnh chó mèo với TensorFlow, bạn sẽ thấy mô hình pretrained giúp tiết kiệm thời gian huấn luyện và đạt độ chính xác cao ngay cả khi dữ liệu không lớn. Trong bài này, chúng ta sẽ thực hành phân loại các món ăn Việt Nam bằng mô hình MobileNet, dựa trên dataset thực tế từ Kaggle.
Mô tả bài toán
Bài toán đặt ra là: Xây dựng một mô hình phân loại hình ảnh đồ ăn Việt Nam thành các danh mục cụ thể (phở, bánh mì, bún bò,…) dựa trên bộ dữ liệu Vietnamese Foods từ Kaggle.
Bộ dữ liệu chứa 10.000 ảnh thuộc nhiều loại món ăn Việt Nam, được phân loại thành các thư mục theo nhãn. Mục tiêu là sử dụng MobileNetV2 đã được huấn luyện trên ImageNet để trích xuất đặc trưng, sau đó tinh chỉnh (fine-tune) để mô hình nhận diện chính xác các món ăn Việt.
Cài đặt và chuẩn bị môi trường
Cài đặt thư viện
pip install tensorflow matplotlib seaborn
Import các thư viện cần thiết
Tải dữ liệu
Tải dataset từ Kaggle (sau khi bạn đã tải file từ link):
📥 Vietnamese Foods Dataset
Giải nén thành thư mục có cấu trúc:
vietnamese_foods/
train/
pho/
banh_mi/
bun_bo/
validation/
pho/
banh_mi/
bun_bo/
Tiền xử lý dữ liệu
Thiết lập generator để augment dữ liệu
Tạo các generator để đọc ảnh từ thư mục:
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
val_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'vietnamese_foods/train',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
val_generator = val_datagen.flow_from_directory(
'vietnamese_foods/validation',
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
Xây dựng mô hình với MobileNetV2
Tải mô hình pretrained
MobileNetV2 là một kiến trúc mạng nơ-ron được thiết kế tối ưu cho thiết bị di động với số lượng tham số ít nhưng hiệu suất cao. Khi sử dụng pretrained model, chúng ta chỉ cần lấy phần feature extractor (bỏ phần classifier gốc) và xây dựng classifier mới phù hợp với dữ liệu món ăn.
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) base_model.trainable = False # Freeze các layer gốc
Thêm các lớp phân loại phía trên
Thêm các lớp phân loại phía trên để huấn luyện, sử dụng cho việc phân loại chi tiết cho bài toán món ăn của chúng ta đang xử lý.

