Deteksi Objek 3D (Kotak Batas 3D) dengan Python dengan MediaPipe Objectron PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Deteksi Objek 3D (Kotak Batas 3D) dengan Python dengan MediaPipe Objectron

Pengantar

Deteksi objek telah mendapatkan uap, dan perbaikan sedang dilakukan untuk beberapa pendekatan untuk menyelesaikannya. Dalam beberapa tahun terakhir, metode berbasis YOLO telah mengungguli yang lain dalam hal akurasi dan kecepatan, dengan kemajuan terbaru seperti YOLOv7 dan YOLOv6 (yang dirilis secara independen, setelah YOLOv7).

Namun โ€“ semua ini mengkhawatirkan Deteksi objek 2D, yang merupakan tugas yang sulit dalam dirinya sendiri. Baru-baru ini, kami telah berhasil tampil Deteksi objek 3D, dan meskipun detektor ini masih berada pada tahap yang lebih tidak stabil daripada detektor objek 2D, akurasinya meningkat.

Dalam panduan ini, kita akan melakukan deteksi objek 3D dengan Python dengan Objectron MediaPipe.

Catatan: MediaPipe adalah kerangka kerja sumber terbuka Google untuk membangun saluran pembelajaran mesin untuk memproses gambar, video, dan aliran audio, terutama untuk perangkat seluler. Ini digunakan baik secara internal maupun eksternal, dan menyediakan model pra-pelatihan untuk berbagai tugas, seperti deteksi wajah, penyambungan wajah, estimasi tangan dan pose, segmentasi rambut, deteksi objek, pelacakan kotak, dll.

Semua ini dapat dan digunakan untuk tugas-tugas hilir โ€“ seperti menerapkan filter ke wajah, pemfokusan kamera otomatis, verifikasi biometrik, robotika yang dikendalikan tangan, dll. Sebagian besar proyek tersedia dengan API untuk Android, iOS, C++, Python, dan JavaScript, sementara beberapa hanya tersedia untuk bahasa tertentu.

Dalam panduan ini, kami akan bekerja dengan Objectron MediaPipe, tersedia untuk Android, C++, Python, dan JavaScript.

MediaPipe dan Deteksi Objek 3D

Grafik keberatan solusi dilatih pada Kumpulan Data Objectron, yang berisi video pendek yang berfokus pada objek. Dataset hanya berisi 9 objek: sepeda, buku, botol, kamera, kotak sereal, kursi, cangkir, laptop dan sepatu, jadi ini bukan dataset yang sangat umum, tetapi pemrosesan dan pengadaan video ini cukup mahal (pose kamera, jarang point-clouds, karakterisasi permukaan planar, dll. untuk setiap frame dari setiap video), membuat dataset berukuran hampir 2 terabyte.

Model Objectron terlatih (dikenal sebagai larutan untuk proyek MediaPipe) dilatih dalam empat kategori โ€“ sepatu, kursi, mug, dan kamera.

Deteksi objek 2D menggunakan istilah "kotak pembatas", padahal sebenarnya persegi panjang. Deteksi objek 3D sebenarnya memprediksi kotak di sekitar objek, dari mana Anda dapat menyimpulkan orientasi, ukuran, volume kasar, dll. Ini adalah tugas yang cukup sulit untuk dilakukan, terutama mengingat kurangnya kumpulan data yang sesuai dan biaya pembuatannya. Meskipun sulit, masalah menjanjikan untuk berbagai Realitas Tertambah (AR) aplikasi!

Solusi Objectron dapat berjalan dalam mode satu tahap atau dua tahap โ€“ di mana mode satu tahap lebih baik dalam mendeteksi beberapa objek, sedangkan mode dua tahap lebih baik dalam mendeteksi satu objek utama dalam adegan, dan berjalan secara signifikan lebih cepat. Pipeline satu tahap menggunakan backbone MobileNetV2, sedangkan pipeline dua tahap menggunakan TensorFlow Object Detection API.

Saat objek terdeteksi dalam video, prediksi lebih lanjut tidak dibuat untuk objek tersebut di setiap frame karena dua alasan:

  • Prediksi berkelanjutan menimbulkan kegelisahan yang tinggi (karena stokastisitas yang melekat dalam prediksi)
  • Mahal untuk menjalankan model besar di setiap bingkai

Tim menurunkan prediksi berat untuk pertemuan pertama saja dan kemudian melacak kotak itu selama objek yang dimaksud masih ada di tempat kejadian. Setelah garis pandang terputus dan objek diperkenalkan kembali, prediksi dibuat lagi. Hal ini memungkinkan untuk menggunakan model yang lebih besar dengan akurasi yang lebih tinggi, sambil menjaga persyaratan komputasi tetap rendah, dan menurunkan persyaratan perangkat keras untuk inferensi waktu nyata!

