Chuyển tới nội dung chính

Thị giác máy tính

Thị giác máy tính (computer vision) là lĩnh vực giúp máy tính "nhìn" và hiểu được nội dung của ảnh hay video: nhận ra một con mèo trong bức ảnh, đọc biển số xe, khoanh vùng khối u trên phim chụp y tế. Nghe thì giống chuyện con người làm dễ dàng mỗi ngày, nhưng với máy tính một bức ảnh chỉ là một đống con số. Cả lĩnh vực này xoay quanh câu hỏi: làm sao biến đống con số đó thành ý nghĩa.

Để thấy bài toán khó tới đâu, hãy tưởng tượng bạn phải nhận ra chữ số viết tay mà chỉ được dùng các câu lệnh if trên giá trị từng pixel. Bạn viết vài luật kiểu "nếu vùng giữa sáng thì có thể là số 8", rồi lập tức vấp phải người viết to nhỏ khác nhau, nghiêng khác nhau, đặt lệch tâm khác nhau, và mỗi luật thêm vào để cứu một trường hợp lại phá vỡ một trường hợp khác. Vấn đề không phải bạn nghĩ chưa kỹ: tri thức "thế nào là số 8" là loại tri thức con người có nhưng không phát biểu ra được thành luật. Đó là lý do thị giác máy tính chuyển sang học từ dữ liệu, và cũng là lý do mô hình phải được thiết kế sao cho tôn trọng cấu trúc rất đặc thù của ảnh.

Thử ngay: trượt bộ lọc qua một ảnh nhỏ

Cách máy bắt đầu đọc một ảnh là trượt một ô vuông trọng số nhỏ, gọi là bộ lọc, qua khắp ảnh; mỗi vị trí cho ra một con số, và tập các con số ấy hợp thành một ảnh mới gọi là bản đồ đặc trưng. Hãy tự tay trượt bộ lọc qua một ảnh nhỏ dưới đây. Chọn một bộ lọc, rồi bấm "Sau" để đưa cửa sổ 3x3 sang ô kế: bạn sẽ thấy phép nhân từng phần tử với trọng số, tổng của chúng, và ô tương ứng của bản đồ đặc trưng được điền dần. Thử đổi qua lại giữa dò cạnh và làm mờ để thấy cùng một ảnh cho ra hai bản đồ rất khác nhau. Quan trọng hơn, bạn có thể sửa thẳng chín trọng số của bộ lọc và bấm vào từng điểm ảnh để vẽ lại ảnh vào: bản đồ đặc trưng được tính lại ngay theo những gì bạn nhập.

Phép tích chập chạy từng bướcÔ 1/16
Ảnh vào (6x6)
Bấm một điểm ảnh để đổi giữa tối (20) và sáng (230).
Bộ lọc 3x3 (sửa được)
Nhận số nguyên, số thập phân hoặc phân số kiểu 1/9.
Nhân từng phần tử
-20
0
20
-20
0
230
-20
0
230
Tổng = 420
Bản đồ đặc trưng (4x4)
420
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
Cửa sổ 3x3 đang xét ở hàng 0, cột 0. Nhân từng điểm ảnh với trọng số cùng vị trí rồi cộng lại, tổng 420 rơi vào ô (0, 0) của bản đồ đặc trưng.
  • Tích chập là phép nhân cục bộ rồi cộng: một ô đầu ra chỉ nhìn một cửa sổ nhỏ của ảnh.
  • Cùng một bộ lọc được dùng chung khắp ảnh (chia sẻ trọng số), nên rất ít tham số.
  • Bộ lọc dò cạnh cho giá trị lớn ở đúng nơi độ sáng đổi đột ngột, gần 0 ở vùng phẳng.

Ý tưởng cốt lõi

Ảnh số là một ma trận điểm ảnh

Với máy tính, một ảnh xám kích thước cao H và rộng W chỉ là một bảng số H hàng và W cột. Mỗi ô trong bảng là một điểm ảnh (pixel), giá trị thường từ 0 (đen) đến 255 (trắng), các giá trị ở giữa là các mức xám.

