13.3. Phát hiện Vật thể và Khoanh vùng Đối tượng (Khung chứa)

Ở phần trước, chúng ta đã giới thiệu nhiều loại mô hình dùng cho phân loại ảnh. Trong tác vụ phân loại ảnh, ta giả định chỉ có duy nhất một đối tượng trong ảnh và ta chỉ tập trung xác định nó thuộc về nhóm nào. Tuy nhiên, ở nhiều tình huống cùng lúc sẽ có nhiều đối tượng trong ảnh mà ta quan tâm. Ta không chỉ muốn phân loại chúng mà còn muốn xác định vị trí cụ thể của chúng ở trong ảnh. Trong lĩnh vực thị giác máy tính, những tác vụ như thế được gọi là phát hiện vật thể (hoặc nhận dạng vật thể).

Phát hiện vật thể được sử dụng rộng rãi trong nhiều lĩnh vực. Chẳng hạn, trong công nghệ xe tự hành, ta cần lên lộ trình bằng cách xác định các vị trí của phương tiện di chuyển, người đi đường, đường xá và các vật cản trong các ảnh được thu về từ video. Robot cần thực hiện kiểu tác vụ này để phát hiện các đối tượng mà chúng quan tâm. Hay các hệ thống an ninh cần phát hiện các mục tiêu bất thường, ví dụ như các đối tượng xâm nhập bất hợp pháp hoặc bom mìn.

Trong các phần tiếp theo, chúng tôi sẽ giới thiệu nhiều mô hình học sâu dùng để phát hiện vật thể. Trước hết, ta nên bàn qua về khái niệm vị trí vật thể. Đầu tiên, ta hãy nhập các gói và mô-đun cần thiết cho việc thử nghiệm.

%matplotlib inline
from d2l import mxnet as d2l
from mxnet import image, npx

npx.set_np()

Kế tiếp, ta nạp các ảnh mẫu sẽ sử dụng trong phần này. Ta có thể thấy trong hình là một con chó ở bên trái và một con mèo ở bên phải. Chúng là hai đối tượng chính trong ảnh này.

d2l.set_figsize()
img = image.imread('../img/catdog.jpg').asnumpy()
d2l.plt.imshow(img);
../_images/output_bounding-box_vn_9c39e2_3_0.svg

13.3.1. Khung chứa

Để phát hiện vật thể, ta thường sử dụng khung chứa để mô tả vị trí của mục tiêu. Khung chứa là một khung hình chữ nhật có thể được xác định bởi hai tọa độ: tọa độ \(x\), \(y\) góc trên bên trái và tọa độ \(x\), \(y\) góc dưới bên phải của khung hình chữ nhật. Ta có thể định nghĩa các khung chứa của con chó và con mèo trong ảnh dựa vào thông tin tọa độ của ảnh trên. Gốc tọa độ của ảnh trên là góc trên bên trái của ảnh, chiều sang phải và xuống dưới lần lượt là chiều dương của trục \(x\) và trục \(y\).

# bbox is the abbreviation for bounding box
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 112, 655, 493]

Ta có thể vẽ khung chứa ngay trên ảnh để kiểm tra tính chính xác của nó. Trước khi vẽ khung, ta định nghĩa hàm hỗ trợ bbox_to_rect. Nó biểu diễn khung chứa theo đúng định dạng khung chứa của matplotlib.

#@save
def bbox_to_rect(bbox, color):
    """Convert bounding box to matplotlib format."""
    # Convert the bounding box (top-left x, top-left y, bottom-right x,
    # bottom-right y) format to matplotlib format: ((upper-left x,
    # upper-left y), width, height)
    return d2l.plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)

Sau khi vẽ khung chứa lên ảnh, có thể thấy rằng phần chính của mục tiêu về cơ bản là nằm trong khung chứa.

fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'));
../_images/output_bounding-box_vn_9c39e2_9_0.svg

13.3.2. Tóm tắt

Để phát hiện vật thể, ta không chỉ cần xác định tất cả đối tượng mong muốn trong ảnh mà còn cả vị trí của chúng. Các vị trí thường được biểu diễn qua các khung chứa hình chữ nhật.

13.3.3. Bài tập

Tìm một vài ảnh và thử dán nhãn một khung chứa bao quanh mục tiêu. So sánh sự khác nhau giữa thời gian cần để dán nhãn các khung chứa và dán nhãn các lớp hạng mục.

13.3.4. Thảo luận

13.3.5. 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 Mai Hoàng Long
  • Lê Khắc Hồng Phúc
  • Phạm Hồng Vinh
  • Đỗ Trường Giang
  • Nguyễn Lê Quang Nhật