Phân vùng hình ảnh - Image Segmentation

{jcomments on}

Author: Nguyễn Thế Hiệp

Published date: 10/04/2022

1. Giới thiệu

Phân vùng hình ảnh là một trong những nhiệm vụ cơ bản trong thị giác máy tính bên cạnh các bài toán nhận dạng và phát hiện đối tượng. Mục tiêu của phân vùng hình ảnh là phân loại từng pixel trong hình ảnh vào một lớp cụ thể hay còn gọi là gán nhãn cho pixel. Chủ đề này hiện đang được quan tâm rộng rãi bởi các ứng dụng tiềm năng như xe tự lái, chẩn đoán ảnh y tế, phân tích khuôn mặt trong ảnh, robot cảm biến. Trong bài viết này, tôi hy vọng có thể đem đến cho mọi người cái nhìn tổng quan nhất về chủ đề này.

2. Phân vùng hình ảnh là gì

Phân vùng hình ảnh là quá trình chia một hình ảnh thành nhiều vùng. Trong quá trình này, mỗi pixel trong hình ảnh được gán vào một lớp nhất định, do đó có thể coi phân vùng hình ảnh là bài toán phân loại trên mỗi pixel. Có 2 loại phân vùng hình ảnh chính:

  • Phân vùng ngữ nghĩa (Semantic Segmentation): là quá trình phân lớp mỗi pixel thuộc một nhãn cụ thể mà không phân biệt sự khác nhau giữa các đối tượng trong cùng một lớp. Ví dụ trong hình ảnh bên trái chúng ta phân biệt được pixel nào thuộc về người và pixel nào thuộc về background. Tuy nhiên trong bức ảnh xuất hiện 5 người, mức độ phân chia sẽ không xác định từng pixel thuộc về người nào.

  • Phân vùng đối tượng (Instance Segmentation):phân đoạn các vùng ảnh chi tiết đến từng đối tượng trong mỗi lớp. Ví dụ: ở hình ảnh bên phải đối với nhãn người sẽ được phân chia chi tiết tới từng người 1, 2, … , 5.

     

    Hình 1: Khác biệt giữa semantic segmentation và Instance Segmentation [8]Hình 1: Khác biệt giữa semantic segmentation và Instance Segmentation [8]

3. Ứng dụng của phân vùng hình ảnh

  • Xe tự lái: Xe tự lái cần sự hiểu biết đầy đủ về môi trường xung quanh chúng ở mức độ chi tiết đến từng pixel. Do đó, phân vùng hình ảnh được sử dụng để xác định làn đường và các thông tin cần thiết khác như người đi bộ, xe cộ, biển báo....

Hình 2: Ví dụ về ứng dụng của phần vùng hình ảnh trong xe tự lái [8]Hình 2: Ví dụ về ứng dụng của phần vùng hình ảnh trong xe tự lái [8]

  • Chuẩn đoán hình ảnh y tế: Phân vùng hình ảnh cũng được sử dụng trong chẩn đoán hình ảnh y tế, hỗ trợ các bác sĩ trong việc chuẩn đoán các khối u hoặc các điểm bất thường từ các ảnh chụp CT. Ảnh chụp CT và hầu hết các hình ảnh y tế đều rất phức tạp nên khó xác định các điểm bất thường. Có thể sử dụng phân vùng hình ảnh như một công cụ chẩn đoán để phân tích những hình ảnh như vậy để các bác sĩ có thể đưa ra các quyết định quan trọng cho việc điều trị của bệnh nhân.

Hình 3: Ứng dụng của phân vùng hình ảnh trong y tế [8]Hình 3: Ứng dụng của phân vùng hình ảnh trong y tế [8]

  • Hiệu ứng background của google meet: phân vùng hình ảnh có thể sử dụng để làm mờ background hoặc thay thế background khác. Ví dụ: Hiệu thay thế background của người dùng trên google meet.

Hình 4: Ứng dụng của phân vùng hình ảnh trong google meet [9]Hình 4: Ứng dụng của phân vùng hình ảnh trong google meet [9]

  • Xử lí ảnh vệ tinh: Trong trường hợp ảnh vệ tinh, mô hình có thể phân vùng đâu là tòa nhà, đường xá, ô tô hoặc cây cối.... Từ đó có thể áp dụng cho việc phân tích đường xá giao thông, hoặc ứng dụng cho các thiết bị bay không người lái.

