سلام! بنابراین، آیا می‌دانید که این همهمه‌ای درباره آینده‌نگر و بدون راننده بودن خلبان خودکار تسلا وجود دارد؟ تا به حال به این فکر کرده اید که واقعاً چگونه جادوی خود را انجام می دهد؟ خوب، اجازه دهید به شما بگویم – همه چیز مربوط به تقسیم بندی تصویر و تشخیص اشیا است.

تقسیم بندی تصویر چیست؟

تقسیم‌بندی تصویر، که اساساً یک تصویر را به بخش‌های مختلف تقسیم می‌کند، به سیستم کمک می‌کند تا موارد را تشخیص دهد. محل قرارگیری انسان ها، ماشین های دیگر و موانع در جاده را مشخص می کند. این فناوری است که مطمئن می‌شود آن ماشین‌های خودران می‌توانند با خیال راحت تردد کنند. باحال، درسته؟ 🚗

در طول دهه گذشته، Computer Vision پیشرفت های زیادی داشته است، به ویژه در ساخت روش های تقسیم بندی و تشخیص اشیا بسیار پیچیده.

این پیشرفت‌ها کاربردهای متنوعی پیدا کرده‌اند، مانند تشخیص تومورها و بیماری‌ها در تصاویر پزشکی، مراقبت از محصولات کشاورزی و حتی هدایت روبات‌ها در مسیریابی. این فناوری واقعاً در حال گسترش است و تأثیر قابل توجهی در زمینه های مختلف دارد.

چالش اصلی در بدست آوردن و آماده سازی داده ها نهفته است. ایجاد یک مجموعه داده تقسیم‌بندی تصویر نیازمند حاشیه‌نویسی انبوهی از تصاویر برای تعریف برچسب‌ها است، که کار بزرگی است. این به منابع زیادی نیاز دارد.

بنابراین، زمانی که بازی تغییر کرد مدل هر چیزی (SAM) وارد صحنه شد SAM انقلابی در این زمینه ایجاد کرد و هر کسی را قادر ساخت تا بدون تکیه بر داده‌های برچسب‌گذاری شده، ماسک‌های تقسیم‌بندی برای داده‌های خود ایجاد کند.

در این مقاله، من شما را از طریق درک SAM، عملکرد آن و نحوه استفاده از آن برای ساخت ماسک راهنمایی خواهم کرد. بنابراین، با فنجان قهوه خود آماده شوید زیرا ما در حال شیرجه هستیم! ☕

پیش نیازها:

پیش نیازهای این مقاله شامل درک اولیه از برنامه نویسی پایتون و دانش اساسی از فراگیری ماشین.

علاوه بر این، آشنایی با مفاهیم تقسیم‌بندی تصویر، بینایی کامپیوتر و چالش‌های حاشیه‌نویسی داده‌ها نیز مفید خواهد بود.

مدل Segment Anything چیست؟

SAM یک مدل زبان بزرگ است که توسط تیم تحقیقاتی فیس بوک (Meta AI) توسعه یافته است. این مدل بر روی یک مجموعه داده عظیم آموزش داده شد 1.1 میلیارد ماسک تقسیم بندی، مجموعه داده SA-1B. این مدل می‌تواند به خوبی به داده‌های دیده نشده تعمیم دهد زیرا بر روی یک مجموعه داده بسیار متنوع آموزش داده شده و واریانس پایینی دارد.

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

چه چیزی SAM را منحصر به فرد می کند؟ این اولین در نوع خود است، تقسیم بندی سریع مدل. دستورات به شما این امکان را می دهند که از طریق متن و اقدامات تعاملی، مدل را در مورد خروجی مورد نظر خود راهنمایی کنید. شما می‌توانید به روش‌های مختلفی به SAM دستور دهید: نقاط، جعبه‌های مرزی، متن‌ها و حتی ماسک‌های پایه.

SAM چگونه کار می کند؟

SAM از معماری مبتنی بر ترانسفورماتور مانند اکثر مدل‌های زبان بزرگ استفاده می‌کند. بیایید به جریان داده ها از طریق اجزای مختلف SAM نگاه کنیم.

پیشنهاد می‌کنیم بخوانید:  نحوه ارسال "چند بخشی/فرم-داده" با درخواست در پایتون

رمزگذار تصویر: هنگامی که تصویری را به SAM ارائه می دهید، ابتدا به Image Encoder ارسال می شود. مطابق با نام خود، این مؤلفه تصویر را در بردارها رمزگذاری می کند. این بردارها نمایانگر ویژگی‌های سطح پایین (لبه‌ها، خطوط کلی) و سطح بالا مانند اشکال شی و بافت استخراج‌شده از تصویر هستند. رمزگذار در اینجا یک است Vision Transformer (ViT) که مزایای زیادی نسبت به CNN های سنتی دارد.

