概要
物体検出は勢いを増しており、それを解決するためのいくつかのアプローチが改善されています。 過去数年間、YOLO ベースの方法は、精度と速度の点で他の方法よりも優れており、YOLOv7 や YOLOv6 (YOLOv7 の後に独立してリリースされました) などの最近の進歩により、精度と速度が向上しています。
ただし、これらはすべて懸念事項です 2D オブジェクト検出、それ自体が難しい作業です。 最近、私たちは成功裏に実行することができました 3D オブジェクト検出、これらの検出器はまだ 2D オブジェクト検出器よりも不安定な段階にありますが、精度は向上しています。
このガイドでは、MediaPipe の Objectron を使用して Python で 3D オブジェクト検出を実行します。
注: MediaPipe は、主にモバイル デバイス向けの画像、動画、音声ストリームを処理するための機械学習パイプラインを構築するための Google のオープン ソース フレームワークです。 これは社内外で使用されており、顔検出、顔メッシュ、手とポーズの推定、髪のセグメンテーション、オブジェクト検出、ボックス トラッキングなど、さまざまなタスク用に事前トレーニング済みのモデルを提供します。
これらはすべて、顔へのフィルターの適用、自動カメラ フォーカス、生体認証、手動ロボット工学などのダウンストリーム タスクに使用できます。ほとんどのプロジェクトは、Android、iOS、C++、Python、JavaScript の API で利用できますが、一部は特定の言語でのみ使用できます。
このガイドでは、 MediaPipe の Objectron、Android、C++、Python、および JavaScript で利用できます。
MediaPipe と 3D オブジェクトの検出
オブジェトロン ソリューションは、 Objectron データセット、短いオブジェクト中心のビデオが含まれています。 データセットには、自転車、本、ボトル、カメラ、シリアル ボックス、椅子、カップ、ラップトップ、靴の 9 つのオブジェクトしか含まれていないため、非常に一般的なデータセットではありませんが、これらのビデオの処理と調達にはかなりの費用がかかります (カメラのポーズ、スパース各ビデオの各フレームの点群、平面の特徴付けなど)、データセットのサイズは約 2 テラバイトになります。
トレーニングされた Objectron モデル ( 溶液 MediaPipe プロジェクトの場合) は、靴、椅子、マグカップ、カメラの XNUMX つのカテゴリについてトレーニングを受けています。
2D オブジェクト検出では「バウンディング ボックス」という用語が使用されますが、実際には長方形です。 3Dオブジェクト検出は実際に予測します ボックス これは、特に適切なデータセットがなく、それらを作成するコストがかかることを考えると、かなり難しい作業です。 困難ではあるが、この問題はさまざまな可能性を秘めている 拡張現実(AR) アプリケーション!
Objectron ソリューションは、2 段階モードまたは XNUMX 段階モードで実行できます。XNUMX 段階モードは複数のオブジェクトの検出に優れており、XNUMX 段階モードはシーン内の単一の主要オブジェクトの検出に優れており、大幅に実行されます。もっと早く。 XNUMX 段階のパイプラインは MobileNetVXNUMX バックボーンを使用し、XNUMX 段階のパイプラインは TensorFlow オブジェクト検出 API を使用します。
ビデオでオブジェクトが検出された場合、次の XNUMX つの理由により、各フレームでそれ以上の予測は行われません。
- 継続的な予測は、高いジッタネスをもたらします (予測に固有の確率論による)。
- すべてのフレームで大規模なモデルを実行するにはコストがかかります
チームは、重い予測を最初の遭遇のみにオフロードし、問題のオブジェクトがまだシーン内にある限り、そのボックスを追跡します。 視線が途切れてオブジェクトが再び導入されると、再び予測が行われます。 これにより、計算要件を低く抑えながら、より大きなモデルをより高い精度で使用することが可能になり、リアルタイム推論のためのハードウェア要件が低くなります!
MediaPipe をインストールし、Objectron ソリューションをインポートして、静止画像とカメラから直接送られてくるビデオ フィードに適用してみましょう。
MediaPipe のインストール
最初に 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 オブジェクト検出
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)
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 を使用したビデオまたは Web カメラからの 3D オブジェクト検出
もっとエキサイティングなアプリケーションはビデオです! Web カメラまたは既存のビデオ ファイルからビデオを提供するかどうかにかかわらず、ビデオに対応するためにコードを大幅に変更する必要はありません。 OpenCV は、ビデオ フレームの読み取り、操作、および 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()
イメージを書き込み不可にする image.flags.writeable = False
プロセスの実行をいくらか速くします。これはオプションの変更です。 最終 cv2.flip()
結果の画像のオンもオプションです。出力をミラーリングして、もう少し直感的にすることができます。
カメラと世界的に一般的なイケアのマグカップで実行すると、次の結果が得られます。
出力はわずかにぎくしゃくしていますが、低解像度のカメラを握っている手が震えている場合でも、回転変換はうまく処理されます。 オブジェクトがフレームから取り出されるとどうなりますか?
オブジェクトの予測は最初の検出で停止し、ボックス トラッキングはオブジェクトがフレームから離れたことを明確に検出し、オブジェクトがフレームに再び入るとすぐに予測と追跡をもう一度実行します。 モデルが マグハンドル、ハンドルが表示されていない場合、出力がより不安定になるためです (おそらく、マグカップの真の向きを正確に確認するのが難しいため)。
さらに、一部の角度は、困難な光条件で、他の角度よりもはるかに安定した出力を生成するようです. 特にマグカップの場合、オブジェクトの正射影を見るのではなく、遠近法に役立つため、マグカップの唇を見ることができます。
さらに、透明なマグカップでテストした場合、モデルがマグカップであることを確認するのは困難でした。 これはおそらく 配布終了 ほとんどのマグカップは不透明で、さまざまな色があります。
まとめ
3D オブジェクトの検出はまだ始まったばかりであり、MediaPipe の Objectron は有能なデモンストレーションです! 照明条件、オブジェクトの種類 (透明または不透明なマグカップなど) に敏感で、わずかにぎくしゃくしていますが、Objectron は、これまで以上に高い精度とアクセシビリティですぐに何ができるようになるかを垣間見ることができます.