4. Một số kiến trúc tiêu biểu cho phân vùng hình ảnh

Trước khi học sâu (deep learning) ra đời, các kỹ thuật học máy cổ điển như SVM, Random Forest, K-means Clustering, mean shift clustering đã được sử dụng để giải quyết vấn đề phân vùng hình ảnh. Nhưng giống như hầu hết các bài toán khác (phân lớp hình ảnh, nhận diện đối tượng...) trong thị giác máy tính, học sâu đã chứng minh được là nó đem lại kết quả tốt hơn một cách toàn diện so với các kỹ thuật cổ điển trong việc phân vùng hình ảnh. Cho nên trong phần này, tôi sẽ chỉ để cập đến các kĩ thuật học sâu để giải quyết việc phân vùng hình ảnh.

4.1 Fully Convolution Network (FCN)

Kiến trúc chung của mạng nơ-ron tích chập - Convolutional Neural Network (CNN) bao gồm các lớp tích chập và lớp gộp (pooling layer) được xếp chồng lên nhau, cuối cùng là một vài lớp kết nối toàn phần (fully-connected layer) để đưa ra dự đoán về nhãn lớp của toàn hình ảnh. Tuy nhiên, không giống với bài toán phân lớp thông thường, phân vùng hình ảnh là bài toán phân lớp ở mức độ pixel và thường yêu cầu đầu ra có cùng kích thước với ảnh đầu vào, do đó trong bài báo [2] đề xuất mô hình FCN chỉ bao gồm các lớp tích chập và lớp gộp (pooling layer) và bỏ đi lớp kết nối toàn phần (fully-connected layer). Cách tiếp cận ban đầu là sử dụng một chồng các lớp tích chập có cùng kích thước để ánh xạ hình ảnh đầu vào với hình ảnh đầu ra.

Tuy nhiên, có một vấn đề cần giải quyết đối với mạng tích chập, đó là các feature map sẽ có kích thước giảm dần khi đi qua các lớp tích chập và lớp gộp. Cho nên để đầu ra có kích thước bằng với ảnh đầu vào, ta có thể sử dụng mạng giải chập (deconvolutional network), gồm nhiều lớp tích chập chuyển vị (tranposed convolution) xếp chồng lên nhau và kích thước của feature map sẽ tăng dần qua từng lớp tích chập chuyển vị. Trong đó, mạng tích chập được sử dụng để trích xuất các đặc trưng được gọi là bộ mã hóa (encoder). Bộ mã hóa cũng làm giảm kích thước của hình ảnh trong quá trình trích xuất đặc trưng, trong khi mạng giải chập được sử dụng để tăng kích thước của feature map được gọi là bộ giải mã (decoder). Kiến trúc FCN cũng bao gồm 2 phần encoder và decoder với các chức năng khác nhau:

  • Encoder: Dùng để trích xuất đặc trưng của ảnh đầu vào. Thông thường là những kiến trúc CNN cơ bản như AlexNet, VGG16, ResNet đã bỏ đi lớp kết nối toàn phần. Đầu ra của encoder là các feature map mang thông tin, ngữ cảnh của hình ảnh đầu vào. Và vì chỉ sử dụng các lớp tích chập và lớp gộp nên đầu ra của encoder sẽ có kích thước nhỏ hơn so với kích thước ảnh ban đầu và sẽ bị mất mát thông tin về vị trí điểm ảnh.

  • Decoder: sử dụng lớp tích chập chuyển vị để khôi phục lại kích thước ảnh từ các feature map thu được từ encoder. Tuy nhiên, do thông tin về không gian điểm ảnh bị mất đi trong quá trình trích xuất đặc trưng ở encoder, điều này gây khó khăn cho decoder trong việc khôi phục kích thước cũng như thông tin về vị trí điểm ảnh ban đầu. Để giải quyết vấn đề này, trong bài báo FCN đã đề xuất sử dụng skip connections để truyền thông tin trực tiếp từ các lớp ở encoder sang các lớp ở decoder mà không thông qua các lớp tích chập, giúp tránh việc mất mát thông tin về vị trí điểm ảnh do các lớp tích chập và lớp gộp gây ra. Từ đó tăng độ chính xác của mô hình.

