Thị giác máy tính 2 — Xử lý ảnh & CNN

13 thg 7, 2026 5 lượt xem
#ai
#cnn
#deep-learning
#computer-vision
#image-processing

Thị giác máy tính 2 — Xử lý ảnh & CNN

Bài tổng quan CV đã vẽ bức tranh lớn: các nhóm bài toán, luồng dữ liệu, vị trí của thị giác máy tính trong ngân hàng. Bài này đi xuống tầng nền tảng kỹ thuật — thứ mọi kỹ sư CV phải nắm trước khi động vào classification, detection hay OCR: ảnh được biểu diễn thế nào trong máy, tiền xử lý ra sao, vì sao đặc trưng thủ công thất bại trước học đặc trưng, và kiến trúc CNN (Convolutional Neural Network — mạng nơ-ron tích chập) cùng transfer learning vận hành ra sao.

Nếu bạn đã đọc Deep Learning 4 — CNN, một phần cơ chế convolution ở đây sẽ quen thuộc. Bài này không lặp lại mà mở rộng: đặt CNN vào bối cảnh xử lý ảnh đầu-cuối và transfer learning cho giấy tờ ngân hàng.

Danh mục AI. Các đoạn code Python/PyTorch trong bài là minh hoạ để thấy hình dạng phép tính và pipeline, KHÔNG phải sandbox chạy được. Không có block SQL chạy được trong bài này.


1. Ảnh là gì với máy tính

Con người thấy một khuôn mặt; máy tính thấy một lưới số. Đây là điểm khởi đầu bắt buộc.

Pixel, kênh, tensor

Ảnh số là ma trận các pixel (điểm ảnh). Mỗi pixel là một con số cường độ sáng.

  • Ảnh xám (grayscale): một ma trận H×W, mỗi ô là 1 số từ 0 (đen) đến 255 (trắng) — kiểu uint8 8 bit.
  • Ảnh màu: ba ma trận chồng lên nhau — ba kênh (channel) đỏ, lục, lam (RGB). Một ảnh màu 224×224 thực chất là khối số 224×224×3.
  • Tensor: trong deep learning ta gọi khối số nhiều chiều này là tensor. Quy ước phổ biến của PyTorch là [C, H, W] (channel-first), còn TensorFlow mặc định [H, W, C] (channel-last). Nhầm thứ tự chiều là lỗi kinh điển khiến model chạy sai lặng lẽ.
  • Batch: khi đưa nhiều ảnh vào cùng lúc để tính song song, ta thêm chiều batch: [N, C, H, W] với N là số ảnh trong lô.

Một CMND/CCCD chụp bằng điện thoại ở độ phân giải 1920×1080 màu = một tensor gần 6,2 triệu số. Toàn bộ bài toán CV là biến khối số khổng lồ, nhiễu, biến thiên này thành một quyết định (nhãn, toạ độ, chuỗi ký tự).

Color space — không gian màu

RGB không phải cách duy nhất mã hoá màu. Vài không gian màu hữu ích:

Không gianÝ nghĩaKhi nào dùng
RGBĐỏ, lục, lamMặc định, đầu vào hầu hết model
GrayscaleChỉ độ sángKhi màu không mang thông tin (OCR văn bản đen–trắng), giảm 3× dữ liệu
HSVHue–Saturation–Value (sắc–bão hoà–sáng)Lọc theo màu, chống thay đổi ánh sáng — ví dụ tách vùng con dấu đỏ trên giấy tờ
YCbCrSáng + 2 kênh màuChuẩn nén JPEG; tách kênh sáng để xử lý riêng

Ví dụ thực chiến: muốn phát hiện con dấu đỏ (thường có trên chứng từ ngân hàng) thì lọc theo Hue trong HSV ổn định hơn nhiều so với ngưỡng trực tiếp trên RGB, vì Hue ít bị ảnh hưởng bởi ánh sáng đèn phòng lúc chụp.


2. Tiền xử lý ảnh (image preprocessing)

Model không ăn ảnh thô. Giữa ảnh gốc và model là một pipeline tiền xử lý — làm sai bước này thì model tốt cỡ nào cũng suy giảm.

Resize — đưa về kích thước cố định