رمزگذار اعلان: ورودی سریعی که کاربر می دهد توسط رمزگذار سریع به جاسازی تبدیل می شود. SAM از تعبیه‌های موقعیتی برای نقاط، اعلان‌های جعبه مرزی و رمزگذارهای متنی برای پیام‌های متنی استفاده می‌کند.

رسیور ماسک: سپس، SAM ویژگی‌های تصویر استخراج‌شده را نقشه‌برداری می‌کند و کدگذاری‌های فوری را برای تولید ماسک، که خروجی ما است، تهیه می‌کند. SAM 3 ماسک تقسیم‌بندی شده برای هر درخواست ورودی ایجاد می‌کند و انتخاب‌هایی را در اختیار کاربران قرار می‌دهد.

چرا از SAM استفاده کنیم؟

با SAM، می‌توانید از تنظیمات گران‌قیمتی که معمولاً برای هوش مصنوعی نیاز است صرفنظر کنید و همچنان نتایج سریعی دریافت کنید. با انواع داده‌ها، مانند تصاویر پزشکی یا ماهواره‌ای، به خوبی کار می‌کند و دقیقاً در نرم‌افزاری که قبلاً برای کارهای تشخیص سریع استفاده می‌کنید، قرار می‌گیرد.

شما همچنین ابزارهایی را دریافت می‌کنید که برای مشاغل خاصی مانند تقسیم‌بندی تصویر طراحی شده‌اند، و تعامل با آن آسان است، چه در حال آموزش آن باشید و چه از آن بخواهید که داده‌ها را تجزیه و تحلیل کند. به‌علاوه، سریع‌تر از سیستم‌های قدیمی‌تر مانند CNN است و در زمان و هزینه شما صرفه‌جویی می‌کند.

tcDOfehN4GLt4bZkN_0uhOPYsZ9B8cBeQaCxf9F6OS6iUN1WESAAWNUb9_vCpTj66TvzeVocZi3i6xKkrMB2cSbj0-UBrjlR3jjBXJfRo1WAYQYiP 7kxXETWDY
چرا از SAM استفاده کنیم؟

نحوه نصب و راه اندازی SAM

اکنون که می دانید SAM چگونه کار می کند، اجازه دهید نحوه نصب و راه اندازی آن را به شما نشان دهم. اولین قدم این است که با دستور زیر بسته را در نوت بوک Jupyter یا Google Colab خود نصب کنید:

pip install 'git+https://github.com/facebookresearch/segment-anything.git'
/content Collecting git+https://github.com/facebookresearch/segment-anything.git Cloning https://github.com/facebookresearch/segment-anything.git to /tmp/pip-req-build-xzlt_n7r Running command git clone --filter=blob:none --quiet https://github.com/facebookresearch/segment-anything.git /tmp/pip-req-build-xzlt_n7r Resolved https://github.com/facebookresearch/segment-anything.git to commit 6fdee8f2727f4506cfbbe553e23b895e27956588 Preparing metadata (setup.py) ... done

مرحله بعدی دانلود وزنه های از پیش آموزش دیده مدل SAM است که می خواهید استفاده کنید.

شما می توانید از بین سه گزینه وزن ایست بازرسی انتخاب کنید: ViT-B (91M)، ViT-L (308M) و ViT-H (پارامترهای 636M).

چگونه مناسب را انتخاب می کنید؟ هر چه تعداد پارامترها بیشتر باشد، زمان لازم برای استنتاج، یعنی تولید ماسک بیشتر می شود. اگر منابع GPU کم و استنتاج سریع دارید، به سراغ ViT-B بروید. در غیر این صورت، ViT-H را انتخاب کنید.

برای تنظیم مسیر چک پوینت مدل دستورات زیر را دنبال کنید:

!wget -q https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
CHECKPOINT_PATH='/content/weights/sam_vit_h_4b8939.pth'


import torch
DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
MODEL_TYPE = "vit_h"

وزنه های مدل آماده است! اکنون، روش‌های مختلفی را به شما نشان می‌دهم که از طریق آن می‌توانید در بخش‌های آینده، دستورات و ماسک‌هایی ایجاد کنید. 🚀

چگونه SAM می تواند ماسک ها را به صورت خودکار تولید کند

