شعار زيفيرنت

كشف خلايا الدم في الصورة باستخدام نهج ساذج

التاريخ:

تم نشر هذه المقالة كجزء من مدونة علوم البيانات.

تتمثل أساسيات مشكلات اكتشاف الكائنات في كيفية استخدام بنى التعلم العميق المختلفة التي يمكننا استخدامها لحل مشكلات اكتشاف الكائنات. دعونا أولاً نناقش بيان المشكلة الذي سنعمل عليه.

جدول المحتويات

  1. فهم بيان المشكلة كشف خلايا الدم
  2. ارتباط مجموعة البيانات
  3. نهج ساذج لحل مشكلة اكتشاف الكائن
  4. خطوات لتنفيذ نهج ساذج
      • قم بتحميل مجموعة البيانات
      • استكشاف البيانات
      • إعداد مجموعة البيانات للنهج الساذج
      • إنشاء مجموعة التدريب والتحقق من الصحة
      • تحديد بنية نموذج التصنيف
      • تدريب النموذج
      • قم بعمل تنبؤات
  5. وفي الختام

فهم بيان المشكلة كشف خلايا الدم

المشكلة بيان

بالنسبة لمجموعة معينة من صور خلايا الدم ، يتعين علينا اكتشاف خلايا الدم البيضاء أو خلايا الدم البيضاء في الصور.
الآن ، هذه صورة عينة من مجموعة البيانات. يمكنك أن ترى أن هناك بعض المناطق المظللة باللون الأحمر ومنطقة زرقاء أو أرجوانية ، كما ترى.

نهج ساذج

 المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915281-understanding-the-problem-statement-blood-cell-detection

في الصورة أعلاه ، هناك مناطق مظللة باللون الأحمر وهي كرات الدم الحمراء أو خلايا الدم الحمراء ، والمناطق المظللة باللون الأرجواني ، وهي خلايا الدم البيضاء ، وبعض الأجزاء الصغيرة المظللة باللون الأسود ، وهي الصفائح الدموية.

كما ترى في هذه الصورة بالذات ، لدينا كائنات متعددة وفئات متعددة.

نقوم بتحويل هذا إلى مشكلة كائن واحد من فئة واحدة من أجل التبسيط. هذا يعني أننا سننظر في WBCs فقط.

ومن ثم ، فإن فئة واحدة فقط ، WBC ، وتجاهل بقية الفئات. أيضًا ، سنحتفظ بالصور التي تحتوي على WBC واحد فقط.

لذلك ستتم إزالة الصور التي تحتوي على العديد من WBCs من مجموعة البيانات هذه. إليك كيفية اختيار الصور من مجموعة البيانات هذه.

نهج ساذج
المصادر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915281-understanding-the-problem-statement-blood-cell-detection

لذلك ، قمنا بإزالة الصورة 2 والصورة 5 لأن الصورة 5 لا تحتوي على WBC ، بينما الصورة 2 بها 2 WBCs والصور الأخرى جزء من مجموعة البيانات. وبالمثل ، سيكون لمجموعة الاختبار أيضًا WBC واحد فقط.

الآن ، لكل صورة ، لدينا مربع محيط حول كرات الدم البيضاء. وكما ترى في هذه الصورة ، لدينا اسم الملف كـ 1.jpg ، وهذه هي إحداثيات المربع المحيط للمربع المحيط حول WBC.

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915281-understanding-the-problem-statement-blood-cell-detection

في القسم التالي ، سنغطي أبسط نهج أو نهج ساذج لحل مشكلة اكتشاف الكائن.

ارتباط مجموعة البيانات

الآن ، أبسط طريقة هي تقسيم الصور إلى رقع متعددة ، لذلك بالنسبة لهذه الصورة ، قسمت الصورة إلى أربع تصحيحات.

نهج ساذج

المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

نقوم بتصنيف كل من هذه التصحيحات ، لذا فإن التصحيح الأول لا يحتوي على WBC ، بينما التصحيح الثاني به WBC ، وبالمثل لا يحتوي التصحيح الثالث والرابع على أي WBC.

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