Hầu hết CNN yêu cầu đầu vào kích thước cố định (ví dụ 224×224) vì lớp fully-connected cuối cần số chiều biết trước. Ta phải resize ảnh về đúng kích thước. Cạm bẫy: resize trực tiếp làm méo tỉ lệ khung hình (aspect ratio) — một CMND hình chữ nhật bị bóp thành vuông, chữ biến dạng. Giải pháp thường dùng là letterbox: giữ tỉ lệ, thêm viền đệm (padding) cho đủ kích thước.

Chuẩn hoá (normalization)

Pixel [0, 255] không phải thang tốt cho mạng nơ-ron. Ta chuẩn hoá về khoảng nhỏ quanh 0 để gradient ổn định:

  • Đơn giản: chia 255 → đưa về [0, 1].
  • Chuẩn ImageNet: trừ trung bình và chia độ lệch chuẩn theo từng kênh, dùng đúng bộ mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]. Bắt buộc dùng đúng bộ số này khi fine-tune model pretrained trên ImageNet — nếu không, phân phối đầu vào lệch với lúc model được huấn luyện và kết quả tệ.

Quy tắc vàng: thống kê chuẩn hoá phải tính trên tập train, rồi áp y hệt cho validation/test và production. Tính lại mean/std trên test là rò rỉ dữ liệu (data leakage).

Data augmentation — tăng cường dữ liệu

Đây là kỹ thuật quan trọng nhất khi ít dữ liệu — đúng bối cảnh ngân hàng (giấy tờ nhạy cảm, khó gán nhãn số lượng lớn). Ý tưởng: sinh thêm biến thể của ảnh gốc bằng các phép biến đổi giữ nguyên nhãn, để model học tính bất biến và chống overfit (học vẹt tập train).

Phép biến đổiMô phỏng tình huống thật
Xoay (rotation) ±10–15°Giấy tờ đặt lệch khi chụp
Lật (flip) ngangĐối xứng — CẨN THẬN: không lật ảnh có chữ, vì chữ đảo ngược đổi nghĩa
Thay đổi độ sáng/tương phảnĐiều kiện ánh sáng khác nhau
Thêm nhiễu (noise) GaussianCamera chất lượng thấp, ảnh mờ
Crop ngẫu nhiên, che vùng (cutout)Che khuất một phần, buộc model không phụ thuộc 1 chi tiết
Biến dạng phối cảnh (perspective)Chụp nghiêng góc

Augmentation chỉ áp lên tập train. Với giấy tờ, cần chọn phép biến đổi hợp lý về nghiệp vụ: lật ngang một CCCD là vô nghĩa (không tồn tại thực tế), nhưng xoay nhẹ, đổi sáng, thêm nhiễu thì rất sát thực tế người dùng chụp bằng điện thoại.


3. Đặc trưng ảnh & vì sao đặc trưng thủ công hạn chế

Đặc trưng cấp thấp

Từ lưới pixel, thị giác cần rút ra đặc trưng (feature) — những mẫu có ý nghĩa:

  • Cạnh (edge): nơi độ sáng thay đổi đột ngột — ranh giới vật thể, đường viền chữ.
  • Góc (corner): điểm giao của hai cạnh — mốc định vị tốt.
  • Kết cấu (texture): mẫu lặp — vân giấy, hoa văn nền bảo an trên tiền/giấy tờ.

Kỷ nguyên đặc trưng thủ công: SIFT, HOG

Trước deep learning, kỹ sư thiết kế tay thuật toán trích đặc trưng:

  • SIFT (Scale-Invariant Feature Transform): tìm điểm đặc trưng bất biến với tỉ lệ và xoay.
  • HOG (Histogram of Oriented Gradients): thống kê hướng gradient trong từng ô nhỏ — từng là chuẩn cho phát hiện người đi bộ.

Cách này có ba hạn chế lớn khiến nó nhường chỗ:

  1. Tốn công người & không tổng quát. Mỗi bài toán/miền dữ liệu cần người giỏi tinh chỉnh lại. Đặc trưng tốt cho nhận dạng khuôn mặt chưa chắc tốt cho đọc chữ viết tay.
  2. Chỉ nắm được mẫu cấp thấp. SIFT/HOG mô tả cạnh, gradient cục bộ — rất khó ghép thành khái niệm cấp cao ("đây là chữ ký", "đây là ảnh chân dung trên CCCD").
  3. Không học được từ dữ liệu. Đặc trưng cố định; có thêm dữ liệu cũng không tự cải thiện.