SAM می تواند به طور خودکار کل تصویر ورودی را به بخش های مجزا و بدون درخواست خاصی تقسیم کند. برای این کار می توانید از SamAutomaticMaskGenerator سودمندی

برای وارد کردن و مقداردهی اولیه آن با نوع مدل و مسیر چک پوینت، دستورات زیر را دنبال کنید.

from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor


sam = sam_model_registry[MODEL_TYPE](checkpoint=CHECKPOINT_PATH).to(device=DEVICE)


mask_generator = SamAutomaticMaskGenerator(sam)

به عنوان مثال، من تصویری از سگ ها را در دفترچه خود آپلود کرده ام. این تصویر ورودی ما خواهد بود که باید به فرمت پیکسلی RGB (قرمز-سبز-آبی) تبدیل شود تا ورودی مدل باشد.

می توانید این کار را با استفاده از بسته OpenCV Python انجام دهید و سپس از آن استفاده کنید generate() عملکرد ایجاد یک ماسک، همانطور که در زیر نشان داده شده است:

# Import opencv package
import cv2


# Give the path of your image
IMAGE_PATH= '/content/dog.png'
# Read the image from the path
image= cv2.imread(IMAGE_PATH)
# Convert to RGB format
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)


# Generate segmentation mask
output_mask = mask_generator.generate(image_rgb)
print(output_mask)

خروجی تولید شده یک فرهنگ لغت با مقادیر اصلی زیر است:

  • Segmentation: آرایه ای که شکل ماسک دارد
  • area: یک عدد صحیح که مساحت ماسک را بر حسب پیکسل ذخیره می کند
  • bbox: مختصات جعبه مرزی [xywh]
  • Predicted_iou: IOU یک امتیاز ارزیابی برای تقسیم بندی است
پیشنهاد می‌کنیم بخوانید:  توزیع های سبک لینوکس برای رایانه های شخصی قدیمی
zvUNSrvPrv8-Z1idbMLHXKv8iXzWlInik9R2fdJ24HQc5EBxdAgqaiEFTeE4UalWdUvA0R0L9dQuqDDZVucoBWwTMBld9aCJ8NKRTp2v1xE-FRF0FNF8FNF8FKFNF8FNF8FNF8FNF8FNF8FNF8FNF8FNF0FY kuNT6Wss1iMX6c
خروجی تولید شده یک فرهنگ لغت با مقادیر اصلی است

پس چگونه ماسک خروجی خود را تجسم کنیم؟

خوب، این یک تابع ساده پایتون است که فرهنگ لغت تولید شده توسط SAM را به عنوان خروجی می گیرد و ماسک های تقسیم بندی را با مقادیر و مختصات شکل ماسک رسم می کند.

# Function that inputs the output and plots image and mask
def show_output(result_dict,axes=None):
     if axes:
        ax = axes
     else:
        ax = plt.gca()
        ax.set_autoscale_on(False)
     sorted_result = sorted(result_dict, key=(lambda x: x['area']),      reverse=True)
     # Plot for each segment area
     for val in sorted_result:
        mask = val['segmentation']
        img = np.ones((mask.shape[0], mask.shape[1], 3))
        color_mask = np.random.random((1, 3)).tolist()[0]
        for i in range(3):
            img[:,:,i] = color_mask[i]
            ax.imshow(np.dstack((img, mask*0.5)))

بیایید از این تابع برای رسم تصویر ورودی خام و ماسک قطعه‌بندی شده خود استفاده کنیم:

_,axes = plt.subplots(1,2, figsize=(16,16))
axes[0].imshow(image_rgb)
show_output(sam_result, axes[1])
m7RxR_KOL-nSBtptL-dEbsV_EN7w21sqQMiCnfvrr83hwxAhe7jgXWLUhMgjoGzpO4QHgSbnoCOtN5SB__kokKC_OykSCxEo7ntXYd1LihwL35BBl0 jShEmCg9w9w
مدل هر شی را بخش بندی کرده است

همانطور که می بینید، این مدل با استفاده از روش صفر شات در یک حرکت تک تک اشیاء در تصویر را قطعه بندی کرده است! 🌟

نحوه استفاده از SAM با دستورات Bounding Box

گاهی اوقات، ممکن است بخواهیم تنها بخش خاصی از یک تصویر را بخش بندی کنیم. برای رسیدن به این هدف، جعبه‌های مرزبندی ناهموار را برای شناسایی شی در ناحیه مورد نظر وارد کنید و SAM آن را بر این اساس تقسیم می‌کند.

