Trong các bài toán học máy sử dụng dữ liệu hình ảnh, việc xử lý file ảnh hàng loạt để làm đầu vào cho mô hình là một bước chuẩn bị bắt buộc. Đây là giai đoạn tiền xử lý nhằm đảm bảo ảnh được đồng bộ về kích thước, định dạng, màu sắc và được tổ chức một cách hợp lý để phục vụ cho quá trình huấn luyện. Nếu ảnh đầu vào không được xử lý đúng cách, mô hình học máy dễ gặp lỗi trong quá trình huấn luyện hoặc đưa ra kết quả thiếu chính xác.
Bài viết này sẽ hướng dẫn bạn cách xử lý ảnh hàng loạt từ khâu chuẩn bị thư mục, resize, chuyển đổi định dạng, đổi tên cho đến phân chia tập train/val/test. Quy trình này áp dụng cho tất cả các mô hình học máy sử dụng ảnh như CNN, ResNet, EfficientNet, hoặc các mô hình học sâu khác, không giới hạn trong YOLO hay thị giác máy tính nâng cao.
Tổ chức thư mục dữ liệu ảnh cho mô hình học máy
Để đảm bảo dữ liệu ảnh có thể được sử dụng dễ dàng với thư viện như TensorFlow, Keras hoặc PyTorch, bạn nên tổ chức ảnh theo cấu trúc chuẩn:
dataset/
├── train/
│ ├── class1/
│ ├── class2/
├── val/
│ ├── class1/
│ ├── class2/
├── test/
├── class1/
├── class2/
Mỗi thư mục con trong các tập train, val, test sẽ đại diện cho một lớp (label) của bài toán phân loại. Đây là định dạng được hỗ trợ tốt bởi ImageDataGenerator (Keras), ImageFolder (PyTorch) và flow_from_directory().
Đổi kích thước và chuẩn hóa định dạng ảnh
Trong học máy, các mô hình như CNN thường yêu cầu ảnh đầu vào có kích thước cố định như 224×224 hoặc 299×299 pixel. Việc resize ảnh về cùng kích thước là cần thiết để đảm bảo mô hình có thể xử lý đồng nhất.
Ngoài ra, định dạng ảnh nên được chuyển hết về .jpg hoặc .png để đảm bảo tương thích và tiết kiệm dung lượng. Dưới đây là đoạn mã resize và chuyển định dạng ảnh hàng loạt:
from PIL import Image
import os
input_dir = 'raw_images'
output_dir = 'dataset/train/cats'
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('jpg', 'jpeg', 'png', 'bmp')):
img = Image.open(os.path.join(input_dir, filename)).convert('RGB')
img = img.resize((224, 224))
new_name = os.path.splitext(filename)[0] + '.jpg'
img.save(os.path.join(output_dir, new_name), format='JPEG')
Mã trên đảm bảo:
- Ảnh chuyển về RGB
- Resize ảnh về đúng kích thước
- Lưu lại với định dạng JPEG
Chia ảnh vào các tập huấn luyện, xác thực và kiểm thử
Sau khi ảnh đã được xử lý và đặt trong cùng thư mục, bạn cần chia ảnh ra thành các tập train, val, test để phục vụ cho quá trình huấn luyện và đánh giá mô hình học máy. Tỷ lệ chia phổ biến là 80% train, 10% val, 10% test.
import os
import shutil
import random
src_dir = 'dataset/full/cats'
train_dir = 'dataset/train/cats'
val_dir = 'dataset/val/cats'
test_dir = 'dataset/test/cats'
os.makedirs(train_dir, exist_ok=True)
os.makedirs(val_dir, exist_ok=True)
os.makedirs(test_dir, exist_ok=True)
files = [f for f in os.listdir(src_dir) if f.endswith('.jpg')]
random.shuffle(files)
train_split = int(0.8 * len(files))
val_split = int(0.9 * len(files))
for i, f in enumerate(files):
src_path = os.path.join(src_dir, f)
if i < train_split:
shutil.copy(src_path, os.path.join(train_dir, f))
elif i < val_split:
shutil.copy(src_path, os.path.join(val_dir, f))
else:
shutil.copy(src_path, os.path.join(test_dir, f))
Thực hiện đoạn mã trên cho mỗi lớp dữ liệu (cats, dogs, birds, v.v.) để xây dựng tập dữ liệu hoàn chỉnh phục vụ huấn luyện mô hình học máy.
Đổi tên file ảnh để tránh lỗi khi load dữ liệu
Khi xử lý file ảnh hàng loạt để làm đầu vào cho mô hình học máy, việc đặt tên file thống nhất giúp loại bỏ rủi ro do ký tự lạ hoặc tên trùng lặp gây ra. Dưới đây là ví dụ đổi tên ảnh dạng img_00001.jpg, img_00002.jpg,…
import os
dir_path = 'dataset/train/cats'
all_files = sorted(os.listdir(dir_path))
for idx, filename in enumerate(all_files):
if filename.endswith('.jpg'):
new_name = f"img_{idx:05d}.jpg"
os.rename(os.path.join(dir_path, filename), os.path.join(dir_path, new_name))
Nhớ đổi tên tương tự cho các lớp khác nếu bạn có nhiều class trong bài toán phân loại ảnh.
Kiểm tra ảnh sau khi xử lý bằng matplotlib
Để kiểm tra dữ liệu đã xử lý trước khi huấn luyện mô hình học máy, bạn có thể dùng matplotlib để hiển thị ảnh trực tiếp từ thư mục:
import matplotlib.pyplot as plt
import cv2
img_path = 'dataset/train/cats/img_00001.jpg'
img = cv2.imread(img_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.axis('off')
plt.show()
Việc kiểm tra giúp bạn đảm bảo ảnh có chất lượng tốt, không bị lỗi, đúng nhãn và đúng kích thước yêu cầu.
Kết luận
Xử lý file ảnh hàng loạt để làm đầu vào cho mô hình là một bước nền tảng trong mọi dự án học máy có sử dụng dữ liệu hình ảnh. Việc chuẩn hóa kích thước, định dạng, tổ chức thư mục và chia tập dữ liệu đúng cách sẽ giúp mô hình học hiệu quả hơn, giảm lỗi trong huấn luyện và tăng độ chính xác khi dự đoán. Dù bạn sử dụng TensorFlow, PyTorch hay bất kỳ framework nào khác, một quy trình xử lý dữ liệu rõ ràng và tự động hóa sẽ là lợi thế lớn khi triển khai thực tế.
Để làm chủ toàn bộ quy trình tiền xử lý dữ liệu trong các dự án AI, bạn có thể xem thêm các bài viết bổ trợ như Hướng dẫn tiền xử lý dữ liệu sạch để huấn luyện mô hình tốt hơn, Hướng dẫn xử lý dữ liệu đầu vào trong đồ án AI và Hướng dẫn xử lý thiếu dữ liệu trong Pandas. Những kỹ thuật được trình bày trong các tài liệu này sẽ giúp bạn xây dựng tập dữ liệu chất lượng cao và tối ưu hóa hiệu suất mô hình học máy của mình.