Bước ngoặt: thay vì thiết kế tay đặc trưng, hãy để mạng tự học đặc trưng trực tiếp từ dữ liệu và nhãn. Đó chính là học đặc trưng (representation learning) — trái tim của CNN.


4. CNN — kiến trúc chủ đạo của CV

CNN được thiết kế riêng để "nhìn" lưới số. Ba khối cốt lõi: convolution, pooling, activation, ghép lại thành mạng sâu rồi kết bằng head phân loại.

Convolution — phép tính cốt lõi

Filter (kernel) là ma trận trọng số nhỏ (ví dụ 3×3). Ta đặt filter lên một vùng ảnh, nhân từng phần tử tương ứng rồi cộng thành một số, sau đó trượt filter sang vị trí kế và lặp lại khắp ảnh. Kết quả là feature map (bản đồ đặc trưng) — cho biết đặc trưng mà filter tìm xuất hiện mạnh ở đâu.

Ba thuộc tính làm nên sức mạnh của convolution:

  • Chia sẻ trọng số (weight sharing): cùng một filter dùng ở mọi vị trí. Một filter 3×3 trên ảnh màu chỉ 3×3×3 + 1 = 28 tham số, bất kể ảnh lớn cỡ nào — so với hàng trăm triệu tham số nếu dùng mạng fully-connected trên ảnh thô.
  • Bất biến dịch chuyển (translation invariance): vì cùng filter quét khắp ảnh, đặc trưng học một lần dùng được ở mọi nơi. Chữ nằm góc trên trái hay giữa trang đều được nhận ra như nhau.
  • Học đặc trưng phân cấp (hierarchical): xếp chồng nhiều lớp conv → lớp đầu học cạnh, lớp giữa ghép cạnh thành hình (góc, đường cong), lớp sâu ghép hình thành bộ phận/vật thể (mắt, con dấu, khối chữ). Trọng số filter được học bằng lan truyền ngược, không do người gán tay.

Pooling — giảm chiều & thêm bất biến

Sau conv thường có lớp pooling để giảm kích thước feature map (giảm tính toán) và tăng bất biến với dịch chuyển nhỏ. Max pooling 2×2 lấy giá trị lớn nhất trong mỗi ô 2×2, giảm chiều cao và rộng đi một nửa. Ý nghĩa: "có đặc trưng này ở đâu đó quanh đây" quan trọng hơn "chính xác pixel nào".

Activation & head

  • Activation (hàm kích hoạt): sau mỗi conv áp một hàm phi tuyến, phổ biến là ReLU (max(0, x)), giúp mạng học quan hệ phi tuyến. Không có nó, chồng nhiều lớp conv vẫn chỉ tương đương một phép tuyến tính.
  • Head: cuối mạng, feature map cấp cao được đưa qua fully-connected (hoặc global average pooling) rồi lớp phân loại (softmax) ra xác suất các lớp. Đây là phần ta thay/huấn luyện lại khi transfer learning.

Các kiến trúc kinh điển

Kiến trúcNămĐóng góp chính
LeNet-51998CNN đầu tiên thực dụng — đọc số viết tay (chi phiếu bưu điện)
AlexNet2012Thắng ImageNet cách biệt, khởi động làn sóng deep learning; dùng ReLU, dropout, GPU
VGG2014Chồng nhiều conv 3×3 — kiến trúc đơn giản, sâu, dễ hiểu
ResNet2015Skip connection — cho phép mạng cực sâu (50–152 lớp) mà vẫn huấn luyện được

ResNet & skip connection là cột mốc đáng nhớ nhất. Khi mạng quá sâu, gradient bị triệt tiêu (vanishing gradient) khiến các lớp đầu không học được. ResNet thêm đường tắt (skip/residual connection) cộng thẳng đầu vào của một khối vào đầu ra của nó: y = F(x) + x. Nhờ vậy gradient "chảy" thẳng qua đường tắt, mạng rất sâu vẫn huấn luyện tốt và khái quát tốt hơn. Đến nay ResNet-50 vẫn là backbone mặc định cho vô số bài toán CV thực tế.

