داده کاوی 1271 بازدید

«بازشناسی تصویر» (Image Recognition) و «دسته‌بندی» (classification) زمینه‌های در حال رشد در حوزه «یادگیری ماشین» (Machine Learning) محسوب می‌شوند. به طور کلی، «بازشناسی شی» (Object Recognition)، یک ویژگی کلیدی در دسته‌بندی تصاویر به شمار می‌آید و فرصت‌های تجاری برای این حوزه بسیار گسترده است. برای مثال، از دسته‌بندی تصاویر با اهداف زیر استفاده خواهد شد.

  • جایگزینی «گذرواژه» (Password) با «بازشناسی چهره» (Facial Recognition)
  • فراهم آوردن امکان تشخیص مانع برای وسایل نقلیه خودکار
  • شناسایی ویژگی‌های جغرافیایی از تصاویر ماهواره‌ای

موارد بیان شده تنها برخی از مثال‌های متعددی هستند که نشان می‌دهد دسته‌بندی تصاویر چگونه آینده جهانی که بشر در آن زندگی می‌کند را تغییر خواهد داد. در ادامه، نحوه ساخت یک «دسته‌بند» (Classifier) تصاویر آموزش داده می‌شود.

دسته‌بندی تصاویر: خودروها و هواپیماها

در این مثال، دسته‌بندی تصاویر با استفاده از کتابخانه Keras انجام شده است. به طور مشخص، Keras برای ایجاد تمایز بین خودرو و هواپیما آموزش داده می‌شود. در ادامه، دو تصویری که انتظار می‌رود مدل بتواند آن‌ها را از هم تفکیک کند ارائه شده‌اند.

تشخیص تصویر با کتابخانه Keras
(Car (7813125.jpg
تشخیص تصویر با Keras
(Plane (56315795.jpg

این مثال نسبتا ساده است و بنابراین از ۱۰۰ تصویر برای آموزش مدل استفاده شده است (۸۰ داده آموزش، ۲۰ داده آزمون). اگر هدف ساخت یک برنامه کاربردی باشد که بتواند چهره‌ها را با درجه بالایی از صحت شناسایی کند، نیاز به تصاویر بیشتری (صدها یا هزاران تصویر) دارد، زیرا شناسایی اشخاص از روی چهره آن‌ها نسبت به شناسایی دو شی (در اینجا یک خودرو و یک هواپیما) کار دشوارتری است. در راستای حل مساله مطرح شده، ابتدا کتابخانه‌های مورد نیاز «وارد» (Import) می‌شوند.

from keras.layers import Conv2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.preprocessing import image
from keras.layers import MaxPooling2D
from keras.models import Sequential
import numpy as np

اکنون، آنچه «شبکه عصبی پیچشی» (convolutional neural network | CNN) نام دارد، راه‌اندازی می‌شود.

شبکه عصبی پیچشی چیست؟

«شبکه عصبی پیچشی» (Convolutional Neural Network) نوع خاصی از شبکه‌های عصبی است که برای تحلیل تصاویر بصری مورد استفاده قرار می‌گیرد.

  • ابتدا، «پیچش» (Convolution) امکان استخراج ویژگی‌های مناسب را از تصاویر ورودی فراهم می‌کند.
  • در ادامه، «تجمع» (Pooling) امکان کاهشی ابعاد نقشه ویژگی‌ها را به منظور حفظ مهم‌ترین اطلاعات فراهم می‌کند.
  • «مسطح کردن» (ٰFlattening) امکان سازمان‌دهی حجم‌های سه‌بُعدی را در یک‌بُعد فراهم می‌کند.
  • شکل دادن لایه‌های کاملا متصل امکان حصول اطمینان از اتصال به همه فعال‌سازی‌ها در لایه پیشین را فراهم می‌کند.

در ادامه، فرایند بیان شده پیاده‌سازی می‌شود.

classifier = Sequential()
classifier.add(Conv2D(32, (3, 3), input_shape=(64, 64, 3),
               activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))

classifier.add(Conv2D(32, (3, 3), activation='relu'))
classifier.add(MaxPooling2D(pool_size=(2, 2)))
classifier.add(Flatten())

classifier.add(Dense(units=128, activation='relu'))
classifier.add(Dense(units=1, activation='sigmoid'))

اکنون، می‌توان CNN را کامپایل کرد و دسته‌بند را آموزش داد. در اینجا از binary_crossentropy به عنوان «تابع زیان» (Loss Function) استفاده می‌شود. دلیل انتخاب «آنتروپی متقاطع دودویی» (Binary Crossentropy)، آن است که تصاویر بر پایه صفر و یک هستند، برای مثال  0 = car و 1 = plane. هنگامی که به «زیان» (Loss) ارجاع داده می‌شود، منظور درجه خطا در مدل است، شایان ذکر است که زیان بیشتر به معنای وجود خطای دسته‌بندی بیشتر است.

آموزش دسته‌بندی

اکنون زمان آن رسیده که CNN را کامپایل و دسته‌بند را آموزش داد. در اینجا، ۲۰ دوره (۲۰ پاس رو به عقب و رو به جلو که برای آموزش وزن‌های شبکه عصبی مورد استفاده قرار می‌گیرد) در طول ۸۰ گام انتخاب می‌شود.

classifier.compile(optimizer='adam', loss='binary_crossentropy',
                   metrics=['accuracy'])
from keras.preprocessing.image import ImageDataGenerator
train_imagedata = ImageDataGenerator(rescale=1. / 255, shear_range=0.2,
        zoom_range=0.2, horizontal_flip=True)
test_imagedata = ImageDataGenerator(rescale=1. / 255)
training_set = \
    train_imagedata.flow_from_directory('/home/directory/image classification/data/training_set'
        , target_size=(64, 64), batch_size=32, class_mode='binary')
test_set = \
    test_imagedata.flow_from_directory('/home/directory/image classification/data/test_set'
        , target_size=(64, 64), batch_size=32, class_mode='binary')
history=classifier.fit_generator(training_set, steps_per_epoch=80, epochs=20,
                         validation_data=test_set,
                         validation_steps=80)

اکنون که مدل آموزش دید، می‌توان زیان و صحت مدل را در طول ۲۰ دوره ترسیم کرد.

import matplotlib.pyplot as plt
print(history.history.keys())
# Loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['loss', 'val_loss'], loc='upper left')
plt.show()
# Accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['acc', 'val_acc'], loc='upper left')
plt.show()

در ادامه، تصویر نمودار ارائه شده است.

تشخیص تصویر با شبکه عصبی پیچشی
صحت مدل
زیان مدل
زیان مدل

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

classifier.compile(optimizer='adam', loss='binary_crossentropy',
                   metrics=['accuracy'])
from keras.preprocessing.image import ImageDataGenerator
train_imagedata = ImageDataGenerator(rescale=1. / 255, shear_range=0.2,
        zoom_range=0.2, horizontal_flip=True)
test_imagedata = ImageDataGenerator(rescale=1. / 255)
training_set = \
    train_imagedata.flow_from_directory('/home/directory/image classification/data/training_set'
        , target_size=(64, 64), batch_size=32, class_mode='binary')
test_set = \
    test_imagedata.flow_from_directory('/home/directory/image classification/data/test_set'
        , target_size=(64, 64), batch_size=32, class_mode='binary')
history=classifier.fit_generator(training_set, steps_per_epoch=80, epochs=2,
                         validation_data=test_set,
                         validation_steps=80)

دسته‌بندی تصویر

پس از آموزش مجدد، می‌توان از تصاویر دیده نشده یک خودرو و یک هواپیما برای آزمودن مدل استفاده کرد. در این مثال، هنگامی که تصویر خودرو به مدل داده می‌شود، مدل به درستی آن را به عنوان «۰» (خودرو) تشخیص می‌دهد.

>>> test_image = \
...     image.load_img('/home/directory/image classification/data/7813125.jpg'
...                    , target_size=(64, 64))
>>> test_image = image.img_to_array(test_image)
>>> test_image = np.expand_dims(test_image, axis=0)
>>> result = classifier.predict(test_image)
>>> training_set.class_indices
{'cars': 0, 'planes': 1}
>>> result
array([[0.]], dtype=float32)

اکنون، تصویر هواپیما به مدل داده می‌شود تا از این جهت نیز ارزیابی شود.

>>> test_image = \
...     image.load_img('/home/directory/image classification/data/56315795.jpg'
...                    , target_size=(64, 64))
>>> test_image = image.img_to_array(test_image)
>>> test_image = np.expand_dims(test_image, axis=0)
>>> result = classifier.predict(test_image)
>>> training_set.class_indices
{'cars': 0, 'planes': 1}
>>> result
array([[1.]], dtype=float32)

این بار، دسته‌بند به درستی تصویر هواپیما را تشخیص داد.

نتیجه‌گیری

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

اگر نوشته بالا برای شما مفید بوده، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

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

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.

بر اساس رای 2 نفر

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

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