Padim - Patch Distribution Modeling
Trong các hệ thống kiểm tra chất lượng bằng thị giác máy, một yêu cầu rất phổ biến là phát hiện sản phẩm lỗi trên dây chuyền sản xuất. Lỗi có thể là vết xước, vết nứt, vùng bẩn, thiếu chi tiết, sai hình dạng hoặc một thay đổi rất nhỏ trên bề mặt sản phẩm. Vấn đề là trong thực tế, ảnh sản phẩm đạt chuẩn thường rất nhiều, còn ảnh lỗi lại ít, không đều và khó bao phủ hết mọi tình huống có thể xảy ra.
Đây là lý do các phương pháp Anomaly Detection thường không đi theo hướng học từng loại lỗi cụ thể. Thay vào đó, chúng học xem dữ liệu bình thường trông như thế nào. Khi một ảnh mới có đặc trưng lệch khỏi trạng thái bình thường đã học, hệ thống xem đó là dấu hiệu bất thường.

PaDiM, viết tắt của Patch Distribution Modeling, là một phương pháp thuộc hướng tiếp cận này. Điểm chính của PaDiM là mô hình không chỉ học đặc trưng bình thường của toàn bộ ảnh, mà học phân bố đặc trưng bình thường tại từng vị trí patch trên ảnh. Nhờ vậy, PaDiM có thể làm được cả hai việc: phát hiện ảnh có lỗi và định vị vùng lỗi trên ảnh.
Ý tưởng cốt lõi của PaDim
Trong dây chuyền sản xuất, các sản phẩm đạt chuẩn thường khá giống nhau về hình dạng, màu sắc và bề mặt. Ví dụ với một linh kiện kim loại, phần mép ngoài, bề mặt phẳng, lỗ bắt vít hay các vân gia công thường xuất hiện ổn định giữa nhiều ảnh bình thường. Khi có lỗi như vết xước, vết bẩn, nứt hoặc thiếu chi tiết, vùng bị lỗi sẽ tạo ra đặc điểm khác so với những ảnh bình thường trước đó.

PaDiM tận dụng đặc điểm này bằng cách học xem từng vùng nhỏ trên ảnh bình thường thường trông như thế nào. Những vùng nhỏ này được gọi là patch, có thể hiểu đơn giản là một ô nhỏ hoặc một khu vực cục bộ trên ảnh. Tuy nhiên, PaDiM không so sánh trực tiếp từng pixel, vì pixel thô dễ bị ảnh hưởng bởi ánh sáng, nhiễu hoặc thay đổi nhỏ không quan trọng. Thay vào đó, ảnh được đưa qua một CNN pretrained như ResNet, tức một mạng đã được huấn luyện sẵn để trích xuất đặc trưng hình ảnh.
Trong PaDiM, CNN đóng vai trò như bộ trích xuất đặc trưng. Mô hình lấy feature từ nhiều tầng khác nhau của CNN, thường gồm các tầng trung gian, vì mỗi tầng giữ một loại thông tin khác nhau. Tầng nông thường chứa thông tin về cạnh, màu sắc và texture; tầng sâu hơn chứa thông tin về cấu trúc và hình dạng ở mức cao hơn. Các feature này được đưa về cùng kích thước không gian rồi ghép lại để tạo thành một biểu diễn giàu thông tin hơn cho từng patch.
Sau bước này, mô hình thu được feature map, có thể hiểu là “bản đồ đặc trưng” của ảnh. Mỗi vị trí trên feature map tương ứng với một vùng nhỏ trên ảnh gốc. Tại vị trí đó, PaDiM có một vector đặc trưng, tức một dãy số mô tả vùng ảnh tương ứng. Ví dụ, nếu một vị trí trên feature map ứng với vùng bề mặt kim loại, vector này sẽ mang thông tin về texture, cạnh, độ nhám hoặc cấu trúc của vùng bề mặt đó.