Ảnh màu thì có ba bảng số như vậy chồng lên nhau, gọi là ba kênh đỏ, lục, lam (RGB). Khi đó ảnh là một khối số ba chiều H nhân W nhân 3. Người ta hay gọi khối số nhiều chiều này là một tensor.

Một vài ví dụ quen thuộc:

  • MNIST (chữ số viết tay): 28 nhân 28, một kênh xám, 10 lớp từ 0 đến 9.
  • CIFAR-10 (vật thể nhỏ): 32 nhân 32, ba kênh màu, 10 lớp.
  • ImageNet (ảnh đời thực): khoảng 224 nhân 224, ba kênh màu, 1000 lớp.

Điểm quan trọng cần nhớ: vị trí của pixel rất có ý nghĩa. Các pixel gần nhau thường liên quan tới nhau, cùng tạo nên một nét, một góc, một vật thể. Đây chính là cấu trúc không gian mà thị giác máy tính cần khai thác.

Kênh màu và tiền xử lý

Ba kênh đỏ, lục, lam chỉ là cách mã hóa khớp với đèn màn hình, không phải cách duy nhất. HSV tách riêng sắc màu, độ bão hòa và độ sáng nên hợp khi cần dò một màu bất kể trời sáng hay tối; ảnh xám bỏ hẳn thông tin màu khi màu vô ích, ví dụ đọc chữ trên giấy trắng; ảnh vệ tinh còn có thể nhiều hơn ba kênh. Với mô hình, số kênh chỉ là chiều thứ ba của khối số nên đổi số kênh không làm đổi ý tưởng thuật toán.

Trước khi đưa ảnh vào mô hình, ta thường tiền xử lý ba việc: đưa về cùng kích thước vì các tầng nơ-ron ở cuối mạng đòi đầu vào cố định chiều; chuẩn hóa giá trị, ví dụ chia cho 255 để đưa về khoảng từ 0 tới 1, vì thuật toán tối ưu chạy ổn định hơn hẳn khi các đầu vào cùng thang đo; và khử nhiễu khi cần, ví dụ làm mượt trước khi dò cạnh để khỏi dò trúng hạt nhiễu. Một cái bẫy hay gặp: tham số chuẩn hóa phải tính chỉ trên tập huấn luyện rồi áp y hệt cho tập kiểm thử, nếu tính trên toàn bộ dữ liệu thì thông tin đã rò rỉ và con số đánh giá sẽ đẹp một cách giả tạo.

Vì sao không chỉ trải phẳng rồi nhét vào mạng thường?

Cách ngây thơ nhất là trải phẳng ma trận ảnh thành một vector dài rồi đưa vào một mạng nơ-ron thông thường (MLP). Với MNIST, ta biến 28 nhân 28 thành một vector 784 số. Cách này chạy được và đạt độ chính xác khá tốt, nhưng có ba vấn đề lớn:

  1. Quá nhiều tham số. Chỉ riêng tầng đầu nối 784 đầu vào tới 128 nơ-ron đã cần hơn một trăm nghìn tham số. Với ảnh ImageNet con số này lên tới hàng chục triệu, không khả thi.
  2. Vứt bỏ cấu trúc không gian. Khi trải phẳng, hai pixel cạnh nhau và hai pixel ở hai góc đối diện bị coi như nhau. Mạng không còn khái niệm "hàng xóm".
  3. Không bền với dịch chuyển. Nếu dời con mèo sang phải vài pixel, toàn bộ vector đầu vào thay đổi, mạng phải học lại từ đầu con mèo ở mỗi vị trí.

Đặc trưng ảnh

Đặc trưng (feature) là những thông tin cô đọng giúp phân biệt ảnh này với ảnh khác: một cạnh thẳng đứng, một góc, một mảng kết cấu lặp lại, hay cao hơn là một bánh xe, một con mắt.

Ngày xưa người ta phải tự thiết kế tay các bộ dò đặc trưng (ví dụ bộ lọc Sobel dò cạnh). Ngày nay, điều làm nên sức mạnh của học sâu là mạng tự học lấy các đặc trưng từ dữ liệu. Và mạng học theo thứ bậc: tầng đầu học cạnh và góc đơn giản, tầng giữa ghép thành bộ phận vật thể, tầng cuối ghép thành vật thể hoàn chỉnh.

