ノード
Node は、SiMa.ai Neat における最小の構成要素です。
ノードは、Graph が接続するものです。具体的には、デコード段階、前処理段階、モデル段階、後処理段階、ソース、シンク、およびアプリケーションの境界などが含まれます。
参照:
ノードが表すもの
ノードは、1つの論理的な作業と、ビルダーが安全に接続するために必要なメタデータを提供します。
- ランタイム作業(デコード、変換、前処理、推論、後処理、またはシンクの動作など)
- 入力/出力の契約(期待されるメディアタイプ、テンソルの形状、データ型、または機能など)
- 決定的なバックエンドの命名により、
describe()、診断、メトリック、およびプローブが安定した状態を維持します。
主 なルールは単純です。
Graph = nodes wired together
Model は、モデルを意識したノードのソースです。Model は、Graph に直接追加することも、前処理、推論、後処理などの再利用可能なステージの断片を提供することもできます。
あらかじめ作成されたノードグループ
一般的なパターンの中には、複数の低レベルノードで構成されるものがあります。Neatでは、それらをあらかじめ作成されたグループとして提供することで、ユーザーがすべてのソース、デコーダー、コンバーター、キュー、またはシンクを手動で接続する必要がなくなります。
グループを、再利用可能なミニグラフとして考えてください。これは、明確なインターフェースを持つ、名前付きのノードの集合です。
例:
VideoInputGroup(...): ファイル/ビデオソース + デコードパス。RtspDecodedInput(...): RTSPソース + デコードパス。- モデルのルートフラグメント:前処理 + 推論 + コンパイルされたモデルを中心としたデコード/後処理。
#include "neat/runtime.h"
#include "neat/node_groups.h"
simaai::neat::Graph graph;
simaai::neat::nodes::groups::VideoInputGroupOptions vopt;
vopt.path = "/data/sample.mp4";
graph.add(simaai::neat::nodes::groups::VideoInputGroup(vopt));
標準的な形状で、アプリケーションの興味深い部分が内部のメディア処理にない場合は、事前に構築されたグループを使用してください。カスタムのトポロジーが必要な場合は、より低レベルのノードから同等のGraphを自分で構築します。
ノードまたはグループを選択する
完全なAPIリファレンスを開く前に、このマップを参照してください。
| タスク | C++の開始点 | Pythonの開始点 |
|---|---|---|
| アプリケーションがテンソル、画像、またはサンプルをプッシュする | nodes::Input("name", options) | pyneat.nodes.input("name", options) |
| アプリケーションが完全なサンプルをプルする | nodes::Output("name", options) | pyneat.nodes.output("name", options) |
| ファイルからフレームを読み取る | nodes::FileInput(...)とデコードノード、またはnodes::groups::VideoInputGroup(...) | pyneat.nodes.file_input(...)とデコードノード、またはpyneat.groups.video_input(...) |
| ソースとして1つの画像を読み取る | nodes::StillImageInput(...) | pyneat.nodes.still_image_input(...) |
| MIPI/libcameraカメラを読み取る | nodes::CameraInput(...) | pyneat.nodes.camera_input(...) |
| RTSPストリームを読み取る | nodes::RTSPInput(...)、nodes::groups::RtspEncodedInput(...)、またはnodes::groups::RtspDecodedInput(...) | pyneat.nodes.rtsp_input(...)、pyneat.groups.rtsp_encoded_input(...)、またはpyneat.groups.rtsp_decoded_input(...) |
| HTTPマルチパートMJPEGを読み取る | nodes::groups::HttpMjpegDecodedInput(...)、またはnodes::HttpSource(...)、MultipartJpegDemux()、JpegParse()(手動でのフレーム処理) | pyneat.groups.http_mjpeg_decoded_input(...)、またはpyneat.nodes.http_source(...)、pyneat.nodes.multipart_jpeg_demux()、pyneat.nodes.jpeg_parse() |
| 画像をデコードする | nodes::ImageDecode()またはnodes::JpegDecode() | pyneat.nodes.image_decode()またはpyneat.nodes.jpeg_decode() |
| エンコードされたビデオをデコードする | nodes::SimaDecode(SimaDecodeOptions{...}) | pyneat.nodes.sima_decode(options) |
| ビデオのスケールまたはレート制限を行う | nodes::VideoScale()、VideoRate()、ImageFreeze() | pyneat.nodes.video_scale()、video_rate()、image_freeze() |
| 再利用可能な画像入力パスを構築する | nodes::groups::ImageInputGroup(...) | pyneat.groups.image_input(...) |
| 再利用可能なビデオ入力パスを構築する | nodes::groups::VideoInputGroup(...) | pyneat.groups.video_input(...) |
| ビデオを出力する | nodes::groups::VideoSender(...)またはH.264/UDP出力ヘルパー | pyneat.groups.video_sender(...)またはH.264/UDP出力ヘルパー |
| メタデータを送信する | MetadataSender | pyneat.MetadataSender |
| 検出結果をレンダリングする | nodes::SimaRender(...) | pyneat.nodes.sima_render(...) |
| ロジットをクラスインデックスに変換する | nodes::SimaArgMax(...) | pyneat.nodes.sima_argmax(...) |
テスト済みのフラグメントが必要な場合はグループを使用し、明示的なトポロジーが必要な場合は個々のノードを使用します。Graphのgraphs::Branch(...)やgraphs::Combine(...)などのヘルパーを使用して、重複した出力でトポロジーを隠すのではなく、ファンアウトとファンインを行います。
nodes::H264Decode(...)とpyneat.nodes.h264_decode(...)は、非推奨の互換性ラッパーです。新しいH.264デコードグラフでは、SimaDecode