نحن على دراية بعملية التصنيف وكيفية بناء خوارزميات التصنيف. لذلك يمكننا بسهولة تصنيف كل من هذه التصحيحات الفردية على أنها نعم ولا لتمثيل WBC.

الآن ، في الصورة أدناه ، يمكن تمثيل التصحيح (المربع الأخضر) الذي يحتوي على WBC ، على أنه المربع المحيط ، لذلك في هذه الحالة ، سنأخذ إحداثيات هذا التصحيح ، ونأخذ قيمة الإحداثيات هذه ، ونعيدها على أنها المربع المحيط لـ WBCs.

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

الآن من أجل تنفيذ هذا النهج ، سنحتاج أولاً إلى إعداد بيانات التدريب الخاصة بنا. الآن قد يكون سؤال واحد ، لماذا نحتاج لإعداد بيانات التدريب أصلاً؟ لدينا بالفعل الصور والمربعات المحيطة مع هذه الصور.

حسنًا ، إذا كنت تتذكر ، فلدينا بيانات التدريب الخاصة بنا بالتنسيق التالي حيث لدينا مربع محيط WBC وإحداثيات المربع المحيط.

نهج ساذج

المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

الآن ، لاحظ أن لدينا إحداثيات المربع المحيط للصورة الكاملة ، لكننا سنقسم هذه الصورة إلى أربع بقع. لذا سنحتاج إلى إحداثيات المربع المحيط لجميع هذه الرقع الأربع. لذا فإن سؤالنا التالي هو كيف نفعل ذلك؟

علينا تحديد بيانات تدريب جديدة حيث لدينا اسم الملف كما ترون الصورة أدناه. لدينا التصحيحات المختلفة ولكل من هذه التصحيحات ، لدينا قيم Xmin و Xmax و Ymin و Ymax التي تشير إلى إحداثيات هذه الرقع ، وأخيرًا ، المتغير المستهدف لدينا وهو WBC. هل WBC موجود في الصورة أم لا؟

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

الآن في هذه الحالة ستصبح مشكلة تصنيف بسيطة. لذلك لكل صورة ، سنقسمها إلى أربع تصحيحات مختلفة وننشئ إحداثيات المربع المحيط لكل من هذه التصحيحات.

الآن السؤال التالي هو كيف ننشئ إحداثيات الصندوق المحيط؟ لذا فالأمر بسيط حقًا.

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

ضع في اعتبارك أن لدينا صورة بحجم (640 * 480). إذن هذا الأصل سيكون (0,0،640). الصورة أعلاه لها محور س ومحور ص ، وهنا لدينا قيمة إحداثيات مثل (480 ، XNUMX).

الآن ، إذا اكتشفنا نقطة المنتصف فستكون (320,240،0,0). بمجرد أن نحصل على هذه القيم ، يمكننا بسهولة معرفة إحداثيات كل من هذه التصحيحات. لذلك بالنسبة للتصحيح الأول ، سيكون Xmin و Ymin لدينا (320,240،XNUMX) و Xmax ، Ymax سيكون (XNUMX،XNUMX).

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

وبالمثل ، يمكننا إيجاده في البقع الثانية والثالثة والرابعة. بمجرد أن نحصل على قيم الإحداثيات أو قيم المربع المحيط لكل من هذه التصحيحات. المهمة التالية هي تحديد ما إذا كان هناك WBC داخل هذا التصحيح أم لا.

نهج ساذج
المصدر: https://courses.analyticsvidhya.com/courses/take/Applied-Computer-Vision-using-Deep-Learning/lessons/13915284-naive-approach-one

هنا يمكننا أن نرى بوضوح أن التصحيح 2 يحتوي على WBC بينما لا تحتوي التصحيحات الأخرى عليه ، لكن لا يمكننا تسميته يدويًا لكل صورة على كل من التصحيحات في مجموعة البيانات.

الآن في القسم التالي ، سنقوم بتنفيذ النهج الساذج.