Sự đối lập này là bước ngoặt của cả lĩnh vực. Với đặc trưng thủ công, quy trình có hai giai đoạn tách rời: chuyên gia thiết kế một bộ rút đặc trưng cố định, rồi một mô hình học máy thông thường học phân loại trên các đặc trưng ấy. Ưu điểm là dễ giải thích, cần ít dữ liệu, chạy được trên máy yếu; nhược điểm là mỗi bài toán mới lại phải ngồi nghĩ lại, và bộ đặc trưng con người nghĩ ra hiếm khi tốt nhất vì con người chỉ tưởng tượng được những gì mình diễn đạt được. Với đặc trưng học được, hai giai đoạn nhập làm một: trọng số bộ lọc do thuật toán tối ưu điều chỉnh sao cho sai số phân loại cuối cùng nhỏ nhất. Cái giá là cần nhiều dữ liệu có nhãn, nhiều phép tính, và ta mất khả năng nhìn vào một trọng số mà nói được nó nghĩa là gì.

Phép tích chập và bộ lọc

Công cụ then chốt để rút đặc trưng từ ảnh là phép tích chập (convolution). Ý tưởng rất gọn: ta có một bộ lọc (kernel) nhỏ, thường 3 nhân 3 hoặc 5 nhân 5, là một ma trận trọng số nhỏ. Ta cho bộ lọc này trượt qua khắp ảnh; tại mỗi vị trí, ta nhân từng phần tử của bộ lọc với phần tử ảnh tương ứng dưới nó rồi cộng tất cả lại, được một số duy nhất cho ô đầu ra đó.

Kết quả tại một vị trí sẽ lớn khi vùng ảnh ở đó "giống" hình dạng mà bộ lọc đang tìm. Ví dụ một bộ lọc dò cạnh thẳng đứng sẽ cho giá trị cao đúng tại những chỗ ảnh có cạnh thẳng đứng. Bảng kết quả sau khi trượt khắp ảnh gọi là bản đồ đặc trưng (feature map).

Bốn thuật ngữ then chốt

Một vài tham số đi kèm phép tích chập:

  • Stride là bước nhảy của bộ lọc. Stride 1 trượt từng pixel; stride 2 nhảy hai pixel mỗi lần nên đầu ra nhỏ đi một nửa mỗi chiều.
  • Padding là việc viền thêm các pixel 0 quanh ảnh để đầu ra giữ nguyên kích thước, tránh hao hụt ở mép.
  • Số kênh đầu ra: mỗi tầng học nhiều bộ lọc song song, mỗi bộ lọc cho một bản đồ đặc trưng riêng, nên tầng đầu thường có vài chục bộ lọc.

Vì sao tích chập hay đến vậy? Một bộ lọc 3 nhân 3 chỉ có 9 trọng số nhưng dùng chung cho toàn bộ ảnh. Nhờ dùng chung trọng số này mà ta giải quyết luôn cả ba vấn đề ở trên: ít tham số, khai thác được vùng lân cận, và một con mèo ở góc nào trong ảnh cũng được cùng một bộ lọc phát hiện.

Ba giả định nằm sau phép tích chập

Nói cho chặt, tích chập không phải phép màu. Nó là một mô hình gài sẵn ba giả định về thế giới ảnh: khi ba giả định đúng, mô hình học nhanh và cần ít dữ liệu; khi chúng sai, nó thua một mô hình tổng quát hơn.

Tính cục bộ. Một cạnh hay một góc chỉ cần vài pixel kề nhau là nhận ra được, không cần nhìn pixel ở góc đối diện, nên mỗi nơ-ron tích chập chỉ nối với một cửa sổ nhỏ và số kết nối giảm hàng nghìn lần. Giả định này đúng với hầu hết ảnh tự nhiên, và sai với dữ liệu mà các ô xa nhau phụ thuộc trực tiếp vào nhau.

