تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

درک فیلترها در شبکه‌های عصبی کانولوشنی (CNN): تبدیل تصاویر به اطلاعات


۱۷ مرداد ۱۴۰۴

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

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

اما چرا CNN‌ ها اهمیت دارند؟ چون کار با تصاویر به دلیل حجم بالای اطلاعات و ابعاد زیاد آن‌ها، به روش‌هایی نیاز دارد که هم کارآمد باشند و هم دقیق. در گذشته، استخراج ویژگی‌ها از تصاویر به‌صورت دستی انجام می‌شد که هم زمان‌بر بود و هم به دقت بالایی نیاز داشت. CNN‌ ها این مرحله را خودکار می‌کنند و به‌طور هوشمند، ویژگی‌های مهم را از داده‌ها استخراج می‌کنند. به همین دلیل، امروزه شبکه‌های کانولوشنی در قلب بسیاری از کاربردهای بینایی ماشین قرار دارند؛ از سیستم‌های تشخیص چهره گرفته تا خودروهای خودران.

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

در ادامه خواهید خواند:

  • پیش‌نیازها
  • شبکه‌های عصبی و استخراج ویژگی‌ها
  • تصاویر و اهمیت لبه‌ها
  • شبکه‌های عصبی کانولوشنی و بینایی انسان
  • تشخیص و استخراج لبه‌ها
  • تابع کانولوشن
  • فیلترهای پرویت
  • فیلترهای سوبل
  • فیلتر لاپلاس
  • ماسک‌های قطب‌نمای رابینسون
  • ماسک‌های جهتی کریش
  • نشانه‌گذاری فیلترها
  • کار با تابع کانولوشن
  • آدرس فایل تصویر
  • فیلتر
  • جمع بندی

پیش‌نیازها

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

شبکه‌های عصبی و استخراج ویژگی‌ها

یکی از توانایی‌های اساسی شبکه‌های عصبی، قبلیت آن‌ها در استخراج ویژگی‌ها از داده‌ها است؛ ویژگی‌هایی که سپس برای رسیدن به اهداف خاصی مانند دسته‌بندی (Classification)، رگرسیون (Regression) و غیره مورد استفاده قرار می‌گیرند.

در شبکه‌های عصبی کلاسیک مانند MLP (شبکه‌های پرسپترون چندلایه)، این فرآیند قابل تصویر است: داده‌های ورودی که معمولا شامل چند ویژگی عددی درباره یک نمونه خاص از داده هستند، با وزن‌های آموزش دیده ترکیب یا تغییر داده می‌شوند تا به ویژگی‌های ضروری‌تر و مفیدتری تبدیل شوند.

اما در شبکه‌های عصبی کانولوشنی یا CNN ها، استخراج ویژگی به این سادگی قابل تعریف نیست؛ چرا که برخلاف MLP ها، داده ورودی به صورت یک بردار ویژگی نیست، بلکه به شکل تصویر وارد می‌شود. تصویرها در واقع ماتریس‌های دوبعدی (و در صورت رنگی بودن، سه بعدی) از پیکسل‌ها هستند؛ بنابراین تعریف ویژگی در این نوع داده‌‌ها کمی پیچیده‌تر است.

برای درک بهتر، به این مثال توجه کنید: اگر با یک دیتابیس جدولی از اطلاعات خانه‌‎ها مواجه باشیم؛ ویژگی‌هایی مثل تعداد اتاق‌خواب‌ها یا متراژ سالن نشیمن به عنوان ویژگی‌های توصیف کننده‌ هر خانه شناخته می‌شوند. اما در مورد یک تصویر با کیفیت متوسط (مثلا رزولوشن 480p) از یک گربه چطور؟ تصویری با ابعاد 640*480، شامل 307,200 پیکسل است. حال سوال اینجاست که از میان این حجم وسیع از پیکسل‌ها، کدام بخش‌ها ویژگی‌های تصویر را تشکیل می‌دهند؟ یا بهتر بگوییم، ویژگی‌ها در فضای تصویری دقیقا چه معنایی دارند؟