خطوات لتنفيذ نهج ساذج

في القسم الأخير ، ناقشنا الطريقة الساذجة لاكتشاف الكائنات. دعونا الآن نحدد خطوات تنفيذ هذا النهج في مشكلة الكشف عن خلايا الدم.

هذه هي الخطوات التي ستتبع: -

  1. قم بتحميل مجموعة البيانات
  2. استكشاف البيانات
  3. جهز مجموعة البيانات للنهج الساذج
  4. إنشاء مجموعة التدريب والتحقق من الصحة
  5. تحديد بنية نموذج التصنيف
  6. درب النموذج
  7. قم بعمل تنبؤات

لذلك دعنا ننتقل إلى القسم التالي ، وننفذ هذه الخطوات المذكورة أعلاه.

1 تحميل المكتبات ومجموعة البيانات المطلوبة

لنبدأ أولاً بتحميل المكتبات المطلوبة. إنه "حزن " والباندا ثم لدينا "matplotlib " من أجل تصور البيانات وقمنا بتحميل بعض المكتبات للعمل مع الصور وتغيير حجم الصورة وأخيراً مكتبة الشعلة.

# استيراد المكتبات المطلوبة استيراد numpy كـ np import pandas كـ pd import matplotlib.pyplot كـ plt٪ matplotlib استيراد مضمن لنظام التشغيل من PIL استيراد صورة من skimage.transform استيراد تغيير حجم استيراد الشعلة من استيراد الشعلة nn

الآن سنقوم بإصلاح قيمة أولية عشوائية.

# تحديد قيم البذور العشوائية لإيقاف البذور العشوائية المحتملة = 42 rng = np.random.RandomState (البذور)

هنا سنقوم بتركيب محرك الأقراص حيث يتم تخزين مجموعة البيانات على محرك الأقراص.

# قم بتحميل محرك الأقراص من google.colab import drive drive.mount ('/ content / drive')

الآن بما أن البيانات الموجودة على محرك الأقراص متاحة بتنسيق zip. سيتعين علينا فك ضغط هذه البيانات وهنا سنقوم بفك ضغط البيانات. لذلك يمكننا أن نرى أن جميع الصور يتم تحميلها وتخزينها في مجلد يسمى الصور. في نهاية هذا المجلد ، لدينا ملف CSV وهو train.csv.

# قم بفك ضغط مجموعة البيانات من drive! unzip / content / drive / My Drive / train_zedkk38.zip
نهج ساذج
المصدر: المؤلف

2 استكشاف البيانات

لذلك دعونا نقرأ ملف CSV ونتعرف على المعلومات المخزنة في ملف "train.csv" هذا.

## قراءة بيانات الملف الهدف = pd.read_csv ('train.csv') data.shape

لذلك نحن هنا نطبع الصفوف القليلة الأولى من ملف CSV. يمكننا أن نرى أن الملف يحتوي على image_names جنبًا إلى جنب مع cell_type الذي سيشير إلى RBC أو WBC وما إلى ذلك. أخيرًا ، ينسق الصندوق المحيط لهذا الكائن المحدد في هذه الصورة بالذات.

data.head ()
نهج ساذج
المصدر: المؤلف

لذلك إذا تحققنا من عدد القيم لـ RBC و WBC والصفائح الدموية. سنرى أن كرات الدم الحمراء لديها العدد الأقصى للقيمة متبوعًا بـ كرات الدم البيضاء والصفائح الدموية.

data.cell_type.value_counts ()
نهج ساذج

المصدر: المؤلف

الآن من أجل البساطة ، سننظر فقط في WBC هنا. ومن ثم قمنا باختيار البيانات باستخدام WBC فقط. الآن يمكنك أن ترى أن لدينا image_names وفقط cell_type WBC مقابل هذه الصور. أيضًا ، لدينا إحداثيات الصندوق المحيط.

(data.loc [data ['cell_type'] == 'WBC']). head ()
نهج ساذج
المصدر: المؤلف

