تشخیص بافت های سرطانی


Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 118

Notice: A non well formed numeric value encountered in /home/mgabir/public_html/wp-content/plugins/crayon-syntax-highlighter/crayon_formatter.class.php on line 119

یکی از نکات جالب در پژوهش های حوزه هوش مصنوعی  ، کاربرد های فراوان در حوزه های مختلف  با توجه به ماهیت ذاتی اون هست . یکی از شاخه های کاربردی هوش مصنوعی ، شاخه پزشکی هست که ما تشخیص بافت های سرطانی رو برای بررسی انتخاب کردیم .

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

برای ایجاد یک سیستم که بتونه بافت های تومور دار رو از روی تصویر های بافت شناسی پیدا کنه ،  باید مباحث یادگیری انتقال (Transfer Learning) و شبکه های عصبی پیچشی(Convolutional Neural Networks) رو بررسی کنیم.

تشخیص بافت های سرطانی بخشی از رقاب وب سایت kaggle هست ، که در اون بهترین محققان در سراسر جهان برای به دست آوردن بهترین طبقه بندی، رقابت می کنند. البته ما در این مطلب روی یه بخش خاص از این پروژه تمرکز داریم ولی با چیزایی که یاد تو این مطلب یاد می گیرید میتونید عمیق تر وارد این مبحث بشید.

نمونه منفی ( بدون تومور)

نمونه منفی ( بدون تومور)

نمونه مثبت( با تومور)نمونه مثبت( با تومور)

سرطان دگرنشین (Metastatic)

بیاید برای درک اصل موضوع به چندتا نمونه نگاه کنیم.

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

الان که به این تصویر نگاه میکنید میتونید سلول های تومور دار رو تشخیص بدید ؟! والا شما که هیچی منم نمیتونم .

مسئله ما اینجا خیلی سخت تر از پیدا کردن یه ماشین یا یه پرنده داخل یه تصویر هست ! و از اونجایی که پزشکی هم نخوندیم ( مهندسی رو بیشتر از پزشکی دوست دارم ) پس احتمالاً نمیتونیم تصاویر بالارو طبقه بندی کنیم. بیاید دعا کنیم که طبقه بندی کننده ما بتونه الگوهای درست رو برای تشخیص درست ، شبیه به تصویر زیر یادبگیره.

نمونه های دسته بندی شده ( ۱ برای تومور ها ۰ برای بدون تومور ها)

با مراجعه به Libre Pathology متوجه میشیم که دگرنشین های  گره های لنفاوی مشخصات زیر رو دارن:

  • تجمعی از سلول های بیگانه ( ویژگی اصلی)
    • ( موقعیت سنتی : سینوس های زیرکپسولی)
  • سلول هایی که در سیتولوژیک  ویژگی های بدخیم بودن دارند
    • پلومورفیسم هسته ای ( تغییر در اندازه، شکل و رنگ)
    • آتپیپی هسته ای :
      • بزرگ شدن هسته ای
      • غشاء هسته نامنظم
      • الگوی کروماتین نامنظم، esp. عدم تقارن
      • هسته ای بزرگ یا نامنظم
    • چهره فراوان میتوز ها
  • سلول هایی که در معماریشان چینش بدخیمی مشاهده شد ؛ بسیار متغیر – وابسته به نوع  و تفاوت تومور .
    • تشکیل غده
    • سلول های تنها
    • خوشه های کوچک از سلولها

در حالی که دست یابی به یک عملکرد مناسب در طبقه بندی بدون داشتن یک دانش فراگیر ممکنه ، ولی داشتن یه درک اولیه از موضوع خیلی ارزشمنده.

با این اوصاف اگر ما انتظار داریم که برنامه ای که مینویسیم راه حلی پیشرفته باشه  ، باید حتماً  یک آشنایی کلی با موضوع سلول ها ، سرطان و بافت شانسی داشته باشیم همچنین باید روش های اکتشافی و تحقیقاتی  که برای حل مسئله  مفید هست رو به کار ببریم.