با سرویس هوش مصنوعی لیارا، بدون دغدغه زیرساخت، مدل‌های AI خودت رو اجرا و مدیریت کن.
✅ پشتیبانی از GPU و CPU ✅ مناسب مدل‌های متن‌باز ✅ اجرای پایدار و سریع
خرید و راه‌اندازی سرویس هوش مصنوعی

تصاویر و اهمیت لبه‌ها

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

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

تصور کنید تنها چیزی که از یک تصویر در اختیار داریم، صرفاً خطوط مرزی آن باشد؛ مثلاً طرح ساده‌ای از یک توله‌سگ که فقط شامل خطوط بیرونی بدن اوست. حتی بدون وجود رنگ، بافت یا جزئیات بیشتر، باز هم بیشتر افراد می‌توانند به‌راحتی تشخیص دهند که تصویر مربوط به یک سگ است. این موضوع اهمیت بالای لبه‌ها در درک تصویری را نشان می‌دهد.

سیستم‌های چندعاملی در هوش مصنوعی چیست؟ چطور باعث افزایش بهره‌وری می‌شوند؟
سیستم‌های چندعاملی

شبکه‌های عصبی کانولوشنی و بینایی انسان

در سال‌های اخیر، بارها به این نکته اشاره شده است که شبکه‌های عصبی مصنوعی، شبکه‌های عصبی کانولوشنی (CNN)، از نحوه عملکرد مغز انسان الهام گرفته‌اند. یکی از شواهد مهم در این زمینه، شباهت میان نحوه پردازش تصاویر در مغز انسان و عملکرد اولیه این شبکه‌ها در تحلیل تصاویر است.

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

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

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

Claude چیست؟ ساخت ابزارهای هوشمند با API هوش مصنوعی
Claude چیست؟

تشخیص و استخراج لبه‌ها

شبکه‌های عصبی کانولوشنی (Convolutional Neural Networks یا CNNs) از توانایی قابل‌توجهی برخوردارند: آن‌ها می‌توانند فیلترهای تخصصی تشخیص لبه را به‌صورت خودکار یاد بگیرند؛ فیلترهایی که متناسب با الگوهای آماری موجود در یک دیتاست خاص و همچنین اهداف مورد نظر شبکه طراحی می‌شوند.

هرچند این فیلترها در طی فرآیند آموزش به‌صورت خودکار ایجاد می‌شوند، فیلترهای سنتی که به‌صورت دستی طراحی شده‌اند همچنان به درک بهتر مفهوم تشخیص لبه در بینایی ماشین کمک می‌کنند. برخی از فیلترهای کلاسیک و پرکاربرد در این زمینه شامل فیلترهای Prewitt, Sobel, Laplacian, Robinson Compass و Krisch Compass هستند.

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

import numpy as np
import torch
import torch.nn.functional as F
import cv2
from tqdm import tqdm
import matplotlib.pyplot as plt


def convolve(image_filepath, filter, title=''):
    """
    This function performs convolution and
    returns both the original and convolved
    images.
    """

    #  reading image in grayscale format
    image = cv2.imread(image_filepath, cv2.IMREAD_GRAYSCALE)

    #  defining filter size
    filter_size = filter.shape[0]

    #  creating an array to store convolutions (x-m+1, y-n+1)
    convolved = np.zeros(((image.shape[0] - filter_size) + 1, 
                      (image.shape[1] - filter_size) + 1))
    
    #  performing convolution
    for i in tqdm(range(image.shape[0])):
      for j in range(image.shape[1]):
        try:
          convolved[i,j] = (image[i:(i+filter_size),
                                  j:(j+filter_size)] * filter).sum()
        except Exception:
          pass

    #  converting to tensor
    convolved = torch.tensor(convolved)
    #  applying relu activation
    convolved = F.relu(convolved)

    #  producing plots
    figure, axes = plt.subplots(1,2, dpi=120)
    plt.suptitle(title)
    axes[0].imshow(image, cmap='gray')
    axes[0].axis('off')
    axes[0].set_title('original')
    axes[1].imshow(convolved, cmap='gray')
    axes[1].axis('off')
    axes[1].set_title('convolved')
    pass