دعونا نلقي نظرة على بعض الصور من مجموعة البيانات الأصلية وشكل هذه الصور. يمكننا أن نرى أن شكل هذه الصور هو (480,640,3،XNUMX،XNUMX). هذه صورة RGB بثلاث قنوات وهذه هي الصورة الأولى في مجموعة البيانات.

image = plt.imread ('images /' + '1.jpg') طباعة (image.shape) plt.imshow (صورة)
نهج ساذج
المصدر: المؤلف

الآن الخطوة التالية هي إنشاء تصحيحات من هذه الصورة. لذلك سوف نتعلم كيفية تقسيم هذه الصورة إلى أربع بقع. نحن نعلم الآن أن الصورة على شكل (640 ، 480). ومن ثم ستكون هذه النقطة الوسطى (320,240،0) والمركز هو (0 ، XNUMX).

نهج ساذج
المصدر: المؤلف

إذن لدينا إحداثيات كل هذه التصحيحات في الصورة ، وها نحن ذاهبون للاستفادة من هذه الإحداثيات وإنشاء التصحيحات. إذن ، تنسيق هذه الإحداثيات سيكون Ymin و Ymax و Xmin و Xmax. لدينا هنا (Ymin، Ymax) هي (0، 240) و (Xmin، Xmax) تساوي (0، 320). لذلك يشير هذا بشكل أساسي إلى التصحيح الأول. وبالمثل ، لدينا image_2 و image_3 و image_4 للبقع التالية الثانية والرابعة. إذن فهذه عملية يمكننا إنشاء تصحيحات من الصورة.

# إنشاء 4 تصحيحات من الصورة # format ymin، ymax، xmin، xmax image_1 = image [0: 240، 0: 320،:] image_2 = image [0: 240، 320: 640،:] image_3 = صورة [240: 480 ، 0: 320 ،:] image_4 = صورة [240: 480 ، 320: 640 ،:]
نهج ساذج
المصدر: المؤلف

نحتاج الآن إلى تعيين قيمة مستهدفة لهذه التصحيحات. لذلك من أجل القيام بذلك نحسب التقاطع على الاتحاد حيث يتعين علينا معرفة منطقة التقاطع ومنطقة الاتحاد.

IU المصدر: المؤلف

لذا فإن منطقة التقاطع هي ببساطة هذا المستطيل المحدد ، لمعرفة المنطقة التي نحتاجها لمعرفة إحداثيات Xmin و Xmax و Ymin و Ymax لهذا المستطيل.

def iou (box1، box2): Irect_xmin، Irect_ymin = max (box1 [0]، box2 [0])، max (box1 [2]، box2 [2]) Irect_xmax، Irect_ymax = min (box1 [1]، box2 [ 1]) ، min (box1 [3] ، box2 [3]) إذا Irect_xmax <Irect_xmin أو Irect_ymax <Irect_ymin: target = inter_area = 0 else: inter_area = np.abs ((Irect_xmax - Irect_xmin) * (Irect_ymax - Irect_ymin)) box1_area = (box1 [1] -box1 [0]) * (box1 [3] -box1 [2]) box2_area = (box2 [1] -box2 [0]) * (box2 [3] -box2 [2]) union_area = box1_area + box2_area-inter_area iou = inter_area / union_area target = int (iou> 0.1) هدف إرجاع

لدينا إحداثيات المربع المحيط الأصلي من ملف القطار CSV. عندما استخدمت هاتين القيمتين كمدخلات في "أنا " الوظيفة التي حددناها للهدف هي 1. يمكنك المحاولة باستخدام تصحيحات مختلفة بناءً على أنك ستحصل على القيمة المستهدفة.

box1 = [320، 640، 0، 240] box2 = [93، 296، 1، 173] iou (box1، box2)

الناتج هو 0. الآن الخطوة التالية هي تحضير مجموعة البيانات.

3 إعداد مجموعة البيانات للنهج الساذج

لقد درسنا واستكشفنا صورة واحدة فقط من مجموعة البيانات. لذلك دعونا ننفذ هذه الخطوات لجميع الصور في مجموعة البيانات. لذا أولاً وقبل كل شيء هنا البيانات الكاملة التي لدينا.

