keras در بینایی ماشین
بینایی ماشین نحوه درک و تعامل ماشینها با جهان را متحول کرده و در برنامههایی از خودروهای خودران تا تصویربرداری پزشکی بهکار میرود. در صدر فریمورکهای یادگیری عمیقی که توسعه در بینایی ماشین را ساده…
بینایی ماشین نحوه درک و تعامل ماشینها با جهان را متحول کرده و در برنامههایی از خودروهای خودران تا تصویربرداری پزشکی بهکار میرود. در صدر فریمورکهای یادگیری عمیقی که توسعه در بینایی ماشین را ساده و کارآمد میکنند، Keras قرار دارد—یک API سطح بالا برای شبکههای عصبی که با پایتون نوشته شده است. Keras با هدف سهولت و کاربرپسندی طراحی شده و به پژوهشگران و توسعهدهندگان امکان میدهد مدلهای پیشرفته بینایی را با کمترین حجم کد نمونهسازی، ساخت و پیادهسازی کنند.در این مطلب جامع وبلاگی، Keras را در بستر بینایی ماشین بررسی میکنیم. به مفاهیم اصلی شبکههای عصبی کانولوشنال (CNN)، پیشپردازش دادهها، لایهها و امکانات داخلی، یادگیری انتقالی، و تکنیکهای پیشرفتهای مانند تقویت داده و ریزتنظیم مدل خواهیم پرداخت. چه در آستانه شروع به یادگیری باشید و چه بهدنبال بهبود روند کاری خود، این راهنما با مثالهای کد به شما کمک میکند تا از Keras در پروژههای بعدی بینایی ماشین خود بهرهمند شوید.
چرا Keras برای بینایی ماشین؟
- سهولت استفاده
Keras پیچیدگیهای عملیات TensorFlow را به فراخوانیهای API ساده تبدیل میکند. در چند خط کد میتوانید مدلهای قدرتمند بینایی بسازید. - مدولاریتی و انعطافپذیری
طراحی مدولار به شما اجازه میدهد لایهها، بهینهسازها و توابع فعالسازی را ترکیب کنید. در صورت نیاز به رفتار سفارشی، میتوانید لایهها یا مدلها را از کلاس پایه ارث ببرید. - ادغام با TensorFlow
از آنجا که Keras بهصورت یکپارچه در TensorFlow 2.x تحتtf.keras
قرار دارد، از بهینهسازیهای TensorFlow، آموزش توزیعشده و امکانات پیادهسازی مانند TensorFlow Serving و TensorFlow Lite بهرهمند میشوید. - اکوسیستم غنی
از مدلهای ازپیشتعلیمدیده در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ها سه ایدهی اصلی را بهکار میگیرند:
- لایههای کانولوشن
فیلترهای قابلآموزش روی ابعاد فضایی (ارتفاع و عرض) حرکت میکنند و الگوهای محلی مانند لبهها و بافتها را استخراج میکنند. - لایههای پولینگ
عملیات پولینگ (مثلاً ماکسیممگیری) ابعاد فضایی را کاهش میدهد تا مهمترین ویژگیها حفظ شده و بار محاسباتی کاهش یابد. - لایههای کاملاً متصل
پس از چندین مرحله کانولوشن و پولینگ، لایههای کاملاً متصل (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) به کاری دیگر منتقل میشود.
- استخراج ویژگی
از شبکه پیشتعلیمیافته بهعنوان استخراجکننده ویژگی ثابت استفاده کرده و فقط لایههای بالایی را آموزش دهید. - ریزتنظیم (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)
مثال عملی: ساخت طبقهبندی گربه و سگ
- داده: مجموعهی Dogs vs. Cats از Kaggle را دانلود و ساختار پوشهها را به
train
وvalidation
تقسیم کنید. - پیشپردازش و تقویت: از
ImageDataGenerator
برای تقویت دادهی آموزشی استفاده کنید. - مدل:
MobileNetV2
را برای کارایی انتخاب و ریزتنظیم کنید. - آموزش و ارزیابی: دقت و خطا را پیگیری و با TensorBoard مصورسازی کنید.
- استقرار: مدل را به فرمت 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
، یادگیری انتقالی و استراتژیهای پیشرفته آموزش—برای حل چالشهای مدرن بینایی ماشین آمادهاید. کدنویسی خوش!