Cuối cùng, ta sẽ gặp Vision Transformer (ViT) — kiến trúc chia ảnh thành các mảnh (patch) và áp cơ chế attention thay cho convolution, đang cạnh tranh và vượt CNN ở nhiều benchmark. Chi tiết ở bài CV hiện đại; nền tảng attention xem bài Transformers.


5. Transfer learning — chìa khoá khi ít dữ liệu

Đây là phần quan trọng nhất về mặt thực tế cho ngân hàng, nơi dữ liệu nhãn thường ít.

Ý tưởng

Huấn luyện một CNN sâu từ đầu cần hàng triệu ảnh và nhiều GPU-ngày. Ngân hàng hiếm khi có 100.000 ảnh CCCD gán nhãn. Transfer learning giải bài toán này: lấy một model đã pretrained trên tập khổng lồ (thường là ImageNet, 1,2 triệu ảnh, 1.000 lớp), rồi fine-tune cho bài toán riêng với ít dữ liệu.

Vì sao được? Các lớp đầu của CNN học đặc trưng tổng quát (cạnh, texture, hình cơ bản) — đúng cho mọi loại ảnh, kể cả giấy tờ mà ImageNet chưa từng thấy. Chỉ các lớp cuối mới đặc thù cho 1.000 lớp gốc. Ta giữ lại phần thân đã học đặc trưng tốt, chỉ thay head và huấn luyện lại phần đó.

Ba chiến lược

  1. Feature extractor (đóng băng thân): đông cứng (freeze) toàn bộ conv, chỉ huấn luyện head mới. Nhanh, ít rủi ro overfit — hợp khi rất ít dữ liệu (vài trăm ảnh) và bài toán gần với ảnh tự nhiên.
  2. Fine-tune một phần: mở khoá vài lớp cuối của thân + head, đông cứng lớp đầu. Cân bằng phổ biến nhất.
  3. Fine-tune toàn bộ: mở khoá cả mạng với learning rate nhỏ. Hợp khi có tương đối nhiều dữ liệu và miền ảnh khác xa ImageNet.

Pseudocode minh hoạ (PyTorch)

Minh hoạ luồng transfer learning — thay head, đông cứng thân, huấn luyện. Không phải code chạy được nguyên trạng, chỉ để thấy hình dạng.

# --- MINH HOẠ, không phải sandbox ---
import torch
import torch.nn as nn
from torchvision import models, transforms

# 1) Tiền xử lý ảnh: resize + chuẩn hoá theo thống kê ImageNet
preprocess = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),                       # -> tensor [C,H,W], [0,1]
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225]),
])

# Augmentation CHỈ cho tập train (giữ nhãn hợp lý với giấy tờ)
train_aug = transforms.Compose([
    transforms.RandomRotation(10),               # lệch nhẹ khi chụp
    transforms.ColorJitter(brightness=0.2, contrast=0.2),
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225]),
])

# 2) Nạp ResNet-50 pretrained trên ImageNet
model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)

# 3) Đông cứng thân (feature extractor)
for param in model.parameters():
    param.requires_grad = False

# 4) Thay head cho bài toán 3 lớp: CMND / CCCD / Hộ chiếu
num_classes = 3
model.fc = nn.Linear(model.fc.in_features, num_classes)  # chỉ lớp này học

# 5) Chỉ tối ưu tham số của head
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

# 6) Vòng huấn luyện (rút gọn)
for images, labels in train_loader:            # train_loader minh hoạ
    optimizer.zero_grad()
    logits = model(images)                     # [N, 3]
    loss = criterion(logits, labels)
    loss.backward()                            # lan truyền ngược
    optimizer.step()

Khung & inference

  • PyTorch (kèm torchvision) và TensorFlow/Keras là hai khung chủ đạo. PyTorch phổ biến hơn trong nghiên cứu và ngày càng thống trị production.
  • Inference (suy luận): khi triển khai, chuyển model sang chế độ eval(), tắt gradient (torch.no_grad()), và áp đúng pipeline tiền xử lý như lúc train (đặc biệt là chuẩn hoá). Để tối ưu tốc độ/độ trễ, thường xuất sang ONNX hoặc TorchScript, chạy trên GPU theo lô. Chi tiết triển khai xem MLOps sản xuất cho CVtriển khai model.

