> 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/hi/build/build-a-workflow.md).

# एक वर्कफ़्लो बनाएं

एक वर्कफ़्लो ब्लॉकों से बना होता है, जो विशिष्ट कार्य करते हैं, जैसे मॉडल इन्फ़ेरेंस चलाना, लॉजिक निष्पादित करना, या बाहरी सेवाओं के साथ इंटरफ़ेस करना।

उपलब्ध ब्लॉकों की सूची पर अधिक जानकारी के लिए, देखें हमारा [ब्लॉक दस्तावेज़ीकरण](/workflows/hi/blocks/blocks.md).

### अवलोकन

यह मार्गदर्शिका एक चार-ब्लॉक वर्कफ़्लो बनाने पर जाएगी, जिसमें ऑब्जेक्ट डिटेक्शन मॉडल चलाना, प्रेडिक्शनों की गिनती करना, और मॉडल परिणामों को विज़ुअलाइज़ करना शामिल है। यहाँ है [अंतिम वर्कफ़्लो टेम्पलेट](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/0c3670289f4c7f819205eb9dcf8d7c828c3a48ae" alt="" width="563"><figcaption><p>डिटेक्ट, काउंट, और विज़ुअलाइज़ वर्कफ़्लो</p></figcaption></figure>

### ब्लॉक कनेक्शन

निर्माण शुरू करने से पहले, यह समझना महत्वपूर्ण है कि ब्लॉक कनेक्शन कैसे काम करते हैं।

किसी स्थान पर ब्लॉक जोड़ने के लिए, उसे पिछले ब्लॉक को इनपुट के रूप में उपयोग करना होता है। उदाहरण के लिए, ऊपर दिखाए गए वर्कफ़्लो में, *गुण परिभाषा* ब्लॉक आता है *ऑब्जेक्ट डिटेक्शन* ब्लॉक के बाद, क्योंकि यह मॉडल ब्लॉक को इनपुट के रूप में उपयोग करता है। *बाउंडिंग बॉक्स विज़ुअलाइज़ेशन* ब्लॉक दाईं ओर है, क्योंकि यह आउटपुट का उपयोग नहीं करता *गुण परिभाषा* ब्लॉक का, लेकिन मॉडल आउटपुट का संदर्भ देता है।

<figure><img src="/files/2cab63a6dcc4cc6384fc835815405fe80dd18249" alt=""><figcaption><p>मॉडल तुलना वर्कफ़्लो</p></figcaption></figure>

ऊपर दिए गए उदाहरण वर्कफ़्लो में, हमारे पास चार अलग-अलग पथ हैं, क्योंकि प्रत्येक शाखा रनटाइम पर समानांतर रूप से निष्पादित होती है, और इनपुट के रूप में दूसरी शाखा के ब्लॉकों पर निर्भर नहीं करती।

### बिल्डर असिस्ट

बिल्डर असिस्ट नियंत्रित करता है कि ब्लॉकों को जोड़ते और सम्मिलित करते समय वर्कफ़्लो संपादक आपको कितनी सहायता देता है। आप ऊपर-दाएँ नेवबार में टॉगल का उपयोग करके मोडों के बीच बदल सकते हैं।

तीन मोड हैं:

* **ऑटो** (डिफ़ॉल्ट): जब ब्लॉक जोड़े या सम्मिलित किए जाते हैं, तो संगत इनपुट और आउटपुट फ़ील्ड्स को स्वतः जोड़ता है। जब आप ब्लॉक हटाते या डिस्कनेक्ट करते हैं, तो बिल्डर डाउनस्ट्रीम संदर्भों को भी ठीक करता है।
* **क्विक**: सुझाए गए कनेक्शन और ब्लॉक अनुशंसाएँ दिखाता है, लेकिन उन्हें केवल तब लागू करता है जब आप स्पष्ट रूप से स्वीकार करते हैं। यदि आप चाहते हैं कि बिल्डर आपकी ओर से बदलाव न करे, लेकिन मार्गदर्शन मिले, तो यह उपयोगी है।
* **मैनुअल**: कोई सुझाव नहीं और कोई स्वचालित वायरिंग नहीं। हर कनेक्शन आप स्वयं नियंत्रित करते हैं।

आपका चयनित मोड स्थानीय रूप से सहेजा जाता है, इसलिए यह सत्रों के बीच बना रहता है।

### ब्लॉकों को व्यवस्थित करना

वर्कफ़्लो संपादक आपके ब्लॉकों को आपके लिए स्थान दे सकता है। वर्तमान ब्लॉकों को व्यवस्थित करने और उन्हें दृश्य में फ़िट करने के लिए ऑटो लेआउट बटन (संपादक टूलबार में साइटमैप आइकन) पर क्लिक करें।

बटन के पास का चेवरॉन दो विकल्पों वाला एक मेनू खोलता है:

* "अभी व्यवस्थित करें": लेआउट को एक बार चलाता है, ठीक बटन पर क्लिक करने जैसा।
* "स्वचालित रूप से व्यवस्थित करें": जब यह चालू हो, तो संपादक हर बार जब आप एक ब्लॉक जोड़ते हैं या कोई कनेक्शन बदलते हैं, ब्लॉकों को फिर से व्यवस्थित करता है। किसी ब्लॉक को खींचने पर यह मोड रुक जाता है, ताकि हाथ से बनाया गया लेआउट सुरक्षित रहे।

आपकी पसंद प्रत्येक वर्कफ़्लो के लिए स्थानीय रूप से सहेजी जाती है।

### वर्कफ़्लो बनाना

#### ऑब्जेक्ट डिटेक्शन मॉडल

सबसे पहले, एक जोड़ें *ऑब्जेक्ट डिटेक्शन मॉडल* ब्लॉक। आप एक सार्वजनिक पूर्व-प्रशिक्षित मॉडल चुन सकते हैं, जैसे YOLOv8n जो पर प्रशिक्षित है [COCO](https://universe.roboflow.com/microsoft/coco), या अपने वर्कस्पेस में एक फ़ाइन-ट्यून किया गया मॉडल। मैं पूर्व-प्रशिक्षित *yolov8n* मॉडल के साथ लोगों और वाहनों का पता लगाऊँगा।

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

ऑब्जेक्ट डिटेक्शन ब्लॉक में एक आवश्यक image पैरामीटर होता है, जो यह निर्धारित करता है कि मॉडल किस पर इन्फ़रेंस कर रहा है। कई वैकल्पिक पैरामीटर भी होते हैं, जिनमें मुख्य पैरामीटर नीचे विस्तार से बताए गए हैं:

* क्लास फ़िल्टर: उन क्लासों की सूची जिन्हें मॉडल वापस करेगा। नोट: मॉडल हमेशा केवल उन्हीं क्लासों को लौटाएगा जिन पर उसे प्रशिक्षित किया गया है; इससे आप अनावश्यक क्लासों को फ़िल्टर कर सकते हैं।
* विश्वास: इस विश्वास स्तर से नीचे वाले ऑब्जेक्ट वापस नहीं किए जाएँगे।
* 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>

के लिए *डेटा* प्रॉपर्टी, मॉडल प्रेडिक्शनों का संदर्भ दें। के लिए *ऑपरेशन्स*, Count Items चुनें। यह कॉन्फ़िगरेशन ऑब्जेक्ट डिटेक्शन मॉडल द्वारा किए गए प्रेडिक्शनों की संख्या लौटाएगा।

#### बाउंडिंग बॉक्स विज़ुअलाइज़ेशन

मॉडल परिणामों को विज़ुअलाइज़ करने के लिए एक बाउंडिंग बॉक्स विज़ुअलाइज़ेशन ब्लॉक जोड़ें। के लिए *छवि* पैरामीटर, इनपुट इमेज चुनें। प्रेडिक्शनों के लिए, मॉडल परिणाम चुनें। आप वैकल्पिक कॉन्फ़िगरेशन गुणों का उपयोग करके बाउंडिंग बॉक्स का रंग और आकार वैकल्पिक रूप से बदल सकते हैं।

<figure><img src="/files/16455f07f0f280a17222a64e73b2ded3f23703b2" alt="" width="342"><figcaption></figcaption></figure>

#### लेबल विज़ुअलाइज़ेशन

बाउंडिंग बॉक्स बनाने के अलावा, हम प्रेडिक्शनों के क्लास नाम भी प्रदर्शित करना चाहेंगे। ऐसा करने के लिए, एक जोड़ें *लेबल विज़ुअलाइज़ेशन* ब्लॉक बाउंडिंग बॉक्स विज़ुअलाइज़ेशन के बाद। एक ही इमेज पर बाउंडिंग बॉक्स और लेबल दोनों बनाने के लिए, आप संदर्भ इनपुट इमेज को के रूप में सेट करना चाहेंगे *bounding\_box\_visualization* इमेज, इनपुट इमेज का संदर्भ देने के बजाय। इससे लेबल बाउंडिंग बॉक्स के ऊपर खींचे जाएँगे।

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

आप वैकल्पिक *टेक्स्ट* पैरामीटर बदलकर प्रदर्शित टेक्स्ट को क्लास नाम से विश्वास, या क्लास नाम और विश्वास में बदल सकते हैं।

### परिवर्तन सहेजना

"Save" पर क्लिक करके अपने परिवर्तनों को ड्राफ्ट के रूप में सहेजें। वर्कफ़्लो संपादक संपादन करते समय स्वचालित रूप से सहेजता नहीं है।

अपने परिवर्तनों को लाइव करने के लिए, वर्कफ़्लो प्रकाशित करें। यदि आपने वर्कफ़्लो को डिप्लॉय किया है, तो आपका प्रकाशित संस्करण उन सभी डिवाइसों पर चलना शुरू हो जाएगा जहाँ वर्कफ़्लो डिप्लॉय किया गया है।

अब जब आपके पास एक पूर्ण वर्कफ़्लो है, इसे परखने का समय है।

### उदाहरण: दो-चरणीय वर्कफ़्लो

जब आप एकल-मॉडल वर्कफ़्लो के साथ सहज हो जाएँ, तो अगला सामान्य पैटर्न पहले के आउटपुट पर दूसरा मॉडल जोड़ना होता है। यह उदाहरण कुत्तों का पता लगाता है, प्रत्येक डिटेक्शन को क्रॉप करता है, प्रत्येक क्रॉप की नस्ल वर्गीकृत करता है, और फिर नस्ल को मूल बाउंडिंग बॉक्सों पर वापस लिखता है।

1. **ऑब्जेक्ट डिटेक्शन मॉडल** - ब्लॉक जोड़ें और चुनें `rfdetr-small` मॉडल।
2. **गतिशील क्रॉप** - पहले मॉडल द्वारा पाए गए ऑब्जेक्ट्स को क्रॉप करें। इसकी *इमेज* प्रॉपर्टी को वर्कफ़्लो इनपुट इमेज पर और इसकी *प्रेडिक्शंस* प्रॉपर्टी को डिटेक्शन मॉडल के प्रेडिक्शंस पर सेट करें।
3. **वर्गीकरण मॉडल** - प्रत्येक क्रॉप पर चलाएँ। Roboflow Universe मॉडल का उपयोग करें `dog-breed-xpaq6/1` और ब्लॉक की *इमेज* प्रॉपर्टी को `क्रॉप्स` Dynamic Crop ब्लॉक के आउटपुट पर सेट करें।
4. **डिटेक्शन्स क्लासेस प्रतिस्थापन** - प्रत्येक क्रॉप की अनुमानित क्लास को उसके बाउंडिंग बॉक्स पर वापस असाइन करें। यह ऑब्जेक्ट डिटेक्शन प्रेडिक्शंस का एक संदर्भ और वर्गीकरण परिणामों का एक संदर्भ लेता है।
5. **बाउंडिंग बॉक्स विज़ुअलाइज़ेशन** फिर **लेबल विज़ुअलाइज़ेशन** - दोनों को चेन करें, जिसमें पहला पढ़ता है `$inputs.image` और दूसरा पहले की आउटपुट इमेज पढ़ता है। दोनों Detections Classes Replacement चरण के प्रेडिक्शंस का संदर्भ देते हैं।
6. **आउटपुट्स** - बदली हुई क्लास वाले डिटेक्शंस और अंतिम विज़ुअलाइज़ेशन चुनें।

<figure><img src="https://media.roboflow.com/inference/workflow_visualisation_result.png" alt="Dog breed classification result"><figcaption><p>दो-चरणीय वर्कफ़्लो का परिणाम</p></figcaption></figure>

क्योंकि क्रॉप्स इनपुट इमेजों से एक स्तर गहरे होते हैं, इसलिए वर्गीकरण परिणाम प्रत्येक इमेज के परिणामों के अंदर नेस्टेड होते हैं। देखें [वर्कफ़्लो निष्पादन](/workflows/hi/developer-guide/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 के सिंटैक्स को सीखने के लिए, देखें [वर्कफ़्लो परिभाषा वाक्यविन्यास](/workflows/hi/developer-guide/developer-guide/definitions.md).
