Phân loại hình ảnh là một phương pháp để phân loại hình ảnh vào các lớp danh mục tương ứng sử dụng một số phương pháp như:
- Huấn luyện một mạng nhỏ từ đầu (from scratch)
- Fine-tuning các lớp trên cùng của mô hình sử dụng VGG16
Ví dụ
# Trước tiên, bao gồm các thư viện sau:
# Import tất cả thư viện cần thiết
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import backend as K
# Ở đây, train_data_dir là thư mục dữ liệu huấn luyện. validation_data_dir là
# thư mục cho dữ liệu validation. nb_train_samples là tổng số mẫu train.
# nb_validation_samples là tổng số mẫu validation.
img_width, img_height = 224, 224
train_data_dir = 'v_data/train'
validation_data_dir = 'v_data/test'
nb_train_samples = 400
nb_validation_samples = 100
epochs = 10
batch_size = 16
# kiểm tra định dạng ảnh
if K.image_data_format() == 'channels_first':
input_shape = (3, img_width, img_height)
else:
input_shape = (img_width, img_height, 3)
model = Sequential()
# Conv2D là lớp để tích chập ảnh thành nhiều ảnh
model.add(Conv2D(32, (2, 2), input_shape=input_shape))
# Activation là hàm kích hoạt.
model.add(Activation('relu'))
# MaxPooling2D dùng để max pool giá trị từ ma trận kích thước cho trước
# và cùng dùng cho 2 lớp tiếp theo.
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (2, 2)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# MaxPooling2D dùng để max pool giá trị từ ma trận kích thước cho trước
# và cùng dùng cho 2 lớp tiếp theo.
model.add(Flatten())
# Dense dùng để làm cho mô hình fully connected và là lớp ẩn.
model.add(Dense(64))
model.add(Activation('relu'))
# Dropout dùng để tránh overfitting trên tập dữ liệu.
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
# Hàm compile được dùng ở đây liên quan đến loss, optimizers
# và metrics. Ở đây loss function dùng là binary_crossentropy,
# optimizer dùng là rmsprop.
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# ImageDataGenerator rescale ảnh, áp dụng shear trong một số
# phạm vi, zoom ảnh và lật ngang ảnh.
# ImageDataGenerator này bao gồm tất cả các hướng
# có thể của ảnh.
train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
# train_datagen.flow_from_directory là hàm dùng để
# chuẩn bị dữ liệu từ thư mục train_dataset. Target_size chỉ định
# kích thước mục tiêu của ảnh.
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
# fit_generator dùng để fit dữ liệu vào mô hình tạo ở trên,
# các yếu tố khác: steps_per_epochs cho biết số lần
# mô hình sẽ thực thi cho dữ liệu huấn luyện.
# epochs cho biết số lần mô hình sẽ được huấn luyện trong forward
# và backward pass.
# validation_data dùng để cung cấp dữ liệu validation/test vào
# mô hình.
# validation_steps chỉ số mẫu validation/test.
model.fit_generator(train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
# Lưu mô hình
model.save_weights('ImgmodelKeras_saved.h5')