تابع کانولوشن

در این بخش، تابعی تعریف کرده‌ایم که فرآیند کانولوشن را مشابه آنچه در شبکه‌های عصبی کانولوشنی (ConvNet) اتفاق می‌افتد، شبیه‌سازی می‌کند. این تابع علاوه‌بر انجام عملیات کانولوشن، شامل یک مرحله‌ی اضافی نیز هست که در آن تابع فعال‌سازی ReLU بر خروجی اعمال می‌شود؛ عملکردی که در مدل‌های رایج یادگیری عمیق نیز انتظار می‌رود.

هدف از تعریف این تابع، تشخیص لبه‌ها (Edge Detection) در یک تصویر نمونه است. برای این کار، از فیلترهایی که در بخش قبل معرفی کردیم، استفاده خواهیم کرد.

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

فیلترهای پرویت

فیلترهای عمودی و افقی Prewitt

عملکرد Prewitt از دو فیلتر تشکیل شده است که به شناسایی لبه‌های عمودی و افقی کمک می‌کنند. فیلترهای افقی (در جهت محور x) به شناسایی لبه‌هایی که کمک می‌کند که به صورت محور افقی تصویر را قطع کنند، و بالعکس، فیلتر عمودی (در جهت محور y) برای تشخیص لبه‌هایی استفاده می‌شود که محور عمودی را قطع می‌کنند.

# utilizing the horizontal filter
convolve('image.jpg', horizontal)
# utilizing the vertical filter
convolve('image.jpg', vertical)

فیلترهای سوبل

فیلترهای عمودی و افقی Sobel

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

# utilizing the horizontal filter
convolve('image.jpg', horizontal)
# utilizing the vertical filter
convolve('image.jpg', vertical)

فیلتر لاپلاسین

برخلاف فیلترهای Prewitt و Sobel که شامل دو فیلتر مجزا برای تشخیص لبه‌های افقی و عمودی هستند، فیلتر لاپلاسین (Laplacian) تنها از یک فیلتر تشکیل شده که قادر است لبه‌ها را در تمام جهات شناسایی کند.

از منظر ریاضی، فیلتر لاپلاسین مشتق مرتبه دوم مقادیر پیکسل را محاسبه می‌کند، در حالی که فیلترهای Prewitt و Sobel تنها مشتق مرتبه اول را به‌دست می‌آورند. این ویژگی باعث می‌شود فیلتر لاپلاسین حساسیت بالاتری به تغییرات ناگهانی شدت روشنایی در تصویر داشته باشد.

# utilizing the filter
convolve('image.jpg', filter)

ماسک‌های قطب‌نمای رابینسون

8 ماسک Robinson Compass

ماسک‌های Robinson Compass فیلترهایی برای تشخیص لبه؛ که شامل 8 فیلتر مختلف مطابق با 8 جهت جغرافیایی قطب نما هستند؛ همان‌طور که در تصویر بالا مشاهده می‌شود. این فیلترها برای شناسایی لبه‌هایی طراحی شده‌اند که در امتداد این جهت‌ها قرار دارند.

برای اختصار، تنها از دو فیلتر برای نمایش عملکرد استفاده شده است.

# utilizing the north_west filter
convolve('image.jpg', north_west)
# utilizing the north_east filter
convolve('image.jpg', north_east)

ماسک‌های جهتی کریش

8 ماسک Krisch Compass

مشابه ماسک‌های Robinson Compass، ماسک Krisch Compass نیز شامل 8 فیلتر است که به شناسایی لبه‌ها در جهات‌های مختلف جغرافیایی کمک می‌کنند. در ادامه، از دو مورد از این فیلترها برای نمایش استفاده شده است.

# utilizing the south_west filter
convolve('image.jpg', south_west)
# utilizing the south_east filter
convolve('image.jpg', south_east)

نشانه‌گذاری فیلترها

در بخش قبلی به نکته‌ای بسیار مهم اشاره شد که ممکن است از توجه شما پنهان مانده باشد:

«فیلتر افقی (در جهت محور x) به شناسایی لبه‌هایی کمک می‌کند که به‌صورت عمود بر محور افقی قرار دارند، و بلعکس، فیلتر عمودی (در جهت محور y) برای شناسایی لبه‌هایی استفاده می‌شود که به صورت عمود بر محور عمودی قرار دارند.»

این موضوع ممکن است در ابتدا کمی گیج کننده به نظر برسد، اما در ادامه با ذکر مثال آن را شفاف‌تر می‌کنیم.

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

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

در ادامه با استفاده از فیلترهای Prewitt افقی و عمودی، به شناسایی لبه‌ها در تصویر خواهیم پرداخت.

مراحل اعمال فیلتر به صورت زیر است.

  • قرار دادن فیلتر در گوشه‌ی بالا-چپ تصویر.
  • انجام ضرب عنصر به عنصر (Element-wise Multiplication).
  • محاسبه مجموع عناصر حاصل از ضرب.
  • ثبت مقدار نهایی به‌عنوان مقدار متناظر در تصویر خروجی.
  • حرکت فیلتر به اندازه یک پیکسل به سمت راست و تکرار مراحل بالا تا زمانی که فیلتر از لبه افقی تصویر خارج شود.
  • انتقال فیلتر به ردیف بعدی و تکرار مراحل فوق.
  • ادامه‌ی این روند تا فیلتر از لبه عمودی تصویر نیز خارج شود.

در پایان عملیات کانولوشن، خروجی به کمک تابع ReLU فعال‌سازی می‌شود؛ این تمامی مقادیر منفی را صفر می‌کند. در نتیجه، فیلتر افقی لبه عمودی تصویر را برجسته می‌سازد، در حالی که فیلتر عمودی تصویری کاملا سیاره (همه مقادیر صفر) باز می‌گرداند که نشان‌دهنده عدم شناسایی لبه‌ای در آن جهات است.

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

کار با تابع کانولوشن

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

این تابع سه پارامتر را دریافت می‌کند:

  • image_filepath (مسیر فایل تصویر)
  • filter (فیلتر موردنظر)
  • title (عنوان نمودار)

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

آدرس فایل تصویر

این پارامتر به محل قرارگیری تصویر موردنظر شما در حافظه‌ی محلی (لوکال) یا فضای ابری اشاره دارد.

اگر تصویر در دایرکتوری جاری (محل اجرای کد) قرار داشته باشد، تنها کافی‌ست نام کامل فایل تصویر را به همراه پسوند آن وارد کنید.

اما اگر تصویر در مسیر دیگری قرار دارد، باید مسیر کامل (absolute path) را مشخص کنید؛ برای مثال: C:/Users/Username/Downloads/image_name.jpg (توجه داشته باشید که در پایتون از اسلش مایل به جلو / استفاده می‌شود.)

مدل سری زمانی چیست؟ معرفی کامل Time Series برای تحلیل‌گران داده
مدل سری زمانی

فیلتر

در واقع، فیلتر همان ماتریسی است که می‌خواهید در فرآیند کانولوشن روی تصویر اعمال کنید. ساخت فیلترها با استفاده از کتابخانه NumPy بسیار ساده است، همان‌طور که در مثال‌های زیر مشاهده می‌کنید‌. کافی است پس از تعریف فیلتر، آن را به عنوان ورودی به تابع کانولوشن بدهید.

#  creating a Prewitt horizontal filter
prewitt_x = np.array(([-1, 0, 1],
                      [-1, 0, 1],
                      [-1, 0, 1]))
                      
#  creating a laplacian filter
laplacian = np.array(([-1, -1, -1],
                      [-1, 8, -1],
                      [-1, -1, -1]))

این فیلترها نمونه‌هایی از ماتریس‌هایی هستند که برای شناسایی ویژگی‌های خاصی مثل لبه‌ها در تصاویر استفاده می‌شوند.

عامل هوش مصنوعی چیست؟ هر آنچه باید در مورد آن‌ها بدانید
AI Agent

جمع بندی

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

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