صرف نظر از سناریویی که میخوایم انتخاب کنیم، شروع کردن از یک راه حل کلی و سپس بهبود مرحله به مرحله اون ، ایده مناسبیه. خب ، بریم سراغ پروژه خودمون یعنی تشخیص بافت های سرطانی!

داده

همونطور که توضیح دادم این پروژه بخشی از رقابت وب‌سایت kaggle هست ، داده ها و دیتاست رو میتونید از صفحه این رقابت دانلود کنید.

اجازه بدید کار رو با راه اندازی داده هامون شروع کنیم.

در کد بالا ما اومدیم و دو  پوشه با نام های   ../training و ../validation ایجاد کردیم که هرکدوم شامل زیر پوشه های ۰ و ۱ هستن که قرار نمونه های متناظر رو در اونها قرار بدیم . این کار برای ImageDataGenerators  که بعداً از اون استفاده می‌کنیم مفیده .

دیتاست آموزش شامل ۱۵۳،۰۰۰ نمونه در دو کلاس مختلف است.
دیتاست تست شامل ۷۰،۰۰۰ نمونه در دو کلاس مختلف است .

اجازه بدید چند نمونه مثبت رو برای بررسی اینکه آیا داده های ما به درستی بارگذاری شده اند یا نه ، انتخاب کنیم:

نمونه های بارگذاری شده مثبت

و یه دسته از نمونه های منفی

نمونه های بارگذاری شده منفی

خب ، به نظر میرسه داده ها به خوبی بارگذاری شدن ، الان میتونیم بریم سراغ بخش اصلی و هسته برنامه.

یادگیری انتقال

تو این  پروژه، ما  از Learning Transfer استفاده می‌کنیم، اما برای درکش ، لازمه که با اصول شبکه های عصبی Convolutional آشنا بشیم. برای این منظور من سری مطالب بلاگ فرادرس رو پیشنهاد میکنم(بررسی شبکه عصبی کانولوشن (CNN)).

 

بیایید نگاهی به نمودار زیر که اهداف لایه های خاص رو در CNN نشون میده  داشته باشیم.

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

ایده یادگیری انتقال  اینه  که لایه هایی  که میتونن ویژگی های عمومی مثل لبه ها یا اشکال رو استخراج کنن، مجددا استفاده کنیم.

سعی نکنید قهرمان بازی در بیارید. -Andrej Karpathy

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

تعداد زیادی مدل های CNN مثل Xception یا NasNet وجود دارن که با استفاده از حجم عظیمی از داده ها(ImageNet) آموزش دیدن ، بنابراین ما میتونیم با استفاده از اونها سرعت و دقت کارمون رو زیاد کنیم و کار رو با استفاده از وزن های(Weights) از پیش آموزش داده شده شروع کنیم.

چندین و چند روش برای انجام این کار وجود داره ، ولی ایده خوب اینه که منتج به قانون زیر بشه .

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

بنابر این اگر ما یه شبکه از پیش آموزش داده درباره نژاد سگ ها داشته باشیم ، برای اضافه کردن یک نژاد جدید به اون نیاز نیست کل شبکه رو مجدداً آموزش بدیم . ما میتونیم استخراج کننده ویژگی های سطح پایین رو فریز کنیم و فقط روی طبقه بندی کننده های سطح بالا تمرکز کنیم.

خلاصه بگم : فرض کنید یه عکس از یه نژاد خواص سگ داریم ، خب میدونید که سگ ها ویژگی هایی دارن که بعضاً شبیه هم هستن و تکراری محسوب میشن ، حالا حرف ما اینجا اینه که بیایم و بگیم که به اون ویژگی هایی که شبیه هم هستن و تکراری محسوب میشن کاری نداشته باش و ویژگی های دیگه که خیلی خواص هستن رو بهشون توجه کن 

