MediaPipe Objectron PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 3D 개체 감지(3D 경계 상자). 수직 검색. 일체 포함.

MediaPipe Objectron을 사용한 Python의 3D 객체 감지(3D 경계 상자)

개요

개체 감지가 점점 더 활발해지고 있으며 이를 해결하기 위한 여러 가지 접근 방식이 개선되고 있습니다. 지난 몇 년 동안 YOLO 기반 방법은 YOLOv7 및 YOLOv6(YOLOv7 이후 독립적으로 출시됨)와 같은 최근의 발전으로 정확도와 속도 측면에서 다른 방법보다 성능이 뛰어났습니다.

그러나 – 이 모든 것은 관련이 있습니다. 2D 객체 감지, 그 자체로 어려운 작업입니다. 최근에 우리는 성공적인 수행을 할 수 있었습니다. 3D 객체 감지, 이러한 감지기는 여전히 2D 물체 감지기보다 불안정한 단계에 있지만 정확도는 높아지고 있습니다.

이 가이드에서는 MediaPipe의 Objectron을 사용하여 Python에서 3D 개체 감지를 수행합니다.

참고 : MediaPipe는 주로 휴대기기용 이미지, 동영상 및 오디오 스트림을 처리하기 위한 기계 학습 파이프라인을 구축하기 위한 Google의 오픈 소스 프레임워크입니다. 내부 및 외부 모두에서 사용되고 있으며 얼굴 감지, 얼굴 메싱, 손 및 포즈 추정, 머리카락 분할, 물체 감지, 상자 추적 등과 같은 다양한 작업을 위한 사전 훈련된 모델을 제공합니다.

이러한 모든 기능은 얼굴에 필터 적용, 자동 카메라 초점 맞추기, 생체 인식 확인, 손으로 제어하는 ​​로보틱스 등과 같은 다운스트림 작업에 사용할 수 있고 사용할 수 있습니다. 대부분의 프로젝트는 Android, iOS, C++, Python 및 JavaScript용 API와 함께 사용할 수 있습니다. 일부는 특정 언어에서만 사용할 수 있습니다.

이 가이드에서 우리는 MediaPipe의 오브젝트론, Android, C++, Python 및 JavaScript에서 사용할 수 있습니다.

MediaPipe 및 3D 객체 감지

XNUMXD덴탈의 오브제론 솔루션에 대한 교육을 받았습니다. Objectron 데이터 세트, 짧은 개체 중심 비디오가 포함되어 있습니다. 데이터세트에는 자전거, 책, 병, 카메라, 시리얼 상자, 의자, 컵, 노트북, 신발 등 9개의 개체만 포함되어 있으므로 매우 일반적인 데이터세트는 아니지만 이러한 비디오의 처리 및 조달 비용이 상당히 비쌉니다(카메라 포즈, 희박함). 각 비디오의 각 프레임에 대한 포인트 클라우드, 평면 표면의 특성화 등) 데이터 세트 크기를 거의 2테라바이트로 만듭니다.

훈련된 Objectron 모델( 해결책 MediaPipe 프로젝트용)은 신발, 의자, 머그, 카메라의 네 가지 범주에 대해 교육을 받았습니다.

2D 개체 감지는 "경계 상자"라는 용어를 사용하지만 실제로는 직사각형입니다. 3D 객체 감지는 실제로 예측합니다. 박스 객체의 방향, 크기, 대략적인 부피 등을 추론할 수 있는 객체 주변. 특히 적절한 데이터 세트가 부족하고 생성 비용을 고려할 때 이것은 수행하기 상당히 어려운 작업입니다. 어렵지만 문제는 다양한 가능성을 약속합니다. 증강 현실 (Augmented Reality, AR) 응용 프로그램!

Objectron 솔루션은 2단계 또는 XNUMX단계 모드로 실행될 수 있습니다. XNUMX단계 모드는 여러 물체를 감지하는 데 더 좋고 XNUMX단계 모드는 장면에서 단일 주요 물체를 감지하는 데 더 좋고 상당히 실행됩니다. 더 빠르게. XNUMX단계 파이프라인은 MobileNetVXNUMX 백본을 사용하고 XNUMX단계 파이프라인은 TensorFlow Object Detection API를 사용합니다.

비디오에서 개체가 감지되면 다음 두 가지 이유로 각 프레임에서 개체에 대한 추가 예측이 이루어지지 않습니다.

  • 지속적인 예측은 높은 불안감을 유발합니다(예측에 내재된 확률로 인해).
  • 모든 프레임에서 대형 모델을 실행하는 데 비용이 많이 듭니다.

팀은 무거운 예측을 첫 번째 조우에만 오프로드한 다음 문제의 물체가 여전히 장면에 있는 한 해당 상자를 추적합니다. 시선이 끊어지고 대상이 다시 도입되면 다시 예측이 이루어집니다. 이를 통해 계산 요구 사항을 낮게 유지하면서 더 높은 정확도로 더 큰 모델을 사용할 수 있고 실시간 추론을 위한 하드웨어 요구 사항을 낮출 수 있습니다!