data.head ()
بيانات

المصدر: المؤلف

الآن ، نقوم بتحويل أنواع الخلايا هذه حيث أن كرات الدم الحمراء هي صفر ، و WBC واحد ، والصفائح الدموية نوعان.

data ['cell_type'] = بيانات ['cell_type']. استبدل ({'RBC': 0، 'WBC': 1، 'Platelets': 2})

الآن علينا تحديد الصور التي تحتوي على WBC واحد فقط.

نهج ساذج
المصدر: المؤلف

لذلك أولاً وقبل كل شيء ، نقوم بإنشاء نسخة من مجموعة البيانات ثم نحتفظ فقط بـ WBCs ونزيل أي صورة بها أكثر من WBC.

## احتفظ فقط بـ WBCs الفردية data_wbc = data.loc [data.cell_type == 1] .copy () data_wbc = data_wbc.drop_duplicates (subset = ['image_names'، 'cell_type']، keep = False)

حتى الآن اخترنا الصور. سنقوم بتعيين إحداثيات التصحيح بناءً على أحجام صور الإدخال لدينا. نحن نقرأ الصور واحدة تلو الأخرى ونخزن إحداثيات المربع المحيط لـ WBC لهذه الصورة بالذات. نقوم باستخراج البقع من هذه الصورة باستخدام إحداثيات التصحيح التي حددناها هنا.

ثم نكتشف القيمة المستهدفة لكل من هذه التصحيحات باستخدام وظيفة IoU التي حددناها. أخيرًا ، نقوم هنا بتغيير حجم البقع إلى الحجم القياسي (224 ، 224 ، 3). نحن هنا نقوم بإنشاء بيانات الإدخال النهائية والبيانات المستهدفة لكل من هذه التصحيحات.

# إنشاء قوائم فارغة X = [] Y = [] # مجموعة إحداثيات التصحيح patch_1_coordinates = [0، 320، 0، 240] patch_2_coordinates = [320، 640، 0، 240] patch_3_coordinates = [0، 320، 240، 480 ] patch_4_coordinates = [320، 640، 240، 480] للمعرف ، الصف في data_wbc.iterrows (): # read image image = plt.imread ('images /' + row.image_names) bb_coordinates = [row.xmin، row. xmax، row.ymin، row.ymax] # extract patches patch_1 = image [patch_1_coordinates [2]: patch_1_coordinates [3]، patch_1_coordinates [0]: patch_1_coordinates [1]،:] patch_2 = image [patch_2_coordinates [2]: patch_2_coordinates [3] 2]، patch_0_coordinates [2]: patch_1_coordinates [3]،:] patch_3 = image [patch_2_coordinates [3]: patch_3_coordinates [3]، patch_0_coordinates [3]: patch_1_coordinates [4]،:] patch_4 = image [patch_2_coordinates [4]: patch_3_coordinates [4]، patch_0_coordinates [4]: patch_1_coordinates [1]،:] # تعيين القيم الافتراضية target_2 = target_3 = target_4 = target_0 = inter_area = 1 # اكتشف ما إذا كان التصحيح يحتوي على الكائن ## لـ patch_1 target_1 = iou (patch_2_coordinates، bb_coordinates) ## for patch_2 target_2 = iou (patch_3_coordinates، bb_coordinates) ## for patch_3 target_3 = iou (patch_4_coordinates، bb_coordinates) ## for patch_4 target_4 = iou (patch_1_coordinates، bb_coordinates) # resize the patch_1 (patch_224، (224، 3، 2)، save_range = True) patch_2 = تغيير الحجم (patch_224، (224، 3، 3)، save_range = True) patch_3 = تغيير الحجم (patch_224، (224، 3، 4)، save_range = True ) patch_4 = تغيير الحجم (patch_224، (224، 3، 1)، save_range = True) # إنشاء بيانات الإدخال النهائي X.extend ([patch_2، patch_3، patch_4، patch_1]) # إنشاء بيانات الهدف Y.extend ([target_2، target_3 ، target_4، target_XNUMX]) # قم بتحويل هذه القوائم إلى مصفوفة عددية مفردة X = np.array (X) Y = np.array (Y)

