# Workflow 구축

Workflow는 특정 작업을 수행하는 block들로 구성되며, 여기에는 model inference 실행, 로직 수행, 또는 외부 서비스와의 연동 등이 포함됩니다.

사용 가능한 block 목록을 더 자세히 알아보려면, 다음을 참조하세요. [block 문서](https://inference.roboflow.com/workflows/blocks/).

### 개요

이 가이드에서는 object detection model을 실행하고, prediction 수를 세고, model 결과를 시각화하는 4개의 block으로 구성된 Workflow를 만드는 과정을 살펴봅니다. 따라할 수 있도록 여기 [최종 Workflow 템플릿](https://app.roboflow.com/workflows/embed/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3b3JrZmxvd0lkIjoiMmdqakJxMDV3Q01ac1hHM3hkeFAiLCJ3b3Jrc3BhY2VJZCI6ImtyT1RBYm5jRmhvUU1DZExPbGU0IiwidXNlcklkIjoiSW1GTElaU2tHYk55OXpiNFV1cWxNelBScHBRMiIsImlhdCI6MTczODE4ODk5MH0.f72WI5bdjtnwC8iqXF_XiUVarfOktIAH1egpsI0Oh4Q) 이 있습니다.

{% embed url="<https://app.roboflow.com/workflows/embed/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3b3JrZmxvd0lkIjoiMmdqakJxMDV3Q01ac1hHM3hkeFAiLCJ3b3Jrc3BhY2VJZCI6ImtyT1RBYm5jRmhvUU1DZExPbGU0IiwidXNlcklkIjoiSW1GTElaU2tHYk55OXpiNFV1cWxNelBScHBRMiIsImlhdCI6MTczODE4ODk5MH0.f72WI5bdjtnwC8iqXF_XiUVarfOktIAH1egpsI0Oh4Q>" fullWidth="false" %}

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-3320b2627ac743a17afb97f63c70993b4cbe3b51%2FCleanShot%202025-01-29%20at%2015.25.03%402x.png?alt=media" alt="" width="563"><figcaption><p>Detect, Count, and Visualize Workflow</p></figcaption></figure>

### Block 연결

구성을 시작하기 전에, block 연결 방식이 어떻게 작동하는지 이해하는 것이 중요합니다.

특정 위치에 block을 추가하려면, 해당 block은 이전 block을 입력으로 사용해야 합니다. 예를 들어, 위에 표시된 Workflow에서는 *Property Definition* block이 *Object Detection* block 뒤에 옵니다. 이는 model block을 입력으로 사용하기 때문입니다. 그리고 *Bounding Box Visualization* block은 오른쪽에 있습니다. 이는 *Property Definition* block의 출력을 사용하지 않고, model 출력을 참조하기 때문입니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-79fa8c10219b4a7e8e0696acceae5e297f05f70f%2FCleanShot%202025-01-29%20at%2016.31.28%402x.png?alt=media" alt=""><figcaption><p>Model Comparison Workflow</p></figcaption></figure>

위의 예시 Workflow에서는 네 개의 개별 경로가 있습니다. 각 branch는 runtime에 병렬로 실행되며, 다른 branch block을 입력으로 의존하지 않기 때문입니다.

### Workflow 만들기

#### Object Detection Model

먼저, *Object Detection Model* block을 추가합니다. COCO로 학습된 YOLOv8n과 같은 공개 사전 학습 model이나, workspace에 있는 fine-tuned model 중에서 선택할 수 있습니다. 여기서는 사전 학습된 [COCO](https://universe.roboflow.com/microsoft/coco)를 사용하겠습니다. *yolov8n* model로 사람과 차량을 감지하겠습니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-bc18512f57a057976473b7d03cc7ee3a884e67e3%2FCleanShot%202025-01-29%20at%2015.30.31%402x.png?alt=media" alt="" width="344"><figcaption></figcaption></figure>

object detection block에는 model이 무엇을 추론할지 결정하는 필수 image parameter가 있습니다. 여러 optional parameter가 있으며, 핵심 항목은 아래에 자세히 설명되어 있습니다:

* Class Filter: model이 반환할 class 목록입니다. 참고: model은 항상 학습된 class만 반환하며, 이 설정을 통해 필요하지 않은 class를 필터링할 수 있습니다.
* Confidence: 해당 confidence 미만의 객체는 반환되지 않습니다.
* IoU threshold: threshold가 높을수록 더 많이 겹치는 prediction이 반환됩니다. 0.9는 90% 이하로 겹치는 객체가 반환됨을 의미하고, 0.1은 10%를 초과하여 겹치는 객체가 포함되지 않음을 의미합니다.
* Max Detections: model이 반환할 수 있는 최대 객체 수입니다.
* Class Agnostic NMS: 겹침 필터링 시 동일한 class의 객체만 비교하고 제외할지, 아니면 모든 class를 비교할지를 결정합니다.

#### Property Definition

Property Definition block을 사용하면 image 크기, 예측된 class, 감지된 객체 수와 같은 관련 정보를 데이터에서 추출할 수 있습니다. 이 예제에서는 object detection model이 찾은 객체 수를 셀 것입니다.

<figure><img src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc507UbRnkEH6XMdrfmwVZbHcK6x6K5THwnt1RmEk8iXSojwvmiA_q6KwRXV9bJudYnW7NMTQKKb9GqGxm_P0VjbuOoGWcDsM5NoQckl9jV4YcjYQFIvYoCgvd_YnQTNJLlwdbZwA?key=yGJPQzp1abf4J7pT0mnBw8w4" alt="" width="375"><figcaption></figcaption></figure>

다음의 *Data* property에는 model prediction을 참조하세요. 그리고 *Operations*에서는 Count Items를 선택합니다. 이 구성은 object detection model이 수행한 prediction 수를 반환합니다.

#### Bounding Box Visualization

model 결과를 시각화하기 위해 bounding box visualization block을 추가하세요.  *image* parameter에는 입력 image를 선택합니다. prediction에는 model 결과를 선택합니다. 선택적으로 optional configuration property를 사용해 bounding box의 색상과 크기를 변경할 수 있습니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-c02309fdf720d80b86c1de59ed126c7b7d9a2f9d%2FCleanShot%202025-01-29%20at%2015.31.50%402x.png?alt=media" alt="" width="342"><figcaption></figcaption></figure>

#### Label Visualization

bounding box를 그리는 것 외에도, prediction의 class 이름도 표시하고 싶을 것입니다. 이를 위해 *Label Visualization* block을 bounding box visualization 뒤에 추가하세요. bounding box와 label을 같은 image에 모두 그리려면, 참조 입력 image를 입력 image 대신 *bounding\_box\_visualization* image로 설정해야 합니다. 이렇게 하면 bounding box 위에 label이 그려집니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-cdcb7551292e790e706a1451b75bd3dcca6b28eb%2FCleanShot%202025-01-29%20at%2016.17.06%402x.png?alt=media" alt="" width="343"><figcaption></figcaption></figure>

optional *Text* parameter를 변경하여 표시 텍스트를 class 이름, confidence, 또는 class 이름과 confidence로 바꿀 수 있습니다.

### 변경 사항 저장

Workflow 구성을 완료했으면 "Save Workflow"를 클릭하세요. Workflow를 이미 배포한 경우, 저장된 Workflow는 해당 Workflow가 배포된 모든 device에서 실행되기 시작합니다.

이제 완성된 Workflow가 준비되었으니, 테스트할 차례입니다.