Dùng chung trọng số. Cùng một bộ lọc quét khắp ảnh, tức là ta tin cách nhận ra cạnh ở góc trên trái không khác cách nhận ra nó ở góc dưới phải. Nhờ vậy mỗi ví dụ huấn luyện dạy cho bộ lọc nhiều lần chứ không phải một lần, nên hiệu quả dữ liệu tăng rõ rệt.

Bất biến tịnh tiến. Dời con mèo sang phải mười pixel thì nó vẫn là con mèo, và bản đồ đặc trưng cũng chỉ dịch theo chừng ấy; mạng nối đầy đủ không có tính chất này vì với nó ảnh dịch đi là một vector hoàn toàn mới. Nhưng tích chập không cho ta bất biến với xoay hay đổi tỉ lệ: một chữ số bị xoay 90 độ vẫn là đầu vào lạ, nên phải bổ sung bằng tăng cường dữ liệu.

Pooling: thu nhỏ bản đồ đặc trưng

Sau tích chập, ta thường pooling để thu nhỏ kích thước. Max pooling chia bản đồ thành các ô nhỏ (ví dụ 2 nhân 2) rồi mỗi ô chỉ giữ lại giá trị lớn nhất. Việc này giảm số phép tính cho tầng sau và khiến mạng bền hơn với những xê dịch nhỏ, vì ta chỉ quan tâm "có đặc trưng đó trong vùng này không" chứ không cần đúng từng pixel.

Mạng nơ-ron tích chập CNN (ý tưởng)

Mạng nơ-ron tích chập (convolutional neural network, CNN) chính là việc xếp chồng nhiều tầng tích chập và pooling lại với nhau, rồi cắm một mạng phân loại nhỏ ở cuối. Một CNN cổ điển kiểu LeNet có ba khối:

  1. Khối tích chập. Nhiều cặp gồm tích chập, hàm kích hoạt ReLU, và pooling, nối tiếp nhau để rút đặc trưng từ thô đến tinh.
  2. Khối làm phẳng. Sau khi qua các tầng tích chập, ta trải khối đặc trưng còn lại thành một vector.
  3. Khối phân loại. Một vài tầng nơ-ron thường cộng với softmax ở cuối để cho ra xác suất từng lớp.

Càng vào sâu, mỗi nơ-ron càng "nhìn" được một vùng rộng hơn của ảnh gốc và đặc trưng nó nắm bắt càng trừu tượng. Đó là lý do CNN xếp nhiều tầng thay vì một tầng to.

Luồng dữ liệu qua một CNN
Ảnh vào
ma trận điểm ảnh
Tích chập
bộ lọc rút đặc trưng
Gộp (pooling)
thu nhỏ bản đồ
Kết nối đầy đủ
trải phẳng, tầng nơ-ron
Phân loại
softmax cho xác suất lớp

Vài mốc kiến trúc đáng nhớ: LeNet-5 năm 1998 đọc chữ số viết tay, AlexNet năm 2012 mở ra kỷ nguyên học sâu khi thắng ImageNet, rồi VGG, ResNet (rất sâu nhờ kết nối phần dư), và gần đây là Vision Transformer dùng cơ chế chú ý thay cho tích chập.

Trong thực hành ta hiếm khi huấn luyện CNN từ con số 0. Phổ biến hơn là transfer learning: lấy một mạng đã được huấn luyện sẵn trên ImageNet, giữ nguyên phần rút đặc trưng, chỉ thay và huấn luyện lại tầng phân loại cuối cho bài toán của mình. Cách này cho kết quả tốt ngay cả khi ta chỉ có vài nghìn ảnh.

Các tác vụ thị giác máy tính

Cùng nền tảng CNN, tùy cách dùng đầu ra mà ta giải nhiều bài toán khác nhau:

  • Phân loại ảnh (image classification): cả bức ảnh thuộc lớp nào. Đầu ra là một nhãn, ví dụ "mèo".
  • Phát hiện vật thể (object detection): trong ảnh có những vật gì và nằm ở đâu. Đầu ra là các khung chữ nhật bao quanh từng vật kèm nhãn, ví dụ YOLO.
  • Phân vùng ảnh (image segmentation): gán nhãn cho từng pixel, ví dụ pixel này thuộc đường, pixel kia thuộc người. Đây là mức hiểu ảnh chi tiết nhất, rất quan trọng cho xe tự lái và ảnh y tế.