Trong giai đoạn huấn luyện, PaDiM chỉ sử dụng ảnh bình thường. Với mỗi vị trí patch, ví dụ vị trí (i, j) trên feature map, mô hình lấy các vector đặc trưng tại đúng vị trí đó từ nhiều ảnh normal. Tập các vector này cho biết vùng (i, j) trong trạng thái bình thường thường thay đổi trong phạm vi nào. Sau đó, PaDiM mô hình hóa tập vector này bằng một phân bố Gaussian, gồm mean — đặc trưng trung bình của vùng đó, và covariance — mức độ dao động tự nhiên của đặc trưng tại vùng đó.
Nói cách khác, PaDiM không học một mô hình chung cho toàn bộ ảnh, mà học một phân bố bình thường riêng cho từng vị trí patch. Nếu feature map có nhiều vị trí khác nhau, mỗi vị trí sẽ có một “hồ sơ bình thường” riêng. Đây là điểm quan trọng trong kiến trúc PaDiM, vì nó giúp mô hình không chỉ biết ảnh có bất thường hay không, mà còn biết bất thường nằm ở vùng nào.
Khi kiểm tra một ảnh mới, PaDiM đưa ảnh đó qua cùng CNN pretrained và tạo feature map theo cùng cách như lúc huấn luyện. Tại từng vị trí patch, vector đặc trưng của ảnh test được so sánh với phân bố Gaussian bình thường đã học ở cùng vị trí. Việc so sánh này được thực hiện bằng Mahalanobis distance, một loại khoảng cách dùng để đo xem một vector lệch xa phân bố bình thường đến mức nào. Nếu khoảng cách lớn, patch đó được gán anomaly score cao.
Trích xuất đặc trưng từ ảnh

Sau khi hiểu ý tưởng tổng quát, bước đầu tiên trong PaDiM là đưa ảnh qua một mạng CNN pretrained, thường là ResNet. Ở đây, CNN không dùng để phân loại ảnh như các bài toán thông thường, mà đóng vai trò như một bộ trích xuất đặc trưng. Nói đơn giản, thay vì để mô hình nhìn ảnh dưới dạng các giá trị pixel thô, CNN giúp chuyển ảnh thành các thông tin có ý nghĩa hơn, chẳng hạn như cạnh, vùng chuyển màu, hoa văn bề mặt, hình dạng cục bộ hoặc cấu trúc của vật thể.
Một điểm quan trọng của PaDiM là mô hình không chỉ lấy đặc trưng ở tầng cuối của CNN. Trong mạng CNN, mỗi tầng thường giữ một mức thông tin khác nhau. Các tầng đầu thường nhạy với chi tiết nhỏ như cạnh, màu sắc và texture — tức kiểu bề mặt như vân kim loại, vết nhám, hoa văn hoặc các đường gia công. Các tầng sâu hơn lại mô tả cấu trúc lớn hơn của ảnh, ví dụ hình dạng vùng, bố cục cục bộ hoặc đặc điểm tổng quát của vật thể. Vì bài toán phát hiện lỗi công nghiệp cần nhận ra cả lỗi nhỏ như vết xước lẫn lỗi lớn như thiếu chi tiết, PaDiM thường kết hợp đặc trưng từ nhiều tầng để biểu diễn ảnh tốt hơn.
Có thể hình dung như sau: nếu chỉ nhìn ảnh ở mức pixel, một vết xước nhỏ có thể bị nhầm với nhiễu, bóng sáng hoặc thay đổi ánh sáng. Nhưng khi ảnh được đưa qua CNN, vùng vết xước có thể tạo ra đặc trưng khác so với vùng bề mặt bình thường. Đây là lý do PaDiM không làm việc trực tiếp trên ảnh gốc, mà làm việc trên feature map — tức bản đồ đặc trưng do CNN tạo ra.

