Trong bài này, chúng ta sẽ cùng thực hành viết một ứng dụng phát hiện đối tượng với mô hình đã được huấn luyện sẵn tại TensorFlow Hub sử dụng Google Colab.

Trước hết, chúng ta tiến hành cài đặt Object Detection API như sau (Quá trình cài đặt yêu cầu download TensorFlow Model Garden và cài đặt Protobuf. Các bạn tham khảo chi tiết tại đây )

Tiếp theo chúng ta tiến hành import các thư việc cần thiết cho việc phát hiện đối tượng:

Tiếp theo chúng ta viết hàm chuyển bức ảnh thành dữ liệu dưới dạng numpy array để làm inputs cho model. Ở đây chúng ta sử dụng hàm Image.open của PIL (Python Imaging Library) để đọc file ảnh và sử dụng thư viện numpy để chuyển bức ảnh về định dạng numpy array thích hợp (trong bài này, chúng ta sẽ sử dụng mô hình có sẵn là mask-RCNN tại Tensorflow Hub. Mô hình này, yêu cầu input có shape là [1, height, width, 3]). Chúng ta cũng viết hàm display_img() sử dụng matplotlib để hiển thị hình ảnh và kiểm tra dữ liệu hình ảnh dưới dạng numpy array.

Sử dụng hàm img2numpy() và display_img() ta được kết quả như sau:

C:\Users\Dark Knight\Desktop\download (1).png

Như vậy ta đã hoàn thành việc đọc và chuyển đổi hình ảnh thành numpy array với định dạng thích hợp (array có shape là (1, 1406, 2048, 3)). Tiếp theo ta sẽ sử dụng mô hình Object detection để nhận diện các đối tượng có trong bức ảnh. Ở bài này, thay vì huấn luyện mô hình từ đầu, chúng ta sẽ sử dụng mô hình đã được huấn luyện sẵn tại Tensorflow Hub (các bạn tham khảo các mô hình tại https://tfhub.dev). Chúng ta sử dụng tensorflow_hub để load model với dòng code sau:

Tiếp theo chúng ta sử dụng mô hình ở trên để nhận diện đối tượng với dòng code sau:

Kết quả trả về là một python dict với các cặp (key, value) được mô tả tại phần outputs của mô hình trên trang Tensor Flow hub.

Tại ví dụ này ta được kết quả trả về của Detection boxes có shape là (1, 100, 4). 1 là 1 hình ảnh đầu vào, 100 là số lượng bounding boxes, 4 là 4 giá trị thể hiện tọa độ của bounding box [ymin, xmin, ymax, xmax]. Tương ứng với mỗi một bounding box là class label của bounding box đó và prediction score của class label. Do đó, detection_classes và detection_scores có shape là (1, 100) tương ứng với 100 bounding boxes

Hiện tại, detection_classes là giá trị số tự nhiên 1, 2, 3 …Do đó, để biết tên của label đối với từng detection_class, chúng ta sử dụng hàm create_category_index_from_labelmap trong object_detection/utils/visualization_utils.py của Model Garden như sau:

Như vậy class 1 tương ứng là ‘person’, class 2 tương ứng là ‘bicycle’, class 3 là ‘car’ …

Cuối cùng ta sử dụng hàm visualize_boxes_and_labels_on_image_array() và matplotlib để hiện thị kết quả xác định đối tượng như sau:

Ta được kết quả trả về là bức ảnh bao gồm bounding box của từng đối tượng cũng như class lable của từng đối tượng như sau:

C:\Users\Dark Knight\Desktop\download.png

Lưu ý: khác với các mô hình khác thuộc họ R-CNN (R-CNN, Fast R-CNN, Faster R-CNN), Mask-RCNN có thêm một output cho instance segmentation (các bạn xem thêm về Mask-RCNN tại bài Các mô hình sử dụng trong Instance Segmentation). Do đó, ta có thể sử dụng ‘detection_masks’ từ detector_output của Mask-RCNN để thực hiện instance segmentation cho bức ảnh như sau:

– Tương tự như object detection, chúng ta sẽ sử dụng hàm visualize_boxes_and_labels_on_image_array() để hiển thị instance segmentation của bức ảnh với tham sốinstance_masks. Tham số này yêu cầu dữ liệu là uint8 numpy array với shape [N, image_height, image_width].

– detection_masks từ detector_output có size là mask_height x mask_width (33 x 33). Do đó, ta cần sử dụng hàm reframe_box_masks_to_image_masks() để chuyển detection_masks về size của hình ảnh là image_height x image_width (trong ví dụ này là 1406 x 2048). Ngoài ra, ta cần sử dụng thêm hàm tf.cast() để chuyển đổi dữ liệu về định dạng uint8.

Việc hiển thị instance segmentation được thực hiện như sau:

Ta được kết quả như sau:

Như vậy chúng ta đã hoàn thành việc xây dựng một ứng dụng phát hiện đối tượng sử dụng mô hình đã được huấn luyện sẵn trên TensorFlow Hub. Các bạn có thể tham khảo Colab notebook của bài viết này trên trang Github của ITechSeeker tại đây.

Tháng Một 25, 2022
ITechSeeker