Ba tác vụ khác nhau chủ yếu ở đầu ra và loại nhãn, còn phần rút đặc trưng phía dưới gần như dùng chung. Hệ quả thực tế: chi phí nặng nhất thường nằm ở việc chuẩn bị nhãn chứ không ở mô hình, vì tô nhãn cho từng pixel của một ảnh đường phố có thể mất hàng chục phút trong khi gán một nhãn cho cả bức ảnh chỉ mất vài giây.

Tăng cường dữ liệu

Học sâu đói dữ liệu, mà dữ liệu có nhãn thì đắt. Tăng cường dữ liệu (data augmentation) là cách rẻ nhất để có thêm dữ liệu: sinh ra các phiên bản biến đổi của ảnh gốc mà nhãn không đổi, chẳng hạn lật ngang, xoay nhẹ, cắt ngẫu nhiên, đổi độ sáng, thêm chút nhiễu.

Vì sao cách này có tác dụng? Bằng việc bắt mạng trả lời đúng cho mọi biến thể, ta dạy cho mạng những bất biến mà kiến trúc không tự có: tích chập tự cho bất biến tịnh tiến, còn bất biến với xoay, với đổi sáng, với che khuất thì phải dạy bằng dữ liệu. Điều tối quan trọng là phép biến đổi phải bảo toàn nhãn: lật ngang con mèo thì vô hại, nhưng lật ngang chữ số 2 cho ra một hình không còn là chữ số, và lật ảnh y tế có thể đảo trái phải giải phẫu. Chọn phép tăng cường vì thế cần hiểu miền ứng dụng, không phải bật hết mọi lựa chọn có sẵn trong thư viện.

Hạn chế và khi nào mô hình hỏng

Trôi phân phối. Mô hình chỉ đúng trên loại ảnh giống ảnh nó từng thấy. Một mô hình huấn luyện trên ảnh chụp bằng máy của bệnh viện A có thể tụt hẳn chất lượng trên ảnh của bệnh viện B chỉ vì máy khác, ánh sáng khác, cách nén ảnh khác. Con người gần như không nhận ra khác biệt đó, còn mô hình thì nhận ra rất rõ, theo hướng có hại.

Đặc trưng ăn theo. Mô hình học bất cứ tín hiệu nào giúp giảm sai số trên tập huấn luyện, kể cả tín hiệu vô nghĩa. Nếu mọi ảnh bò trong dữ liệu đều chụp trên đồng cỏ, mô hình rất có thể học "cỏ nghĩa là bò" và sẽ trượt khi thấy con bò trên bãi biển. Loại lỗi này đặc biệt nguy hiểm vì nó không lộ ra trong con số đánh giá: tập kiểm thử thường cùng phân phối với tập huấn luyện nên chứa cùng cái ăn theo đó.

Nhạy với nhiễu đối kháng. Thêm vào ảnh một nhiễu rất nhỏ, mắt người không thấy, cũng có thể khiến mô hình đổi hẳn nhãn dự đoán.

Hiểu nhầm thường gặp

"Độ chính xác cao nghĩa là mô hình đã hiểu ảnh." Không. Nó chỉ nghĩa là mô hình khớp tốt với tập kiểm thử đó, mà tập kiểm thử chia ngẫu nhiên từ cùng mẻ dữ liệu thì chia sẻ mọi thiên lệch và mọi đặc trưng ăn theo.

"Pooling làm CNN bất biến hoàn toàn với dịch chuyển." Không. Pooling chỉ cho bất biến với xê dịch nhỏ trong phạm vi cửa sổ gộp; xoay, đổi tỉ lệ và dịch chuyển lớn vẫn làm mô hình sai.

"Bộ lọc là do người thiết kế." Chỉ đúng với thời đặc trưng thủ công. Trong CNN, trọng số bộ lọc là tham số được học.

Mã nguồn Python

Đoạn dưới minh họa một phép tích chập 2D đơn giản, viết bằng list Python thuần, không dùng thư viện ngoài. Ảnh là một ma trận nhỏ và bộ lọc dò cạnh thẳng đứng. Ta dùng stride 1 và không padding, nên đầu ra nhỏ hơn đầu vào một chút.

