# Workflow 만들기

Workflow는 특정 작업을 수행하는 block들로 구성되며, 예를 들어 model inference 실행, logic 수행, 또는 external services와의 인터페이스 등이 있습니다.

사용 가능한 block 목록에 대해 더 자세히 알아보려면, 다음을 확인하세요. [block documentation](https://inference.roboflow.com/workflows/blocks/).

### 개요

이 가이드에서는 object detection model을 실행하고, prediction을 count하고, model 결과를 시각화하는 4개의 block으로 이루어진 Workflow를 만드는 과정을 살펴봅니다. 다음은 [최종 Workflow template](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="/files/6b3496c93fb1d0d890f588c6f9dc5994d63b1a8f" alt="" width="563"><figcaption><p>감지, 개수 집계 및 시각화 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 output을 참조하기 때문입니다.

<figure><img src="/files/618a0107cc7cc3febb5dd791c9bf90bce51a6820" alt=""><figcaption><p>Model Comparison Workflow</p></figcaption></figure>

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

### Builder Assist

Builder Assist는 block을 연결하고 삽입할 때 Workflow editor가 얼마나 많은 도움을 제공할지 제어합니다. 오른쪽 상단 navbar의 toggle을 사용해 모드를 전환할 수 있습니다.

세 가지 모드가 있습니다:

* **Auto** (기본값): block이 연결되거나 삽입될 때 호환되는 입력 및 출력 필드를 자동으로 연결합니다. 또한 block을 제거하거나 연결을 끊으면 builder가 downstream reference를 복구합니다.
* **Quick**: 제안된 연결과 block 추천을 표시하지만, 명시적으로 수락할 때만 적용합니다. builder가 대신 변경을 수행하지 않으면서 안내를 받고 싶을 때 유용합니다.
* **Manual**: 제안도 없고 자동 연결도 없습니다. 모든 연결을 직접 제어합니다.

선택한 모드는 로컬에 저장되므로 세션이 바뀌어도 유지됩니다.

### Workflow 구축하기

#### Object Detection Model

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

<figure><img src="/files/cfed15731e4108ea6a3fc3b7fa8e11c2a904bee9" alt="" width="344"><figcaption></figcaption></figure>

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

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

#### Property Definition

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

<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에는 입력 이미지를 선택합니다. prediction에는 model 결과를 선택합니다. 선택적으로 optional configuration property를 사용해 bounding box의 색상과 크기를 변경할 수 있습니다.

<figure><img src="/files/058027ee5493882179a7636b1d06c8302e187d4e" alt="" width="342"><figcaption></figcaption></figure>

#### Label Visualization

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

<figure><img src="/files/92eab617a18fb9fb4b7b55a34c66580c4333bba2" alt="" width="343"><figcaption></figcaption></figure>

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

### 변경 사항 저장

Workflow editor는 변경 사항을 draft로 자동 저장합니다. 편집하는 동안 수동으로 저장할 필요는 없습니다.

변경 사항을 실제로 적용하려면 Workflow를 publish하세요. Workflow를 이미 배포했다면, publish된 버전이 Workflow가 배포된 모든 device에서 실행되기 시작합니다.

이제 완성된 Workflow가 있으니, 테스트할 차례입니다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.roboflow.com/roboflow/roboflow-ko/workflows/build-a-workflow.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
