মূল কনটেন্টে যান
এআই টিউটোরিয়াল

MOSS-Image দিয়ে টেক্সটসমৃদ্ধ ছবি ও নিয়ন্ত্রিত লেআউট তৈরি করুন

এই টিউটোরিয়ালে MOSS-Image সেটআপ, এর Base ও SFT মডেলের মধ্যে নির্বাচন, Python বা Gradio-এর মাধ্যমে ছবি তৈরি এবং কাঠামোবদ্ধ লেআউট প্রম্পট ব্যবহার করে টেক্সট ও অবজেক্টের অবস্থান নির্ধারণের পদ্ধতি ব্যাখ্যা করা হয়েছে। এতে প্রস্তাবিত স্যাম্পলিং সেটিংস, মেমোরি মোড, ComfyUI সমর্থন এবং প্রম্পট উন্নত করার সরঞ্জামও রয়েছে।

MOSS-Image দিয়ে টেক্সটসমৃদ্ধ ছবি ও নিয়ন্ত্রিত লেআউট তৈরি

MOSS-Image কী?

MOSS-Image হলো OpenMOSS Team-এর একটি উন্মুক্ত ইমেজ-জেনারেশন প্রকল্প। এতে একটি বেস টেক্সট-টু-ইমেজ মডেল এবং একটি সুপারভাইজড ফাইন-টিউনড মডেল, পাশাপাশি একটি কাস্টম Diffusers পাইপলাইন, Gradio ইন্টারফেস, নেটিভ ComfyUI প্লাগইন এবং বিস্তারিত প্রম্পট প্রস্তুতের টুল রয়েছে।

MOSS-Image Base ও SFT-এর উদাহরণ

প্রকল্পটি এমন কম্পোজিশনের জন্য তৈরি, যেখানে ভিজ্যুয়াল উপাদানের সঙ্গে পাঠযোগ্য টেক্সট থাকে। এটি সর্বোচ্চ 4K টোকেনের প্রম্পট সমর্থন করে এবং অ্যানিমে থেকে ফটোরিয়ালিস্টিক ছবি পর্যন্ত বিভিন্ন স্টাইল তৈরি করতে পারে। এর 5B ব্যাকবোন তুলনামূলকভাবে কমপ্যাক্ট ও দক্ষ ইমেজ জেনারেশনের জন্য তৈরি।

প্রধান বৈশিষ্ট্য

  • লেআউট নিয়ন্ত্রণ: কাঠামোবদ্ধ JSON ইনপুট ও বাউন্ডিং বক্স ব্যবহার করে টেক্সট এবং ভিজ্যুয়াল উপাদান স্থাপন করুন।
  • টেক্সট রেন্ডারিং: পোস্টার, নোট, হোয়াইটবোর্ড এবং অন্যান্য ইমেজ কম্পোজিশনের ভেতরে স্পষ্ট টেক্সট তৈরি করুন।
  • দীর্ঘ প্রম্পট: সর্বোচ্চ 4K টোকেনের টেক্সট প্রম্পট জমা দিন।
  • বিভিন্ন স্টাইল: অ্যানিমে-স্টাইল ও ফটোরিয়ালিস্টিক ছবি তৈরি করুন।
  • ফাইন-টিউনিং সমর্থন: কাস্টম কাজ ও ডোমেইনের জন্য বেস মডেলকে মানিয়ে নিন।
  • দক্ষ আর্কিটেকচার: 5B ব্যাকবোন ব্যবহার করে ছবি তৈরি করুন।
  • বিভিন্ন ইন্টারফেস: Python, Gradio, ComfyUI অথবা আলাদা prompt-enhancer skill ব্যবহার করুন।

একটি মডেল বেছে নিন

MOSS-Image দুটি ভ্যারিয়েন্টে পাওয়া যায়:

  • MOSS-Image-Base: বেস টেক্সট-টু-ইমেজ মডেল। এর ওজন Hugging Face ও ModelScope-এ পাওয়া যায়।
  • MOSS-Image-SFT: কিউরেট করা ডেটার ওপর বেস মডেল থেকে ফাইন-টিউন করা সংস্করণ। এর ওজন Hugging Face ও ModelScope-এ পাওয়া যায়।

প্রকল্পের দেওয়া তুলনায় SFT মডেলটি আরও স্পষ্ট টেক্সট বিন্যাস এবং বেশি গোছানো হোয়াইটবোর্ড লেআউট তৈরি করে। মূল সাধারণ-উদ্দেশ্যের চেকপয়েন্ট দরকার হলে বা ফাইন-টিউন করার পরিকল্পনা থাকলে Base মডেল দিয়ে শুরু করুন। কাঠামোবদ্ধ টেক্সট উপস্থাপন বিশেষভাবে গুরুত্বপূর্ণ হলে SFT বিবেচনা করুন।

MOSS-Image Base-এর আউটপুট MOSS-Image SFT-এর আউটপুট

MOSS-Image ইনস্টল করুন

রিপোজিটরি ক্লোন করুন, এর ডিরেক্টরিতে প্রবেশ করুন, একটি ভার্চুয়াল এনভায়রনমেন্ট তৈরি ও সক্রিয় করুন এবং প্রয়োজনীয় প্যাকেজ ইনস্টল করুন:

git clone https://github.com/OpenMOSS/MOSS-Image.git
cd MOSS-Image
python -m venv .venv
source .venv/bin/activate

pip install -r requirements.txt

উদাহরণগুলোতে CUDA ব্যবহার করা হয়েছে এবং pipe.to("cuda") দিয়ে পাইপলাইনকে GPU-তে পাঠানো হয়েছে। যে GPU প্ল্যাটফর্মে ইনফারেন্স চালানোর পরিকল্পনা করছেন, তার জন্য আপনার PyTorch এনভায়রনমেন্ট কনফিগার করা আছে কি না নিশ্চিত করুন।

Python দিয়ে একটি ছবি তৈরি করুন

MOSS-Image তার কাস্টম পাইপলাইন ব্যবহার করে Diffusers-এর মাধ্যমে লোড হয়। নিচের উদাহরণে মডেলকে হাতে লেখা চীনা রিমাইন্ডারসহ একটি রান্নাঘরের দৃশ্য তৈরি করতে বলা হয়েছে:

import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "OpenMOSS-Team/MOSS-Image-Base",
    custom_pipeline="pipeline_moss_image",
    trust_remote_code=True,
    torch_dtype={"default": torch.bfloat16, "vae": torch.float32},
)
pipe.scheduler = type(pipe.scheduler).from_config(pipe.scheduler.config)
pipe.to("cuda")

prompt = (
    "A wide view of a refrigerator beside a kitchen counter with a fruit bowl. "
    "A small sticky note on the refrigerator door is handwritten in Chinese:“\n"
    "记得买牛奶和鸡蛋!\n牛奶两盒,鸡蛋一打。\n顺便带一袋面包。”"
)

image = pipe(
    prompt,
    height=1456,
    width=1456,
    num_inference_steps=50,
    guidance_scale=3.0,
    uncond_skip_layers=[22],
    generator=torch.Generator("cpu").manual_seed(42),
).images[0]

image.save("refrigerator_note.png")

গুরুত্বপূর্ণ আর্গুমেন্টগুলো বুঝুন

  • custom_pipeline="pipeline_moss_image" MOSS-Image পাইপলাইন নির্বাচন করে।
  • trust_remote_code=True Diffusers-কে মডেলের কাস্টম পাইপলাইন ইমপ্লিমেন্টেশন লোড করার অনুমতি দেয়।
  • torch_dtype ডিফল্টভাবে bfloat16 ব্যবহার করে এবং VAE-এর জন্য float32 বজায় রাখে।
  • height ও width আউটপুটের মাত্রা নির্ধারণ করে।
  • num_inference_steps=50 প্রকল্পের ডিফল্ট স্যাম্পলিং সুপারিশ অনুসরণ করে।
  • guidance_scale=3.0 সুপারিশকৃত classifier-free guidance মান প্রয়োগ করে।
  • uncond_skip_layers=[22] 22 নম্বর লেয়ারে negative-branch layer skipping সক্রিয় করে।
  • manual_seed(42) একই কনফিগারেশনে পুনরাবৃত্ত রানকে আরও পুনরুৎপাদনযোগ্য করে।

Gradio ইন্টারফেস চালান

ঐচ্ছিক ইউজার-ইন্টারফেস নির্ভরতা ইনস্টল করুন এবং অন্তর্ভুক্ত অ্যাপ্লিকেশন চালু করুন:

pip install -e '.[ui]'
python gradio_app.py --model OpenMOSS-Team/MOSS-Image-Base

Gradio প্রদর্শিত স্থানীয় ঠিকানাটি খুলুন, একটি ইতিবাচক প্রম্পট লিখুন, ছবির মাত্রা নির্বাচন করুন এবং জেনারেশন শুরু করুন। পরিবর্তে ফাইন-টিউনড চেকপয়েন্ট পরীক্ষা করতে মডেল আর্গুমেন্টটি OpenMOSS-Team/MOSS-Image-SFT দিয়ে বদলে দিন।

সুপারিশকৃত স্যাম্পলিং সেটিংস

  • স্যাম্পলার: Flow-matching Euler
  • ধাপ: 50
  • CFG: 3
  • Shift: 5
  • লেয়ার স্কিপিং: 22 নম্বর লেয়ারে negative-branch skipping
  • Python API negative prompt: খালি

এগুলো প্রকল্পে নথিভুক্ত ডিফল্ট এবং ব্যবহারিক শুরুর ভিত্তি হিসেবে কাজ করে। অতিরিক্ত প্রম্পট ও স্যাম্পলিংয়ের সুপারিশের জন্য রিপোজিটরির ইংরেজি ব্যবহারকারী নির্দেশিকা দেখুন।

JSON লেআউট দিয়ে কম্পোজিশন নিয়ন্ত্রণ করুন

সাধারণ প্রম্পট একটি ছবিতে কী থাকা উচিত তা বর্ণনা করে, কিন্তু প্রতিটি উপাদান ঠিক কোথায় থাকবে তা নির্দিষ্ট করে না। এর পরিবর্তে MOSS-Image এমন একটি JSON লেআউট গ্রহণ করতে পারে, যেখানে পুরো দৃশ্য, পৃথক টেক্সট বা অবজেক্ট উপাদান এবং তাদের বাউন্ডিং বক্স বর্ণনা করা থাকে।

অবস্থান নির্ধারিত ছবির উপাদানগুলোর লেআউট বাউন্ডিং বক্স

নিচের লেআউটটি ১০২৪ বাই ১০২৪ আকারের একটি মিনিমালিস্ট ট্রাভেল পোস্টার বর্ণনা করে। Python থেকে লোড করতে চাইলে এটি layout.json নামে সংরক্ষণ করুন, অথবা সরাসরি Gradio-এর Prompt ক্ষেত্রে পেস্ট করুন।

{
  "summary": {
    "meta": ["poster"],
    "canvas": "single",
    "caption": "ক্রিম রঙের পটভূমি, নীল পাহাড়ের ইলাস্ট্রেশন এবং উপরে EXPLORE শিরোনামসহ একটি মিনিমালিস্ট ট্রাভেল পোস্টার।"
  },
  "items": [
    {
      "label": "text",
      "caption": "উপরে কেন্দ্রে থাকা বড় গাঢ়-নীল বড় হাতের শিরোনাম।",
      "text": "EXPLORE",
      "bbox": [-416, -384, -288, 384]
    },
    {
      "label": "object",
      "caption": "নিচের কেন্দ্রভাগে থাকা সমতল নীল পাহাড়ের ইলাস্ট্রেশন।",
      "bbox": [-192, -288, 384, 288]
    }
  ],
  "bbox_coord_space": "abs_centralized",
  "bbox_format": "yxyx"
}

লেআউট ফরম্যাট কীভাবে কাজ করে

  • summary.caption পুরো দৃশ্য এবং এর ভিজ্যুয়াল স্টাইল বর্ণনা করে।
  • items-এ স্বাধীনভাবে অবস্থান নির্ধারণ করা টেক্সট ও অবজেক্ট উপাদান থাকে।
  • label কোনো আইটেমকে টেক্সট বা অবজেক্ট হিসেবে শনাক্ত করে।
  • caption আইটেমটির উপস্থিতি ও ভূমিকা বর্ণনা করে।
  • text-এ টেক্সট আইটেমে রেন্ডার করার নির্দিষ্ট শব্দগুলো থাকে।
  • bbox উপাদানটির অবস্থান ও বিস্তৃতি নির্ধারণ করে।
  • bbox_format: "yxyx" মানে প্রতিটি বক্সের ক্রম [y_min, x_min, y_max, x_max]।
  • bbox_coord_space: "abs_centralized" মানে ক্যানভাসের কেন্দ্র থেকে স্থানাঙ্ক পরিমাপ করা হয়।

১০২৪ বাই ১০২৪ ক্যানভাসে উভয় অক্ষের পরিসর -৫১২ থেকে +৫১২। x স্থানাঙ্ক ডানদিকে বাড়ে, আর y স্থানাঙ্ক নিচের দিকে বাড়ে। সাধারণ ক্যানভাস স্থানাঙ্কে রূপান্তর করতে x মান থেকে ক্যানভাসের অর্ধেক প্রস্থ এবং y মান থেকে ক্যানভাসের অর্ধেক উচ্চতা বিয়োগ করুন।

লেআউট প্রস্তুতের সময় ব্যবহৃত মাত্রার সঙ্গে মিল রেখে জেনারেশনের মাত্রা নির্ধারণ করুন। মাত্রার অমিল স্থানাঙ্ক ব্যবস্থা বদলে দেয় এবং উপাদানগুলোকে নির্ধারিত অবস্থান থেকে সরিয়ে দিতে পারে।

Python-এর মাধ্যমে লেআউট জমা দিন

JSON ফাইল লোড করে সেটিকে একটি স্ট্রিং হিসেবে সিরিয়ালাইজ করুন, তারপর সেই স্ট্রিংটি পাইপলাইন প্রম্পট হিসেবে পাঠান:

import json
import torch

with open("layout.json", "r", encoding="utf-8") as file:
    layout = json.load(file)

layout_prompt = json.dumps(layout, ensure_ascii=False)

image = pipe(
    layout_prompt,
    height=1024,
    width=1024,
    num_inference_steps=50,
    guidance_scale=3.0,
    uncond_skip_layers=[22],
    generator=torch.Generator("cpu").manual_seed(42),
).images[0]

image.save("travel_poster.png")

পুরো প্রম্পট নতুন করে না লিখেও কম্পোজিশন সংশোধন করতে পারেন। কোনো আইটেমের টেক্সট, ক্যাপশন বা বাউন্ডিং বক্স সম্পাদনা করে আবার ছবি তৈরি করুন। README-তেও বলা হয়েছে, এই কাঠামোবদ্ধ পদ্ধতি নিয়ন্ত্রিত সম্পাদনা এবং ব্যবহারবান্ধব লেআউট টুলে সহায়তা করতে পারে।

GPU মেমরি পরিচালনা করুন

Gradio ইন্টারফেসের Advanced সেটিংসে তিনটি মেমরি মোড রয়েছে:

  • GPU resident: সরাসরি ব্যবহারের জন্য সম্পূর্ণ মডেল GPU-তে রাখে।
  • Component: প্রয়োজন অনুযায়ী মডেলের উপাদানগুলো CPU ও GPU-এর মধ্যে স্থানান্তর করে।
  • Sequential fallback: ধীর ইনফারেন্সের বিনিময়ে মেমরি ব্যবহার কমায়।

উপলব্ধ GPU মেমরিতে মডেল না ধরলে Sequential মোড নির্বাচন করুন অথবা আউটপুট ছবির আকার কমান। ডিফল্টভাবে DiT কম্পাইলেশন বন্ধ থাকে এবং Sequential মোডে এটি উপলব্ধ নয়।

ComfyUI-এর সঙ্গে MOSS-Image ব্যবহার করুন

রিপোজিটরিতে ComfyUI-এর জন্য একটি নেটিভ MOSS-Image প্লাগইন রয়েছে। এটি ইনস্টল করতে ComfyUI Manager-এ MOSS-Image অনুসন্ধান করুন। প্রকল্পটি একটি উদাহরণ ওয়ার্কফ্লোও প্রদান করে, যা শুরুর ভিত্তি হিসেবে ইমপোর্ট করা যায়।

প্রকল্পটি অফিসিয়াল ComfyUI রিপোজিটরিতে ইন্টিগ্রেশনের জন্য কাজ করছে। ততদিন পর্যন্ত রিপোজিটরির ComfyUI ইনস্টলেশন ও ব্যবহার নির্দেশনা অনুসরণ করুন।

Prompt Enhancer দিয়ে উন্নত প্রম্পট তৈরি