برای پیاده سازی این، وارد و مقداردهی اولیه کنید SamPredictor و استفاده کنید set_image() عملکرد ارسال تصویر ورودی بعد، تماس بگیرید predict تابع، ارائه مختصات جعبه مرزی به عنوان ورودی برای پارامتر box همانطور که در قطعه زیر نشان داده شده است. اعلان جعبه های محدود کننده باید در قسمت باشد [X-min, Y-min, X-max, Y-max] قالب

# Set up the SAM model with the encoded image
mask_predictor = SamPredictor(sam)
mask_predictor.set_image(image_rgb)


# Predict mask with bounding box prompt
masks, scores, logits = mask_predictor.predict(
box=bbox_prompt,
multimask_output=False
)


# Plot the bounding box prompt and predicted mask
plt.imshow(image_rgb)
show_mask(masks[0], plt.gca())
show_box(bbox_prompt, plt.gca())
plt.show()
DoiDVGgozu4ZDeBMyJWbSlCt3CGFnxd7SFlfWFuvuUu_ByZuHc2pA75C2dbaygBwIQqmHcPCBoEsVFaqs_dxpAskPVZxXOoejgu2j0JIrkwUUUu_ByZuHc2pA75C2dbaygBwIQqmHcPCBoEsVFaqs_dxpAskPVZxXOoejgu2j0JIrkwEBKa7 ZrDzvmQLA
کادر سبز رنگ اعلان ورودی ما در این خروجی بود و آبی نمایانگر ماسک پیش بینی شده ما است.

نحوه استفاده از SAM با نقاط به عنوان درخواست

اگر برای نقطه خاصی از تصویر به ماسک شی نیاز داشته باشید چه می کنید؟ شما می توانید مختصات نقطه را به عنوان یک اعلان ورودی به SAM ارائه دهید. سپس مدل سه ماسک تقسیم بندی مرتبط را ایجاد می کند. این در صورت وجود هرگونه ابهام در مورد موضوع اصلی مورد علاقه کمک می کند.

مراحل اول شبیه به آنچه در بخش های قبلی انجام دادیم است. ماژول پیش بینی را با تصویر ورودی مقداردهی کنید. سپس، اعلان ورودی را به عنوان ارائه دهید [X,Y] مختصات به پارامتر point_coords.

# Initialize the model with the input image
from segment_anything import sam_model_registry, SamPredictor
sam = sam_model_registry[MODEL_TYPE](checkpoint=CHECKPOINT_PATH).to(device=DEVICE)
mask_predictor = SamPredictor(sam)
mask_predictor.set_image(image_rgb)
# Provide points as input prompt [X,Y]-coordinates
input_point = np.array([[250, 200]])
input_label = np.array([1])


# Predict the segmentation mask at that point
masks, scores, logits = mask_predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=True,
)

همانطور که ما تنظیم کرده ایم multimask_output پارامتر به عنوان True، سه ماسک خروجی وجود خواهد داشت. بیایید با ترسیم ماسک ها و دستور ورودی آنها، آن را تجسم کنیم.

etMcljU5T2wlLBfbJdV46L4n1I2KUZe2nswYJVFs0Hh-xRFFs-nArO9i5rEr1xU3Er77T7TTn7uenU9Tu1_H4SuSwjGyAtOYe-Jt7_5RvYe-Jt7_5Rv3 BiKSf0RMfWhwVUaQ
در شکل بالا، ستاره سبز نشان دهنده نقطه اعلان است و آبی نشان دهنده ماسک پیش بینی شده است. در حالی که ماسک 1 پوشش ضعیفی دارد، ماسک 2 و 3 دقت خوبی برای نیازهای من دارند.

من همچنین نمرات IOU خودارزیابی شده را برای هر ماسک چاپ کرده ام. IOU مخفف Intersection Over Union است و انحراف بین طرح کلی شی و ماسک را اندازه گیری می کند.

نتیجه

می‌توانید با جمع‌آوری تصاویر خام و استفاده از ابزار SAM برای حاشیه‌نویسی، یک مجموعه داده تقسیم‌بندی مناسب برای حوزه خود بسازید. این مدل حتی در شرایط دشواری مانند نویز یا انسداد عملکرد ثابتی از خود نشان داده است.

در نسخه آینده، آنها با هدف افزایش کاربرپسندی، اعلان های متنی را سازگار می کنند.

امیدواریم این اطلاعات برای شما مفید باشد!

با تشکر از شما برای خواندن! من جس هستم و در Hyperskill متخصص هستم. شما می توانید ما را بررسی کنید دوره های ML بر روی پلت فرم.