Phát hiện đối tượng 3D (Hộp giới hạn 3D) bằng Python với MediaPipe Objectron PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Phát hiện đối tượng 3D (3D Bound Boxes) bằng Python với MediaPipe Objectron

Giới thiệu

Tính năng phát hiện vật thể đang được cải thiện và các cải tiến đang được thực hiện đối với một số cách tiếp cận để giải quyết nó. Trong vài năm qua, các phương pháp dựa trên YOLO đã vượt trội hơn các phương pháp khác về độ chính xác và tốc độ, với những tiến bộ gần đây như YOLOv7 và YOLOv6 (được phát hành độc lập, sau YOLOv7).

Tuy nhiên – tất cả những điều này đều liên quan Phát hiện đối tượng 2D, bản thân nó đã là một nhiệm vụ khó khăn. Gần đây, chúng tôi đã có thể thực hiện thành công Phát hiện đối tượng 3D, và trong khi các máy dò này vẫn ở giai đoạn không ổn định hơn so với máy dò vật thể 2D, độ chính xác của chúng đang tăng lên.

Trong hướng dẫn này, chúng tôi sẽ thực hiện phát hiện đối tượng 3D bằng Python với Objectron của MediaPipe.

Lưu ý: MediaPipe là khung nguồn mở của Google để xây dựng quy trình máy học nhằm xử lý hình ảnh, video và luồng âm thanh, chủ yếu dành cho thiết bị di động. Nó đang được sử dụng cả bên trong lẫn bên ngoài, đồng thời cung cấp các mô hình được đào tạo trước cho các nhiệm vụ khác nhau, chẳng hạn như nhận diện khuôn mặt, chia lưới khuôn mặt, ước tính bàn tay và tư thế, phân đoạn tóc, phát hiện đối tượng, theo dõi hộp, v.v.

Tất cả những thứ này đều có thể và được sử dụng cho các tác vụ tiếp theo – chẳng hạn như áp dụng bộ lọc cho khuôn mặt, lấy nét máy ảnh tự động, xác minh sinh trắc học, robot điều khiển bằng tay, v.v. Hầu hết các dự án đều có sẵn API cho Android, iOS, C++, Python và JavaScript, trong khi một số chỉ có sẵn cho một số ngôn ngữ nhất định.

Trong hướng dẫn này, chúng tôi sẽ làm việc với Đối tượng của MediaPipe, có sẵn cho Android, C ++, Python và JavaScript.

MediaPipe và Phát hiện đối tượng 3D

Sản phẩm phản đối giải pháp đã được đào tạo về Tập dữ liệu Objectron, chứa các video ngắn tập trung vào đối tượng. Tập dữ liệu chỉ chứa 9 đối tượng: xe đạp, sách, chai, máy ảnh, hộp ngũ cốc, ghế, cốc, máy tính xách tay và giày, vì vậy đây không phải là một tập dữ liệu quá chung chung, nhưng việc xử lý và mua các video này khá tốn kém (tư thế máy ảnh, thưa thớt). đám mây điểm, đặc tính của bề mặt phẳng, v.v. cho từng khung hình của mỗi video), làm cho tập dữ liệu có kích thước gần 2 terrabyte.

Mô hình Objectron được đào tạo (được gọi là giải pháp cho các dự án MediaPipe) được đào tạo về bốn loại – giày, ghế, cốc và máy ảnh.

Phát hiện đối tượng 2D sử dụng thuật ngữ “hộp giới hạn”, trong khi chúng thực sự là hình chữ nhật. Phát hiện đối tượng 3D thực sự dự đoán hộp xung quanh các đối tượng, từ đó bạn có thể suy ra hướng, kích thước, khối lượng thô của chúng, v.v. Đây là một nhiệm vụ khá khó khăn để thực hiện, đặc biệt là do thiếu bộ dữ liệu thích hợp và chi phí tạo chúng. Trong khi khó khăn, vấn đề hứa hẹn cho nhiều Thực tế mở rộng (AR) các ứng dụng!

