برنامه نویسی

تشخیص بیماری های گیاهی با استفاده از یادگیری عمیق

معرفی

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

مجموعه داده

مجموعه داده شامل حدود 87000 تصویر از برگ های گیاه سالم و بیمار است. مجموعه داده شامل 38 کلاس مختلف از برگ های گیاه است. کل مجموعه داده به نسبت 80/20 مجموعه آموزشی و اعتبار سنجی با حفظ ساختار دایرکتوری تقسیم می شود. یک دایرکتوری جدید نیز برای آزمایش مدل ایجاد می شود.

واردات کتابخانه ها

import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras import models, layers
import matplotlib.pyplot as plt
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تنظیم Hyperparameters

ما فراپارامترها را برای مدل تنظیم خواهیم کرد. ما از هایپرپارامترهای زیر استفاده خواهیم کرد:

image_size = 256
batch_size =32
channels = 3
epoches = 12
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در حال بارگیری مجموعه داده

برای بارگذاری مجموعه داده از image_dataset_from_directory تابع. این تابع مسیر دایرکتوری مجموعه داده را می گیرد و a را برمی گرداند tf.data.Dataset هدف – شی. را tf.data.Dataset شی یک ابزار قدرتمند برای ساخت خطوط لوله ورودی برای مدل های TensorFlow است. به ما این امکان را می دهد که به راحتی داده ها را از دیسک بارگذاری کنیم، تبدیل ها را اعمال کنیم و داده ها را به مدل خود وارد کنیم.

dataset = tf.keras.preprocessing.image_dataset_from_directory(
    '../input/new-plant-diseases-dataset/',
    shuffle = True,
    image_size = (image_size, image_size),
    batch_size = batch_size
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ذخیره و چاپ نام کلاس ها

class_names = dataset.class_names
print(class_names)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تجسم تصاویر

plt.figure(figsize=(10, 10))
for image_batch, label_batch in dataset.take(1):
    for i in range(12):
        ax = plt.subplot(3, 4, i+1)
        plt.imshow(image_batch[i].numpy().astype("uint8"))
        plt.title(class_names[label_batch[i]])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در کد بالا ما اولین دسته از تصاویر و برچسب ها را از مجموعه داده می گیریم و سپس تصاویر را با برچسب های مربوطه ترسیم می کنیم.

تقسیم مجموعه داده

ما مجموعه داده را به مجموعه آموزش، اعتبار سنجی و آزمایش تقسیم خواهیم کرد.

def get_dataset_partitions_tf(ds, train_split=0.8, val_split=0.1, test_split=0.1, shuffle=True, shuffle_size = 10000):
    ds_size = len(ds)

    if shuffle:
        ds = ds.shuffle(shuffle_size, seed = 12)

    train_size = int(train_split * ds_size)
    val_size = int(val_split*ds_size)

    train_ds = ds.take(train_size)

    val_ds = ds.skip(train_size).take(val_size)
    test_ds = ds.skip(train_size).skip(val_size)

    return train_ds, val_ds, test_ds
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

train_ds, val_ds, test_ds = get_dataset_partitions_tf(dataset)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دریافت طول دوره آموزشی، اعتبار سنجی و مجموعه تست

print("Len train_set = ", len(train_ds))
print("Len val_set = ", len(val_ds))
print("Len test_set = ", len(test_ds))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

Caching، Prefetching و Batching مجموعه داده

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
val_ds = val_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
test_ds = test_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

تغییر اندازه و تغییر مقیاس تصاویر

resize_and_rescale = tf.keras.Sequential([
    layers.experimental.preprocessing.Resizing(image_size, image_size),
    layers.experimental.preprocessing.Rescaling(1.0/255)
])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در بالا ما اندازه تصاویر را به اندازه مشخص شده تغییر می دهیم و تصاویر را در محدوده 0 تا 1 تغییر می دهیم.

افزایش داده ها

data_augumentation = tf.keras.Sequential([
    layers.experimental.preprocessing.RandomFlip("horizontal_and_vertical"),
    layers.experimental.preprocessing.RandomRotation(0.2)
])
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ساخت مدل

input_shape = (batch_size, image_size, image_size, channels)
num_classes = 38
model = models.Sequential([
    resize_and_rescale, 
    data_augumentation,
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
    layers.MaxPooling2D((2, 2)), 
    layers.Conv2D(64, kernel_size = (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)), 
    layers.Conv2D(64, kernel_size = (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)), 
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)), 
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)), 
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)), 
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(num_classes, activation='softmax'),
])