Trong thực tế, việc chọn feature từ bao nhiêu tầng phụ thuộc vào loại sản phẩm và loại lỗi cần phát hiện. Nếu sản phẩm có bề mặt đơn giản và lỗi chủ yếu là vết xước, vết bẩn, vết nứt nhỏ hoặc thay đổi texture, các tầng nông thường rất quan trọng vì chúng giữ nhiều thông tin chi tiết. Với những trường hợp này, dùng một hoặc hai tầng đầu có thể đã đủ tốt và giúp mô hình nhẹ hơn.
Ngược lại, với các đối tượng phức tạp hơn như PCB, dây cáp, transistor hoặc linh kiện có nhiều chi tiết nhỏ, chỉ dùng tầng nông có thể chưa đủ. Lúc này, nên kết hợp thêm tầng giữa hoặc tầng sâu để mô hình hiểu được cấu trúc tổng thể hơn, ví dụ vị trí linh kiện, đường mạch, vùng chân hàn, lỗ bắt vít hoặc bố cục giữa các cụm chi tiết. Nói cách khác, tầng nông giúp bắt các lỗi nhỏ trên bề mặt, còn tầng sâu giúp mô hình có thêm ngữ cảnh để tránh nhầm các biến đổi bình thường thành lỗi.
Có thể tóm tắt kinh nghiệm chọn tầng như sau:
| Cách lấy feature | Phù hợp khi | Đặc điểm |
|---|---|---|
| 1 layer | Sản phẩm đơn giản, lỗi rõ, bề mặt ít biến đổi | Nhẹ, nhanh, nhưng ít ngữ cảnh |
| 2 layers | Cần bắt cả chi tiết nhỏ và một phần cấu trúc vùng | Cân bằng giữa tốc độ và độ giàu thông tin |
| 3 layers | Sản phẩm phức tạp như PCB, cable, transistor | Nhiều thông tin hơn, nhưng nặng hơn |
Trong quá trình này, các feature map từ nhiều tầng có thể có kích thước khác nhau. Vì vậy, chúng cần được đưa về cùng kích thước không gian trước khi ghép lại. Sau khi ghép, tại mỗi vị trí trên feature map, ta có một vector đặc trưng giàu thông tin hơn, kết hợp cả chi tiết bề mặt và cấu trúc cục bộ của vùng ảnh tương ứng. Vector này sẽ được dùng ở các bước tiếp theo để học phân bố bình thường của từng patch.
Biểu diễn patch và học phân bố bình thường

Sau khi ghép đặc trưng từ nhiều tầng CNN, PaDiM thu được một feature map chung. Có thể hiểu feature map là bản đồ đặc trưng của ảnh, trong đó mỗi vị trí không còn là một pixel đơn lẻ, mà đại diện cho một vùng nhỏ trên ảnh gốc. Vùng nhỏ đó được gọi là patch. Tại mỗi vị trí patch, mô hình có một vector đặc trưng mô tả vùng ảnh tương ứng, ví dụ bề mặt nhẵn hay nhám, có cạnh mạnh, có hoa văn lặp lại hoặc có cấu trúc khác thường hay không.
Trong giai đoạn huấn luyện, PaDiM chỉ dùng các ảnh normal. Với mỗi vị trí patch (i, j), mô hình gom các vector đặc trưng tại đúng vị trí đó từ nhiều ảnh bình thường. Tập vector này cho biết vùng (i, j) khi sản phẩm không lỗi thường có đặc điểm như thế nào và được phép dao động trong phạm vi nào.

