그래프 실행
Graph는 계획입니다. Run은 실제 실행 핸들입니다.
그래프를 작성한 후에 이 페이지를 사용하세요. 여전히 그래프에 어떤 노드 또는 조각을 포함할지 결정해야 한다면 그래프부터 시작하세 요. 그래프가 이미 제대로 구성되어 있다면, 이 페이지에서 실제 입력에 대해 실행, 처리, 측정 및 생존하도록 설정할 수 있습니다.
한 번 실행하거나 재사용 가능한 실행 방식을 선택하세요.
작업에 필요한 가장 짧은 런타임 경로를 사용하세요.
| 필요하다 | 사용하세요. | 왜 |
|---|---|---|
| 하나의 입력을 실행하여 하나의 출력을 얻습니다. | Graph.run(...) | 가장 짧은 단일 경로. |
| 시간이 지남에 따라 여러 입력을 연속적으로 처리합니다. | Graph.build(...) 및 Run. | 런타임을 재사용하고 푸시/풀 제어를 지원합니다. |
| 이름이 지정된 입력 또는 출력을 사용하세요. | Graph.build(...)를 생성하고, 이름을 run.push(...) / run.pull(...)로 지정했습니다. | 다중 입력 및 다중 출력 앱을 명확하게 관리합니다. |
| 소스 노드가 그래프를 주도하도록 합니다. | 앱 입력을 사용하지 않고 Graph.build() 또는 Graph.run()을 실행합니다. | 그래프가 카메라, 파일, RTSP 또는 기타 소스 노드를 소유하고 있을 때 사용합니다. |
| 측정하고, 내보내고, 배출하거나, 또는 의도적으로 중단합니다. | Run | 제품 수명 주기 및 진단 기능을 제어할 수 있습니다. |
마법은 없습니다. 그래프를 만들고, 실행하고, 결과를 검토하세요.
입력 데이터가 그래프에 어떻게 들어갈지 선택하세요.
큐를 조정하기 전에 입력 데이터의 소유자를 결정하세요.
| 그래프 스타일 | 입력 방식 | 어떻게 실행하시나요? |
|---|---|---|
| 앱에서 제공하는 그래프 | 귀하의 애플리케이션은 Graph.run(input, ...), run.run(input, ...), run.push(...) 또는 run.try_push(...)를 호출합니다. | 입력을 사용하여 구축하거나 실행합니다. 다중 입력 그래프에 적용하기 전에 엔드포인트 이름을 확인합니다. |
| 소스에서 소유한 그래프 | 이 그래프에는 파일, 카메라, RTSP 또는 스트림 입력과 같은 소스 노드 또는 소스 조각이 포함되어 있습니다. | 앱 입력을 사용하지 않고 그래프를 생성하거나 실행합니다: graph.build() 또는 graph.run(). 그래프에 따라 출력을 가져오거나, 출력 노드를 사용하거나, 콜백을 사용합니다. |
그래프가 소스 데이터를 가지고 있다면, 해당 그래프에 데이터를 추가하지 마세요. 대신 그래프가 어떤 데이터를 출력하는지 확인하세요.
소스가 소유한 그래프를 실행합니다.
그래프에 자체 소스 노드가 포함된 경우, 앱 입력을 사용하지 않고 그래프를 빌드하거나 실행합니다. 이미 소스를 포함하고 있는 그래프에 추가하지 마십시오. 그래프가 출력을 제공할 때 명명된 출력을 가져오고, 그래프가 싱크 노드로 끝날 때 싱크 노드가 출력을 처리하도록 합니다.
그래프가 입력과 출력을 모두 포함하는 소스-싱크 작업에는 graph.run()을 사용합니다. 앱에서 결과를 가져오거나, 실행을 측정하거나, 의도적으로 실행을 중지해야 할 때는 graph.build()을 사용합니다.
auto run = graph.build();
while (running && run.can_pull()) {
auto sample = run.pull("detections", /*timeout_ms=*/1000);
if (!sample) {
continue;
}
handle(*sample);
}
run.close();
오랫동안 실행되는 소스의 경우, 애플리케이션에서 루프를 종료할 시점을 결정하고 close()를 호출하도록 합니다. 타임아웃은 해당 시간 동안 출력값이 도착하지 않았음을 의미하며, 항상 소스가 완료되었음을 의미하는 것은 아닙니다.
한 번 실행
동기화된 푸시/풀 작업을 한 번만 수행하려는 경우 Graph.run(...)을 사용하세요.
simaai::neat::Graph graph("classifier");
graph.add(simaai::neat::nodes::Input("image"));
graph.add(model);
graph.add(simaai::neat::nodes::Output("classes"));
simaai::neat::TensorList outputs = graph.run(std::vector<cv::Mat>{frame});
Python에서는 리스트 또는 튜플을 전달합니다. graph.run([tensor])는 “배치 차원을 추가”하는 것이 아니라 “하나의 그래프 입력”을 의미합니다.