ホームページ >テクノロジー周辺機器 >AI >たった 2 つの Python 関数を使用して完全なコンピューター ビジョン アプリケーションを数分で作成する方法
#翻訳者| Li Rui
校閲者| Chonglou
#Thisこの記事は、コンピュータ ビジョン アプリケーションの基本要件の簡単な紹介から始まります。次に、組み込みコンピューター ビジョンのサーバーレス開発エクスペリエンスを提供するオープン ソース フレームワークである Pipeless について詳しく紹介します。最後に、いくつかの Python 関数とモデルを使用して単純なオブジェクト検出アプリケーションを作成および実行する方法を示す詳細なステップバイステップ ガイドが提供されます。コンピュータ ビジョン アプリケーションの作成
などの画像内の主要な特徴を識別します。60 fps のビデオ ストリームをリアルタイムで処理するには、各フレームを 16 フレーム以内に処理する必要があります。ミリ秒。これは通常、マルチスレッドおよびマルチ処理プロセスを通じて実現されます。場合によっては、フレーム処理を確実に高速化するために、前のフレームが完了する前に次のフレームの処理を開始することが必要になる場合もあります。
人工知能モデルの場合、幸いなことに、現在では優れたオープンソース モデルが多数利用できるため、ほとんどの場合、独自のモデルを最初から開発する必要はなく、パラメータを微調整するだけで済みます。特定のユースケースを満たすため。これらのモデルはすべてのフレームで推論を実行し、オブジェクト検出、セグメンテーション、姿勢推定などのタスクを実行します。
•推論ランタイム: 推論ランタイムは、モデルをロードし、利用可能なさまざまなデバイス (GPU または CPU) 上で効率的に実行する責任があります。
推論プロセス中にモデルを迅速に実行できるようにするには、GPU の使用が不可欠です。 GPU は、特に大量の数学演算を処理する場合に、CPU よりも桁違いに多くの並列演算を処理できます。フレームを処理するときは、フレームが配置されるメモリの場所を考慮する必要があり、GPU メモリまたは CPU メモリ (RAM) に格納することを選択できます。ただし、これら 2 つの異なるメモリ間でフレームをコピーすると、特にフレーム サイズが大きい場合、動作が遅くなる可能性があります。これは、より効率的なモデル推論プロセスを実現するには、メモリの選択とデータ転送のオーバーヘッドを比較検討する必要があることも意味します。
マルチメディア パイプラインは、データ ソースからビデオ ストリームを取得し、フレームに分割して、モデルへの入力として使用する一連のコンポーネントです。場合によっては、これらのコンポーネントは、転送のためにビデオ ストリームを変更および再構築することもできます。これらのコンポーネントはビデオ データの処理において重要な役割を果たし、ビデオ ストリームが効率的に送信および処理されることを保証します。
• ビデオ ストリーム管理: 開発者は、アプリケーションがビデオ ストリームの中断、再接続、ビデオ ストリームの動的追加と削除、複数のビデオ ストリームの同時処理などに耐えられるようにしたい場合があります。
これらのシステムはすべて作成するか、プロジェクトに組み込む必要があるため、コードを保守する必要があります。ただし、直面する問題は、アプリケーション固有ではなく、実際のケース固有のコードを囲むサブシステムを大量のコードを保守することになることです。
Pipeless フレームワーク
Pipeless フレームワークは、アプリケーションのロジックを「ステージ」に分割し、その 1 つは単一モデルのマイクロアプリケーションのようなものです。ステージには、前処理、前処理された入力を使用した推論の実行、およびアクション用のモデル出力の後処理が含まれます。その後、複数のモデルを使用する場合でも、好きなだけステージを連鎖させて完全なアプリケーションを構成できます。
各ステージのロジックを提供するには、アプリケーション固有のコード関数を追加するだけで、必要に応じて Pipeless がその関数の呼び出しを処理します。このため、Pipeless は、組み込みコンピューター ビジョンにサーバーのような開発エクスペリエンスを提供し、追加のサブシステムの必要性を気にせずにいくつかの機能を提供するフレームワークと考えることができます。
Pipeless のもう 1 つの重要な機能は、CLI または REST API を介してビデオ ストリームを動的に追加、削除、更新することでビデオ ストリーム処理を自動化できることです。ビデオ ストリームの処理をいつ再開するか、エラー後に再開するかどうかなどを示す再開ポリシーを指定することもできます。
最後に、Pipeless フレームワークをデプロイするには、パイプレス フレームワークをインストールし、クラウド コンピューティング仮想マシンやコンテナ化モード、または Nvidia Jetson などのエッジ デバイスで直接、任意のデバイス上でコード関数を使用して実行するだけです。ラズベリーなどミドル。 次に、Pipeless フレームワークを使用して単純なオブジェクト検出アプリケーションを作成する方法を詳しく説明します。 。 #最初はインストールです。インストール スクリプトを使用すると、インストールが非常に簡単になります。 次に、プロジェクトを作成する必要があります。 Pipeless プロジェクトは、ステージを含むディレクトリです。各ステージはサブディレクトリ内にあり、各サブディレクトリ内にフック (特定のコード関数) を含むファイルが作成されます。各ステージ フォルダーに指定された名前は、後でビデオ ストリームに対してそのステージを実行するときに、パイプレス ボックスに指定する必要があるステージ名です。 ここで、空のテンプレートは CLI にディレクトリを作成するだけを指示します。テンプレートが提供されていない場合、CLI はステージを作成するためのいくつかの質問を表示します。インタラクティブに。 上で述べたように、プロジェクトにフェーズを追加する必要があります。次のコマンドを使用して、GitHub からステージの例をダウンロードします: これにより、ステージ ディレクトリ onnx-yolo が作成されます。アプリケーション機能が含まれています。 次に、各ステージ ファイルの内容 (アプリケーション フック) を確認します。 これは、フレームとシーンを受け入れる関数 (フック) を定義する pre-process.py ファイルです。この関数は、モデルが予期する形式と一致するように、RGB フレームを受信する入力データを準備するためにいくつかの操作を実行します。このデータは、Pipeless がモデルに渡すデータである Frame_data['interence_input'] に追加されます。 使用するパイプレス推論ランタイム (この場合は ONNX ランタイム) を示す process.json ファイルもあります。ロードする必要があるモデルと、使用する実行プロバイダー (CPU、CUDA、TensorRT など) などのオプションのパラメーターの一部を見つけます。 最後に、post-process.py ファイルは、pre-process.py の関数と同様の関数を定義します。今回は、Pipeless が Frame_data["inference_output"] に保存する推論出力を受け入れ、その出力を境界ボックスに解析する操作を実行します。その後、フレーム上に境界ボックスを描画し、最後に変更されたフレームをframe_data['modified']に割り当てます。このようにして、Pipeless は提供されたビデオ ストリームを転送しますが、境界ボックスを含む変更されたフレームが含まれます。 最後のステップは、Pipeless を起動してビデオ ストリームを提供することです。 Pipeless を開始するには、my-project ディレクトリで次のコマンドを実行するだけです: 実行すると、Web カメラ (v4l2) からのビデオ ストリームが提供されます。 、出力を画面に直接表示します。ビデオストリームが順番に実行するステージのリストを提供する必要があることに注意してください。この例では、それは単なる onnx-yolo 段階です: コンピューター ビジョン アプリケーションの作成は A多くの要素やサブシステムを実装する必要があるため、タスクは複雑です。 Pipeless のようなフレームワークを使用すると、立ち上げて実行するのに数分しかかからないため、特定のユースケース向けのコードの作成に集中できます。さらに、パイプレス「ステージ」は再利用性が高く、メンテナンスが容易であるため、メンテナンスが容易になり、非常に迅速に反復できます。 Pipeless の開発に参加したい場合は、GitHub リポジトリを通じて参加できます。 元のタイトル: Create a Complete Computer Vision App in Minutes With Just Two Python Functions、著者: Miguel Angel Cabrera リンク: https://www.php.cn/link/e26dbb5b1843bf566ea7ec757f3325c4オブジェクト検出アプリケーションの作成
Curl https://raw.githubusercontent.com/pipeless-ai/pipeless/main/install.sh | bash
pipeless init my-project --template emptycd my-project
wget -O - https://github.com/pipeless-ai/pipeless/archive/main.tar.gz | tar -xz --strip=2 "pipeless-main/examples/onnx-yolo"
def hook(frame_data, context):frame = frame_data["original"].view()yolo_input_shape = (640, 640, 3) # h,w,cframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)frame = resize_rgb_frame(frame, yolo_input_shape)frame = cv2.normalize(frame, None, 0.0, 1.0, cv2.NORM_MINMAX)frame = np.transpose(frame, axes=(2,0,1)) # Convert to c,h,winference_inputs = frame.astype("float32")frame_data['inference_input'] = inference_inputs... (some other auxiliar functions that we call from the hook function)
{ "runtime": "onnx","model_uri": "https://pipeless-public.s3.eu-west-3.amazonaws.com/yolov8n.onnx","inference_params": { "execution_provider": "tensorrt" }}
def hook(frame_data, _):frame = frame_data['original']model_output = frame_data['inference_output']yolo_input_shape = (640, 640, 3) # h,w,cboxes, scores, class_ids = parse_yolo_output(model_output, frame.shape, yolo_input_shape)class_labels = [yolo_classes[id] for id in class_ids]for i in range(len(boxes)):draw_bbox(frame, boxes[i], class_labels[i], scores[i])frame_data['modified'] = frame... (some other auxiliar functions that we call from the hook function)
pipeless start --stages-dir .
pipeless add stream --input-uri "v4l2" --output-uri "screen" --frame-path "onnx-yolo"
結論
以上がたった 2 つの Python 関数を使用して完全なコンピューター ビジョン アプリケーションを数分で作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。