Mari kita lanjutkan dan instal MediaPipe, impor solusi Objectron dan terapkan ke gambar statis dan umpan video yang datang langsung dari kamera.

Memasang MediaPipe

Pertama-tama, instal MediaPipe dan siapkan metode pembantu untuk mengambil gambar dari URL yang diberikan:

! pip install mediapipe

Dengan kerangka kerja terinstal, mari impor bersama perpustakaan umum:

import mediapipe as mp

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

Mari kita tentukan metode pembantu untuk mengambil gambar yang diberikan URL dan yang mengembalikan larik RGB yang mewakili gambar itu:

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)

Terakhir, kami ingin mengimpor solusi Objectron dan utilitas gambar untuk memvisualisasikan prediksi:

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

Deteksi Objek 3D pada Gambar Statis dengan MediaPipe

Grafik Objectron class memungkinkan untuk beberapa argumen, termasuk:

  • static_image_mode: Apakah Anda memberi makan dalam gambar atau aliran gambar (video)
  • max_num_objects: Jumlah maksimum objek yang dapat diidentifikasi
  • min_detection_confidence: Ambang kepercayaan deteksi (seberapa yakin jaringan harus mengklasifikasikan objek untuk kelas tertentu)
  • model_name: Model mana yang ingin Anda muat di antaranya 'Cup', 'Shoe', 'Camera' dan 'Chair'.

Dengan mengingat hal itu โ€“ mari kita buat instance Objectron dan process() gambar masukan:


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


results = objectron.process(mug)

Grafik results berisi landmark 2D dan 3D dari objek yang terdeteksi serta rotasi, translasi, dan skala untuk masing-masing objek. Kami dapat memproses hasil dan menggambar kotak pembatas dengan cukup mudah menggunakan utilitas gambar yang disediakan:

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

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

Ini menghasilkan:

Deteksi Objek 3D dari Video atau Webcam dengan MediaPipe

Aplikasi yang lebih menarik ada di video! Anda tidak perlu banyak mengubah kode untuk mengakomodasi video, apakah Anda menyediakannya dari webcam atau file video yang sudah ada. OpenCV sangat cocok untuk membaca, memanipulasi, dan memasukkan bingkai video ke dalam model objectron:


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

Membuat gambar tidak dapat ditulisi dengan image.flags.writeable = False membuat proses berjalan lebih cepat, dan merupakan perubahan opsional. Akhir cv2.flip() pada gambar yang dihasilkan juga opsional โ€“ dan hanya membuat output dicerminkan untuk membuatnya sedikit lebih intuitif.

Saat dijalankan di kamera dan mug Ikea yang umum secara global, inilah hasilnya:

Deteksi Objek 3D (Kotak Batas 3D) dengan Python dengan MediaPipe Objectron PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Outputnya sedikit gelisah, tetapi menangani terjemahan rotasi dengan baik, bahkan dengan tangan yang gemetar memegang kamera resolusi rendah. Apa yang terjadi jika sebuah benda dikeluarkan dari bingkai?

Deteksi Objek 3D (Kotak Batas 3D) dengan Python dengan MediaPipe Objectron PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Prediksi berhenti untuk objek pada deteksi pertama, dan pelacakan kotak dengan jelas mengambil bahwa objek telah meninggalkan bingkai, dan melakukan prediksi dan pelacakan sekali lagi segera setelah objek masuk kembali ke bingkai. Tampaknya pelacakan bekerja lebih baik ketika model dapat melihat pegangan mug, karena output lebih gelisah saat pegangan tidak terlihat (mungkin karena lebih sulit untuk memastikan secara akurat orientasi mug yang sebenarnya).

Selain itu, beberapa sudut tampaknya menghasilkan output yang jauh lebih stabil daripada yang lain, dalam kondisi cahaya yang menantang. Khusus untuk mug, akan membantu untuk dapat melihat bibir mug karena membantu dengan perspektif, daripada melihat proyeksi objek yang ortogonal.

Selain itu, ketika diuji pada mug transparan, model kesulitan memastikannya sebagai mug. Ini mungkin contoh dari keluar dari distribusi objek, karena kebanyakan mug buram dan memiliki berbagai warna.

Kesimpulan

Deteksi objek 3D masih terbilang muda, dan Objectron MediaPipe adalah demonstrasi yang mumpuni! Meskipun peka terhadap kondisi pencahayaan, jenis objek (mug transparan vs buram, dll.) dan sedikit gelisah โ€“ Objectron adalah gambaran sekilas yang bagus tentang apa yang akan segera mungkin dilakukan dengan akurasi dan aksesibilitas yang lebih tinggi daripada sebelumnya.

Stempel Waktu:

Lebih dari penyalahgunaan