13.5. Phát hiện Vật thể Đa tỷ lệ

Trong Section 13.4, 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 (\(561 \times 728 \times 5\)).

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 \(1 \times 1\), \(1 \times 2\), and \(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 \(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.

Để 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 \(561 \times 728\) pixel.

%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
(561, 728)

Trong Section 6.2, 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.

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ạ độ \(x\)\(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_wfmap_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.

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)

Đầ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.

display_anchors(fmap_w=4, fmap_h=4, s=[0.15])
../_images/output_multiscale-object-detection_vn_1fd1d5_5_0.svg

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.

display_anchors(fmap_w=2, fmap_h=2, s=[0.4])
../_images/output_multiscale-object-detection_vn_1fd1d5_7_0.svg

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.

display_anchors(fmap_w=1, fmap_h=1, s=[0.8])
../_images/output_multiscale-object-detection_vn_1fd1d5_9_0.svg

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).

Ở một tỷ lệ nhất định, giả sử rằng ta sinh \(h \times w\) tập hợp khung neo với các tâm khác nhau dựa vào \(c_i\) ánh xạ đặc trưng có kích thước \(h \times w\) và số khung neo của mỗi tập hợp là \(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 \(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 \(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.

Ta giả sử rằng \(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ó \(h \times w\) vị trí khác nhau trong không gian, một vị trí sẽ có \(c_i\) đơn vị. Theo định nghĩa của vùng tiếp nhận trong Section 6.2, \(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 \(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 \(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.

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.

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.

13.5.1. Tóm tắt

  • 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.

13.5.2. Bài tập

Cho một ảnh đầu vào, giả sử \(1 \times c_i \times h \times w\) là kích thước của ánh xạ đặc trưng với \(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?

13.5.3. Thảo luận

13.5.4. 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