کدنویسی هوش مصنوعی خود در سال 2023 با fastai

اخیراً دوره آموزش عمیق عملی برای کدنویس ها را شروع کرده ام. این دوره عالی است و اگر مایلید عمیق تر به موضوع بپردازید، آن را توصیه می کنم. اما همچنین بسیار وقت گیر است زیرا هر درس در این دوره یک ویدیوی طولانی 1 ساعت است.
به همین دلیل است که تصمیم گرفتم این راهنما را ایجاد کنم که بر بخش های مهم دوره تمرکز دارد. من نحوه انجام آن را توضیح خواهم داد
- اکوسیستم را برای توسعه هوش مصنوعی تنظیم کنید
- یک مدل هوش مصنوعی با fastai ایجاد و آموزش دهید
- مدل را مستقر کرده و از آن در پروژه خود استفاده کنید
یک نوت بوک Jupyter ایجاد کنید
برای ایجاد هوش مصنوعی از fastai استفاده می کنیم. این یک کتابخانه پایتون است که بر روی pytorch ساخته شده است. نگران نباشید، شما نیازی به دانستن نحوه کدنویسی پایتون ندارید. ما در طول راه یاد خواهیم گرفت که چگونه این چیزها کار می کند 🙂
شما می توانید تمام کتابخانه ها را خودتان نصب و راه اندازی کنید تا کد را در یک فایل پایتون اجرا کنید. اما معمولاً هوش مصنوعی در چیزهایی به نام نوت بوک Jupyter کدگذاری می شود.
دو گزینه برای استفاده از نوت بوک Jupyter وجود دارد.
- از یک سرویس میزبانی رایگان مانند Kaggle استفاده کنید
- یک نوت بوک را به صورت محلی اجرا کنید. میتوانید راهنمای نحوه راهاندازی Jupyter را در اسناد آنها پیدا کنید
نوت بوک های Jupyter دارای سلول های کد پایتون یا علامت گذاری هستند. می توانید با فشار دادن دکمه “Run” در ناوبری بالا یا در کنار سلول، کد را مستقیماً در مرورگر خود اجرا کنید. خروجی کد خود را در زیر سلول کد به شما می دهد.
حالا بیایید مستقیماً وارد کد شویم. بقیه این راهنما نیز در این نوت بوک Kaggle در دسترس خواهد بود:
https://www.kaggle.com/vincentwill/fastai-tutorial
در Kaggle، برای اینکه کد کار کند، ابتدا باید سوئیچ “اینترنت” را در منوی نوار کناری فعال کنید. برای باز کردن نوار کناری، روی فلش کوچک پایین سمت راست کلیک کنید. سوئیچ اینترنت فقط در صورتی در دسترس است که شماره تلفن خود را تأیید کرده باشید.
آماده سازی داده ها برای آموزش هوش مصنوعی
در این آموزش ما یک هوش مصنوعی خواهیم نوشت که قادر به تشخیص آنچه در یک تصویر است خواهد بود.
برای این کار به تعدادی عکس برای آموزش هوش مصنوعی در ابتدا نیاز داریم.
عملکرد زیر کمکی برای دانلود سریع تصاویر از duckduckgo است. من در اینجا به جزئیات نمی پردازم، زیرا برای آموزش هوش مصنوعی ما مهم نیست. همچنین می توانید تصاویر را به صورت دستی دانلود کنید یا از هر اسکراپر دیگری برای دریافت داده ها استفاده کنید.
# import libraries | imports will be available in all following cells as well
from fastcore.all import *
from fastai.vision.all import *
import time
import json
def search_images(term, max_images=100): # define search_images function
url="https://duckduckgo.com/"
res = urlread(url,data={'q':term})
time.sleep(2)
searchObj = re.search(r'vqd=([d-]+)&', res)
requestUrl = url + 'i.js' # the duckduck go api url
params = dict(l="us-en", o='json', q=term, vqd=searchObj.group(1), f=",,,", p='1', v7exp='a')
headers = dict( referer="https://duckduckgo.com/" )
urls,data = set(),{'next':1}
# loop through pages until we have enough images
while len(urls)<max_images and 'next' in data:
res = urlread(requestUrl, data=params, headers=headers)
data = json.loads(res) if res else {}
urls.update(L(data['results']).itemgot('image'))
requestUrl = url + data['next']
time.sleep(4)
return L(urls)[:max_images]`
من توصیه می کنم ابتدا این راهنما را دنبال کنید و سپس سعی کنید هوش مصنوعی را با تصاویر مختلف آموزش دهید. ما با آزمایش خود شروع خواهیم کرد search_images
تابع. خروجی یک لینک نشان می دهد.
برای این آموزش، من یک هوش مصنوعی ایجاد خواهم کرد که انواع مختلف دایناسورها را تشخیص می دهد.
# "search_images" depends on duckduckgo.com, which doesn't always return correct responses.
# If you get a JSON error, just try running it again (it may take a couple of tries).
urls = search_images('t-rex', max_images=1)
urls[0] # 'https://preview.redd.it/dwthh8wdl9k21.jpg?auto=webp&s=e0af431550ed710c2ffb11eae6ca325806c9f46b'`
اکنون که تأیید کردیم که عملکرد به درستی کار می کند، می توانیم از آن برای دانلود و نمایش تصاویر استفاده کنیم.
from fastdownload import download_url
dest="t-rex.jpg"
download_url(urls[0], dest, show_progress=False)
im = Image.open(dest) # open the downloaded image
im.to_thumb(256,256) # display the image in a 256x256 thumbnail
اکنون باید تصاویری از چیز متفاوتی به دست آوریم تا هوش مصنوعی بداند که تی رکس چیست. ما از همین تابع برای واکشی تصویری از تری سراتوپ استفاده می کنیم.
download_url(search_images('triceratops', max_images=1)[0], 'triceratops.jpg', show_progress=False)
Image.open('triceratops.jpg').to_thumb(256,256)
اکنون که مطمئن شدیم جستجو و ذخیره به درستی کار می کنند، می توانیم از آنها برای دانلود مجموعه داده خود استفاده کنیم. تابع بعدی در دسته بندی های ما حلقه می زند و 100 عکس از هر کدام را دانلود می کند.
searches="t-rex",'triceratops' # define search terms
path = Path('images')
for o in searches:
dest = (path/o)
dest.mkdir(exist_ok=True, parents=True) # create folder for categories
download_images(dest, urls=search_images(f'{o}'))
time.sleep(5)
resize_images(path/o, max_size=400, dest=path/o) # resize to save time training the AI
ممکن است اتفاق بیفتد که دانلودها با شکست مواجه شوند. به همین دلیل است که باید تصاویر را تأیید کنیم و تصاویر نامعتبر را حذف کنیم.
failed = verify_images(get_image_files(path))
failed.map(Path.unlink)
len(failed)
هوش مصنوعی را آموزش دهید
برای آموزش هوش مصنوعی ابتدا به یک بلوک داده نیاز داریم. این مانند طرحی در مورد نحوه جمع آوری داده های خود است. با این DataBlock میتوانیم با فراخوانی آن یک بارگذار داده ایجاد کنیم .dataloader
تابع. پارامترهای مختلف را در کد زیر توضیح خواهم داد. در اینجا می توانید توضیح دقیق تری در مورد همه چیز پیدا کنید.
dls = DataBlock(
blocks=(ImageBlock, CategoryBlock), # input = images, output = categories
get_items=get_image_files, # Get image files in path recursive
splitter=RandomSplitter(valid_pct=0.2, seed=42), # split data into training / validation set randomly
get_y=parent_label, # label the items - in this case take the parent (folder) as label
item_tfms=[Resize(192, method='squish')] # method to transform the items - in this case resize
).dataloaders(path, bs=32) # bs = size of batch
# show an example batch of the items we loaded
dls.show_batch(max_n=6)
اکنون ما آماده ایم تا هوش مصنوعی خود را با این داده ها آموزش دهیم. ابتدا یک مدل از پیش آموزش دیده را بارگذاری می کنیم. در این مورد، مدل از پیش آموزش دیده برای تشخیص عکس ها آموزش داده شد. پس از آن، ما این مدل را در مجموعه داده خود تنظیم می کنیم. ما Data Loader خود را به یادگیرنده بینایی می دهیم و سپس مدل از پیش آموزش دیده را که از آن استفاده خواهیم کرد. در این مورد، آن است resnet18
.
learn = vision_learner(dls, resnet18, metrics=error_rate)
learn.fine_tune(3)
هوش مصنوعی را آزمایش و اجرا کنید
اکنون هوش مصنوعی ما آماده آزمایش است. برای آن، میتوانیم از عکسهایی که در ابتدا دانلود کردهایم برای آزمایش عملکرد دانلود خود استفاده کنیم.
prediction,_,probs = learn.predict('t-rex.jpg') # run a prediction
print(f"This is a: {prediction}.")
print(f"Probability it's a t-rex: {probs[0]:.4f}")
print(f"Probability it's a triceratops: {probs[1]:.4f}")
اگر از نتیجه و دقت راضی باشیم، میتوانیم مدل را اجرا کنیم. ما این کار را با فراخوانی ساده انجام می دهیم export
عملکرد زبان آموز
learn.export('model.pkl')
اکنون می توانید مدل صادر شده را بارگیری و استفاده کنید. یعنی می توانید آن را به هر برنامه پایتون وارد کنید و از آن استفاده کنید .predict
تابع.
path = Path()
path.ls(file_exts=".pkl") # double check if model exists
learn_inf = load_learner('model.pkl')
learn_inf.predict('t-rex.jpg')
اما راه سادهتری برای استفاده از مدل شما نسبت به پیادهسازی API پایتون وجود دارد. ما می توانیم از Gradio و Hugging Face برای ایجاد آسان API و استفاده از مدل خود استفاده کنیم. برای آن، باید تابعی بنویسیم که به Gradio بگوید چگونه از مدل ما استفاده کند.
labels = learn.dls.vocab # read labels from Data Loader
def predict(img):
pred,pred_idx,probs = learn.predict(img) # use passed image for prediction
return {labels[i]: float(probs[i]) for i in range(len(labels))} # return all results
حالا باید gradio را نصب کنیم. سپس میتوانیم آن را با تعریف یک رابط راهاندازی کنیم. به این رابط، تابع پیش بینی و تعاریف ورودی و خروجی خود را منتقل می کنیم. سپس میتوانیم تابع راهاندازی را فراخوانی کنیم که رابطی را برای تعامل با مدل ما راهاندازی میکند.
!pip install -Uqq gradio
import gradio as gr
gradio_interface = gr.Interface(fn=predict, inputs=gr.inputs.Image(shape=(512, 512)), outputs=gr.outputs.Label(num_top_classes=3))
gradio_interface.launch(share=True)
این یک رابط کاربری ایجاد می کند تا به راحتی با مدل ما تعامل داشته باشد
در پایین، می توانید متن Use via API را مشاهده کنید.
اگر روی آن کلیک کنید، نحوه تعامل با هوش مصنوعی خود از طریق API را به شما نشان می دهد. شما می توانید میکروسرویس پایتون خود را با Gradio ایجاد کنید. اما ساده ترین راه برای میزبانی آن استفاده از Hugging Face است. بنابراین به آنجا بروید و یک حساب کاربری ایجاد کنید. پس از تایید ایمیل خود می توانید یک “Space” ایجاد کنید.
روی منوی بالا سمت راست و سپس بر روی “فضای جدید” کلیک کنید. نام پروژه خود را وارد کرده و Gradio را به عنوان SDK انتخاب کنید. سپس یک مجوز را انتخاب کنید و گزینه های دیگر را همانطور که هستند نگه دارید. اکنون می توانید Space را ایجاد کنید.
پس از آن، باید مدل و کد خود را به مخزن Hugging Face اضافه کنیم. اگر نوت بوک خود را به صورت محلی اجرا می کنید، باید مدل صادر شده را در فهرست کاری خود داشته باشید. اگر در Kaggle هستید، باید روی فلش کوچک پایین سمت راست کلیک کنید. در آنجا باید یک برگه “داده” را با فایل model.pkl صادراتی خود مشاهده کنید.
اکنون مخزن Hugging Face Space خود را کلون کنید. سپس فایل model.pkl را به مخزن اضافه کنید و یک فایل بسازید app.py
. در آنجا کدی را که قبلاً برای بارگذاری مدل و ایجاد یک رابط گرادیو استفاده کرده بودیم اضافه می کنیم.
import gradio as gr
import skimage
from fastai.vision.all import *
path = Path()
learn = load_learner('model.pkl')
labels = learn.dls.vocab # read labels from Data Loader
def predict(img):
pred,pred_idx,probs = learn.predict(img) # use passed image for prediction
return {labels[i]: float(probs[i]) for i in range(len(labels))} # return all results
gradio_interface = gr.Interface(fn=predict, inputs=gr.inputs.Image(shape=(512, 512)), outputs=gr.outputs.Label(num_top_classes=3))
gradio_interface.launch()
و در آخر یک فایل require.txt اضافه کنید تا کتابخانه های مورد نیاز برای اجرای مدل خود را فراهم کند.
fastai
scikit-image
قبل از commit باید ابتدا git-lfs را نصب کنیم، زیرا فایل model.pkl ما خیلی بزرگ است. برای نصب آن برای سیستم عامل خود پیوند و دستورالعمل ها را دنبال کنید.
اکنون می توانیم از git-lfs برای model.pkl خود استفاده کنیم:
git lfs install
git lfs track "*.pkl"
پس از آن، ما آماده هستیم تا مدل خود را متعهد و اجرا کنیم.
git add .
git commit -m "initial commit"
git push
اگر به فضای بغل کردن صورت خود برگردید، باید ببینید که برنامه شما در حال ساخت است. پس از مدتی، شما باید بتوانید همان رابط کاربری را در نوت بوک jupyter خود مشاهده کنید.
تبریک میگم شما با موفقیت هوش مصنوعی خود را ایجاد و به کار گرفتید. اکنون می توانید از API فضای بغل دستی خود در برنامه های خود استفاده کنید.
بعدش چیه؟
- ابتدا به شما توصیه می کنم کد را در نوت بوک jupyter جایگزین کنید. بازی کنید تا درک بهتری از نحوه کار این چیزها داشته باشید.
- اسناد fastai را بررسی کنید تا بفهمید چگونه:
- به من بگویید چگونه این راهنما را دوست داشتید و چگونه می توانم آن را بهبود بخشم توییتر یا از طریق ایمیل: info@wweb.dev