Giải pháp Objectron có thể chạy ở chế độ một giai đoạn hoặc hai giai đoạn – trong đó chế độ một giai đoạn phát hiện nhiều đối tượng tốt hơn, trong khi chế độ hai giai đoạn tốt hơn trong việc phát hiện một đối tượng chính trong cảnh và chạy đáng kể nhanh hơn. Quy trình một giai đoạn sử dụng đường trục MobileNetV2, trong khi quy trình hai giai đoạn sử dụng API phát hiện đối tượng TensorFlow.

Khi phát hiện một đối tượng trong video, các dự đoán khác sẽ không được đưa ra cho đối tượng đó trên mỗi khung hình vì hai lý do:

  • Các dự đoán liên tục có tính nhanh nhạy cao (do tính ngẫu nhiên vốn có trong các dự đoán)
  • Thật tốn kém khi chạy các mô hình lớn trên mọi khung hình

Nhóm nghiên cứu giảm tải các dự đoán nặng nề để chỉ bắt gặp lần đầu tiên và sau đó theo dõi hộp đó miễn là vật thể được đề cập vẫn còn ở trong hiện trường. Khi đường ngắm bị phá vỡ và đối tượng được đưa vào lại, một dự đoán lại được đưa ra. Điều này giúp bạn có thể sử dụng các mô hình lớn hơn với độ chính xác cao hơn, trong khi vẫn giữ các yêu cầu tính toán ở mức thấp và giảm các yêu cầu về harware đối với suy luận thời gian thực!

Hãy tiếp tục và cài đặt MediaPipe, nhập giải pháp Objectron và áp dụng nó cho hình ảnh tĩnh và nguồn cấp dữ liệu video trực tiếp từ máy ảnh.

Cài đặt MediaPipe

Trước tiên, hãy cài đặt MediaPipe và chuẩn bị phương thức trợ giúp để tìm nạp hình ảnh từ một URL nhất định:

! pip install mediapipe

Với khung đã được cài đặt, hãy nhập nó cùng với các thư viện phổ biến:

import mediapipe as mp

import cv2
import numpy as np
import matplotlib.pyplot as plt

Hãy xác định một phương thức trợ giúp để tìm nạp hình ảnh được cung cấp bởi một URL và trả về một mảng RGB đại diện cho hình ảnh đó:

import PIL
import urllib

def url_to_array(url):
    req = urllib.request.urlopen(url)
    arr = np.array(bytearray(req.read()), dtype=np.int8)
    arr = cv2.imdecode(arr, -1)
    arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
    return arr

mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)

Cuối cùng, chúng tôi sẽ muốn nhập cả giải pháp Objectron và các tiện ích vẽ để trực quan hóa các dự đoán:

mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils

Phát hiện đối tượng 3D trên hình ảnh tĩnh với MediaPipe

Sản phẩm Objectron lớp cho phép một số đối số, bao gồm:

  • static_image_mode: Cho dù bạn đang nạp một hình ảnh hay một luồng hình ảnh (video)
  • max_num_objects: Số lượng đối tượng có thể nhận dạng tối đa
  • min_detection_confidence: Ngưỡng tin cậy phát hiện (mức độ chắc chắn của mạng để phân loại một đối tượng cho lớp đã cho)
  • model_name: Bạn muốn tải model nào ở giữa 'Cup', 'Shoe', 'Camera''Chair'.

Với những điều đó – hãy khởi tạo một phiên bản Objectron và process() hình ảnh đầu vào:


objectron = mp_objectron.Objectron(
    static_image_mode=True,
    max_num_objects=5,
    min_detection_confidence=0.2,
    model_name='Cup')


results = objectron.process(mug)

Sản phẩm results chứa các mốc 2D và 3D của (các) đối tượng được phát hiện cũng như xoay, dịch và tỷ lệ cho từng đối tượng. Chúng tôi có thể xử lý kết quả và vẽ các hộp giới hạn khá dễ dàng bằng cách sử dụng các utils bản vẽ được cung cấp:

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

if not results.detected_objects:
    print(f'No box landmarks detected.')


