> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/workflows/ja/birudo/build-a-workflow.md).

# Workflowを構築する

ワークフローはブロックで構成されており、モデル推論の実行、ロジックの処理、外部サービスとの連携など、特定のタスクを実行します。

利用可能なブロック一覧の詳細については、こちらをご覧ください [ブロックのドキュメント](/workflows/ja/burokku/blocks.md).

### 概要

このガイドでは、4つのブロックからなるワークフローを作成して、物体検出モデルを実行し、予測数を数え、モデル結果を可視化する方法を説明します。こちらが [完成版ワークフローテンプレート](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/fbdf876ec755e12abd71161cddd842210bb6c34b" alt="" width="563"><figcaption><p>検出・カウント・可視化ワークフロー</p></figcaption></figure>

### ブロック接続

作成を始める前に、ブロック接続の仕組みを理解しておくことが重要です。

特定の場所にブロックを追加するには、前のブロックを入力として使用する必要があります。たとえば、上に示したワークフローでは、 *プロパティ定義* ブロックは次の *物体検出* ブロックは、モデルブロックを入力として使用するためです。 *バウンディングボックスの可視化* ブロックは右側にあります。これは、次の出力を使用しないためです。 *プロパティ定義* ブロックの出力は使用しませんが、モデルの出力は参照します。

<figure><img src="/files/fb5ae92bfc6206176d6c6f1d8bf7b7707494c960" alt=""><figcaption><p>モデル比較ワークフロー</p></figcaption></figure>

上の例のワークフローには、4つの異なる経路があります。各ブランチは実行時に並列に実行され、他のブランチのブロックを入力として利用しないためです。

### Builder Assist

Builder Assist は、ブロックの接続や挿入時にワークフローエディタがどの程度サポートするかを制御します。右上のナビバーにあるトグルでモードを切り替えられます。

モードは3つあります：

* **自動** (デフォルト): ブロックの接続または挿入時に、互換性のある入力フィールドと出力フィールドを自動で配線します。ブロックを削除または切断したときには、ビルダーが下流の参照も修復します。
* **クイック**：推奨される接続とブロックの提案を表示しますが、明示的に承認した場合のみ適用されます。ビルダーに変更を任せずにガイダンスが欲しい場合に便利です。
* **手動**：提案も自動配線もありません。すべての接続を自分で管理します。

選択したモードはローカルに保存されるため、セッションをまたいで保持されます。

### ブロックの配置

ワークフローエディタはブロックを自動配置できます。自動レイアウトボタン（エディタツールバーのサイトマップアイコン）をクリックすると、現在のブロックを整理して画面内に収まるように配置します。

ボタン横のシェブロンをクリックすると、2つのオプションを含むメニューが開きます：

* 「今すぐ配置」：ボタンをクリックした場合と同じように、レイアウトを1回実行します。
* 「自動的に配置」：オンにすると、ブロックを追加したり接続を変更したりするたびに、エディタがブロックを再配置します。ブロックをドラッグするとこのモードは一時停止され、手動で配置したレイアウトが保持されます。

選択内容はワークフローごとにローカルに保存されます。

### ワークフローの作成

#### 物体検出モデル

まず、 *物体検出モデル* ブロックを追加します。公開済みの事前学習済みモデル、たとえば [COCO](https://universe.roboflow.com/microsoft/coco)で学習されたYOLOv8nのようなものか、ワークスペース内のファインチューニング済みモデルを選べます。ここでは事前学習済みの *yolov8n* モデルを使って、人と車両を検出します。

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

物体検出ブロックには、モデルが何に対して推論を行うかを決める必須の画像パラメータがあります。いくつかのオプションパラメータがあり、主要なものは以下で詳しく説明します：

* クラスフィルター：モデルが返すクラスの一覧です。注意：モデルは常に学習済みのクラスのみを返します。これにより不要なクラスを除外できます。
* 信頼度：その信頼度未満のオブジェクトは返されません。
* IoUしきい値：しきい値が高いほど、重なりのある予測がより多く返されます。0.9は90%以下の重なりを持つオブジェクトが返され、0.1は10%以上重なるオブジェクトが含まれないことを意味します。
* 最大検出数：モデルが返すオブジェクトの最大数
* クラス非依存NMS：重なりのフィルタリングで、同じクラスのオブジェクトのみを比較・除外するか、すべてのクラスを対象にするか

#### プロパティ定義

プロパティ定義ブロックを使うと、画像サイズ、予測クラス、検出オブジェクト数など、データから関連情報を抽出できます。この例では、物体検出モデルで見つかったオブジェクト数を数えます。

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

「 *データ* 」プロパティでは、モデルの予測を参照します。次の *「操作*」を選択します。この構成では、物体検出モデルが行った予測数が返されます。

#### バウンディングボックスの可視化

モデル結果を可視化するために、バウンディングボックス可視化ブロックを追加します。 *image* パラメータでは入力画像を選択します。予測にはモデル結果を選択します。オプションの設定プロパティを使って、バウンディングボックスの色やサイズを変更することもできます。

<figure><img src="/files/9bb4d718387bc897bdee24165b0e858c16c7063e" alt="" width="342"><figcaption></figcaption></figure>

#### Label Visualization

バウンディングボックスを描画するだけでなく、予測のクラス名も表示したいので、 *Label Visualization* ブロックをバウンディングボックス可視化の後に追加します。バウンディングボックスとラベルの両方を同じ画像に描画するには、参照入力画像を *bounding\_box\_visualization* 画像に設定し、入力画像を参照しないようにします。これにより、ラベルがバウンディングボックスの上に描画されます。

<figure><img src="/files/6f2455a1543daac25d98ab2c7e019d0b3cf458da" alt="" width="343"><figcaption></figcaption></figure>

オプションの *テキスト* パラメータを変更すると、表示テキストをクラス名、信頼度、またはクラス名と信頼度に切り替えられます。

### 変更を保存

「保存」をクリックすると、変更が下書きとして保存されます。ワークフローエディタは編集中に自動保存しません。

変更を本番反映するには、ワークフローを公開します。ワークフローをデプロイしている場合、公開版はワークフローがデプロイされているすべてのデバイスで実行を開始します。

完成したワークフローができたので、テストしてみましょう。

### 例：2段階のワークフロー

単一モデルのワークフローに慣れたら、次によくあるパターンは、最初のモデルの出力に2つ目のモデルを連結する方法です。この例では、犬を検出し、各検出を切り出して、それぞれの切り出し画像で犬種を分類し、その犬種を元のバウンディングボックスに書き戻します。

1. **物体検出モデル** - ブロックを追加して `rfdetr-small` モデルを選択します。
2. **動的クロップ** - 1つ目のモデルで見つかったオブジェクトを切り出します。その *画像* プロパティをワークフロー入力画像に、 *予測* プロパティを検出モデルの予測に設定します。
3. **分類モデル** - 各切り出し画像で実行します。Roboflow Universeモデル `dog-breed-xpaq6/1` を使用し、ブロックの *画像* プロパティを `クロップ` Dynamic Crop ブロックの出力に設定します。
4. **検出クラスの置換** - 各切り出し画像の予測クラスを、それぞれのバウンディングボックスに割り当てます。物体検出の予測と分類結果への参照を使用します。
5. **バウンディングボックスの可視化** その後 **Label Visualization** - 2つを連結し、最初のブロックは `$inputs.image` 、2つ目のブロックは最初のブロックの出力画像を読み取ります。両方とも Detections Classes Replacement ステップの予測を参照します。
6. **出力** - 置換後クラスの検出結果と最終ビジュアライゼーションを選択します。

<figure><img src="https://media.roboflow.com/inference/workflow_visualisation_result.png" alt="Dog breed classification result"><figcaption><p>2段階ワークフローの結果</p></figcaption></figure>

切り出し画像は入力画像より1階層深い位置にあるため、分類結果は各画像の結果の内側にネストされます。 [ワークフロー実行](/workflows/ja/gaido/developer-guide/workflow-execution.md) このネストの仕組みをご覧ください。

<details>

<summary>この例のワークフロー定義</summary>

これをエディタに貼り付けると、ワークフローを再現できます。

```json
{
  "version": "1.0",
  "inputs": [
    {
      "type": "InferenceImage",
      "name": "image"
    }
  ],
  "steps": [
    {
      "type": "roboflow_core/roboflow_object_detection_model@v1",
      "name": "model",
      "images": "$inputs.image",
      "model_id": "rfdetr-small"
    },
    {
      "type": "roboflow_core/dynamic_crop@v1",
      "name": "dynamic_crop",
      "images": "$inputs.image",
      "predictions": "$steps.model.predictions"
    },
    {
      "type": "roboflow_core/roboflow_classification_model@v1",
      "name": "model_1",
      "images": "$steps.dynamic_crop.crops",
      "model_id": "dog-breed-xpaq6/1"
    },
    {
      "type": "roboflow_core/detections_classes_replacement@v1",
      "name": "detections_classes_replacement",
      "object_detection_predictions": "$steps.model.predictions",
      "classification_predictions": "$steps.model_1.predictions"
    },
    {
      "type": "roboflow_core/bounding_box_visualization@v1",
      "name": "bounding_box_visualization",
      "predictions": "$steps.detections_classes_replacement.predictions",
      "image": "$inputs.image"
    },
    {
      "type": "roboflow_core/label_visualization@v1",
      "name": "label_visualization",
      "predictions": "$steps.detections_classes_replacement.predictions",
      "image": "$steps.bounding_box_visualization.image"
    }
  ],
  "outputs": [
    {
      "type": "JsonField",
      "name": "detections",
      "coordinates_system": "own",
      "selector": "$steps.detections_classes_replacement.predictions"
    },
    {
      "type": "JsonField",
      "name": "visualisation",
      "coordinates_system": "own",
      "selector": "$steps.label_visualization.image"
    }
  ]
}
```

</details>

上記JSONの構文については、こちらをご覧ください [Workflow Definitionの構文](/workflows/ja/gaido/developer-guide/definitions.md).