অন্তর্ভুক্ত MOSS-Image Prompt Enhancer একটি সাধারণ ছবির ধারণাকে বিস্তারিত ক্যাপশন অথবা স্থানিক লেআউট প্রম্পটে রূপান্তর করে। এটি স্থানীয় ফাইল ও Python টুল ব্যবহার করতে পারে এমন GPT-6-family এজেন্টের জন্য তৈরি।

  1. আপনার এজেন্টের skills ডিরেক্টরিতে skills/moss-image-prompt-enhancer ফোল্ডারটি ইনস্টল করুন।
  2. একটি ছবির ধারণা দিয়ে $moss-image-prompt-enhancer চালু করুন।
  3. আপনি বিস্তারিত ক্যাপশন চান, নাকি Layout আউটপুট চান তা নির্দিষ্ট করুন।
  4. লেআউট তৈরি করার সময় কাঙ্ক্ষিত ক্যানভাসের মাত্রা উল্লেখ করুন।
  5. কম্পাইল করা আউটপুট MOSS-Image-এর positive prompt-এ পেস্ট করুন।
  6. Layout আউটপুটের ক্ষেত্রে কম্পাইলের সময় ব্যবহৃত একই ক্যানভাসের মাত্রায় ছবি তৈরি করুন।

অন্তর্ভুক্ত স্ক্রিপ্টটি পিক্সেল-স্থানাঙ্কভিত্তিক খসড়াকে পূর্ণসংখ্যা-কেন্দ্রিক স্থানাঙ্ক ব্যবহার করে সংক্ষিপ্ত JSON-এ রূপান্তর করে। এটি কেবল প্রম্পট প্রস্তুত করে এবং কোনো ছবি-উৎপাদন সেবা কল করে না।

ব্যবহারিক পরামর্শ

  • নথিভুক্ত ডিফল্ট দিয়ে শুরু করুন: পরীক্ষা-নিরীক্ষার আগে ৫০টি ধাপ, CFG ৩, shift ৫ এবং ২২ নম্বর লেয়ারে negative-branch skipping ব্যবহার করুন।
  • অনুরোধ করা লেখা স্পষ্ট রাখুন: প্রম্পটে অথবা কোনো আইটেমের text ফিল্ডে হুবহু লেখাটি দিন।
  • জটিল ডিজাইনের জন্য কাঠামোবদ্ধ লে-আউট ব্যবহার করুন: পোস্টার, ডায়াগ্রাম এবং বেশি লেখাযুক্ত দৃশ্য আলাদাভাবে বর্ণিত উপাদান ও বাউন্ডিং বক্স থেকে উপকৃত হয়।
  • মাত্রা সতর্কতার সঙ্গে মিলিয়ে নিন: লে-আউটের স্থানাঙ্ক নির্বাচিত ক্যানভাসের প্রস্থ ও উচ্চতার সঙ্গে নির্ধারিত।
  • পরিবর্তন করার সময় seed অপরিবর্তিত রাখুন: একই seed রাখলে প্রম্পট, মডেল এবং লে-আউটের পরিবর্তন তুলনা করা সহজ হয়।
  • মেমোরি সীমিত হলে ছবির আকার কমান: প্রকল্পে স্পষ্টভাবে সুপারিশ করা প্রতিকারগুলোর মধ্যে এটি একটি।
  • Base ও SFT তুলনা করুন: আরও স্পষ্ট গোষ্ঠীবিন্যাস এবং অধিক সুশৃঙ্খল টেক্সট লে-আউট অগ্রাধিকার পেলে SFT চেকপয়েন্টটি বেশি উপযোগী হতে পারে।

উপসংহার

MOSS-Image সাধারণ text-to-image জেনারেশনের সঙ্গে শক্তিশালী টেক্সট রেন্ডারিং এবং কাঠামোবদ্ধ কম্পোজিশন নিয়ন্ত্রণ একত্র করে। আপনি Python পাইপলাইন বা Gradio ইন্টারফেস দিয়ে শুরু করতে পারেন, এরপর নির্দিষ্ট স্থাপনা গুরুত্বপূর্ণ হলে JSON লে-আউটে যেতে পারেন। ComfyUI ইন্টিগ্রেশন, মেমোরি মোড এবং prompt-enhancer স্কিল মডেলটিকে ভিজ্যুয়াল ওয়ার্কফ্লোতে যুক্ত করার আরও উপায় দেয়। স্বতন্ত্র পাইপলাইন কোড Apache License 2.0-এর অধীনে উপলভ্য।