الآن ، دعنا نطبع شكل بياناتنا الأصلية والبيانات الجديدة التي أنشأناها للتو. يمكننا أن نرى أنه كان لدينا في الأصل 240 صورة. الآن قمنا بتقسيم هذه الصور إلى أربعة أجزاء لدينا (960,224,224,3،XNUMX،XNUMX،XNUMX). هذا هو شكل الصور.

# 4 تصحيحات لكل صورة data_wbc.shape، X.shape، Y.shape

لذلك دعونا نلقي نظرة سريعة على إحدى هذه الصور التي أنشأناها للتو. فهذه هي صورتنا الأصلية وهذه هي آخر رقعة أو التصحيح الرابع لهذه الصورة الأصلية. يمكننا أن نرى أن الهدف المحدد هو واحد.

image = plt.imread ('images /' + '1.jpg') plt.imshow (صورة)
محاور
المصدر: المؤلف

إذا تحققنا من أي تصحيح آخر ، فلنفترض أنني أريد التحقق من التصحيح الأول من هذه الصورة ، لذلك هنا سيضع الهدف على أنه صفر. سوف تحصل على التصحيح الأول. وبالمثل ، يمكنك التأكد من تحويل جميع الصور إلى تصحيحات وتعيين الأهداف وفقًا لذلك.

plt.imshow (X [0] .astype ('uint8'))، Y [0]
صورة
المصدر: المؤلف

4 إعداد مجموعات التدريب والتحقق من الصحة

الآن بعد أن أصبح لدينا مجموعة البيانات. سنقوم بإعداد مجموعات التدريب والتحقق. لاحظ الآن أن لدينا هنا شكل الصور كـ (224,224,3،XNUMX،XNUMX).

# 4 تصحيحات لكل صورة data_wbc.shape، X.shape، Y.shape

الخرج هو: -

((240 ، 6) ، (960 ، 224 ، 224 ، 3) ، (960 ،))

في PyTorch ، نحتاج إلى القنوات أولاً. لذلك سنقوم بتحريك المحور الذي سيكون له الشكل (3,224,224،XNUMX،XNUMX).

X = np.moveaxis (X، -1، 1) X. شكل

الخرج هو: -

(960، 3، 224، 224)

الآن نحن هنا نقوم بتطبيع قيم بكسل الصورة.

X = X / X.max ()

باستخدام وظيفة تقسيم اختبار القطار ، سنقوم بإنشاء مجموعة قطار وتحقق من الصحة.

من sklearn.model_selection ، استيراد train_test_split X_train ، X_valid ، Y_train ، Y_valid = train_test_split (X ، Y ، test_size = 0.1 ، random_state = seed) X_train.shape ، X_valid.shape ، Y_train.shape ، Y_valid.shape

ناتج الكود أعلاه هو: -

((864 ، 3 ، 224 ، 224) ، (96 ، 3 ، 224 ، 224) ، (864 ،) ، (96 ،)) 

الآن ، سنحول كلاً من مجموعات التدريب ومجموعات التحقق من الصحة إلى موترات ، لأن هذه "حزن " صفائف.

X_train = torch.FloatTensor (X_train) Y_train = torch.FloatTensor (Y_train) X_valid = torch.FloatTensor (X_valid) Y_valid = torch.FloatTensor (Y_valid)

5 نموذج بناء

في الوقت الحالي ، سنقوم ببناء نموذجنا ، لذلك قمنا هنا بتثبيت مكتبة هي ملخص نموذج PyTorch.

! نقطة تثبيت pytorch-model-Summary
بناء نموذج
المصدر: المؤلف

يستخدم هذا ببساطة لطباعة ملخص النموذج في PyTorch. نقوم الآن باستيراد وظيفة الملخص من هنا.

من ملخص الاستيراد pytorch_model_summary

