.. raw:: html
Phát hiện Vật thể Đa tỷ lệ
==========================
.. raw:: html
Trong :numref:`sec_anchor`, ta đã tạo ra nhiều khung neo có tâm tại
từng điểm ảnh đầu vào. Các khung neo đó được sử dụng để lấy mẫu các vùng
khác nhau của ảnh đầu vào. Tuy nhiên, nếu ta sinh khung neo cho mọi điểm
trên ảnh thì chẳng mấy chốc sẽ có quá nhiều khung neo phải xử lý. Chẳng
hạn, ta giả định rằng ảnh đầu vào có chiều cao và chiều rộng lần lượt là
561 và 728 pixel. Nếu với mỗi điểm ảnh ta sinh ra năm khung neo kích
thước khác nhau có cùng tâm ở đó, ta sẽ phải dự đoán và dán nhãn hơn hai
triệu khung neo (:math:`561 \times 728 \times 5`).
.. raw:: html
Việc giảm số lượng khung neo cũng không quá khó. Một cách dễ dàng là lấy
mẫu ngẫu nhiên theo phân phối đều trên một lượng nhỏ điểm ảnh từ ảnh đầu
vào và tạo ra các khung neo có tâm tại các điểm được chọn. Thêm vào đó,
ta có thể tạo ra những khung neo có số lượng và kích thước thay đổi với
nhiều tỷ lệ. Lưu ý rằng các vật thể nhỏ hơn nhiều khả năng sẽ được định
vị dễ hơn. Ở đây, ta sẽ dùng một ví dụ đơn giản: các vật thể có kích
thước :math:`1 \times 1`, :math:`1 \times 2`, and :math:`2 \times 2` sẽ
có thể nằm ở lần lượt 4, 2, và 1 vị trí trên một bức ảnh có kích thước
:math:`2 \times 2`. Do đó, khi sử dụng những khung neo nhỏ hơn để phát
hiện các vật thể nhỏ hơn, ta có thể lấy mẫu nhiều vùng hơn và ngược lại.
.. raw:: html
Để minh họa cách sinh ra khung neo với nhiều tỷ lệ, trước hết ta hãy đọc
một ảnh có kích thước :math:`561 \times 728` pixel.
.. code:: python
%matplotlib inline
from d2l import mxnet as d2l
from mxnet import image, np, npx
npx.set_np()
img = image.imread('../img/catdog.jpg')
h, w = img.shape[0:2]
h, w
.. parsed-literal::
:class: output
(561, 728)
.. raw:: html
Trong :numref:`sec_conv_layer`, mảng đầu ra 2D của mạng nơ-ron tích
chập (CNN) được gọi là một ánh xạ đặc trưng. Ta có thể xác định tâm của
các khung neo được lấy mẫu đều trên bất kì ảnh nào bằng cách chỉ định
kích thước của ánh xạ đặc trưng này.
.. raw:: html
Hàm ``display_anchors`` được định nghĩa như ở dưới. Ta sẽ tạo các khung
neo ``anchors`` có tâm được đặt theo từng đơn vị (điểm ảnh) trong ánh xạ
đặc trưng ``fmap``. Do các toạ độ :math:`x` và :math:`y` trong các khung
neo ``anchors`` đã được chia cho chiều rộng và chiều cao của ánh xạ đặc
trưng ``fmap``, ta sử dụng các giá trị trong khoảng từ 0 đến 1 để biểu
diễn vị trí tương đối của các khung neo trong ánh xạ đặc trưng. Tâm của
các khung neo ``anchors`` trùng với tất cả các đơn vị của ánh xạ đặc
trưng ``fmap``, vị trí tương đối trong không gian của tâm của
``anchors`` trên một ảnh bất kỳ bắt buộc phải tuân theo phân phối đều.
Cụ thể, khi chiều rộng và chiều cao của một ánh xạ đặc trưng lần lượt
được đặt là ``fmap_w`` và ``fmap_h``, hàm này sẽ lấy mẫu các điểm ảnh
theo phân phối đều từ ``fmap_h`` hàng và ``fmap_w`` cột rồi sử dụng
chúng làm tâm để sinh các khung neo với kích thước ``s`` (ta giả sử rằng
độ dài của danh sách ``s`` là 1) và các tỷ lệ khung ảnh (``ratios``)
khác nhau.
.. code:: python
def display_anchors(fmap_w, fmap_h, s):
d2l.set_figsize()
# The values from the first two dimensions will not affect the output
fmap = np.zeros((1, 10, fmap_w, fmap_h))
anchors = npx.multibox_prior(fmap, sizes=s, ratios=[1, 2, 0.5])
bbox_scale = np.array((w, h, w, h))
d2l.show_bboxes(d2l.plt.imshow(img.asnumpy()).axes,
anchors[0] * bbox_scale)
.. raw:: html
Đầu tiên ta sẽ tập trung vào việc phát hiện các vật thể nhỏ. Để dễ dàng
phân biệt trong lúc hiển thị, các khung neo có tâm khác nhau ở ví dụ này
sẽ không nằm chồng chéo lẫn nhau. Ta giả sử rằng kích thước của các
khung neo là 0.15 và chiều cao và chiều rộng của ánh xạ đặc trưng đều
bằng 4. Có thể thấy rằng tâm của các khung neo tuân theo phân phối đều
trên 4 hàng và 4 cột trong ảnh.
.. code:: python
display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
.. figure:: output_multiscale-object-detection_vn_1fd1d5_5_0.svg
.. raw:: html
Ta giảm chiều cao và chiều rộng của ánh xạ đặc trưng đi một nửa và sử
dụng khung neo lớn hơn để phát hiện vật thể có kích thước lớn hơn. Khi
kích thước được đặt bằng 0.4, một số khung neo sẽ nằm chồng chéo nhau.
.. code:: python
display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
.. figure:: output_multiscale-object-detection_vn_1fd1d5_7_0.svg
.. raw:: html
Cuối cùng, ta sẽ giảm chiều cao và chiều rộng của ánh xạ đặc trưng đi
một nửa và tăng kích thước khung neo lên 0.8. Lúc này tâm của khung neo
chính là tâm của ảnh.
.. code:: python
display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
.. figure:: output_multiscale-object-detection_vn_1fd1d5_9_0.svg
.. raw:: html
Do ta sinh các khung neo với kích thước khác nhau trên nhiều tỷ lệ khác
nhau, ta sẽ sử dụng chúng để phát hiện các vật thể với kích cỡ đa dạng
trên nhiều tỷ lệ khác nhau. Bây giờ chúng tôi sẽ giới thiệu một phương
pháp dựa vào mạng nơ-ron tích chập (CNN).
.. raw:: html
Ở một tỷ lệ nhất định, giả sử rằng ta sinh :math:`h \times w` tập hợp
khung neo với các tâm khác nhau dựa vào :math:`c_i` ánh xạ đặc trưng có
kích thước :math:`h \times w` và số khung neo của mỗi tập hợp là
:math:`a`. Ví dụ, đối với tỷ lệ đầu tiên trong thí nghiệm này, ta sinh
16 tập hợp khung neo với các tâm khác nhau dựa vào 10 (số kênh) ánh xạ
đặc trưng có kích thước :math:`4 \times 4`, và mỗi tập hợp bao gồm 3
khung neo. Tiếp theo, mỗi khung neo được gán nhãn bằng một danh mục và
độ dời dựa vào danh mục được phân loại và vị trí của khung chứa nhãn
gốc. Với tỷ lệ hiện tại, mô hình phát hiện vật thể cần phải dự đoán danh
mục và độ dời của :math:`h \times w` tập hợp khung neo với các tâm khác
nhau dựa vào ảnh đầu vào.
.. raw:: html
Ta giả sử rằng :math:`c_i` ánh xạ đặc trưng là đầu ra trung gian của CNN
dựa trên ảnh đầu vào. Do mỗi ánh xạ đặc trưng có :math:`h \times w` vị
trí khác nhau trong không gian, một vị trí sẽ có :math:`c_i` đơn vị.
Theo định nghĩa của vùng tiếp nhận trong :numref:`sec_conv_layer`,
:math:`c_i` đơn vị của ánh xạ đặc trưng nằm ở cùng một vị trí trong
không gian sẽ có cùng một vùng tiếp nhận trên ảnh đầu vào. Do đó, chúng
biểu diễn thông tin của ảnh đầu vào trên cùng vùng tiếp nhận đó. Vì vậy,
ta có thể biến đổi :math:`c_i` đơn vị của ánh xạ đặc trưng tại cùng vị
trí trong không gian thành danh mục và độ dời cho :math:`a` khung neo
được sinh ra có tâm tại vị trí đó. Không khó để nhận ra rằng, về bản
chất, ta sử dụng thông tin của ảnh đầu vào trong một vùng tiếp nhận nhất
định để dự đoán danh mục và độ dời của khung neo gần với vùng đó trên
ảnh đầu vào.
.. raw:: html
Khi các ánh xạ đặc trưng của các tầng khác nhau có các vùng tiếp nhận
với kích thước khác nhau trên ảnh đầu vào, chúng được sử dụng để phát
hiện vật thể với kích thước khác nhau. Ví dụ, ta có thể thiết kế mạng
sao cho mỗi đơn vị trong ánh xạ đặc trưng gần với tầng đầu ra hơn có
vùng tiếp nhận rộng hơn, để phát hiện các vật thể với kích thước lớn hơn
trong ảnh đầu vào.
.. raw:: html
Ta sẽ tiến hành lập trình mô hình phát hiện vật thể đa tỷ lệ trong phần
kế tiếp.
Tóm tắt
-------
.. raw:: html
- Ta có thể sinh các khung neo với số lượng và kích thước khác nhau
trên nhiều tỷ lệ để phát hiện vật thể có kích thước khác nhau trên
nhiều tỷ lệ.
- Kích thước của ánh xạ đặc trưng có thể được sử dụng để xác định tâm
của các khung neo được lấy mẫu đều trên bất kỳ ảnh nào.
- Ta sử dụng thông tin của ảnh đầu vào từ một vùng tiếp nhận nhất định
để dự đoán danh mục và độ dời của các khung neo gần với vùng đó trên
ảnh.
Bài tập
-------
.. raw:: html
Cho một ảnh đầu vào, giả sử :math:`1 \times c_i \times h \times w` là
kích thước của ánh xạ đặc trưng với :math:`c_i, h, w` lần lượt là số
lượng, chiều cao và chiều dài của ánh xạ đặc trưng. Liệu có phương pháp
nào để chuyển đổi biến này thành danh mục và độ dời của một khung neo
không? Kích thước của đầu ra là bao nhiêu?
Thảo luận
---------
- `Tiếng Anh - MXNet `__
- `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
- Lê Khắc Hồng Phúc
- Đỗ Trường Giang
- Nguyễn Lê Quang Nhật
- Nguyễn Văn Cường
- Phạm Minh Đức
- Phạm Hồng Vinh
- Nguyễn Mai Hoàng Long