model.build(input_shape)

model.summary()
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما از یک مدل ترتیبی با لایه های زیر استفاده می کنیم:

  • تغییر اندازه و تغییر مقیاس لایه – این لایه اندازه تصاویر را به اندازه مشخص شده تغییر می دهد و تصاویر را در محدوده 0 تا 1 تغییر می دهد.
  • لایه افزایش داده – این لایه افزایش داده ها را روی تصاویر انجام می دهد. افزایش داده ها تکنیکی برای ایجاد مصنوعی داده های آموزشی جدید از داده های آموزشی موجود است. این به جلوگیری از برازش بیش از حد کمک می کند و به تعمیم بهتر مدل کمک می کند.
  • لایه کانولوشنال – این لایه روی تصویر ورودی کانولوشن انجام می دهد. پیچیدگی یک عملیات ریاضی است که دو ورودی مانند ماتریس تصویر و یک فیلتر یا کرنل را می گیرد. فیلتر روی تصویر ورودی اعمال می شود و خروجی یک نقشه ویژگی است.
  • حداکثر لایه ادغام – این لایه حداکثر ادغام را روی تصویر ورودی انجام می دهد. Max Pooling تکنیکی برای کاهش ابعاد تصویر ورودی است. این کار با گرفتن حداکثر مقدار از قسمتی از تصویر که توسط کرنل پوشانده شده است انجام می شود.
  • صاف کردن لایه – این لایه تصویر ورودی را به یک بعد مسطح می کند.
  • لایه متراکم – این لایه عملیات خروجی = فعال سازی (نقطه(ورودی، هسته) + بایاس) را انجام می دهد. برای انجام طبقه بندی روی تصویر ورودی استفاده می شود.

تدوین مدل

model.compile(
    optimizer='adam', 
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    metrics = ['accuracy']
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما در حال کامپایل کردن مدل با پارامترهای زیر هستیم:

  • بهینه ساز – این بهینه ساز است که برای به روز رسانی وزن های مدل استفاده می شود. ما از بهینه ساز Adam استفاده می کنیم.
  • ضرر – زیان – این تابع ضرر است که برای محاسبه ضرر مدل استفاده می شود. ما از تابع تلفات متقاطع طبقه بندی پراکنده استفاده می کنیم.
  • معیارهای – این معیاری است که برای ارزیابی عملکرد مدل استفاده می شود. ما از متریک دقت استفاده می کنیم.

آموزش مدل

history = model.fit(
    train_ds, 
    epochs = epoches,
    batch_size = batch_size,
    verbose=1,
    validation_data = val_ds
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما در حال آموزش مدل با پارامترهای زیر هستیم:

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

ارزیابی مدل

model.evaluate(test_ds)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

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

ذخیره مدل

model.save("model.h5")
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ما مدل را با فرمت h5 ذخیره می کنیم. فرمت h5 یک فرمت فایل داده ای است که برای ذخیره وزن و معماری مدل استفاده می شود. ما می توانیم مدل را از فایل h5 با استفاده از تابع load_model () بارگذاری کنیم.

نتیجه

در این وبلاگ یاد گرفتیم که چگونه از یادگیری عمیق برای تشخیص بیماری های برگ گیاه استفاده کنیم. ما یاد گرفتیم که چگونه با استفاده از Keras API یک مدل یادگیری عمیق بسازیم. ما یاد گرفتیم که چگونه یک مدل متوالی با لایه‌های کانولوشن، لایه‌های تجمع حداکثر، لایه‌های مسطح، لایه‌های متراکم و غیره بسازیم. نحوه کامپایل مدل را با بهینه‌ساز Adam، تابع تلفات متقاطع طبقه‌بندی پراکنده و متریک دقت یاد گرفتیم. ما یاد گرفتیم که چگونه مدل را بر روی مجموعه داده آموزشی آموزش دهیم و مدل را روی مجموعه داده آزمایشی ارزیابی کنیم. ما یاد گرفتیم که چگونه مدل را با فرمت h5 ذخیره کنیم.

وویلا! ما با موفقیت یک مدل یادگیری عمیق برای تشخیص بیماری ها در برگ گیاهان ایجاد کرده ایم.

با تشکر از شما برای خواندن!

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

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

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

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