Phần 1.Bài toán Object Detection với SSD

Sơ lược

Đầu tiên đối với bài toán Object Detection này input là một bức ảnh bình thường,và output là một bounding box xung quanh đối tượng, mỗi đối tượng là một bouding box , bounding box này không chỉ là cái hình vuông mà còn là độ cao, rộng, vị trí của nó ở đâu mà còn cả nhãn (lable) tức là con người, con vật hay oto như trong hình bên dưới đây. Thậm chí có cả accuracy ( độ chính xác) của cái box là bao nhiêu trong khoảng [0,1] càng cao thì độ chính xác càng được khẳng định. Trong bouding box nó có những gì?? Như hình bên dưới thì ta có một bức ảnh có dấu chấm đen ở vị trí (0,0) còn bên trong là một box với vị trí x,y cụ thể x_min, y_min, x_max, y_max hay vị trí top_left, botton_right. Hiện tại thì người ta đã biến đổi một chú đó là sử dụng c_x,c_y điểm ở vị trí trung tâm của box và width, height của box. Đối với phương pháp sử dụng SSD thì số lượng class sẽ bao gồm cả backgroud. Tức là trong cái output ngoài class người, ngựa mà còn cả backgroud,nên sẽ có 3 class.

VOC Dataset

Đối với xử lý ảnh việc sử dụng data là rất nhiều, có những chỗ cung cấp free cho mình sử dụng, nhưng cũng có data không được cung cấp như thế (thương mại). Với việc làm một bài toán Computer Vision thì trước hết ta phải tìm được nguồn data , các đặc tính của data. Ví dụ như ta có tập data của người Châu Mĩ, Phi khi ta train được model khi áp dụng lên người Việt Nam thì độ chính xác lại không cao do đăc điểm khác nhau, phân bố khác nhau. Cụ thể trong bài này mình sử dụng VOC 2012 với 20 class(người, ngựa, máy bay,....) với 5717 image cho việc traning, 5823 image cho validation.Và như mình đã nói ở trên thì do tính cả class là background nên ta sẽ có 21 class tất cả, ta nên chú ý đến cái này. Tiêp theo là xml annotation với x_min, y_min, x_mã, y_max, lable. Khái niệm annotation là các thông tin của bức ảnh dành cho việc trainning như là bounding box ở đâu, nhãn là cái gì.

SSD

SSD (Single Shot Detector) có 2 version là SSD300, SSD512. Mình sẽ sử dụng SSD300 ,điểm đăc biệt của mạng này là input đầu vào sẽ là 300x300, còn mạng SSD512 thì input sẽ là image với size 512x512. Trước khi đi vào phần chính ta sẽ tìm hiểu thêm khái niệm Offset

Offset

Khi một bức ảnh được đưa vào thì nó không dự đoán luôn bouding box mà dùng các thông tin Offset . Mạng sẽ chuẩn bị bounding box (default box) bao gồm thông số cx_d,cy_d,w_d,h_d (với c:center, w: width, h:height, d:default). Khi nó đi qua cái Tranform biến đổi thông tin từ default box(db) thành bouding box , đấy là output kết quả mà ta thấy trên các bức ảnh. Nguồn gốc là db nó đã đi qua Tranform thành bounding box , ta dùng: những giá trị đó là Offset.

Luồng xử lý

Việc đầu tiên là ta sẽ resize bức ảnh về size 300x300 do mình dùng model SSD300 nên ta cần resize về dạng như thế . Chuẩn bị input image 8732 default box trong mỗi bức ảnh. Ta đưa image vào SSD khi output ta có default box (8732) x (class(21)+ offset(4)) = 218.300 (thông tin).

Sau đó lấy ra bouding box với cofidence cao nhất, trong SSD thì thường lấy 200 bb trong tổng số 8732. Tiếp theo là nó sử dụng thuật toán NMS (Non-Maximum Suppression). Ta có thể tưởng tượng output là một bức ảnh trong đó có 1 object, trong object đó có rất nhiều bb chỉ cùng một object như vậy và chỉ khác nhau về size một chút thôi. Nên nó dùng NMS để lấy ra bb có giá trị cofidence xác suất cao nhất, còn các bb khác nó overlap (trùng) hoặc thấp thì nó sẽ loại đi , tức nó chỉ lấy ra thằng Maximum và khử bớt (Suppression) bb. Cuối cùng mỗi một bài toán nó sẽ chọn ra cho mình một threshold (ngưỡng) , nghĩa là khi cofidence mà lớn hơn threshold thì lấy kết quả đó.

Có hai hướng cho việc chọn threshold:

  1. Hight threshold : tránh detec nhầm (tức xác suất cao thì mới chọn, nhưng có thể thiếu).
  2. Low threshold : tránh được detec thiếu (có thể detec nhầm).

Phần tiếp theo ta sẽ tiếp tục với việc tạo dataset + Xử lý data trước khi training. Ta sử dụng đoạn code sau để tải tập data về và giải nén nó:

import os
import urllib.request
import zipfile
import tarfile

data_dir = "./data"
if not os.path.exists(data_dir):
    os.mkdir(data_dir)

url = "http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar"
target_path = os.path.join(data_dir, "VOCtrainval_11-May-2012.tar")

if not os.path.exists(target_path):
    urllib.request.urlretrieve(url, target_path)

    tar = tarfile.TarFile(target_path)
    tar.extractall(data_dir)
    tar.close

Sau khi tải xong ta thử open xem có những gì :

Trong folder bao gồm các folder con : Annotations, ImageSets, JPEGImages,SegmentatiionClass, SegmemtationObject. Hãy thử mở từng thư mục xem cụ thể bên trong nó có những gì. Phần tiếp theo là bước rất quan trọng là xử lý data trước khi training và build model. Hẹn gặp lại vào phần tiếp theo.

Tài liệu tham khảo

  1. https://arxiv.org/pdf/1512.02325.pdf
  2. https://paperswithcode.com/task/object-detection
  3. http://host.robots.ox.ac.uk/pascal/VOC/voc2012/