هنا هو الهيكل الذي حددناه لنهجنا الساذج. لذلك قمنا بتعريف نموذج متسلسل حيث لدينا طبقة Conv2d الخاصة بنا مع عدد القنوات المدخلات كـ 3 وعدد المرشحات هو 64 ، وحجم المرشحات هو 5 والخطوة مضبوطة على 2. لدينا وظيفة تنشيط ReLU الخاصة بنا لهذه الطبقة Conv2d. طبقة تجمع بحجم النافذة 4 والخطوة 2 ثم الطبقة التلافيفية. الآن نقوم بتسوية الناتج من طبقة Conv2d وأخيرًا طبقة خطية أو طبقة كثيفة ووظيفة التنشيط السيني.

## نموذج بنية النموذج = nn.Sequential (nn.Conv2d (in_channels = 3، out_channels = 64، kernel_size = 5، stride = 2)، nn.ReLU ()، nn.MaxPool2d (kernel_size = 4، stride = 2)، nn.Conv2d (in_channels = 64 ، out_channels = 64 ، kernel_size = 5 ، خطوة = 2) ، nn.Flatten () ، nn.inear (40000 ، 1) ، nn.Sigmoid ())

إذا قمنا هنا بطباعة النموذج ، فستكون هذه هي بنية النموذج التي حددناها.

طباعة (نموذج)
الموديل
المصدر: المؤلف

باستخدام دالة التلخيص ، يمكننا إلقاء نظرة على ملخص النموذج. لذلك سيعيد لنا هذا الطبقات شكل الإخراج من كل طبقة من هذه الطبقات ، وعدد المعلمات القابلة للتدريب لكل طبقة من هذه الطبقات. حتى الآن نموذجنا جاهز.

طباعة (ملخص (نموذج ، X_train [: 1]))
قطار
المصدر: المؤلف

الآن النموذج جاهز للقطار.

6 تدريب النموذج

دعونا ندرب هذا النموذج. لذلك سنقوم بتحديد وظائف الخسارة والمحسن الخاصة بنا. لقد حددنا الانتروبيا الثنائية على أنها محسِّن للخسارة وآدم. ثم نقوم بنقل النموذج إلى وحدة معالجة الرسومات. نحن هنا نأخذ دفعات من الصورة المدخلة من أجل تدريب هذا النموذج.

## معيار الخسارة والمحسن = torch.nn.BCELoss () محسن = torch.optim.Adam (model.parameters () ، lr = 0.001)
## جهاز GPU إذا كان torch.cuda.is_available (): model = model.cuda () معيار = معايير.

لذلك أخذنا دفعات من x_train لدينا واستخدمنا هذه الدفعات. سنقوم بتدريب هذا النموذج لما مجموعه 15 حقبة. لقد قمنا أيضًا بتعيين مُحسِّن. Zero_grad () ونقوم بتخزين المخرجات هنا.
نقوم الآن بحساب الخسائر وتخزين جميع الخسائر وتنفيذ الانتشار العكسي وتحديث المعلمات. أيضا ، نحن نطبع الخسارة بعد كل حقبة.
في المخرجات ، يمكننا أن نرى أنه في كل مرحلة تتناقص الخسارة. لذا فإن التدريب كامل لهذا النموذج.

# حجم الدفعة للنموذج batch_size = 32 # تحديد نموذج مرحلة التدريب. randperm (X_train.size () [15]) # لتتبع خسارة التدريب training_loss = [] # for loop للتدريب على دفعات لـ i في النطاق (0، X_train.size () [0.0]، batch_size): # أخذ المؤشرات من مؤشرات القيم المُنشأة عشوائيًا = التبديل [i: i + batch_size] # الحصول على الصور والتسميات الخاصة بدفعة_x، batch_y = X_train [مؤشرات]، Y_train [مؤشرات] إذا torch.cuda.is_available (): batch_x، batch_y = batch_x.cuda (). float ()، batch_y.cuda (). float () # مسح كل محسن التدرجات المتراكمة .zero_grad () # مخرجات حساب الدُفعة الصغيرة = النموذج (دُفعة_س) # حساب الخسارة لفقدان الدُفعة المصغرة = المعيار (outputs.squeeze () ، batch_y) # تخزين الخسارة لكل دفعة صغيرة training_loss.append (loss.item ()) # حساب خسارة التدرجات. backward () #تحديث المعلمات optimizer.step () training_loss = np.average (training_loss) print ('epoch: t'، epoch، 't training loss: t'، training_loss)
قطار
المصدر: المؤلف