annotated_image = mug.copy()
for detected_object in results.detected_objects:
    
    mp_drawing.draw_landmarks(annotated_image, 
                              detected_object.landmarks_2d, 
                              mp_objectron.BOX_CONNECTIONS)

    
    mp_drawing.draw_axis(annotated_image, 
                         detected_object.rotation, 
                         detected_object.translation)
  

fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()

Kết quả này trong:

Phát hiện đối tượng 3D từ Video hoặc Webcam với MediaPipe

Một ứng dụng thú vị hơn là trên video! Bạn không cần phải thay đổi mã nhiều để chứa video, cho dù bạn đang cung cấp video từ webcam hay tệp video hiện có. OpenCV phù hợp tự nhiên để đọc, thao tác và đưa các khung hình video vào mô hình đối tượng:


cap = cv2.VideoCapture(0)



objectron = mp_objectron.Objectron(static_image_mode=False,
                            max_num_objects=5,
                            min_detection_confidence=0.4,
                            min_tracking_confidence=0.70,
                            model_name='Cup')
                            

while cap.isOpened():
    success, image = cap.read()

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = objectron.process(image)

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.detected_objects:
        for detected_object in results.detected_objects:
            
            mp_drawing.draw_landmarks(image, 
                                      detected_object.landmarks_2d, 
                                      mp_objectron.BOX_CONNECTIONS)
            
            mp_drawing.draw_axis(image, 
                                 detected_object.rotation,
                                 detected_object.translation)

    cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Làm cho hình ảnh không thể ghi được với image.flags.writeable = False làm cho quá trình chạy nhanh hơn một chút và là một thay đổi tùy chọn. Trận chung kết cv2.flip() trên hình ảnh thu được cũng là tùy chọn – và chỉ cần làm cho đầu ra được phản chiếu để làm cho nó trực quan hơn một chút.

Khi chạy trên máy ảnh và cốc Ikea phổ biến trên toàn cầu, đây là kết quả:

Phát hiện đối tượng 3D (Hộp giới hạn 3D) bằng Python với MediaPipe Objectron PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Đầu ra hơi chập chờn, nhưng xử lý tốt bản dịch xoay, ngay cả khi tay cầm máy ảnh độ phân giải thấp bị run. Điều gì xảy ra khi một đối tượng được đưa ra khỏi khung hình?

Phát hiện đối tượng 3D (Hộp giới hạn 3D) bằng Python với MediaPipe Objectron PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Các dự đoán dừng đối với đối tượng ở lần phát hiện đầu tiên và theo dõi hộp sẽ xác định rõ ràng đối tượng đã rời khỏi khung và thực hiện dự đoán và theo dõi lại một lần nữa ngay khi đối tượng quay lại khung. Có vẻ như theo dõi hoạt động tốt hơn một chút khi mô hình có thể thấy tay cầm cốc, vì đầu ra sẽ giật hơn khi không nhìn thấy tay cầm (có lẽ vì khó xác định chính xác hướng thực sự của cốc hơn).

Ngoài ra, một số góc độ dường như tạo ra đầu ra ổn định hơn đáng kể so với các góc độ khác, trong điều kiện ánh sáng khó khăn. Đặc biệt, đối với cốc, bạn có thể nhìn thấy phần môi của cốc vì nó giúp có phối cảnh, thay vì nhìn thấy hình chiếu trực giao của đối tượng.

Ngoài ra, khi thử nghiệm trên một chiếc cốc trong suốt, người mẫu gặp khó khăn khi xác định nó là một chiếc cốc. Đây có thể là một ví dụ về một ngoài phân phối vật thể, vì hầu hết các cốc đều mờ đục và có nhiều màu sắc khác nhau.

Kết luận

Tính năng phát hiện đối tượng 3D vẫn còn hơi non trẻ và Objectron của MediaPipe là một minh chứng có khả năng! Mặc dù nhạy cảm với các điều kiện ánh sáng, loại đối tượng (cốc trong suốt hay cốc đục, v.v.) và hơi rung – Objectron là một cái nhìn thoáng qua về những gì sẽ sớm có thể thực hiện với độ chính xác và khả năng tiếp cận cao hơn bao giờ hết.

Dấu thời gian:

Thêm từ xếp chồng lên nhau