Hình 5: Mô tả mô hình Fully Convolution Network (FCN) [1]Hình 5: Mô tả mô hình Fully Convolution Network (FCN) [1]

Hình trên mô tả kiến trúc của FCN, trong đó FCN-32s không sử dụng skip connection. Còn trong FCN-16, thông tin từ lớp gộp trước đó (conv-4) được sử dụng cùng với feature map thu được từ encoder để sinh ra hình ảnh được phân vùng. FCN-8 cố gắng cải thiện độ chính xác tốt hơn nữa bằng cách sử dụng thông tin từ lớp gộp trước đó nữa (conv-3).

Tích chập chuyển vị (Tranposed Convolution)

Tích chập chuyển vị được dùng để tăng kích thước của dữ liệu đầu vào. Ta có thể xem tích chập chuyển vị là quá trình ngược lại so với tích chập thông thường. Để dễ hình dung ta có thể xem một ví dụ dưới đây:

Hình 6: Mô tả cách hoạt động cả tích chập chuyển vịHình 6: Mô tả cách hoạt động cả tích chập chuyển vị

Ở đây ta có ma trận đầu vào kích thước 2x2, ta sử dụng bộ lọc kernel có kích thước 2x2 để tiến hành tích chập chuyển vị (kích thước của kernel có thể do người dùng điều chỉnh, không bắt buộc kích thước kernel phải bằng kích thước ma trận đầu vào). Ta lấy từng phần tử ở ma trận đầu vào nhân với tất cả các phần tử của kernel thu được một ma trận kết quả. Tùy vào kích thước bước trượt (stride) (do ta quy định) là bao nhiêu mà ta sẽ di chuyển kết quả của mỗi lần nhân pixel với bộ lọc sang bấy nhiêu đơn vị, như ở trong ví dụ trên thì bước trượt là 1. Tiếp tục như vậy với tất cả các phần tử còn lại của ma trận đầu vào. Sau cùng ta tính tổng các ma trận kết quả để thu được ma trận chuyển vị.

                        Hình 7: Tích chập chuyển vị với kernel 3x3, stride = 1, padding=0 [3]Hình 7: Tích chập chuyển vị với kernel 3x3, stride = 1, padding=0 [3]

4.2 Unet

U-net lần đầu tiên được đề xuất trong một bài báo [4] vào năm 2015 dựa trên kiến trúc FCN để sử dụng trong phân vùng hình ảnh y sinh. U-net có tính đối xứng bằng cách tăng kích thước của decoder để bằng với kích thước của encoder. Ta có thể tham khảo kiến trúc Unet qua hình bên dưới:

Hình 8: Kiên trúc mạng Unet [4]Hình 8: Kiên trúc mạng Unet [4]

Kiến trúc mạng Unet gồm 2 phần encoder và decoder đối xứng nhau:

  • Encoder: là phần bên trái của Unet, làm nhiệm vụ trích xuất đặc trưng từ ảnh đầu vào, gồm 4 khối, mỗi khối gồm 2 lớp tích chập kích thước 3x3 theo sau là một lớp gộp cực đại (max-pooling) kích thước 2x2. Số lượng feature map được nhân đôi ở mỗi lớp gộp (sau mỗi khối) là 64 → 128 → 256, đồng thời kích thước của feature map cũng giảm đi một nửa.

  • Decoder: là phần bên phải của Unet, bao gồm 4 khối đối xứng với các khối của encoder. Mỗi khối bao gồm 2 lớp tích chập kích thước 3x3 theo sau là lớp tích chập chuyển vị 2x2 để tăng kích thước của feature map. Số lượng feature map giảm đi một nửa ở mỗi khối, đồng thời kích thước của feature map cũng tăng lên gấp đôi.

Dựa vào hình trên ta có thể thấy rằng Unet có 4 skip connection, sau mỗi phép tích chập chuyển vị ở các khối bên decoder, feature map thu được sẽ được nối (concate) với feature map từ khối cùng mức tương ứng ở bên encoder. Do tính đối xứng, Unet có thể chuyển nhiều thông tin hơn từ các lớp bên encoder sang các lớp bên decoder, cải thiện độ phân giải của đầu ra cuối cùng ở decoder.

Hình 9: Kết quả của Unet trong cuộc thi theo dõi tế bào ISBI [4]Hình 9: Kết quả của Unet trong cuộc thi theo dõi tế bào ISBI [4]