Use case thực tế

Bài toán: Phòng vận hành NCB cần tự động phân loại giấy tờ khách hàng tải lên qua app eKYC thành 3 nhóm — CMND cũ, CCCD gắn chip, Hộ chiếu — để định tuyến sang đúng luồng OCR (mỗi loại có layout trường khác nhau, xem OCR & Document AI). Trước đây nhân viên tự chọn loại, sai sót ~8% khiến OCR đọc nhầm trường.

Ràng buộc: chỉ có 1.500 ảnh đã gán nhãn (500/loại) — quá ít để train CNN từ đầu.

Cách làm (transfer learning):

  1. Tiền xử lý: letterbox về 224×224 giữ tỉ lệ, chuẩn hoá theo mean/std ImageNet.
  2. Augmentation train: xoay ±10°, đổi sáng/tương phản ±20%, thêm nhiễu Gaussian nhẹ — không lật ngang (giấy tờ có chữ). Từ 1.200 ảnh train sinh ra hiệu quả gấp nhiều lần biến thể.
  3. Model: ResNet-50 pretrained ImageNet, đông cứng thân, thay head 1000→3 lớp.
  4. Huấn luyện: fine-tune head ~15 epoch trên 1 GPU, mất ~20 phút. Sau đó mở khoá thêm 1 block cuối, fine-tune LR nhỏ (1e-5) thêm vài epoch.
  5. Kết quả (minh hoạ tiêu biểu): accuracy trên 300 ảnh test đạt ~97%, sai sót định tuyến giảm từ 8% xuống dưới 2%. Chi phí train gần như bằng 0 nhờ dùng lại đặc trưng pretrained.

Bài học: với ít dữ liệu và ràng buộc thời gian của ngân hàng, transfer learning + augmentation đúng nghiệp vụ thắng xa việc cố train từ đầu. Điểm mấu chốt là chọn phép augmentation hợp lý về nghiệp vụ (không lật chữ) và áp đúng chuẩn hoá ở cả train lẫn inference.


Ghi nhớ

  • Ảnh với máy tính là tensor số: xám [H,W], màu [C,H,W] (RGB); nhầm thứ tự channel-first/last là lỗi lặng lẽ.
  • Tiền xử lý bắt buộc: resize (giữ tỉ lệ bằng letterbox), chuẩn hoá theo mean/std của tập train (dùng đúng bộ ImageNet khi fine-tune pretrained).
  • Data augmentation (xoay, đổi sáng, nhiễu…) chống overfit và tăng dữ liệu ảo — chỉ áp cho train, và phải hợp lý nghiệp vụ (đừng lật ngang giấy tờ có chữ).
  • Đặc trưng thủ công (SIFT/HOG) tốn công, chỉ nắm mẫu cấp thấp, không học từ dữ liệu → deep learning chuyển sang tự học đặc trưng.
  • CNN = convolution (chia sẻ trọng số, bất biến dịch chuyển, học đặc trưng phân cấp cạnh→hình→vật thể) + pooling (giảm chiều) + activation + head.
  • ResNet với skip connection cho phép mạng cực sâu vẫn huấn luyện tốt; ResNet-50 là backbone mặc định thực tế.
  • Transfer learning là chìa khoá khi ít dữ liệu: dùng model pretrained ImageNet, đông cứng thân, thay & fine-tune head — cực phổ biến và hiệu quả cho nhận dạng giấy tờ ngân hàng.
  • Vision Transformer đang cạnh tranh CNN — xem CV hiện đại.

Bài viết liên quan

Phân biệt AI/ML/DL, các kiểu học máy, quy trình ML end-to-end và thuật ngữ nền tảng.

13 thg 7, 2026 14

Chất lượng dữ liệu, xử lý thiếu/ngoại lai, mã hoá, chuẩn hoá, tạo đặc trưng và tránh data leakage.

13 thg 7, 2026 12

Mô hình ngôn ngữ lớn hoạt động ra sao, token, context window, tham số sinh, và kỹ thuật viết prompt.

13 thg 7, 2026 11

Retrieval-Augmented Generation, vector database, tool calling, agent và MCP để xây ứng dụng LLM thực tế.

13 thg 7, 2026 11