টেক্সট থেকে ছবি (Text-to-Image) তৈরি হলো কম্পিউটার ভিশন (computer vision) এবং ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং (natural language processing) এর একটি কাজ, যেখানে মূল লক্ষ্য হলো প্রদত্ত একটি লিখিত বিবরণের সাথে সামঞ্জস্যপূর্ণ একটি ছবি তৈরি করা। এর জন্য টেক্সট ইনপুটকে একটি অর্থপূর্ণ উপস্থাপনা বা রিপ্রেজেন্টেশনে (representation), যেমন একটি ফিচার ভেক্টর (feature vector), রূপান্তর করতে হয় এবং তারপর সেই রিপ্রেজেন্টেশন ব্যবহার করে বিবরণের সাথে মিলে যায় এমন একটি ছবি তৈরি করা হয়।
এই প্রক্রিয়ায় প্রথম কাজটি হলো ইনপুট টেক্সটকে ভেক্টরাইজ (vectorize) করা, যাতে মডেল তার প্রেক্ষিত বা কনটেক্সট (context) বুঝতে পারে। এরপর মডেলটি ইনপুট টেক্সটের কনটেক্সটের সাথে সম্পর্কিত বৈশিষ্ট্য ব্যবহার করে ছবিটি তৈরি করে। এই কাজটি ভালোভাবে আয়ত্ত করার জন্য, একটি মেশিনকে একটি বিশাল ডেটাসেট (dataset) ব্যবহার করে প্রশিক্ষণ দিতে হয়, যেখানে ছবি এবং সেগুলোর লিখিত বিবরণ থাকে, যেন মেশিনটি ছবির বস্তুগুলো শনাক্ত করতে শেখে।
এর ফলে, মেশিন শুধুমাত্র ছবির বস্তু শনাক্ত করতেই শেখে না, বরং সেগুলোর সাথে সম্পর্কিত লিখিত বিবরণও বুঝতে পারে এবং বস্তু ও ধারণাগুলো একে অপরের সাথে কীভাবে সম্পর্কিত তাও অনুধাবন করতে পারে। ভাষা এবং ছবির মধ্যেকার এই সম্পর্ক বোঝাটাই টেক্সট-থেকে-ছবি অ্যালগরিদমের একটি প্রধান দিক। মেশিন ডেটাগুলোকে গাণিতিক সমতুল্য মানে রূপান্তর করে এবং অর্থ, রঙ, আকৃতি, গঠন, শৈলী ইত্যাদির উপর ভিত্তি করে সেগুলোকে একটি বহুমাত্রিক স্থানে (multi-dimensional space) স্থাপন করে।
এই স্থানটি, অর্থাৎ যে “ব্ল্যাক বক্স”-এর ভেতরে মূল কাজটি সম্পন্ন হয়, তাকে “ল্যাটেন্ট স্পেস” (latent space) বলা হয়। যখন একজন ব্যবহারকারী কোনো প্রম্পট (prompt) টাইপ করেন, তখন অ্যালগরিদমটি তার লেখার গাণিতিক উপস্থাপনা খুঁজে বের করে এবং ল্যাটেন্ট স্পেস থেকে তা পুনরুদ্ধার করে।
ডেটাসেটে থাকা যে ছবিগুলো মেশিন আগে থেকেই “দেখেছে”, তার উপর ভিত্তি করে এটি সেই গাণিতিক তথ্যকে আবার পিক্সেলে (pixel) অনুবাদ করে এবং ফলাফল হিসেবে এমন একটি ছবি প্রদান করে যা আগে কখনো তৈরি হয়নি। মেশিন আসলে মানুষের মতো করে ছবি “দেখে” বা “বোঝে” না। বরং, এটি ডেটার মধ্যে থাকা পরিসংখ্যানগত প্যাটার্ন (statistical patterns) ব্যবহার করে টেক্সট প্রম্পটের সাথে মিলে যায় এমন ছবি তৈরি করে।
এআই-এর মাধ্যমে ছবি তৈরির মূল ভিত্তি হলো ডিফিউশন মডেল (Segmind Stable Diffusion)। এর পেছনের মূল ধারণাটি হলো, একটি র্যান্ডম (random) ছবি থেকে শুরু করে একাধিক ধাপের মাধ্যমে সেটিকে ধীরে ধীরে পরিমার্জিত করা। প্রতিটি ধাপে, মডেলটি ছবিতে কিছুটা র্যান্ডম নয়েজ (noise) যুক্ত করে এবং তারপর এমন একটি রূপান্তর (transformation) প্রয়োগ করে যা ধীরে ধীরে নয়েজটিকে প্রায় অদৃশ্য করে দেয়। এই প্রক্রিয়াটি বহুবার পুনরাবৃত্তি করা হয়, এবং প্রতিটি ধাপ ছবিটিকে আরও বেশি বিস্তারিত ও জটিল করে তোলে।
স্টেবল ডিফিউশন মডেল (Stable Diffusion Models)
স্টেবল ডিফিউশন-এক্সএল ১.০-বেস মডেল (Stable Diffusion-XL 1.0-base Model)
স্টেবল ডিফিউশন হলো স্টেবিলিটি এআই (Stability AI) দ্বারা তৈরি একটি জেনারেটিভ এআই মডেল, যা টেক্সট এবং ইমেজ প্রম্পট থেকে অনন্য ফটোরিয়ালিস্টিক (বাস্তবসম্মত) ছবি তৈরি করে। এই মডেলটি ডিফিউশন প্রযুক্তি এবং ল্যাটেন্ট স্পেস (latent space) ব্যবহার করে কাজ করে।
এসডিএক্সএল (SDXL) মডেলটি ল্যাটেন্ট ডিফিউশনের জন্য একাধিক এক্সপার্ট পাইপলাইনের (expert pipelines) সমন্বয়ে গঠিত। এর বেস মডেলটি (noisy) ল্যাটেন্ট তৈরি করতে ব্যবহৃত হয়, যা পরবর্তীতে একটি বিশেষ রিফাইনমেন্ট মডেলের (refinement model) মাধ্যমে চূড়ান্ত ডিনয়েজিং (denoising) ধাপগুলোতে প্রসেস করা হয়।
বিকল্পভাবে, আমরা দুই-ধাপের একটি পাইপলাইন ব্যবহার করতে পারি: প্রথমত, বেস মডেলটি ব্যবহার করে কাঙ্ক্ষিত আউটপুট আকারের ল্যাটেন্ট তৈরি করা হয়। দ্বিতীয় ধাপে, আমরা একটি বিশেষ হাই-রেজোলিউশন মডেল ব্যবহার করি এবং প্রথম ধাপে তৈরি করা ল্যাটেন্টের উপর একই প্রম্পট ব্যবহার করে SDEdit (যা “img2img” নামেও পরিচিত) কৌশলটি প্রয়োগ করি। এই কৌশলটি প্রথমটির চেয়ে কিছুটা ধীর, কারণ এতে বেশি ফাংশন ইভ্যালুয়েশনের (function evaluations) প্রয়োজন হয়।
সেগমাইন্ড স্টেবল ডিফিউশন ১বি মডেল (Segmind Stable Diffusion 1B Model)
সেগমাইন্ড স্টেবল ডিফিউশন মডেল (SSD-1B) হলো স্টেবল ডিফিউশন এক্সএল (SDXL)-এর একটি ডিস্টিল্ড, ৫০% ছোট সংস্করণ, যা উচ্চ-মানের টেক্সট-টু-ইমেজ জেনারেশন ক্ষমতা বজায় রেখে ৬০% দ্রুত গতি প্রদান করে। পাঠ্য (textual) প্রম্পটের (prompts) ভিত্তিতে বিস্তৃত পরিসরের ভিজ্যুয়াল কনটেন্ট তৈরি করার সক্ষমতা বাড়াতে এটি গ্রিট (Grit) এবং মিডজার্নি স্ক্র্যাপ ডেটা (Midjourney scrape data)-সহ বিভিন্ন ধরনের ডেটাসেটের উপর প্রশিক্ষিত হয়েছে।
এই মডেলটি একটি ‘নলেজ ডিস্টিলেশন’ (knowledge distillation) কৌশল ব্যবহার করে, যেখানে এটি SDXL, ZavyChromaXL, এবং JuggernautXL সহ বেশ কয়েকটি বিশেষজ্ঞ মডেলের শিক্ষাকে ক্রমান্বয়ে কাজে লাগায়, যাতে তাদের শক্তিগুলিকে একত্রিত করে চমৎকার ভিজ্যুয়াল আউটপুট তৈরি করা যায়।
টেক্সট থেকে ছবি তৈরি করা যাক (Let’s Generate the Image from Text)
এই কোডগুলি চালানোর জন্য আপনার স্থানীয় মেশিনে একটি জিপিইউ (GPU) থাকতে হবে। অন্যথায়, আপনি গুগল কোলাব (Google Colab) থেকে বিনামূল্যে জিপিইউ ব্যবহার করতে পারেন।
প্রথম ধাপ: প্রয়োজনীয় লাইব্রেরিগুলি ইনস্টল করা (Installing Required Libraries)
প্রথম ধাপটি হলো pip ফাংশনালিটি ব্যবহার করে transformers, accelerators, safetensors, diffusers, এবং Gradio লাইব্রেরিগুলি ইনস্টল করা।
|
1 2 3 4 5 6 |
# installing the libraries !pip install git+https://github.com/huggingface/diffusers !pip install transformers accelerate safetensors diffusers !pip install gradio |
দ্বিতীয় ধাপ: লাইব্রেরি ইমপোর্ট করা (Importing the Libraries)
দ্বিতীয় ধাপে, আমাদেরকে ইনস্টল করা লাইব্রেরিগুলি আমাদের এনভায়রনমেন্টে (environment) যোগ করতে হবে। মডেল লোড করার জন্য diffusers থেকে StableDiffusionXLPipeline মডিউল এবং transformers থেকে ইমেজ মডিউলগুলি ইমপোর্ট করুন। এছাড়াও, অবশিষ্ট লাইব্রেরিগুলিও ইমপোর্ট করতে হবে।
|
1 2 3 4 5 6 7 8 9 10 |
# importing the libraries import torch import gradio as gr from IPython.display import display from diffusers import StableDiffusionXLPipeline from transformers.pipelines.image_to_text import Image |
তৃতীয় ধাপ: মডেল লোড করা (Loading the Model)
তৃতীয় ধাপে, সেগমাইন্ড স্টেবল ডিফিউশন মডেল লোড করার জন্য StableDiffusionXLPipeline শুরু (initiate) করতে হবে। এরপর, মডেলের ওজন (weights) লোড করার জন্য আমরা float16 এবং safetensors ফাংশনালিটি ব্যবহার করেছি।
|
1 2 3 4 5 6 7 8 9 10 |
# initiating the stable diffusion pipeline pipe = StableDiffusionXLPipeline.from_pretrained( "segmind/SSD-1B", torch_dtype=torch.float16, use_safetensors=True, variant="fp16" ) pipe.to("cuda") |
চতুর্থ ধাপ: প্রম্পট নির্ধারণ করা (Defining the Prompts)
চতুর্থ ধাপটি হলো মডেল দ্বারা ছবি তৈরি করার জন্য প্রম্পট (prompts) দেওয়া। পজিটিভ প্রম্পট মডেলকে নির্দেশ দেয় ছবিটি কেমন হওয়া উচিত। অন্যদিকে, নেগেটিভ প্রম্পট মডেলকে নির্দেশ দেয় ছবিটি কেমন হওয়া উচিত নয়।
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# prompts to generate image prompt = "astronut inside the valcano" neg_prompt = "ugly, darkness, blurry, poor quality" image = pipe(prompt = prompt, negative_prompt = neg_prompt, width=1500 - (1500 % 8), height=750 - (750 % 8), guidance_scale=7, num_inference_steps=28).images[0] display(image) |
পঞ্চম ধাপ: মডেল ফাংশন ও ইন্টারফেস সংজ্ঞায়িত করা (Defining Model Function and Interface)
পঞ্চম ধাপে, আমরা মডেল পাইপলাইনের ফাংশনটি সংজ্ঞায়িত করব এবং ইন্টারফেসের মাধ্যমে ব্যবহারকারীদের কাছ থেকে ইনপুটগুলি (পজিটিভ প্রম্পট ও নেগেটিভ প্রম্পট) নেব।
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# function for intracting with model def generate_image(prompt, neg_prompt): image = pipe(prompt = prompt, negative_prompt = neg_prompt).images[0] return image # input for how the image must be prompt = gr.Text( label = "Prompt", show_label = False, max_lines = 1, placeholder = "Enter your prompt", container = False ) # input for how the image must not be neg_prompt = gr.Text( label = "Negative Prompt", show_label = False, max_lines = 1, placeholder = "Enter your negative prompt", container = False ) # integrating user input and model output iface = gr.Interface( fn = generate_image, inputs = [prompt, neg_prompt], outputs = "image", title = "Text to Image Generation", examples = [ ["a painting of a cite dog sitting on the car", "ugly, blurry"], ["a astronaut playing a game in the mars", "darkness, poor quality"] ], allow_flagging = False ) iface.launch(share = True) |
চূড়ান্ত ধাপ: গ্র্যাডিও ইন্টারফেস চালু করা (Launching the Gradio Interface)
গ্র্যাডিও (Gradio) ইন্টারফেসটি চালু করার পরে, মডেলের সাথে ইন্টারঅ্যাক্ট করার জন্য আপনি ইউজার ইন্টারফেসটি পেয়ে যাবেন। To learn more: https://huggingface.co/segmind/SSD-1B


Leave a Comment