def tich_chap_2d(anh, bo_loc):
# anh: list cac hang (list cac so); bo_loc: ma tran k x k
H = len(anh)
W = len(anh[0])
k = len(bo_loc)
H_out = H - k + 1 # khong padding, stride = 1
W_out = W - k + 1
ket_qua = []
for i in range(H_out):
hang = []
for j in range(W_out):
tong = 0
# truot cua so k x k tai vi tri (i, j)
for p in range(k):
for q in range(k):
tong += anh[i + p][j + q] * bo_loc[p][q]
hang.append(tong)
ket_qua.append(hang)
return ket_qua


# Anh nho 5 x 5: nua trai toi (0), nua phai sang (10) -> co mot canh doc o giua
anh = [
[0, 0, 10, 10, 10],
[0, 0, 10, 10, 10],
[0, 0, 10, 10, 10],
[0, 0, 10, 10, 10],
[0, 0, 10, 10, 10],
]

# Bo loc do canh doc: trai am, phai duong
bo_loc_canh_doc = [
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1],
]

dac_trung = tich_chap_2d(anh, bo_loc_canh_doc)
for hang in dac_trung:
print(hang)

# Cot co gia tri lon (30) chinh la noi co canh doc trong anh

Khi chạy, cột nào trong kết quả có giá trị lớn chính là nơi ảnh có cạnh thẳng đứng. Đó là toàn bộ trực giác của tích chập: bộ lọc "sáng lên" ở đúng chỗ có đặc trưng nó tìm.

Bài tập thực hành

Bài 1. Thay bo_loc_canh_doc bằng một bộ lọc dò cạnh ngang rồi chạy lại trên một ảnh có cạnh ngang (nửa trên tối, nửa dưới sáng). Quan sát xem giá trị lớn xuất hiện ở đâu.

Gợi ý

Bộ lọc cạnh ngang là phiên bản xoay 90 độ của bộ lọc cạnh dọc: hàng trên âm, hàng dưới dương, ví dụ [[-1, -1, -1], [0, 0, 0], [1, 1, 1]]. Hãy tạo một ảnh mà nửa trên toàn 0 và nửa dưới toàn 10, kết quả sẽ "sáng" ở hàng giữa, đúng nơi có cạnh ngang.

Bài 2. Viết thêm hàm max_pooling(anh, k) chia ma trận thành các ô k nhân k không chồng lấn rồi mỗi ô giữ lại giá trị lớn nhất. Áp dụng lên kết quả tích chập ở ví dụ trên với k bằng 2.

Gợi ý

Dùng hai vòng lặp ngoài nhảy theo bước k (ví dụ for i in range(0, H, k)), bên trong hai vòng lặp nữa duyệt khối k nhân k để tìm max. Lưu ý kích thước đầu ra giảm còn khoảng một phần k mỗi chiều. Hàm max() của Python giúp lấy giá trị lớn nhất gọn gàng.

Bài 3. Cho biết với ảnh đầu vào 28 nhân 28, bộ lọc 3 nhân 3, padding 1 và stride 1, đầu ra có kích thước bao nhiêu? Nếu đổi stride thành 2 thì sao?

Gợi ý

Dùng công thức kích thước đầu ra mỗi chiều bằng phần nguyên của (H + 2p - k) / s rồi cộng 1. Với padding 1, kernel 3, stride 1, đầu ra giữ nguyên 28. Với stride 2, đầu ra còn khoảng một nửa, tức 14.

Tự kiểm tra

Vì sao CNN cần ít tham số hơn nhiều so với MLP khi xử lý ảnh?

Vì CNN dùng chung một bộ lọc nhỏ cho toàn bộ ảnh thay vì nối mọi pixel với mọi nơ-ron. Một bộ lọc 3 nhân 3 chỉ có 9 trọng số nhưng quét khắp ảnh. Việc dùng chung trọng số này vừa giảm số tham số, vừa giúp mạng nhận ra một vật thể ở bất kỳ vị trí nào trong ảnh.