اما اگر دیتاست ما کلاً با دیتاست اصلی (ImageNet) تفاوت داشه باشه چی ؟

در واقع، دیتاست  سرطان هیستوپاتولوژیک ما به نظر می رسه تو این دسته است!

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

با وجود اینکه این کار  به همون اندازه سریع نیست که فقط طبقه بندی های سطح بالا تر رو تنظیم کنیم ، ولی ما هنوز به دلیل استفاده از وزن های از پیش مقداری دهی شده و  معماری CNN که به خوبی کارایی خودش رو نشون داده   همچنان از یادگیری انتقال استفاده میکنیم.

ما در شناساگر بافت های سرطانی از دو مدل پیش آموزش دیده یعنی Xception و NasNet استفاده می کنیم.

مدل تشخیص سرطان

این معماری مدل ماست که  با  استفاده از معماری Xception و NasNet  در کنار هم، ایجاد شده.

و کد های این معماری به شکل زیر هست.

 

لازم به ذکر که  که مدل بالا یک نقطه شروع خوبه ،  اما برای رسیدن به کارایی بالاتر ، قطعا باید تصحیح بشه ، با پارامتر ها ولایه ها بازی کنید .

داده افزایی(data augmentation)

در حالیکه ممکنه در نگاه اول ، دیتاست ما که شامل ۱۷۰ هزار تصویر برچسب زده شده هست مناسب به نظر بیاد ولی ، برای اینکه نتیجه بهتری رو شاهد باشیم باید سعی کنیم تعداد داده هامون رو بیشتر کنیم. یک راه برای این کار استفاده از داده افزاییه  که عملی مصنوعی هست. 

داده افزایی یعنی تغییراتی رو روی تصویر اصلی انجام بدیم که  سیستم فکر کنه اون تصویر یه تصویر جدیده  ، ولی کماکان محتوای تصویر اصلی رو داره ، یعنی یه جور کلاه شرعی .

به تصویر زیر نگاه کنید ، تصویر زیر نشون میده که چطور ما میتونیم با استفاده از یک تصویر اصلی ۶ تصویر دیگه رو بسازیم. اینجا که خوب نگاه میکنید میبیند که تصویر یکیه ولی ما با اعمالی شبیه چرخش ، آینه کردن تصویر جدید تولید کردیم ! ( موقعیت بخش سفید رو دقت کنید )

کدهایی که برای داده افزایی در پروژه ما یعنی شناساگر بافت سرطانی استفاده شده.

آموزش دادن

بالاخره  میتونیم بریم سراغ فرآیند آموزش دادن. مراحل آموزش رو در طی ۱۲ دوره (epochs) انجام میدیم و بعد از هردوره معیار های loss و accuracy  رو بررسی میکنیم.

 

علاوه بر نمودار های آموزش و اعتبار سنجی ، باید منحنی مشخصه عملکرد سیستم رو با معیار های سنجش Kaggle’s  بررسی کنیم.

بالاترین میزان دقتی که برنامه ما بهش  رسیده ~۰٫۹۶ هست ، که یعنی طبقه بندی کننده ما ۹۶ درصد نمونه هارو میتونه درست طبقه بندی کنه و بهمون بگه که تصویر دارای یک تومور هست یا نه !

در ادامه ؟

بعد از خوندین این مطلب ، باید فهمیده باشید که یادگیری ماشینی تا چه حد برای حل مسائل زندگی قدرتمنده. خوب بهش فکر کنید ، ما تونستیم فقط به چیزی حدود ۳۰۰ خط کد پایتون یه تشخیص دهنده بافت های سرطانی رو بنویسیم ! ، اگر عمری بود و فرصتی پیش اومده سعی دارم که مطالب دیگه ای رو هم در حوزه یادگیری ماشینی منتشرکنم. 

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

محمد قبادی

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

مطالب مرتبط
ارسال یک نظر