.. raw:: html
CNN theo Vùng (R-CNN)
=====================
.. raw:: html
Mạng nơ-ron tích chập theo vùng, hay các vùng với đặc trưng CNN (R-CNN)
là một hướng tiếp cận tiên phong ứng dụng mô hình sâu cho bài toán phát
hiện vật thể :cite:`Girshick.Donahue.Darrell.ea.2014`. Trong phần này,
chúng ta sẽ thảo luận về R-CNN và một loạt các cải tiến sau đó: Fast
R-CNN :cite:`Girshick.2015`, Faster R-CNN
:cite:`Ren.He.Girshick.ea.2015`, và Mask R-CNN
:cite:`He.Gkioxari.Dollar.ea.2017`.
.. raw:: html
R-CNN
-----
.. raw:: html
Đầu tiên, các mô hình R-CNN sẽ chọn một số vùng đề xuất từ ảnh (ví dụ,
các khung neo cũng là một phương pháp lựa chọn) và sau đó gán nhãn hạng
mục và khung chứa (ví dụ, các giá trị độ dời) cho các vùng này. Tiếp
đến, các mô hình này sử dụng CNN để thực hiện lượt truyền xuôi nhằm
trích xuất đặc trưng từ từng vùng đề xuất. Sau đó, ta sử dụng các đặc
trưng của từng vùng được đề xuất để dự đoán hạng mục và khung chứa.
:numref:`fig_r-cnn` mô tả một mô hình R-CNN.
.. raw:: html
.. _fig_r-cnn:
.. figure:: ../img/r-cnn.svg
Mô hình R-CNN.
.. raw:: html
Cụ thể, R-CNN có bốn phần chính sau:
.. raw:: html
1. Tìm kiếm chọn lọc trên ảnh đầu vào để lựa chọn các vùng đề xuất tiềm
năng :cite:`Uijlings.Van-De-Sande.Gevers.ea.2013`. Các vùng đề xuất
thông thường sẽ có nhiều tỷ lệ với hình dạng và kích thước khác nhau.
Hạng mục và khung chứa nhãn gốc sẽ được gán cho từng vùng đề xuất.
2. Sử dụng một mạng CNN đã qua tiền huấn luyện, ở dạng rút gọn, đặt
trước tầng đầu ra. Mạng này biến đổi từng vùng đề xuất thành các đầu
vào có chiều phù hợp với mạng và thực hiện các lượt truyền xuôi để
trích xuất đặc trưng từ các vùng đề xuất tương ứng.
3. Các đặc trưng và nhãn hạng mục của từng vùng đề xuất được kết hợp
thành một mẫu để huấn luyện các máy vector hỗ trợ cho phép phân loại
vật thể. Ở đây, mỗi máy vector hỗ trợ được sử dụng để xác định một
mẫu có thuộc về một hạng mục nào đó hay không.
4. Các đặc trưng và khung chứa được gán nhãn của mỗi vùng đề xuất được
kết hợp thành một mẫu để huấn luyện mô hình hồi quy tuyến tính, để
phục vụ dự đoán khung chứa nhãn gốc.
.. raw:: html
Mặc dù các mô hình R-CNN sử dụng các mạng CNN đã được tiền huấn luyện để
trích xuất các đặc trưng ảnh một cách hiệu quả, điểm hạn chế chính yếu
đó là tốc độ chậm. Có thể hình dung, với hàng ngàn vùng đề xuất từ một
ảnh, ta cần tới hàng ngàn phép tính truyền xuôi từ mạng CNN để phát hiện
vật thể. Khối lượng tính toán nặng nề khiến các mô hình R-CNN không được
sử dụng rộng rãi trong các ứng dụng thực tế.
.. raw:: html
Fast R-CNN
----------
.. raw:: html
Điểm nghẽn cổ chai chính về hiệu năng của R-CNN đó là việc trích xuất
đặc trưng cho từng vùng đề xuất một cách độc lập. Do các vùng đề xuất
này có độ chồng lặp cao, việc trích xuất đặc trưng một cách độc lập sẽ
dẫn đến một số lượng lớn các phép tính lặp lại. Fast R-CNN cải thiện
R-CNN bằng cách chỉ thực hiện lượt truyền xuôi qua mạng CNN trên toàn bộ
ảnh.
.. raw:: html
.. _fig_fast_r-cnn:
.. figure:: ../img/fast-rcnn.svg
Mô hình Fast R-CNN.
.. raw:: html
:numref:`fig_fast_r-cnn` mô tả mạng Fast R-CNN. Các bước tính toán
chính yếu được mô tả như sau:
.. raw:: html
1. So với mạng R-CNN, mạng Fast R-CNN sử dụng toàn bộ ảnh làm đầu vào
cho CNN để trích xuất đặc trưng thay vì từng vùng đề xuất. Hơn nữa,
mạng này được huấn luyện như bình thường để cập nhật tham số mô hình.
Do đầu vào là toàn bộ ảnh, đầu ra của mạng CNN có kích thước
:math:`1 \times c \times h_1 \times w_1`.
2. Giả sử thuật toán tìm kiếm chọn lọc chọn ra :math:`n` vùng đề xuất,
kích thước khác nhau của các vùng này chỉ ra rằng vùng quan tâm
(*regions of interests - RoI*) tại đầu ra của CNN có kích thước khác
nhau. Các đặc trưng có cùng kích thước phải được trích xuất từ các
vùng quan tâm này (giả sử có chiều cao là :math:`h_2` và chiều rộng
là :math:`w_2`). Mạng Fast R-CNN đề xuất phép gộp RoI (*RoI
pooling*), nhận đầu ra từ CNN và các vùng quan tâm làm đầu vào rồi
ghép nối các đặc trưng được trích xuất từ mỗi vùng quan tâm làm đầu
ra có kích thước :math:`n \times c \times h_2 \times w_2`.
3. Tầng kết nối đầy đủ được sử dụng để biến đổi kích thước đầu ra thành
:math:`n \times d`, trong đó :math:`d` được xác định khi thiết kế mô
hình.
4. Khi dự đoán hạng mục, kích thước đầu ra của tầng kết nối đầy đủ lại
được biến đổi thành :math:`n \times q` và áp dụng phép hồi quy
softmax (:math:`q` là số lượng hạng mục). Khi dự đoán khung chứa,
kích thước đầu ra của tầng đầy đủ lại được biến đổi thành
:math:`n \times 4`. Nghĩa là ta dự đoán hạng mục và khung chứa cho
từng vùng đề xuất.
.. raw:: html
Tầng gộp RoI trong mạng Fast R-CNN có phần khác với các tầng gộp mà ta
đã thảo luận trước đó. Trong tầng gộp thông thường, ta thiết lập cửa sổ
gộp, giá trị đệm, và sải bước để quyết định kích thước đầu ra. Trong
tầng gộp RoI, ta có thể trực tiếp định rõ kích thước đầu ra của từng
vùng, ví dụ chiều cao và chiều rộng của từng vùng sẽ là
:math:`h_2, w_2`. Giả sử chiều cao và chiều rộng của cửa sổ RoI là
:math:`h` và :math:`w`, cửa sổ này được chia thành một lưới có
:math:`h_2 \times w_2` cửa sổ con. Mỗi cửa sổ con có kích thước xấp xỉ
:math:`(h/h_2) \times (w/w_2)`. Chiều cao và chiều rộng của cửa sổ con
phải luôn là số nguyên và thành phần lớn nhất được sử dụng là đầu ra cho
cửa sổ con đó. Điều này cho phép tầng gộp RoI trích xuất đặc trưng có
cùng kích thước từ các vùng quan tâm có kích thước khác nhau.
.. raw:: html
Trong :numref:`fig_roi`, ta chọn một vùng :math:`3\times 3` làm RoI
của một đầu vào :math:`4 \times 4`. Với RoI này, ta sử dụng một tầng gộp
RoI :math:`2\times 2` để thu được một đầu ra đơn :math:`2\times 2`. Khi
chia vùng này thành bốn cửa sổ con, chúng lần lượt chứa các phần tử 0,
1, 4 và 5 (5 là lớn nhất); 2 và 6 (6 là lớn nhất); 8 và 9 (9 là lớn
nhất); và 10.
.. raw:: html
.. _fig_roi:
.. figure:: ../img/roi.svg
Tầng gộp RoI :math:`2\times 2`.
.. raw:: html
Ta sử dụng hàm ``ROIPooling`` để thực hiện việc tính toán tầng gộp RoI.
Giả sử rằng CNN trích xuất đặc trưng ``X`` với chiều rộng và chiều cao
là 4 với một kênh duy nhất.
.. code:: python
from mxnet import np, npx
npx.set_np()
X = np.arange(16).reshape(1, 1, 4, 4)
X
.. parsed-literal::
:class: output
array([[[[ 0., 1., 2., 3.],
[ 4., 5., 6., 7.],
[ 8., 9., 10., 11.],
[12., 13., 14., 15.]]]])
.. raw:: html
Giả sử chiều cao và chiều rộng của ảnh là 40 pixel và tìm kiếm chọn lọc
sinh ra hai vùng đề xuất trên ảnh này. Mỗi vùng được biểu diễn bằng 5
phần tử: hạng mục của đối tượng trong vùng đó và các tọa độ :math:`x, y`
của góc trên bên trái và góc dưới bên phải.
.. code:: python
rois = np.array([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]])
.. raw:: html
Vì chiều cao và chiều rộng của ``X`` bằng :math:`1/10` chiều cao và
chiều rộng của ảnh, các tọa độ của hai vùng được đề xuất sẽ nhân với 0.1
thông qua ``spatial_scale``, tiếp theo các RoI được gán nhãn trên ``X``
lần lượt là ``X[:, :, 0:3, 0:3]`` và ``X[:, :, 1:4, 0:4]``. Sau cùng, ta
chia hai RoI thành một lưới cửa sổ con và trích xuất đặc trưng với chiều
cao và chiều rộng là 2.
.. code:: python
npx.roi_pooling(X, rois, pooled_size=(2, 2), spatial_scale=0.1)
.. parsed-literal::
:class: output
array([[[[ 5., 6.],
[ 9., 10.]]],
[[[ 9., 11.],
[13., 15.]]]])
.. raw:: html
Faster R-CNN
------------
.. raw:: html
Để có kết quả phát hiện đối tượng chính xác, Fast R-CNN thường đòi hỏi
tạo ra nhiều vùng đề xuất khi tìm kiếm chọn lọc. Faster R-CNN thay thế
tìm kiếm chọn lọc bằng mạng đề xuất vùng. Mạng này làm giảm số vùng đề
xuất, trong khi vẫn đảm bảo phát hiện chính xác đối tượng.
.. raw:: html
.. _fig_faster_r-cnn:
.. figure:: ../img/faster-rcnn.svg
Mô hình Faster R-CNN.
.. raw:: html
:numref:`fig_faster_r-cnn` minh họa mô hình Faster R-CNN. So với Fast
R-CNN, Faster R-CNN chỉ thay thế phương pháp sản sinh các vùng đề xuất
từ tìm kiếm chọn lọc sang mạng đề xuất vùng. Những phần còn lại trong mô
hình không đổi. Quy trình tính toán của mạng đề xuất vùng được mô tả chi
tiết dưới đây:
.. raw:: html
1. Dùng một tầng tích chập :math:`3\times 3` với đệm bằng 1 để biến đổi
đầu ra của CNN và đặt số kênh đầu ra bằng :math:`c`. Bằng cách này,
mỗi phần tử trong ánh xạ đặc trưng mà CNN trích xuất ra từ bức ảnh là
một đặc trưng mới có độ dài bằng :math:`c`.
2. Lấy mỗi phần tử trong ánh xạ đặc trưng làm tâm để tạo ra nhiều khung
neo có kích thước và tỷ lệ khác nhau, sau đó gán nhãn cho chúng.
3. Lấy những đặc trưng của các phần tử có độ dài :math:`c` ở tâm khung
neo để phân loại nhị phân (là vật thể hay là nền) và dự đoán khung
chứa tương ứng cho các khung neo.
4. Sau đó, sử dụng triệt phi cực đại (*non-maximum suppression*) để loại
bỏ các khung chứa có kết quả giống nhau của hạng mục “vật thể”. Cuối
cùng, ta xuất ra các khung chứa dự đoán là các vùng đề xuất rồi đưa
vào tầng gộp RoI.
.. raw:: html
Lưu ý rằng, vì là một phần của mô hình Faster R-CNN, nên mạng đề xuất
vùng được huấn luyện cùng với phần còn lại trong mô hình. Ngoài ra,
trong đối tượng Faster R-CNN còn chứa các hàm dự đoán hạng mục và khung
chứa trong bài toán phát hiện vật thể, cũng như các hàm dự đoán hạng mục
nhị phân và khung chứa cho các khung neo trong mạng đề xuất vùng. Sau
cùng, mạng đề xuất vùng có thể học được cách sinh ra những vùng đề xuất
có chất lượng cao, giảm đi số lượng vùng đề xuất trong khi vẫn giữ được
độ chính xác khi phát hiện vật thể.
.. raw:: html
Mask R-CNN
----------
.. raw:: html
Nếu dữ liệu huấn luyện được gán nhãn với các vị trí ở cấp độ từng điểm
ảnh trong bức hình, thì mô hình Mask R-CNN có thể sử dụng hiệu quả các
nhãn chi tiết này để cải thiện độ chính xác của việc phát hiện đối
tượng.
.. raw:: html
.. _fig_mask_r-cnn:
.. figure:: ../img/mask-rcnn.svg
Mô hình Mask R-CNN.
.. raw:: html
Trong :numref:`fig_mask_r-cnn`, có thể thấy Mask R-CNN là một sự hiệu
chỉnh của Faster R-CNN. Mask R-CNN thay thế tầng tổng hợp RoI bằng tầng
căn chỉnh RoI (*RoI alignment layer*). Điều này cho phép sử dụng phép
nội suy song tuyến tính (*bilinear interpolation*) để giữ lại thông tin
không gian trong ánh xạ đặc trưng, làm cho Mask R-CNN trở nên phù hợp
hơn với các dự đoán cấp điểm ảnh. Lớp căn chỉnh RoI xuất ra các ánh xạ
đặc trưng có cùng kích thước cho mọi RoI. Điều này không những dự đoán
các lớp và khung chứa của RoI, mà còn cho phép chúng ta bổ sung một mạng
nơ-ron tích chập đầy đủ (*fully convolutional network*) để dự đoán vị
trí cấp điểm ảnh của các đối tượng. Chúng tôi sẽ mô tả cách sử dụng mạng
nơ-ron tích chập đầy đủ để dự đoán ngữ nghĩa cấp điểm ảnh ở phần sau của
chương này.
Tóm tắt
-------
.. raw:: html
- Mô hình R-CNN chọn ra nhiều vùng đề xuất và sử dụng CNN để thực hiện
tính toán truyền xuôi rồi trích xuất đặc trưng từ mỗi vùng đề xuất.
Sau đó dùng các đặc trưng này để dự đoán hạng mục và khung chứa của
những vùng đề xuất.
- Fast R-CNN cải thiện R-CNN bằng cách chỉ thực hiện tính toán truyền
xuôi CNN trên toàn bộ bức ảnh. Mạng này sử dụng một tầng gộp RoI để
trích xuất các đặc trưng có cùng kích thước từ các vùng quan tâm có
kích thước khác nhau.
- Faster R-CNN thay thế tìm kiếm chọn lọc trong Fast R-CNN bằng mạng đề
xuất vùng. Điều này làm giảm số lượng vùng đề xuất tạo ra, nhưng vẫn
đảm bảo độ chính xác khi phát hiện đối tượng.
- Mask R-CNN có cấu trúc cơ bản giống Faster R-CNN, nhưng có thêm một
mạng nơ-ron tích chập đầy đủ giúp định vị đối tượng ở cấp điểm ảnh và
cải thiện hơn nữa độ chính xác của việc phát hiện đối tượng.
Bài tập
-------
.. raw:: html
Tìm hiểu cách thực thi từng mô hình trong `bộ công cụ
GluonCV `__ liên quan đến phần này.
Thảo luận
---------
- `Tiếng Anh `__
- `Tiếng Việt `__
Những người thực hiện
---------------------
Bản dịch trong trang này được thực hiện bởi:
- Đoàn Võ Duy Thanh
- Nguyễn Văn Quang
- Lê Khắc Hồng Phúc
- Nguyễn Mai Hoàng Long
- Phạm Đăng Khoa
- Nguyễn Lê Quang Nhật
- Phạm Hồng Vinh
- Nguyễn Văn Cường