در گذشته، رویکردهای کلاسیک زیادی وجود داشت که یه مدل پایه (مثل U-Net) رو برمیداشتن و اون رو روی دیتاستهای تخصصی «فاین-تیون» یا همون تنظیم دقیق میکردن. با اینکه فاین-تیون کردن خوب جواب میده، اما با ظهور مدلهایی مثل GPT-2 و GPT-3، جامعه یادگیری ماشین کمکم تمرکزش رو به سمت توسعه راهکارهایی با یادگیری «صفر-شات» (zero-shot) برد.
یادگیری صفر-شات به این معنیه که یک مدل بتونه کاری رو انجام بده، بدون اینکه قبلن هیچ مثال آموزشی مستقیمی برای اون کار دیده باشه. مفهوم صفر-شات نقش مهمی بازی میکنه چون اجازه میده مرحله فاین-تیون کردن رو نادیده بگیریم، با این امید که مدل به اندازه کافی هوشمند باشه تا هر کاری رو در لحظه حل کنه.
تو حوزه بینایی کامپیوتر، شرکت متا در سال ۲۰۲۳ مدل معروف و همهکاره «Segment Anything Model» یا همون SAM رو منتشر کرد. این مدل این امکان رو فراهم کرد که کارهای بخشبندی با کیفیتی قابل قبول و به صورت صفر-شات انجام بشن.
با اینکه نتایج SAM در مقیاس بزرگ خیلی چشمگیر بود، چند ماه بعد، گروه تحلیل تصویر و ویدیوی آکادمی علوم چین (CASIA IVA) مدل FastSAM رو منتشر کرد. همونطور که از کلمه «Fast» (سریع) پیداست، FastSAM محدودیتهای سرعت SAM رو هدف قرار داده و تونسته فرایند استنتاج (inference) رو تا ۵۰ برابر سریعتر کنه، در حالی که کیفیت بخشبندی رو هم بالا نگه داشته.
توی این مقاله، قراره نگاهی به معماری FastSAM، گزینههای ممکن برای اجراش و اینکه چی باعث میشه نسبت به مدل استاندارد SAM «سریع» باشه بندازیم. علاوه بر این، یه مثال کد هم میبینیم تا درکمون از موضوع عمیقتر بشه.
فصل دوم: معماری FastSAM – زیر کاپوت چه خبره؟
فرایند استنتاج توی FastSAM تو دو مرحله اتفاق میافته:
- بخشبندی تمام اجزا (All-instance segmentation): هدف اینه که برای تمام اشیای موجود در تصویر، ماسکهای بخشبندی تولید بشه.
- انتخاب با راهنمای پرامپت (Prompt-guided selection): بعد از اینکه همه ماسکهای ممکن به دست اومد، این مرحله با توجه به پرامپت (دستور) ورودی، ناحیهای از تصویر که با اون پرامپت مطابقت داره رو برمیگردونه.
بیاین با بخشبندی تمام اجزا شروع کنیم.
بخشبندی تمام اجزا
قبل از اینکه به صورت تصویری معماری رو بررسی کنیم، بهتره به مقاله اصلی خود مدل مراجعه کنیم:
«معماری FastSAM بر پایه YOLOv8-seg ساخته شده — یک شناساگر اشیا که به شاخه بخشبندی نمونه (instance segmentation) مجهز شده و از متد YOLACT استفاده میکنه.»
مقاله Fast Segment Anything
این تعریف شاید برای کسایی که با YOLOv8-seg و YOLACT آشنا نیستن یکم پیچیده به نظر بیاد. در هر صورت، برای اینکه معنی این دو مدل رو بهتر روشن کنم، یه توضیح ساده میدم که چی هستن و چطور استفاده میشن.
YOLACT (You Only Look at CoefficienTs)
YOLACT یک مدل کانولوشنی برای بخشبندی نمونه به صورت زنده (real-time) هست که تمرکزش روی سرعت بالای شناساییه. این مدل از مدل YOLO الهام گرفته و عملکردی قابل مقایسه با مدل Mask R-CNN داره.
YOLACT از دو ماژول یا شاخه اصلی تشکیل شده:
- شاخه پروتوتایپ (Prototype branch): این شاخه مجموعهای از ماسکهای بخشبندی به نام «پروتوتایپ» (prototypes) یا نمونههای اولیه رو ایجاد میکنه.
- شاخه پیشبینی (Prediction branch): این شاخه کار شناسایی اشیا رو با پیشبینی کادرهای مرزی (bounding boxes) انجام میده و بعد ضریبهای ماسک رو تخمین میزنه. این ضریبها به مدل میگن که چطور پروتوتایپها رو به صورت خطی با هم ترکیب کنه تا ماسک نهایی برای هر شی ساخته بشه.
برای استخراج ویژگیهای اولیه از تصویر، YOLACT از یک شبکه ResNet و بعد از اون از یک شبکه هرمی ویژگی (Feature Pyramid Network یا FPN) برای به دست آوردن ویژگیهای چندمقیاسی استفاده میکنه. هر کدوم از سطوح P (که تو تصویر نشون داده شده) ویژگیهایی با اندازههای مختلف رو با استفاده از کانولوشن پردازش میکنن (مثلن P3 شامل کوچکترین ویژگیهاست، در حالی که P7 ویژگیهای سطح بالاتر تصویر رو ثبت میکنه). این رویکرد به YOLACT کمک میکنه تا اشیا رو در مقیاسهای مختلف در نظر بگیره.
YOLOv8-seg
YOLOv8-seg مدلیه که بر پایه YOLACT ساخته شده و از همون اصول در مورد پروتوتایپها استفاده میکنه. این مدل هم دو «هِد» (head) یا سر داره:
- هِد شناسایی (Detection head): برای پیشبینی کادرهای مرزی و کلاسها استفاده میشه.
- هِد بخشبندی (Segmentation head): برای تولید ماسکها و ترکیب اونها به کار میره.
تفاوت کلیدی اینه که YOLOv8-seg از معماری پایه YOLO به جای معماری پایه ResNet و FPN که تو YOLACT استفاده میشد، بهره میبره. این باعث میشه YOLOv8-seg در زمان استنتاج سبکتر و سریعتر باشه.
هر دو مدل YOLACT و YOLOv8-seg از تعداد پیشفرض پروتوتایپ k = 32 استفاده میکنن که یک هایپرپارامتر قابل تنظیمه. تو بیشتر سناریوها، این عدد یه تعادل خوب بین سرعت و عملکرد بخشبندی ایجاد میکنه.
تو هر دو مدل، برای هر شی شناسایی شده، یک بردار با اندازه k = 32 پیشبینی میشه که وزنهای مربوط به پروتوتایپهای ماسک رو نشون میده. این وزنها بعدن برای ترکیب خطی پروتوتایپها و تولید ماسک نهایی برای اون شی استفاده میشن.
معماری اصلی FastSAM
معماری FastSAM بر پایه YOLOv8-seg هست اما مثل YOLACT، یک FPN رو هم در خودش جا داده. این مدل هم هِد شناسایی و هم هِد بخشبندی داره و از k = 32 پروتوتایپ استفاده میکنه. اما از اونجایی که FastSAM کار بخشبندی تمام اشیای ممکن در تصویر رو انجام میده، گردش کارش با YOLOv8-seg و YOLACT فرق داره:
- اول، FastSAM با تولید k = 32 ماسک تصویر، کار بخشبندی رو انجام میده.
- بعد این ماسکها با هم ترکیب میشن تا ماسک بخشبندی نهایی تولید بشه.
- در حین پردازش نهایی (post-processing)، FastSAM ناحیهها رو استخراج میکنه، کادرهای مرزی رو محاسبه میکنه و برای هر شی، بخشبندی نمونه رو انجام میده.
نکتهای در مورد پردازش نهایی:
با اینکه تو مقاله به جزئیات پردازش نهایی اشارهای نشده، اما میشه دید که تو مخزن رسمی گیتهاب FastSAM از متد cv2.findContours()
کتابخونه OpenCV تو مرحله پیشبینی استفاده شده.
# استفاده از متد cv2.findContours() در مرحله پیشبینی
# منبع: مخزن FastSAM (FastSAM / fastsam / prompt.py)
def _get_bbox_from_mask(self, mask):
mask = mask.astype(np.uint8)
contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
x1, y1, w, h = cv2.boundingRect(contours[0])
x2, y2 = x1 + w, y1 + h
if len(contours) > 1:
for b in contours:
x_t, y_t, w_t, h_t = cv2.boundingRect(b)
# ادغام چند کادر مرزی در یک کادر
x1 = min(x1, x_t)
y1 = min(y1, y_t)
x2 = max(x2, x_t + w_t)
y2 = max(y2, y_t + h_t)
h = y2 - y1
w = x2 - x1
return [x1, y1, x2, y2]
در عمل، چندین روش برای استخراج ماسکهای نمونه از ماسک بخشبندی نهایی وجود داره. بعضی از مثالها شامل تشخیص کانتور (که تو FastSAM استفاده شده) و تحلیل مولفههای همبند (cv2.connectedComponents()
) هستن.
فصل سوم: آموزش مدل – چطور اینقدر سریع شد؟
محققان FastSAM از همون دیتاست SA-1B که توسعهدهندههای SAM استفاده کرده بودن، بهره بردن اما ردیاب CNN رو فقط روی ۲ درصد از دادهها آموزش دادن. با وجود این، ردیاب CNN به عملکردی قابل مقایسه با SAM اصلی دست پیدا میکنه، در حالی که برای بخشبندی به منابع خیلی کمتری نیاز داره. در نتیجه، استنتاج در FastSAM تا ۵۰ برابر سریعتره!
برای اطلاع، دیتاست SA-1B شامل ۱۱ میلیون تصویر متنوع و ۱.۱ میلیارد ماسک بخشبندی با کیفیت بالاست.
چی باعث میشه FastSAM از SAM سریعتر باشه؟ مدل SAM از معماری Vision Transformer (ViT) استفاده میکنه که به نیاز محاسباتی سنگینش معروفه. در مقابل، FastSAM کار بخشبندی رو با استفاده از شبکههای عصبی کانولوشنی (CNN) انجام میده که خیلی سبکتر هستن.
فصل چهارم: انتخاب با راهنمای پرامپت – چطور به مدل دستور بدیم؟
«تسک بخشبندی هر چیزی» (segment anything task) شامل تولید یک ماسک بخشبندی برای یک پرامپت مشخصه که این پرامپت میتونه به شکلهای مختلفی ارائه بشه.
پرامپت نقطهای (Point Prompt)
بعد از به دست آوردن چندین پروتوتایپ برای یک تصویر، میشه از یک پرامپت نقطهای استفاده کرد تا نشون بدیم شی مورد نظر در یک ناحیه خاص از تصویر قرار داره (یا نداره). در نتیجه، نقطه مشخص شده روی ضریبهای ماسکهای پروتوتایپ تاثیر میذاره.
مشابه SAM، مدل FastSAM هم اجازه میده چندین نقطه انتخاب کنیم و مشخص کنیم که آیا به پیشزمینه (foreground) تعلق دارن یا پسزمینه (background). اگه یک نقطه پیشزمینه که مربوط به شی مورد نظره تو چندین ماسک ظاهر بشه، میشه از نقاط پسزمینه برای فیلتر کردن ماسکهای نامربوط استفاده کرد.
با این حال، اگه بعد از فیلتر کردن هنوز چندین ماسک وجود داشته باشن که با پرامپتهای نقطهای مطابقت کنن، از ادغام ماسکها برای به دست آوردن ماسک نهایی برای اون شی استفاده میشه.
علاوه بر این، نویسندههای مقاله از عملگرهای مورفولوژیکی برای صاف کردن شکل ماسک نهایی و حذف آرتیفکتها و نویزهای کوچیک استفاده میکنن.
پرامپت باکسی (Box Prompt)
پرامپت باکسی شامل انتخاب ماسکی میشه که کادر مرزیش بیشترین «اشتراک بر روی اجتماع» (Intersection over Union یا IoU) رو با کادر مرزی مشخص شده در پرامپت داشته باشه.
پرامپت متنی (Text Prompt)
به طور مشابه، برای پرامپت متنی، ماسکی انتخاب میشه که بهترین تطابق رو با توضیحات متنی داشته باشه. برای رسیدن به این هدف، از مدل CLIP استفاده میشه:
- اول، امبدینگها (embeddings) برای پرامپت متنی و k = 32 ماسک پروتوتایپ محاسبه میشن.
- بعد، شباهت بین امبدینگ متن و پروتوتایپها محاسبه میشه. پروتوتایپی که بیشترین شباهت رو داره، پردازش نهایی میشه و به عنوان خروجی برگردونده میشه.
به طور کلی، برای بیشتر مدلهای بخشبندی، پرامپت دادن معمولن در سطح پروتوتایپ اعمال میشه.
فصل پنجم: منابع و مثالهای بیشتر
در زیر لینک مخزن رسمی FastSAM قرار داره که شامل یک فایل README.md واضح و مستنداته.
اگه قصد دارین از یک رزبری پای (Raspberry Pi) استفاده کنین و میخواین مدل FastSAM رو روی اون اجرا کنین، حتمن به این مخزن گیتهاب هم سر بزنین: Hailo-Application-Code-Examples. این مخزن شامل تمام کدها و اسکریپتهای لازم برای راهاندازی FastSAM روی دستگاههای لبه (edge devices) هست.
در این مقاله، ما به FastSAM نگاهی انداختیم — یک نسخه بهبود یافته از SAM. با ترکیب بهترین روشها از مدلهای YOLACT و YOLOv8-seg، مدل FastSAM کیفیت بالای بخشبندی رو حفظ میکنه و در عین حال به افزایش سرعت قابل توجهی در پیشبینی دست پیدا میکنه، به طوری که استنتاج رو چندین ده برابر سریعتر از SAM اصلی انجام میده.
توانایی استفاده از پرامپتها با FastSAM یک راه انعطافپذیر برای به دست آوردن ماسکهای بخشبندی برای اشیای مورد نظر فراهم میکنه. علاوه بر این، نشون داده شده که جدا کردن انتخاب با راهنمای پرامپت از بخشبندی تمام اجزا، پیچیدگی رو کاهش میده.
منابع
- [۱] FastSAM for Image Segmentation Tasks — Explained Simply | Towards Data Science
دیدگاهتان را بنویسید