Sự phát triển của U-net là một cột mốc quan trọng khác trong lĩnh vực thị giác máy tính, ban đầu Unet được phát triển để phân vùng hình ảnh y sinh, nhưng nhờ tính hiệu quả của nó mà các mô hình sau nay tiếp tục phát triển dựa trên kiến trúc Unet với nhiều biến thể khác nhau và được sử dụng trong nhiều ứng dụng khác nhau.

4.3 DeepLab

DeepLab là một mô hình phân vùng ngữ nghĩa hình ảnh có kiến trúc encoder-decoder. Bộ mã hóa bao gồm mô hình CNN được huấn luyện trước đó được sử dụng để trích xuất đặc trưng từ hình ảnh đầu vào và decoder có nhiệm vụ sinh ra hình ảnh được phân vùng từ các thông tin đặc trưng thu được từ encoder. Để hiểu kiến trúc DeepLab, trước tiên hãy xem qua một số các khối cơ bản của nó.

Tích chập atrous - Atrous convolution

Điểm mạnh của tích chập Atrous là giúp kiểm soát kích thước của các feature map thu được mạng nơ-ron tích chập sâu và giúp điều chỉnh kích thước vùng tiếp nhận (receptive field) để nắm bắt thông tin đa tỷ lệ. Trong trường hợp xử lý hình ảnh, tích chập atrous có thể được biểu thị bằng:

\[y[i, j] = \sum_{k=1}^Nx[i+r\cdot k, j+r\cdot k]w[k]\]

Trong đó, \(y[i, j]\) là đầu ra của lớp tích chập atrous, \(x[i, j]\) là giá trị đầu vào, \(w\) là kí hiệu kernel tích chập với kích thước là \(N\), \(r\) kí hiệu cho mức độ giãn nở của lớp tích chập atrous, với giá trị \(r\) ta sẽ giãn cách các dòng, cột liên tiếp của kernel là \(r-1\) dòng, cột. Nếu \(r=1\) thì tích chập atrous trở thành lớp tích chập bình thường.

 Hình 10: Cách hoạt động của tích chập atrous [3]

Hình 10: Cách hoạt động của tích chập atrous [3]

Một trong những vấn đề cần giải quyết đối với kiến trúc FCN là kích thước của feature map giảm quá mức do các lớp tích chập và lớp gộp liên tiếp nhau. Ở kiến trúc FCN, feature map thu được tại đầu ra của encoder có kích thước nhỏ hơn 32 lần so với kích thước ảnh ban đầu, điều này dẫn đến việc mất mát thông tin về vị trí của điểm ảnh. Trong khi đó tích atrous có thể tăng kích thước vùng tiếp nhận lên mà không làm giảm kích thước của feature maps. Ta có thể xem thêm hình bên dưới để hiểu rõ thêm.

Hình 11: mô tả tích chập atrous trên ảnh đầu vào với kernel có kích thước 3x3 và \(r=1, 2\), và \(4\). Hình 11: mô tả tích chập atrous trên ảnh đầu vào với kernel có kích thước 3x3 và \(r=1, 2\), và \(4\).

Dựa vào hình trên ta có thể thấy khi r càng tăng thì kích thước của vùng tiếp nhận càng tăng. So với lớp tích chập bình thường thì để mở rộng vùng tiếp nhận cần phải sử dụng nhiều lớp tích chập và lớp với số lượng tham số tăng lên, và kích thước của feature map giảm xuống, trong khi đó tích chập atrous có thể mở rộng vùng tiếp nhận mà không tăng số lượng tham số, đồng thời không làm giảm kích thước của feature maps điều này giúp giảm chi phí tính toán cũng như tránh mất mát quá nhiều thông tin về vị trí điểm ảnh.

DeeplabV1+V2 [5, 6] sử dụng DCNN (deep convolution neural network) để trích xuất đặc trưng, trong DCNN các lớp tích chập atrous được sử dụng để thay thế cho các lớp tích chập thông thường. Như đã nói trên điểm mạnh của tích chập atrous là mở rộng kích thước vùng tiếp nhận mà ko làm giảm kích thước của các feature map từ đó hạn chế việc mất mát thông tin không gian điểm ảnh, giúp cho việc phân vùng được hiệu quả hơn. Đầu ra của DCNN là một score map, vì score map này có kích thước nhỏ hơn so với kích thước ảnh đầu vào, nên ta dùng phép nội suy (bi-linear interpolation) để đưa kích thước score map về kích thước ảnh ban đầu. Sau đó dùng Conditional Random Field-CRF để hậu xử lí kết quả, giúp chuẩn hóa lại nhãn lớp của các pixel làm cho các vùng ảnh thu được trở nên rõ ràng hơn.