Từ tập vector này, PaDiM ước lượng một phân bố Gaussian cho từng vị trí patch, gồm hai thành phần chính là mean và covariance. Mean là vector trung bình, có thể hiểu như đặc trưng đại diện cho trạng thái bình thường điển hình của vùng đó. Covariance, hay ma trận hiệp phương sai, mô tả mức độ biến thiên tự nhiên của đặc trưng giữa các ảnh normal. Nhờ vậy, mô hình không yêu cầu mọi sản phẩm bình thường phải giống hệt nhau, mà vẫn cho phép một mức sai khác hợp lý do ánh sáng, nhiễu hoặc khác biệt nhỏ trong quá trình chụp.
Có thể hình dung đơn giản rằng với mỗi vị trí patch, PaDiM tạo ra một “đám mây điểm” trong không gian đặc trưng từ nhiều ảnh bình thường. Mean đóng vai trò như tâm của đám mây đó, còn covariance mô tả hình dáng và độ rộng của vùng phân bố bình thường. Nếu vector đặc trưng của một patch trong ảnh test nằm gần tâm và vẫn nằm trong vùng dao động quen thuộc, patch đó được xem là bình thường. Ngược lại, nếu vector này nằm quá xa khỏi vùng phân bố normal, PaDiM sẽ gán cho patch đó điểm bất thường cao.
Tính điểm bất thường và tạo anomaly map
Sau khi đã học phân bố bình thường cho từng vị trí patch, PaDiM dùng các phân bố này để kiểm tra ảnh mới. Ảnh test được đưa qua cùng CNN pretrained và xử lý giống như giai đoạn huấn luyện, từ đó thu được vector đặc trưng tại từng patch.
Với mỗi vị trí patch (i, j), PaDiM so sánh vector đặc trưng của ảnh test với phân bố Gaussian normal đã học ở cùng vị trí. Nếu vector này vẫn nằm trong vùng phân bố quen thuộc, patch được xem là bình thường. Nếu nó lệch xa khỏi vùng normal, patch sẽ được gán điểm bất thường cao.

Để đo mức độ lệch này, PaDiM sử dụng Mahalanobis distance. Khác với khoảng cách thông thường chỉ đo “xa bao nhiêu”, Mahalanobis distance còn xét đến hướng lệch và mức dao động tự nhiên của dữ liệu normal. Vì vậy, nó phù hợp để đánh giá xem một patch có thật sự nằm ngoài trạng thái bình thường hay không.
Trong đó, x là vector đặc trưng của patch trong ảnh test, μ là mean, còn Σ là covariance của patch đó đã học từ ảnh normal.

Khi tính Mahalanobis distance cho tất cả các patch, PaDiM thu được một score map ở kích thước của feature map, ví dụ 28 × 28. Score map này nhỏ hơn ảnh gốc vì khi ảnh đi qua CNN, kích thước không gian thường bị giảm xuống do convolution, stride hoặc pooling. Vì vậy, mỗi điểm trên score map không tương ứng với một pixel riêng lẻ, mà đại diện cho mức bất thường của một vùng nhỏ trên ảnh gốc.
Để hiển thị kết quả trực quan, score map sẽ được resize/upsample về kích thước ảnh ban đầu, ví dụ từ 28 × 28 lên 224 × 224. Sau đó, bản đồ này thường được làm mượt nhẹ bằng Gaussian filter để vùng lỗi hiển thị liền mạch hơn. Kết quả cuối cùng là anomaly map, tức heatmap cho biết vùng nào có khả năng bất thường. Từ anomaly map, PaDiM có thể định vị vùng lỗi bằng cách quan sát các vùng có score cao, hoặc lấy điểm lớn nhất/tổng hợp trên bản đồ này để quyết định toàn ảnh có lỗi hay không.
Thử nghiệm PaDiM trên bộ dữ liệu MVTec AD
Để hiểu rõ hơn cách PaDiM hoạt động, mình xây dựng một notebook demo trên Kaggle với bộ dữ liệu MVTec AD. Notebook này chỉ tập trung vào việc triển khai lại pipeline cơ bản của PaDiM, không nhằm tối ưu kết quả hay so sánh sâu với các phương pháp khác.
Trong notebook, mình lần lượt thực hiện các bước chính: dùng ResNet để trích xuất đặc trưng từ ảnh normal, gom đặc trưng theo từng patch, ước lượng phân bố Gaussian cho trạng thái bình thường, sau đó dùng Mahalanobis distance để tính điểm bất thường trên ảnh test. Kết quả được hiển thị dưới dạng anomaly map, giúp quan sát trực quan vùng nào trên sản phẩm có khả năng bị lỗi.
Bạn có thể xem notebook demo tại: [link Kaggle Notebook] (opens in a new tab).