계속해서 MediaPipe를 설치하고 Objectron 솔루션을 가져와 정적 이미지와 카메라에서 바로 나오는 비디오 피드에 적용해 보겠습니다.

미디어파이프 설치

먼저 MediaPipe를 설치하고 주어진 URL에서 이미지를 가져오는 도우미 메서드를 준비하겠습니다.

! pip install mediapipe

프레임워크가 설치되면 일반 라이브러리와 함께 가져옵니다.

import mediapipe as mp

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

URL이 주어진 이미지를 가져오고 해당 이미지를 나타내는 RGB 배열을 반환하는 도우미 메서드를 정의해 보겠습니다.

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)

마지막으로 예측을 시각화하기 위해 Objectron 솔루션과 그리기 유틸리티를 모두 가져와야 합니다.

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

MediaPipe를 사용한 정적 이미지의 3D 객체 감지

XNUMXD덴탈의 Objectron 클래스는 다음을 포함하여 여러 인수를 허용합니다.

  • static_image_mode: 이미지를 공급하든 이미지 스트림(비디오)을 공급하든
  • max_num_objects: 식별 가능한 최대 개체 수
  • min_detection_confidence: 탐지 신뢰 임계값(네트워크가 주어진 클래스에 대해 개체를 분류하는 데 얼마나 확신이 있어야 하는지)
  • model_name: 중간에 로드할 모델 'Cup', 'Shoe', 'Camera''Chair'.

이를 염두에 두고 Objectron 인스턴스를 인스턴스화하고 process() 입력 이미지:


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


results = objectron.process(mug)

XNUMXD덴탈의 results 감지된 객체의 2D 및 3D 랜드마크와 각 항목에 대한 회전, 변환 및 배율을 포함합니다. 제공된 그리기 유틸리티를 사용하여 결과를 처리하고 경계 상자를 상당히 쉽게 그릴 수 있습니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

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

결과 :

MediaPipe로 비디오 또는 웹캠에서 3D 객체 감지

더 흥미로운 응용 프로그램은 비디오에 있습니다! 웹캠에서 제공하든 기존 비디오 파일에서 제공하든 비디오를 수용하기 위해 코드를 많이 변경할 필요가 없습니다. OpenCV는 객체론 모델에 비디오 프레임을 읽고 조작하고 공급하는 데 자연스럽게 적합합니다.


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

다음을 사용하여 이미지를 쓸 수 없게 만들기 image.flags.writeable = False 프로세스 실행을 다소 빠르게 하며 선택적 변경입니다. 마지막 cv2.flip() 결과 이미지도 선택 사항입니다. 출력을 미러링하여 좀 더 직관적으로 만들 수 있습니다.

카메라와 전 세계적으로 일반적인 Ikea 머그에서 실행하면 다음과 같은 결과가 나타납니다.

MediaPipe Objectron PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 3D 개체 감지(3D 경계 상자). 수직 검색. 일체 포함.

출력이 약간 불안정하지만 저해상도 카메라를 잡고 떨리는 손으로도 회전 변환을 잘 처리합니다. 프레임에서 물체를 꺼내면 어떻게 될까요?

MediaPipe Objectron PlatoBlockchain 데이터 인텔리전스를 사용하여 Python에서 3D 개체 감지(3D 경계 상자). 수직 검색. 일체 포함.

개체에 대한 예측은 첫 번째 감지에서 중지되고 상자 추적은 개체가 프레임을 떠났다는 것을 명확하게 파악하고 개체가 프레임에 다시 진입하자마자 다시 한 번 예측 및 추적을 수행합니다. 모델이 볼 수 있을 때 추적이 다소 더 잘 작동하는 것으로 보입니다. 머그 핸들, 핸들이 보이지 않을 때 출력이 더 불안해지기 때문입니다(머그의 실제 방향을 정확하게 확인하기가 더 어렵기 때문인 것 같습니다).

또한 일부 각도는 까다로운 조명 조건에서 다른 각도보다 훨씬 더 안정적인 출력을 생성하는 것으로 보입니다. 특히 머그의 경우 개체의 직교 투영을 보는 것보다 원근감에 도움이 되므로 머그의 가장자리를 볼 수 있도록 도와줍니다.

또한 투명한 머그에서 테스트했을 때 모델이 머그인지 확인하는 데 어려움이 있었습니다. 이것은 아마도 유통되지 않음 대부분의 머그는 불투명하고 다양한 색상을 가지고 있기 때문입니다.

결론

3D 객체 감지는 아직 젊고 MediaPipe의 Objectron은 유능한 데모입니다! 조명 조건, 물체 유형(투명한 머그잔과 불투명한 머그잔 등) 및 약간의 불안감에 민감하지만 Objectron은 이전보다 더 높은 정확도와 접근성으로 곧 무엇을 할 수 있는지를 잘 보여줍니다.

타임 스탬프 :

더보기 스택카부스