Hình 12: Mô hình DeepLabV1 [5]Hình 12: Mô hình DeepLabV1 [5]

Atrous spatial pyramid pooling (ASPP)

ASPP được đề xuất trong bài báo [7] gồm 4 lớp tích chập atrous song song với mức giãn nở (tham số \(r\)) khác nhau. Sau đó đem các đặc trưng thu được kết hợp lại với nhau để thu được lớp đặc trưng cuối cùng [7].

ASPP được sử dụng trong mô hình DeeLabv3 [7]. Trong đó gồm 1 lớp tích chập kích thước 1x1 và 3 lớp tích chập kích thước 3x3 với mức giãn nở lần lượt là 6, 12, 18 và một bộ lọc toàn cục . Các đặc trưng thu được từ các nhánh song song được lấy mẫu (bilinearly upsample) để tăng kích thước bắt kích thước dữ liệu đầu vào, các đặc trưng thu được sau khi lấy mẫu được nối lại với nhau và cho qua một lớp tích chập 1x1. Đầu vào của ASPP là các lớp đặc trưng thu được từ bộ mã hóa, đầu ra của ASPP được sử dụng như đầu vào của bộ giải mã.

Hình 13: ASPP được sử dụng trong mô hình DeepLabv3 [7]Hình 13: ASPP được sử dụng trong mô hình DeepLabv3 [7]

5. Kết luận

Phân vùng hình ảnh là bài toán có nhiều ứng dụng trong thực tiễn như xe tự lái, chẩn đoán ảnh y tế, phân tích khuôn mặt trong ảnh, robot cảm biến. Hiện nay phân vùng hình ảnh vẫn đang là một chủ đề hot trong lĩnh vực thị giác máy tính và vẫn đang được tiếp tục nghiên cứu. Bài viết trên đã giới thiệu qua một số kiến trúc phổ biến được dùng để giải quyết bài toán phân vùng hình ảnh, hy vọng thông qua đó đã có thể đem đến cho bạn đọc một cái nhìn tổng quan nhất về lĩnh vực này.

6. Tham khảo

[1] Ulku, I. and Akagündüz, E., 2022. A Survey on Deep Learning-based Architectures for Semantic Segmentation on 2D Images. Applied Artificial Intelligence.

[2] Long, J., Shelhamer, E., & Darrell, T. (2015). Fully convolutional networks for semantic segmentation. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 3431-3440).

[3] GitHub. 2022. GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning. [online] Available at https://github.com/vdumoulin/conv_arithmetic#transposed-convolution-animations [Accessed 7 April 2022].

[4] Ronneberger, O., Fischer, P., & Brox, T. (2015, October). U-net: Convolutional networks for biomedical image segmentation. In International Conference on Medical image computing and computer-assisted intervention (pp. 234-241). Springer, Cham.

[5] Chen, L. C., Papandreou, G., Kokkinos, I., Murphy, K., & Yuille, A. L. (2014). Semantic image segmentation with deep convolutional nets and fully connected CRFs. arXiv preprint arXiv:1412.7062.

[6] Chen, L. C., Papandreou, G., Kokkinos, I., Murphy, K., & Yuille, A. L. (2017). Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs. IEEE transactions on pattern analysis and machine intelligence, 40(4), 834-848.

[7] Chen, L. C., Papandreou, G., Schroff, F., & Adam, H. (2017). Rethinking atrous convolution for semantic image segmentation. arXiv preprint arXiv:1706.05587.

[8] Khánh, P., 2022. [online] Khanh's blog. Available at: https://phamdinhkhanh.github.io/2020/06/10/ImageSegmention.html [Accessed 7 April 2022].

[9] Background Features in Google Meet, P., 2022. Background Features in Google Meet, Powered by Web ML. [online] Google AI Blog. Available at: https://ai.googleblog.com/2020/10/background-features-in-google-meet.html [Accessed 7 April 2022].


Print   Email

Related Articles

BIẾN ĐỔI FOURIER