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

معرفی
در این پست ما یک مدل تشخیص بیماری های گیاهی با استفاده از یادگیری عمیق خواهیم ساخت. ما از مجموعه دادههای جدید بیماریهای گیاهی از 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 ذخیره کنیم.
وویلا! ما با موفقیت یک مدل یادگیری عمیق برای تشخیص بیماری ها در برگ گیاهان ایجاد کرده ایم.
با تشکر از شما برای خواندن!