برنامه نویسی

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

اخیراً دوره آموزش عمیق عملی برای کدنویس ها را شروع کرده ام. این دوره عالی است و اگر مایلید عمیق تر به موضوع بپردازید، آن را توصیه می کنم. اما همچنین بسیار وقت گیر است زیرا هر درس در این دوره یک ویدیوی طولانی 1 ساعت است.

به همین دلیل است که تصمیم گرفتم این راهنما را ایجاد کنم که بر بخش های مهم دوره تمرکز دارد. من نحوه انجام آن را توضیح خواهم داد

  • اکوسیستم را برای توسعه هوش مصنوعی تنظیم کنید
  • یک مدل هوش مصنوعی با fastai ایجاد و آموزش دهید
  • مدل را مستقر کرده و از آن در پروژه خود استفاده کنید

یک نوت بوک Jupyter ایجاد کنید

برای ایجاد هوش مصنوعی از fastai استفاده می کنیم. این یک کتابخانه پایتون است که بر روی pytorch ساخته شده است. نگران نباشید، شما نیازی به دانستن نحوه کدنویسی پایتون ندارید. ما در طول راه یاد خواهیم گرفت که چگونه این چیزها کار می کند 🙂

شما می توانید تمام کتابخانه ها را خودتان نصب و راه اندازی کنید تا کد را در یک فایل پایتون اجرا کنید. اما معمولاً هوش مصنوعی در چیزهایی به نام نوت بوک Jupyter کدگذاری می شود.

دو گزینه برای استفاده از نوت بوک Jupyter وجود دارد.

  1. از یک سرویس میزبانی رایگان مانند Kaggle استفاده کنید
  2. یک نوت بوک را به صورت محلی اجرا کنید. می‌توانید راهنمای نحوه راه‌اندازی 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

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا