keras در بینایی ماشین

نویسنده:
شرکت بینا پردازان هوشمند سپاهان
تاریخ انتشار:
22 خرداد 1404
دیدگاه ها:
Keras در بینایی ماشین

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

بینایی ماشین نحوه درک و تعامل ماشین‌ها با جهان را متحول کرده و در برنامه‌هایی از خودروهای خودران تا تصویربرداری پزشکی به‌کار می‌رود. در صدر فریم‌ورک‌های یادگیری عمیقی که توسعه در بینایی ماشین را ساده و کارآمد می‌کنند، Keras قرار دارد—یک API سطح بالا برای شبکه‌های عصبی که با پایتون نوشته شده است. Keras با هدف سهولت و کاربرپسندی طراحی شده و به پژوهشگران و توسعه‌دهندگان امکان می‌دهد مدل‌های پیشرفته بینایی را با کمترین حجم کد نمونه‌سازی، ساخت و پیاده‌سازی کنند.در این مطلب جامع وبلاگی، Keras را در بستر بینایی ماشین بررسی می‌کنیم. به مفاهیم اصلی شبکه‌های عصبی کانولوشنال (CNN)، پیش‌پردازش داده‌ها، لایه‌ها و امکانات داخلی، یادگیری انتقالی، و تکنیک‌های پیشرفته‌ای مانند تقویت داده و ریزتنظیم مدل خواهیم پرداخت. چه در آستانه شروع به یادگیری باشید و چه به‌دنبال بهبود روند کاری خود، این راهنما با مثال‌های کد به شما کمک می‌کند تا از Keras در پروژه‌های بعدی بینایی ماشین خود بهره‌مند شوید.

چرا Keras برای بینایی ماشین؟

  1. سهولت استفاده
    Keras پیچیدگی‌های عملیات TensorFlow را به فراخوانی‌های API ساده تبدیل می‌کند. در چند خط کد می‌توانید مدل‌های قدرتمند بینایی بسازید.
  2. مدولاریتی و انعطاف‌پذیری
    طراحی مدولار به شما اجازه می‌دهد لایه‌ها، بهینه‌سازها و توابع فعال‌سازی را ترکیب کنید. در صورت نیاز به رفتار سفارشی، می‌توانید لایه‌ها یا مدل‌ها را از کلاس پایه ارث ببرید.
  3. ادغام با TensorFlow
    از آنجا که Keras به‌صورت یکپارچه در TensorFlow 2.x تحت tf.keras قرار دارد، از بهینه‌سازی‌های TensorFlow، آموزش توزیع‌شده و امکانات پیاده‌سازی مانند TensorFlow Serving و TensorFlow Lite بهره‌مند می‌شوید.
  4. اکوسیستم غنی
    از مدل‌های ازپیش‌تعلیم‌دیده در tf.keras.applications تا ابزارهای پیش‌پردازش داده (tf.keras.preprocessing) و تقویت تصویر (tf.keras.preprocessing.image.ImageDataGenerator)، Keras تمام نیازهای بینایی ماشین را پوشش می‌دهد.

راه‌اندازی محیط

قبل از شروع، باید کتابخانه‌های موردنیاز را نصب کنید. می‌توانید یک محیط مجازی بسازید و TensorFlow (شامل Keras) را به‌صورت زیر نصب نمایید:

python3 -m venv keras-cv-env
source keras-cv-env/bin/activate
pip install --upgrade pip
pip install tensorflow matplotlib numpy

نکته: برای شتاب‌سخت‌افزاری GPU، به‌جای tensorflow از tensorflow-gpu استفاده کرده و مطمئن شوید که نسخه‌های CUDA و cuDNN سازگار نصب شده‌اند.


مفاهیم اصلی: شبکه‌های عصبی کانولوشنال

در قلب مسائل بینایی ماشین، شبکه‌های عصبی کانولوشنال (CNN) قرار دارند. CNNها سه ایده‌ی اصلی را به‌کار می‌گیرند:

  1. لایه‌های کانولوشن
    فیلترهای قابل‌آموزش روی ابعاد فضایی (ارتفاع و عرض) حرکت می‌کنند و الگوهای محلی مانند لبه‌ها و بافت‌ها را استخراج می‌کنند.
  2. لایه‌های پولینگ
    عملیات پولینگ (مثلاً ماکسیمم‌گیری) ابعاد فضایی را کاهش می‌دهد تا مهم‌ترین ویژگی‌ها حفظ شده و بار محاسباتی کاهش یابد.
  3. لایه‌های کاملاً متصل
    پس از چندین مرحله کانولوشن و پولینگ، لایه‌های کاملاً متصل (Dense) روی ویژگی‌های استخراج‌شده کار می‌کنند و آنها را به احتمال‌های کلاس یا مقادیر رگرسیونی نگاشت می‌دهند.

در Keras می‌توانید این بلوک‌ها را به‌سادگی ترکیب کنید:

import tensorflow as tf
from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(128, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])

model.summary()

این مدل ساده تصاویر رنگی ۲۲۴×۲۲۴ را پردازش کرده و احتمال ۱۰ کلاس مختلف را خروجی می‌دهد.

آماده‌سازی و تقویت داده‌ها

بارگذاری و پیش‌پردازش داده

آماده‌سازی داده اهمیت زیادی دارد. Keras ابزارهایی برای بارگذاری تصاویر از دیسک و پیش‌پردازش در زمان واقعی ارائه می‌دهد:

from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    fill_mode='nearest'
)

valid_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical'
)

validation_generator = valid_datagen.flow_from_directory(
    'data/validation',
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical'
)

این بستر به‌صورت بلادرنگ داده‌ها را تقویت می‌کند و به کاهش بیش‌برازش کمک می‌نماید.

استفاده از tf.data

برای مجموعه‌داده‌های بزرگ‌تر، لوله‌های tf.data کارایی و انعطاف بیشتری دارند:

import pathlib

data_root = pathlib.Path('data/train')
all_image_paths = list(data_root.glob('*/*.jpg'))
all_image_paths = [str(path) for path in all_image_paths]

labels = [pathlib.Path(path).parent.name for path in all_image_paths]
label_to_index = {label: idx for idx, label in enumerate(sorted(set(labels)))}
all_image_labels = [label_to_index[label] for label in labels]

path_ds = tf.data.Dataset.from_tensor_slices(all_image_paths)
image_ds = path_ds.map(lambda x: preprocess_image(x), num_parallel_calls=tf.data.AUTOTUNE)
label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64))
dataset = tf.data.Dataset.zip((image_ds, label_ds))
dataset = dataset.shuffle(1000).batch(32).prefetch(tf.data.AUTOTUNE)

در اینجا preprocess_image تابعی است که تصویر را می‌خواند، رمزگشایی و تغییر اندازه می‌دهد و نرمال‌سازی یا تقویت را اعمال می‌کند.

معماری‌ها در tf.keras.applications

Keras چندین مدل پیشرفته را در tf.keras.applications ارائه می‌دهد که روی ImageNet تعلیم یافته‌اند:

  • VGG16/VGG19: شبکه‌های کلاسیک و عمیق.
  • ResNet (50/101/152): با ارتباطات باقیمانده برای تسهیل آموزش شبکه‌های بسیار عمیق.
  • InceptionV3: استفاده همزمان از فیلترهای کانولوشن با اندازه‌های مختلف.
  • MobileNet: مدل‌های سبک برای دستگاه‌های موبایل و تعبیه‌شده.
  • EfficientNet: بهینه‌سازی مقیاس عرض، عمق و وضوح برای دقت بالا.

استفاده از مدل پیش‌تعلیم‌دیده

base_model = tf.keras.applications.ResNet50(
    weights='imagenet',
    include_top=False,
    input_shape=(224, 224, 3)
)

base_model.trainable = False

inputs = tf.keras.Input(shape=(224, 224, 3))
x = tf.keras.applications.resnet.preprocess_input(inputs)
x = base_model(x, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.2)(x)
outputs = layers.Dense(10, activation='softmax')(x)
model = tf.keras.Model(inputs, outputs)

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

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

یادگیری انتقالی و ریزتنظیم

یادگیری انتقالی رویکردی است که در آن مدل تعلیم‌یافته روی یک کار (مثلاً طبقه‌بندی ImageNet) به کاری دیگر منتقل می‌شود.

  1. استخراج ویژگی
    از شبکه پیش‌تعلیم‌یافته به‌عنوان استخراج‌کننده ویژگی ثابت استفاده کرده و فقط لایه‌های بالایی را آموزش دهید.
  2. ریزتنظیم (Fine-Tuning)
    بخشی از لایه‌های عمیق‌تر شبکه پیش‌تعلیم‌یافته را آزاد کرده و همزمان با لایه‌های بالایی با نرخ یادگیری کمتر آموزش دهید.
base_model.trainable = True
fine_tune_at = 100

for layer in base_model.layers[:fine_tune_at]:
    layer.trainable = False

model.compile(optimizer=tf.keras.optimizers.Adam(1e-5),
              loss='categorical_crossentropy',
              metrics=['accuracy'])

history_fine = model.fit(
    train_generator,
    epochs=10,
    validation_data=validation_generator
)

ریزتنظیم معمولاً عملکرد بهتری دارد، به‌ویژه اگر مجموعه‌داده هدف با ImageNet تفاوت داشته باشد.

لایه‌ها و Callbacks سفارشی

انعطاف‌پذیری Keras هنگامی نمایان می‌شود که رفتار سفارشی نیاز باشد:

مثال لایه سفارشی

class L2Normalization(layers.Layer):
    def __init__(self, axis=-1, eps=1e-6, **kwargs):
        super().__init__(**kwargs)
        self.axis = axis
        self.eps = eps

    def call(self, inputs):
        squared = tf.square(inputs)
        summed = tf.reduce_sum(squared, axis=self.axis, keepdims=True)
        norm = tf.sqrt(tf.maximum(summed, self.eps))
        return inputs / norm

x = layers.Conv2D(64, (3,3), activation=None)(inputs)
x = L2Normalization()(x)
x = layers.Activation('relu')(x)

Callbackهای مفید

  • ModelCheckpoint: ذخیره بهترین مدل در حین آموزش.
  • EarlyStopping: متوقف کردن آموزش هنگام سکون اعتبارسنجی.
  • TensorBoard: مصورسازی معیارها و نمودار مدل.
callbacks = [
    tf.keras.callbacks.ModelCheckpoint('best_model.h5', save_best_only=True),
    tf.keras.callbacks.EarlyStopping(patience=5, restore_best_weights=True),
    tf.keras.callbacks.TensorBoard(log_dir='./logs')
]

history = model.fit(
    train_generator,
    epochs=50,
    validation_data=validation_generator,
    callbacks=callbacks
)

تکنیک‌های پیشرفته

۱. تقویت داده با tf.image

فراتر از ImageDataGenerator، ماژول tf.image امکان تقویت در سطح گراف را فراهم می‌کند:

def augment(image, label):
    image = tf.image.random_flip_left_right(image)
    image = tf.image.random_brightness(image, max_delta=0.1)
    image = tf.image.random_contrast(image, 0.9, 1.1)
    return image, label

dataset = dataset.map(augment, num_parallel_calls=tf.data.AUTOTUNE)

۲. برنامه‌های نرخ یادگیری

تغییر دینامیک نرخ یادگیری معمولاً همگرایی را بهبود می‌بخشد:

lr_schedule = tf.keras.optimizers.schedules.CosineDecay(
    initial_learning_rate=1e-3,
    decay_steps=10000
)
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)
model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy'])

۳. آموزش با دقت ترکیبی

از Tensor Cores در GPUهای مدرن برای شتاب استفاده کنید:

from tensorflow.keras import mixed_precision

policy = mixed_precision.Policy('mixed_float16')
mixed_precision.set_global_policy(policy)

مثال عملی: ساخت طبقه‌بندی گربه و سگ

  1. داده: مجموعه‌ی Dogs vs. Cats از Kaggle را دانلود و ساختار پوشه‌ها را به train و validation تقسیم کنید.
  2. پیش‌پردازش و تقویت: از ImageDataGenerator برای تقویت داده‌ی آموزشی استفاده کنید.
  3. مدل: MobileNetV2 را برای کارایی انتخاب و ریزتنظیم کنید.
  4. آموزش و ارزیابی: دقت و خطا را پیگیری و با TensorBoard مصورسازی کنید.
  5. استقرار: مدل را به فرمت SavedModel صادر و با TensorFlow Serving یا به TensorFlow Lite برای موبایل منتقل نمایید.
# Data generators
train_gen = ImageDataGenerator(...).flow_from_directory(...)
val_gen   = ImageDataGenerator(...).flow_from_directory(...)

# Base model
base = tf.keras.applications.MobileNetV2(include_top=False, input_shape=(224,224,3), weights='imagenet')
base.trainable = False

# Head
x = layers.GlobalAveragePooling2D()(base.output)
x = layers.Dense(1, activation='sigmoid')(x)
model = tf.keras.Model(base.input, x)

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_gen, validation_data=val_gen, epochs=10, callbacks=callbacks)

# Unfreeze and fine-tune
base.trainable = True
for layer in base.layers[:-20]:
    layer.trainable = False
model.compile(optimizer=tf.keras.optimizers.Adam(1e-5), ...)
model.fit(...)

نکات موفقیت

  • نظارت بر بیش‌برازش: از نمودارهای اعتبارسنجی استفاده کرده و EarlyStopping را به کار ببرید.
  • آزمایش سیستماتیک: پارامترها را با ابزارهایی مانند TensorBoard یا Weights & Biases پیگیری کنید.
  • از کوچک شروع کنید: ابتدا با زیرمجموعه کوچکی از داده‌ها پروتوتایپ بسازید و سپس مقیاس بدهید.
  • از وزن‌های پیش‌تعلیم‌یافته بهره ببرید: یادگیری انتقالی زمان و داده کمتری می‌طلبد.
  • بهینه‌سازی برای استقرار: برای کاربردهای عملی، به حجم مدل و سرعت استنتاج توجه کنید.

نتیجه‌گیری

Keras توسعه مدل‌های بینایی ماشین را از طبقه‌بندی ساده تا خطوط لوله پیچیده شامل تقویت داده، یادگیری انتقالی و لایه‌های سفارشی به‌شکل چشمگیری ساده می‌کند. API شهودی آن در کنار زیرساخت مقیاس‌پذیر TensorFlow، به شما امکان می‌دهد پروتوتایپ سریع ساخته و گسترده پیاده‌سازی کنید. با تسلط بر مباحث و تکنیک‌های مطرح‌شده—مبانی CNN، لوله‌های داده، tf.keras.applications، یادگیری انتقالی و استراتژی‌های پیشرفته آموزش—برای حل چالش‌های مدرن بینایی ماشین آماده‌اید. کدنویسی خوش!

پرسش‌های متداول (FAQs)

1 Keras چیست و چه مزایایی در بینایی ماشین دارد؟

Keras یک API سطح‌بالا برای ساخت و آموزش شبکه‌های عصبی است که در بالای TensorFlow قرار دارد. سادگی سینتکس، ماژولار بودن و دسترسی به مدل‌های از پیش آموزش‌دیده از مهم‌ترین مزایای آن در پروژه‌های بینایی ماشین است.

2 چگونه می‌توان با Keras یک شبکه کانولوشنال ساده تعریف کرد؟

با استفاده از `Sequential` یا API تابعی (`Functional API`) می‌توان لایه‌های Conv2D، MaxPooling2D، Flatten و Dense را پشت سر هم ترکیب کرد تا یک CNN پایه برای طبقه‌بندی تصاویر ساخته شود.

3 Data Augmentation در Keras چگونه انجام می‌شود؟

ابزار `ImageDataGenerator` در Keras امکاناتی مانند چرخش، جابه‌جایی، بزرگ‌نمایی و بازتاب تصویر را به‌صورت بلادرنگ فراهم می‌کند تا از بیش‌برازش جلوگیری شود.

4 تفاوت استفاده از `ImageDataGenerator` و `tf.data` چیست؟

`ImageDataGenerator` سریع و ساده است ولی برای مجموعه‌داده‌های بزرگ‌تر یا پیچیده‌تر لوله‌های `tf.data` انعطاف و کارایی بالاتری در بارگذاری و پیش‌پردازش ارائه می‌دهند.

5 چه مدل‌های از پیش آموزش‌دیده‌ای در `tf.keras.applications` موجود‌اند؟

مدل‌هایی مانند VGG16/VGG19، ResNet50، InceptionV3، MobileNet و EfficientNet برای طبقه‌بندی تصاویر روی دیتاست ImageNet به‌صورت آماده وجود دارند.

6 یادگیری انتقالی (Transfer Learning) چگونه در Keras پیاده‌سازی می‌شود؟

ابتدا backbone مدل از پیش آموزش‌دیده را فریز کرده و فقط لایه‌های بالایی را آموزش می‌دهیم، سپس با آزاد کردن تعدادی از لایه‌های انتهایی و نرخ یادگیری کمتر، مدل را ریزتنظیم (Fine-Tuning) می‌کنیم.

7 Mixed Precision Training در Keras چیست و چه سودی دارد؟

با فعال‌سازی Mixed Precision، محاسبات در بخش‌هایی با دقت 16 بیتی انجام می‌شود که سرعت آموزش را در GPUهای مدرن افزایش و مصرف حافظه را کاهش می‌دهد.

8 چگونه می‌توان مدل Keras را برای استنتاج در موبایل به TensorFlow Lite تبدیل کرد؟

پس از آموزش مدل با `model.save()`, با استفاده از `TFLiteConverter` مدل را به فرمت `.tflite` تبدیل کرده و سپس می‌توان آن را در اپلیکیشن‌های اندروید یا iOS وارد کرد.

9 چه Callbackهایی برای بهبود آموزش می‌توان در Keras استفاده کرد؟

`ModelCheckpoint` برای ذخیره بهترین وزن‌ها، `EarlyStopping` برای متوقف کردن به‌موقع آموزش و `TensorBoard` برای مصورسازی متریک‌ها از مهم‌ترین Callbackهای کاربردی هستند.

10 روش‌های پیشرفته دیگر مانند Learning Rate Schedules و Custom Layers چگونه در Keras اعمال می‌شوند؟

می‌توان با استفاده از برنامه‌های نرخ یادگیری مانند `CosineDecay` و تعریف کلاس‌های جدید که از `layers.Layer` ارث می‌برند، رفتارهای پیچیده‌تری در زمان آموزش ایجاد کرد.

برای خرید دوربین های صنعتی و انواع محصولات هایک ربات با ما تماس بگیرید

مشتاقانه منتظر دریافت نظرات شما دوستان عزیز هستیم





مطالب مرتبط

خواندن تاریخ انقضا با دوربین

خواندن تاریخ انقضا با دوربین – راهنمای جامع برای صنایع و خطوط تولید

مشاوره خرید دوربین صنعتی

مشاوره خرید دوربین صنعتی؛ انتخاب دقیق برای موفقیت پروژه‌های بینایی ماشین

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

انقلاب سبز دیجیتال: چگونه دوربین‌های هوشمند کشاورزی را برای همیشه متحول می‌کنند؟

بینایی ماشین در صنایع نساجی

بینایی ماشین در صنایع نساجی: انقلابی در کنترل کیفیت و تولید

واردکننده دوربین صنعتی

واردکننده دوربین صنعتی | نمایندگی رسمی Hikrobot در ایران

دوربین‌ صنعتی با وضوح بالا - مشاوره خرید دوربین صنعتی

دوربین صنعتی با وضوح بالا: کلید دقت در بینایی ماشین