Phân biệt phân loại ảnh, phát hiện vật thể và phân vùng ảnh.

Phân loại ảnh trả về một nhãn cho cả bức ảnh. Phát hiện vật thể trả về các khung bao quanh từng vật kèm nhãn, tức là biết cả "cái gì" lẫn "ở đâu". Phân vùng ảnh đi xa nhất, gán nhãn cho từng pixel nên cho ra ranh giới chi tiết của mỗi vùng.

Mô hình phân loại "có bò hay không" đạt kết quả rất cao trên tập kiểm thử nhưng trượt hẳn với ảnh bò trên bãi biển. Chuyện gì đã xảy ra?

Nhiều khả năng mô hình đã học một đặc trưng ăn theo: trong dữ liệu, mọi ảnh có bò đều chụp trên đồng cỏ, nên nền cỏ đủ để đoán đúng nhãn và mô hình không cần học hình dạng con bò. Tập kiểm thử chia ngẫu nhiên từ cùng mẻ dữ liệu mang đúng thiên lệch đó nên con số đánh giá vẫn đẹp.

Cách kiểm chứng: thu tập kiểm thử ở nguồn khác, cố ý phá vỡ tương quan nền và nhãn (ảnh bò trên bãi biển, ảnh đồng cỏ không có bò), hoặc che nền rồi xem dự đoán có đổi không. Cách khắc phục: bổ sung dữ liệu đa dạng nền, và tăng cường bằng cắt ngẫu nhiên hoặc che vùng.

Câu hỏi tự kiểm

Kiểm tra nhanh: thị giác máy tính0/4 đúngchưa trả lời
  1. 1Vì sao CNN cần ít tham số hơn nhiều so với MLP khi xử lý ảnh?
  2. 2Giả định "bất biến tịnh tiến" mà phép tích chập gài sẵn nghĩa là gì?
  3. 3Max pooling mang lại lợi ích gì cho CNN?
  4. 4Đặc trưng ăn theo, kiểu mọi ảnh bò đều chụp trên đồng cỏ, nguy hiểm vì sao?

Tóm tắt

Ảnh với máy tính là một khối số, và mọi khó khăn của thị giác máy tính bắt nguồn từ khoảng cách giữa khối số đó và ý nghĩa mà con người thấy. Viết luật tay không đi tới đâu vì tri thức thị giác của con người là tri thức ngầm. Học từ dữ liệu giải được bài toán, nhưng chỉ khi mô hình biết tôn trọng cấu trúc không gian của ảnh. Phép tích chập là hiện thân của sự tôn trọng đó: nó gài vào mô hình ba giả định (đặc trưng có tính cục bộ, cùng một bộ dò dùng được ở mọi vị trí, ảnh dịch đi vẫn là ảnh cũ) và đổi lại cho ta ít tham số, hiệu quả dữ liệu cao, khả năng nhận ra vật thể ở bất kỳ đâu trong khung hình.

Nhưng chính ba giả định đó cũng là giới hạn. Mô hình không bất biến với xoay hay đổi tỉ lệ trừ khi ta dạy bằng tăng cường dữ liệu; nó suy sụp khi phân phối dữ liệu đổi; và nó sẵn sàng bám vào bất kỳ tín hiệu ăn theo nào miễn tín hiệu đó giúp giảm sai số trên tập huấn luyện. Vì vậy công việc thật không dừng ở chỗ chọn kiến trúc, mà nằm ở chỗ hiểu dữ liệu, chọn phép tăng cường đúng với miền, và kiểm thử ở nơi mô hình có khả năng vỡ.

Ghi nhớ

Ảnh số chỉ là một ma trận (hoặc khối) điểm ảnh, và vị trí pixel mang nhiều thông tin. Phép tích chập trượt một bộ lọc nhỏ dùng chung khắp ảnh để rút ra đặc trưng, nhờ đó CNN ít tham số, khai thác được cấu trúc không gian và bền với dịch chuyển. Xếp chồng tích chập và pooling tạo nên CNN học đặc trưng theo thứ bậc, làm nền cho ba tác vụ lớn: phân loại ảnh, phát hiện vật thể và phân vùng ảnh.