داخل یک کادر بنویسید چه تصویری لازم دارید و اجازه بدهید تا کامپیوتر آن را برای شما بسازد. این مفهوم که چند سال پیش شبیه یک رویا بود، اکنون و با پیشرفتها در زمینه شبکههای عصبی و مدلهای Diffusion به واقعیت پیوسته است. سرویس DALL-E شرکت OpenAI اولین ابزاری بود که در این زمینه به پیشرفتهای شگفتانگیزی دست پیدا کرد. زمانی که هنوز ChatGPT دنیای اینترنت را فتح نکرده بود، مجلههای داخلی مثل دانستنیها و سایتهای خبری با هیجان از آخرین دستاوردهای DALL-E (که آن زمان تنها در اختیار تعداد محدودی تستکننده بود) صحبت میکردند.
حالا OpenAI دسترسی به سرویس DALL-E از طریق API را مقدور کرده، که یعنی شما میتوانید با استفاده از آن اپلیکیشن خودتان را بسازید. در این پست قرار است یک ابزار تولید تصاویر با هوش مصنوعی بسازیم. برای این منظور گامهای زیر را باید طی کنیم:
- کتابخانه OpenAI را بارگذاری کنیم
- فراخوانیهای API مربوط به تولید تصاویر را کاوش کنیم
- از طریق نوشتن متن تصاویر را تولید کنیم
- نسخههای مختلفی از تصویر را بسازیم
- پاسخهای استاندارد Base64 را به عکسهایی با فرمت PNG تبدیل کنیم
این پست آموزشی تا حد امکان ساده نوشته شده تا هر کس با دانش محدود برنامهنویسی پایتون آن را درک کند.
نصب پیشنیازها
قبل از شروع هر کاری باید ابتدا پیشنیازها را نصب کنیم.
نصب کتابخانه OpenAI
با استفاده از دستور زیر در پاورشل ویندوز مطمئن شوید که نسخه پایتون شما ۳.۷.۱ یا بالاتر است، و سپس یک محیط مجازی بسازید و کتابخانه OpenAI را نصب کنید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ |
PS> python --version Python ۳.۱۱.۰ PS> python -m venv venv PS> .\venv\Scripts\activate (venv) PS> python -m pip install openai |
پکیج openai به شما دسترسی کامل API را میدهد. در این آموزش تمرکز ما روی کلاس image است که به ما اجازه میدهد با DALL-E تعامل کنیم.
ساخت کلید API
برای دسترسی به API به کلید آن نیاز دارید. یک حساب کاربری OpenAI بسازید (اگر از قبل ندارید) و در پنل خود وارد قسمت API Keys شوید. در این قسمت میتوانید کلیدهای API خودتان را بسازید و مدیریت کنید. در حال حاضر حسابهای جدید میتوانند به میزان ۵ دلار و برای مدت سه ماه از API استفاده کنند، که برای اهداف آموزشی کافی است.
بعد از ساخت کلید، مقدار آن را کپی کنید. فراموش نکنید کلید API مختص شماست و باید آن را مخفی نگه دارید.
ذخیره کلید API به عنوان متغیر محیطی
سریعترین راه برای استفاده از کلید API ذخیره آن به عنوان یک متغیر محیطی است. برای این کار کافی است دستور زیر را در پاورشل اجرا کنید:
(venv) PS> $ENV:OPENAI_API_KEY = “<your-key-value-here>” |
به جای <your-key-value-here> مقدار کلید API را قرار دهید.
قیمتگذاری API تولید تصاویر OpenAI
این شرکت مبنای قیمتگذاری API خود را کیفیت تصاویر تولیدشده قرار داده است که در جدول زیر مشاهده میکنید:
Price per image | Resolution |
$۰.۰۱۶ | ۲۵۶×۲۵۶ |
$۰.۰۱۸ | ۵۱۲×۵۱۲ |
$۰.۰۲۰ | ۱۰۲۴×۱۰۲۴ |
طبق این جدول، با ۵ دلار شارژ اولیهتان میتوانید ۲۵۰ عکس با رزولوشن ۱۰۲۴×۱۰۲۴ بسازید.
بعد از اتمام شارژ اولیه، اگر قصد دارید باز هم از اپلیکیشن استفاده کنید، باید یک حساب پیپال یا یک کارت اعتباری بینالمللی به حساب کاربری خودتان متصل کنید.
تولید تصویر از طریق متن
برای شروع با کمک دستور زیر از آماده بودن کتابخانه OpenAI مطمئن شوید:
۱ ۲ ۳ |
(venv) $ openai api image.create -p "a tree in an island" |
بعد از اجرای دستور، باید یک پاسخ JSON مشابه زیر دریافت کنید که حاوی URL تصویر تولیدشده باشد:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ |
{ "created": ۱۶۶۸۰۷۳۵۶۲, "data": &#۰۹۱; { "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org ⮑ -QANMxYn3BsMeuAbRT8X3iiu3/user-xSuQTJ0IIVj3dHM4DPymXTg4/img-5GqtVx ⮑ L86Retwi282RbE8HzA.png?st=2022-11-10T08%3A46%3A02Z&se=2022-11-10T1 ⮑ ۰%۳A46%3A02Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&sk ⮑ oid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e- ⮑ a814-9c849652bcb3&skt=2022-11-09T14%3A20%3A19Z&ske=2022-11-10T14%3 ⮑ A20%3A19Z&sks=b&skv=2021-08-06&sig=yorbHuIy/qHhWvGPmJrZ8apJptorzpI ⮑ ۰/۶۲VH2lmhcg%3D" } ] } |
با کپی کردن URL در مرورگر میتوانید تصویر را ببینید. تصویری که برای من ساخته شده به این شکل است:
البته تصویر شما متفاوت خواهد بود، چرا که مدل Diffusion هر تصویر را در زمان ارسال درخواست میسازد. حالا که مطمئن شدیم همه چیز درست کار میکند، به سراغ ساخت اپلیکیشن میرویم.
فراخوانی API با اسکریپت پایتون
ادیتور کد خودتان را باز کنید و اسکریپت زیر را در آن قرار دهید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ |
# create.py import os import openai PROMPT = "A tree in the middle of an island in ocean" openai.api_key = os.getenv("OPENAI_API_KEY") response = openai.Image.create( prompt=PROMPT, n=۱, size="۲۵۶x256", ) print(response&#۰۹۱;"data"][0]["url"]) |
این اسکریپت یک درخواست تولید تصویر از روی متن به وسیله API ارسال میکند. در این اسکریپت موارد دیگری نظیر تعداد تصاویر تولیدی و ابعاد آن را مشخص کردهایم تا خروجی با درخواست ما تطبیق بیشتری داشته باشد.
وقتی این اسکریپت را اجرا میکنید، در ترمینال یک URL دریافت میکنید که آدرس تصویر تولیدشده است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ |
(venv) $ python create.py https:&#۰۴۷;/oaidalleapiprodscus.blob.core.windows.net/private/org-QANMxYn3BsMe ⮑ uAbRT8X3iiu3/user-xSuQTJ0IIVj3dHM4DPymXTg4/img-۴AMS4wJJLFsu6ClQmGDppAeV ⮑ .png?st=۲۰۲۲-۱۱-۱۰T12%۳A22%۳A46Z&se=۲۰۲۲-۱۱-۱۰T14%۳A22%۳A46Z&sp=r&sv=۲۰ ⮑ ۲۱-۰۸-۰۶&sr=b&rscd=inline&rsct=image/png&skoid=۶aaadede-۴fb3-۴۶۹۸-a8f6- ⮑ ۶۸۴d7786b067&sktid=a48cca56-e6da-۴۸۴e-a814-۹c849652bcb3&skt=۲۰۲۲-۱۱-۱۰T ⮑ ۱۰%۳A55%۳A29Z&ske=۲۰۲۲-۱۱-۱۱T10%۳A55%۳A29Z&sks=b&skv=۲۰۲۱-۰۸-۰۶&sig=xJW ⮑ imMiA1/nGmFMYKUTsJq7G1u4xSL652r/MrzTH0Nk%۳D |
خروجی به شکل زیر است:
میبینید که تصویر تولیدشده با نسخه قبلی تفاوت داشته و اندازه آن کوچکتر است، چراکه ما در خط ۱۴ کد تعیین کردهایم که ابعاد عکس ۲۵۶x۲۵۶ باشد.
ذخیره اطلاعات عکس در فایل
درست است که اسکریپت ما خوب کار میکند، اما اگر قرار باشد به طور مداوم عکس تولید کنیم، بهتر است که به طور مستقیم به دادههای عکس دسترسی داشته باشیم. همچنین باید اسکریپت را طوری تغییر دهیم تا پاسخهای JSON را به جای پرینت در ترمینال در یک فایل ذخیره کند:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ |
# create.py import json import os from pathlib import Path import openai PROMPT = "An eco-friendly computer from the 90s in the style of vaporwave" DATA_DIR = Path.cwd() / "responses" DATA_DIR.mkdir(exist_ok=True) openai.api_key = os.getenv("OPENAI_API_KEY") response = openai.Image.create( prompt=PROMPT, n=۱, size="۲۵۶x256", response_format="b64_json", ) file_name = DATA_DIR / f"{PROMPT[:5]}-{response['created']}.json" with open(file_name, mode="w", encoding="utf-8") as file: json.dump(response, file) |
با این تغییرات حالا شما یک فایل دریافت میکنید که حاوی اطلاعات عکس است. یک بار اسکریپت را اجرا و فایل JSON را بررسی کنید، چه میبینید؟ این کلمات هیچ مفهومی برای شما ندارند، چرا که به صورت بیتهای Base64 ذخیره شدهاند. با این که شما به عنوان برنامهنویس این موضوع را متوجه میشوید، اما یک کاربر نمیداند با این رشته اعداد و کلمات چه کار کند. پس در قسمت بعدی باید یک عکس Base64 را به فرمت PNG تبدیل کنیم.
تبدیل فرمت Base64 به PNG
برای این منظور کافی است یک اسکریپت جدید بسازید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ |
# convert.py import json from base64 import b64decode from pathlib import Path DATA_DIR = Path.cwd() / "responses" JSON_FILE = DATA_DIR / "An ec-1667994848.json" IMAGE_DIR = Path.cwd() / "images" / JSON_FILE.stem IMAGE_DIR.mkdir(parents=True, exist_ok=True) with open(JSON_FILE, mode="r", encoding="utf-8") as file: response = json.load(file) for index, image_dict in enumerate(response&#۰۹۱;"data"]): image_data = b64decode(image_dict&#۰۹۱;"b64_json"]) image_file = IMAGE_DIR / f"{JSON_FILE.stem}-{index}.png" with open(image_file, mode="wb") as png: png.write(image_data) |
این اسکریپت فایل JSON با نامی که داخل JSON_FILE تعریف کردهاید، میخواند. در ادامه نیز رشته Base64 را گرفته، آن را رمزگشایی کرده و تصویر را به عنوان یک فایل PNG داخل یک پوشه ذخیره میکند.
حلقه for داخل اسکریپت برای این است که بیش از یک تصویر را هم بتوان دریافت کرد. بعد از اجرای اسکریپت میتوانید به مسیر پوشه مقصد رفته و عکس تولیدشده را ببینید.
اما اگر تصویر تولیدشده آن چیزی که میخواستید نبود چه باید کرد؟
ساخت نسخههای متفاوت از یک تصویر
با ساخت نسخههای متفاوت از یک تصویر به صورت همزمان، میتوانید گزینهای را انتخاب کنید که به آنچه که شما در ذهن داشتید نزدیکتر است.بر اساس کدی که در ابتدا نوشتیم، میتوانید یک فایل جدید بسازید و کد زیر را در آن قرار دهید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ |
# vary.py import json import os from base64 import b64decode from pathlib import Path import openai DATA_DIR = Path.cwd() / "responses" SOURCE_FILE = DATA_DIR / "An ec-1667994848.json" openai.api_key = os.getenv("OPENAI_API_KEY") with open(SOURCE_FILE, mode="r", encoding="utf-8") as json_file: saved_response = json.load(json_file) image_data = b64decode(saved_response&#۰۹۱;"data"][0]["b64_json"]) response = openai.Image.create_variation( image=image_data, n=۳, size="۲۵۶x256", response_format="b64_json", ) new_file_name = f"vary-{SOURCE_FILE.stem[:5]}-{response['created']}.json" with open(DATA_DIR / new_file_name, mode="w", encoding="utf-8") as file: json.dump(response, file) |
در این اسکریپت ما اطلاعات تصویر با فرمت Base64 در پاسخ JSON قبلی را از طریق API ارسال کرده و سه نسخه متفاوت از آن را درخواست میکنیم. سپس اطلاعات هر سه تصویر را در یک فایل JSON جدید در پوشه response قرار میدهیم. حالا کافی است تا نام فایل را کپی کرده و به عنوان JSON_FILE در اسکریپت convert.py قرار دهیم تا سه تصویر مختلف دریافت کنیم.
گام بعدی
شما به همین راحتی و در عرض چند دقیقه یک ابزار تولید تصاویر با هوش مصنوعی ساختید که میتواند یک متن از شما بگیرد و نسخههای متفاوتی از یک تصویر را به شما ارائه دهد. گام بعدی استفاده از این ابزار برای توسعه سرویسهای مختلف است. برای مثال میتوانید با کمک آن و ساخت یک رابط کاربری، ابزار تولید تصاویر خودتان را بسازید، یا در اپلیکیشن خود توضیحات کاربر یا متن Bio را به عنوان ورودی به این اسکریپت ارسال کرده و یک آواتار شخصیسازیشده برای حساب کاربر بسازید. استفادههای این ابزار مختلف است و بسته به تخیل شما دارد. دیگر چه کاربردهایی برای آن به ذهنتان میرسد؟