7 قم بعمل تنبؤات

دعونا الآن نستخدم هذا النموذج لعمل تنبؤات. لذلك أنا هنا فقط آخذ المدخلات الخمسة الأولى من مجموعة التحقق ونقلها إلى Cuda.

الإخراج = النموذج (X_valid [: 5] .to ('cuda')). cpu (). detach (). numpy ()

هذا هو ناتج هذه الصور الخمس الأولى التي التقطناها. الآن يمكننا أن نرى أن الناتج الأول هو عدم وجود WBC أو وجود WBC.

الناتج

هذا هو الناتج:

صفيف ([0.00641595] ، [0.01172841] ، [0.99919134] ، [0.01065345] ، [0.00520921]] ، dtype = float32)

لذلك دعونا أيضًا نرسم الصور. يمكننا أن نرى أن هذه هي الصورة الثالثة ، وهنا يقول النموذج أن هناك WBC ويمكننا أن نرى أن لدينا WBC في هذه الصورة.

plt.imshow (np.transpose (X_valid [2]))
com.imshow
المصدر: المؤلف

وبالمثل ، يمكننا التحقق من وجود صورة أخرى ، لذلك سنلتقط الصورة الأولى للمخرجات. يمكنك أن ترى الصورة الناتجة ، كانت هذه الصورة تصحيح الإدخال ولا يوجد WBC في هذا التصحيح.

plt.imshow (np.transpose (X_valid [1]))
matplotlib
المصدر: المؤلف

 

كانت هذه طريقة بسيطة جدًا لعمل تنبؤات أو تحديد التصحيح أو جزء من الصورة الذي يحتوي على WBC.

وفي الختام

فهم التنفيذ العملي لاكتشاف خلايا الدم باستخدام مجموعة بيانات الصور باستخدام نهج ساذج. هذا هو التحدي الحقيقي لحل مشكلة العمل وتطوير النموذج. أثناء العمل على بيانات الصورة ، يجب عليك تحليل بعض المهام مثل المربع المحيط ، وحساب قيمة IoU ، ومقياس التقييم. المستوى التالي (المهمة المستقبلية) من هذه المقالة هو أن صورة واحدة يمكن أن تحتوي على أكثر من كائن واحد. المهمة هي الكشف عن الكائن في كل من هذه الصور.

آمل أن تساعدك المقالات على فهم كيفية اكتشاف خلايا الدم ببيانات الصور ، وكيفية بناء نماذج الكشف ، وسنستخدم هذه التقنية ، ونطبقها في مجال التحليل الطبي.

عن المؤلف

مرحبًا ، أنا كاجال كوماري. أكملت درجة الماجستير من IIT (ISM) Dhanbad في علوم وهندسة الكمبيوتر. اعتبارًا من الآن ، أعمل كمهندس تعلم الآلة في حيدر أباد. هنا ملفي الشخصي على Linkedin إذا كنت تريد التواصل معي.

ملاحظات نهاية

شكرا للقراءة!

آمل أن تكون قد استمتعت بالمقال. إذا أعجبك ، شاركه مع أصدقائك أيضًا. لا تتردد في التعليق إذا كان لديك أي أفكار يمكن أن تحسن كتابة مقالتي.

إذا كنت ترغب في قراءة مدوناتي السابقة ، يمكنك القراءة منشورات مدونة علوم البيانات السابقة من هنا.

الوسائط الموضحة في هذه المقالة ليست مملوكة لشركة Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة

الدردشة معنا

أهلاً! كيف يمكنني مساعدك؟