بینایی ماشین, هوش مصنوعی, یادگیری عمیق

شبکه عصبی کانولوشن CNN چیست؟ راهنمای کامل CNN در یادگیری عمیق

شبکه عصبی کانولوشن یا CNN یکی از مهم‌ترین معماری‌های یادگیری عمیق برای پردازش و تحلیل داده‌های تصویری است. این معماری با استفاده از لایه‌هایی مانند Convolution و Pooling می‌تواند الگوهای موجود در تصاویر را به‌صورت خودکار استخراج کند و در مسائلی مانند طبقه‌بندی تصویر، تشخیص اشیا، تشخیص چهره و بسیاری از کاربردهای Computer Vision مورد استفاده قرار گیرد. در این مقاله با معماری CNN، نحوه عملکرد آن، Convolution، Kernel، Feature Map، Pooling، کاربردها، مزایا و محدودیت‌های این شبکه آشنا می‌شویم.

شبکه عصبی کانولوشن CNN چیست؟

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

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

به همین دلیل CNN نقش بسیار مهمی در شبکه‌های عصبی و به‌خصوص در حوزه Computer Vision دارد.

CNN چگونه کار می‌کند؟

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

  1. Input: دریافت تصویر به‌عنوان داده ورودی
  2. Convolution: استخراج ویژگی‌های محلی با استفاده از فیلترها
  3. Activation: اعمال تابع غیرخطی مانند ReLU
  4. Pooling: کاهش ابعاد Feature Map
  5. Feature Extraction: استخراج ویژگی‌های پیچیده‌تر در لایه‌های عمیق‌تر
  6. Fully Connected: استفاده از ویژگی‌های استخراج‌شده برای تصمیم‌گیری
  7. Output: تولید نتیجه نهایی مانند کلاس تصویر
معماری و لایه های شبکه عصبی کانولوشن CNN
مراحل اصلی پردازش داده در معماری CNN

تصویر چگونه به ورودی CNN تبدیل می‌شود؟

یک تصویر دیجیتال را می‌توان به‌صورت مجموعه‌ای از مقادیر عددی نمایش داد. در یک تصویر Grayscale، هر پیکسل معمولاً یک مقدار شدت روشنایی دارد. برای نمونه، در نمایش‌های رایج 8 بیتی، مقدار پیکسل بین 0 تا 255 قرار می‌گیرد.

در تصویر RGB، داده تصویری از سه کانال Red، Green و Blue تشکیل می‌شود. بنابراین تصویر رنگی را می‌توان به‌صورت سه ماتریس مجزا در نظر گرفت که هر کدام اطلاعات مربوط به یکی از کانال‌های رنگی را نگهداری می‌کنند.

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

Convolution چیست؟

Convolution یا کانولوشن یکی از مهم‌ترین عملیات‌ها در CNN است. در این فرآیند یک فیلتر کوچک یا Kernel روی بخش‌های مختلف تصویر حرکت می‌کند و با مقادیر موجود در آن ناحیه عملیات ریاضی انجام می‌دهد.

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

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

Kernel و Filter در CNN

Kernel یا Filter یک ماتریس کوچک از وزن‌های قابل یادگیری است که روی نواحی مختلف تصویر حرکت می‌کند. در زمان آموزش، شبکه وزن‌های این فیلترها را به‌گونه‌ای تنظیم می‌کند که ویژگی‌های مفید برای مسئله موردنظر را بهتر شناسایی کنند.

Stride چیست؟

Stride مشخص می‌کند فیلتر در هر حرکت چند پیکسل جابه‌جا شود. اگر مقدار Stride برابر یک باشد، فیلتر معمولاً یک خانه در هر مرحله حرکت می‌کند. افزایش Stride می‌تواند باعث کاهش ابعاد Feature Map شود، اما در عین حال ممکن است بخشی از جزئیات مکانی تصویر از دست برود.

Padding چیست؟

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

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

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

لایه Convolutional

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

لایه Activation

پس از عملیات کانولوشن معمولاً از یک تابع فعال‌سازی استفاده می‌شود تا مدل بتواند روابط غیرخطی را یاد بگیرد. تابع ReLU یکی از رایج‌ترین انتخاب‌ها در معماری‌های CNN است.

لایه Pooling

Pooling برای کاهش ابعاد فضایی Feature Map استفاده می‌شود. این کاهش ابعاد می‌تواند هزینه محاسباتی را پایین بیاورد و مدل را نسبت به برخی تغییرات کوچک مکانی مقاوم‌تر کند.

لایه Fully Connected

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

Output Layer

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

CNN را فقط تئوری یاد نگیرید؛ ساخت مدل را شروع کنید

اگر می‌خواهید از مفاهیم یادگیری عمیق به ساخت پروژه‌های واقعی AI برسید، مسیر یادگیری مناسب خود را پیدا کنید.


مسیر یادگیری AI Engineer →

Pooling چیست و چرا در CNN استفاده می‌شود؟

Pooling روشی برای کاهش ابعاد Feature Map است. این عملیات باعث می‌شود اطلاعات پردازشی فشرده‌تر شوند و تعداد محاسبات موردنیاز در بخش‌های بعدی شبکه کاهش پیدا کند.

Max Pooling

در Max Pooling، بیشترین مقدار موجود در هر ناحیه انتخاب می‌شود. این روش می‌تواند فعال‌ترین ویژگی شناسایی‌شده توسط فیلتر را حفظ کند.

Average Pooling

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

CNN چگونه ویژگی‌های تصویر را استخراج می‌کند؟

یکی از ویژگی‌های مهم CNN، یادگیری سلسله‌مراتبی ویژگی‌هاست. در لایه‌های ابتدایی شبکه معمولاً الگوهای ساده‌تر شناسایی می‌شوند و هرچه عمق شبکه بیشتر می‌شود، ویژگی‌های پیچیده‌تری ساخته می‌شوند.

به‌صورت ساده می‌توان این روند را چنین تصور کرد:

  • لایه‌های ابتدایی: لبه‌ها و خطوط
  • لایه‌های میانی: گوشه‌ها و ترکیب‌های ساده‌تر
  • لایه‌های عمیق‌تر: شکل‌ها و ساختارهای پیچیده
  • لایه‌های پایانی: ویژگی‌های سطح بالا برای تصمیم‌گیری

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

یک مثال ساده از عملکرد CNN

فرض کنید می‌خواهیم مدلی بسازیم که تصاویر را در دو کلاس «گربه» و «سگ» قرار دهد. تصویر ابتدا به‌عنوان داده ورودی وارد CNN می‌شود.

در لایه‌های ابتدایی، شبکه ممکن است الگوهایی مانند لبه‌ها و خطوط را شناسایی کند. سپس این الگوها در لایه‌های بعدی با یکدیگر ترکیب می‌شوند تا ساختارهای پیچیده‌تری شکل بگیرند.

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

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

معماری CNN چگونه طراحی می‌شود؟

یک CNN می‌تواند معماری‌های مختلفی داشته باشد، اما یک ساختار ساده معمولاً از چند بلوک Convolution و Activation و در برخی معماری‌ها Pooling تشکیل می‌شود و سپس به بخش طبقه‌بندی می‌رسد.

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

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

کاربردهای شبکه عصبی کانولوشن

CNN به دلیل توانایی بالا در پردازش داده‌های تصویری در طیف گسترده‌ای از کاربردهای هوش مصنوعی استفاده شده است.

طبقه‌بندی تصویر

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

تشخیص اشیا

در Object Detection مدل علاوه بر تشخیص نوع شیء، محل قرارگیری آن را نیز در تصویر مشخص می‌کند. این قابلیت در سیستم‌های نظارت تصویری، خودروهای خودران و بسیاری از سیستم‌های Computer Vision کاربرد دارد.

تشخیص چهره

مدل‌های مبتنی بر شبکه‌های عصبی عمیق می‌توانند برای استخراج ویژگی‌های چهره و سیستم‌های شناسایی یا تأیید هویت مورد استفاده قرار گیرند.

تحلیل تصاویر پزشکی

CNN می‌تواند برای تحلیل تصاویر پزشکی مانند تصاویر X-ray، CT و MRI مورد استفاده قرار گیرد. در چنین کاربردهایی مدل می‌تواند به شناسایی الگوهای تصویری مرتبط با یک مسئله پزشکی کمک کند، هرچند استفاده بالینی از چنین مدل‌هایی نیازمند اعتبارسنجی دقیق و نظارت متخصصان است.

پردازش و تحلیل تصاویر صنعتی

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

مزایای شبکه عصبی کانولوشن

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

معایب و محدودیت‌های CNN

  • نیاز به داده: مدل‌های عمیق معمولاً برای یادگیری قابل اتکا به داده آموزشی مناسب نیاز دارند.
  • هزینه محاسباتی: آموزش CNNهای عمیق می‌تواند به منابع محاسباتی قابل توجهی نیاز داشته باشد.
  • پیچیدگی مدل: مدل‌های عمیق ممکن است پارامترهای بسیار زیادی داشته باشند.
  • تفسیرپذیری محدود: توضیح دقیق اینکه مدل چرا یک تصمیم خاص گرفته همیشه ساده نیست.
  • حساسیت به داده آموزشی: کیفیت، تنوع و نحوه آماده‌سازی داده می‌تواند تأثیر زیادی بر عملکرد مدل داشته باشد.
  • ریسک Overfitting: در صورت تناسب بیش از حد مدل با داده‌های آموزشی، عملکرد روی داده‌های جدید می‌تواند کاهش پیدا کند.

CNN در Python

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

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

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

CNN و Transfer Learning

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

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

تفاوت CNN با شبکه عصبی معمولی

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

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

مقایسه مفهومی CNN با شبکه عصبی معمولی
تفاوت رویکرد CNN با شبکه عصبی کاملاً متصل در پردازش داده تصویری
ویژگی شبکه عصبی Fully Connected CNN
ساختار ورودی تصویری معمولاً نیازمند Flatten کردن ساختار مکانی تصویر را حفظ می‌کند
اتصالات اتصال‌های متراکم اتصال‌های محلی
اشتراک وزن محدود یکی از ویژگی‌های اصلی CNN
استخراج ویژگی تصویری کمتر تخصصی مناسب برای استخراج ویژگی‌های مکانی

چه زمانی از CNN استفاده کنیم؟

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

با این حال انتخاب مدل باید بر اساس مسئله، نوع داده، حجم دیتاست، محدودیت محاسباتی و معیارهای ارزیابی انجام شود. در برخی مسائل جدید Computer Vision، معماری‌های دیگری مانند Vision Transformer نیز می‌توانند گزینه‌های مناسبی باشند.

چه زمانی CNN انتخاب مناسبی نیست؟

CNN برای هر نوع داده‌ای بهترین انتخاب نیست. اگر داده شما عمدتاً جدولی باشد و ساختار مکانی مشخصی نداشته باشد، مدل‌هایی مانند درخت تصمیم، Random Forest یا Gradient Boosting ممکن است گزینه‌های مناسب‌تری باشند.

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

جمع‌بندی شبکه عصبی کانولوشن CNN

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

در یک CNN معمولی، داده از لایه‌های Convolution، Activation و در بسیاری از معماری‌ها Pooling عبور می‌کند و در نهایت ویژگی‌های استخراج‌شده برای تولید خروجی استفاده می‌شوند. این ساختار باعث شده است CNN در طبقه‌بندی تصویر، تشخیص اشیا، تحلیل تصاویر پزشکی، کنترل کیفیت صنعتی و بسیاری از مسائل Computer Vision کاربرد داشته باشد.

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

سوالات متداول درباره شبکه عصبی کانولوشن CNN

شبکه عصبی کانولوشن CNN چیست؟

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

CNN چگونه ویژگی‌های تصویر را استخراج می‌کند؟

CNN با استفاده از فیلترهای کانولوشن روی بخش‌های مختلف تصویر حرکت می‌کند و Feature Map ایجاد می‌کند. لایه‌های مختلف شبکه این ویژگی‌های ساده را به‌تدریج با یکدیگر ترکیب می‌کنند تا الگوهای پیچیده‌تر شکل بگیرند.

تفاوت CNN با شبکه عصبی معمولی چیست؟

CNN برای حفظ ساختار فضایی تصویر و استخراج ویژگی‌های محلی طراحی شده است و از اتصال محلی و اشتراک وزن استفاده می‌کند. شبکه‌های Fully Connected معمولی چنین ساختاری را به‌صورت تخصصی در نظر نمی‌گیرند.

Pooling در CNN چه کاری انجام می‌دهد؟

Pooling ابعاد فضایی Feature Map را کاهش می‌دهد و در نتیجه می‌تواند حجم محاسبات را کاهش دهد. Max Pooling و Average Pooling دو روش رایج برای این کار هستند.

آیا CNN فقط برای تصاویر استفاده می‌شود؟

خیر. CNN می‌تواند در برخی مسائل مربوط به ویدئو، سیگنال‌ها، داده‌های مکانی و سایر داده‌هایی که ساختار محلی دارند نیز استفاده شود؛ هرچند شناخته‌شده‌ترین کاربرد آن در Computer Vision است.

آیا می‌توان CNN را با Python پیاده‌سازی کرد؟

بله. Python یکی از رایج‌ترین زبان‌ها برای توسعه مدل‌های CNN است و کتابخانه‌هایی مانند TensorFlow و PyTorch ابزارهای لازم برای ساخت، آموزش و ارزیابی این مدل‌ها را فراهم می‌کنند.

مسیر یادگیری CNN و Deep Learning

اگر هدف شما فقط آشنایی با مفهوم CNN نیست و می‌خواهید از شبکه‌های عصبی و یادگیری عمیق برای ساخت پروژه‌های واقعی AI استفاده کنید، بهتر است مسیر یادگیری را از مبانی Machine Learning و شبکه‌های عصبی شروع کرده و سپس به CNN، Computer Vision و مدل‌های پیشرفته‌تر برسید.

اگر CNN را یاد گرفته‌ای، قدم بعدی ساختن پروژه واقعی است.

بین دانستن مفاهیم Deep Learning و توانایی ساخت یک سیستم AI واقعی فاصله وجود دارد. با یک مسیر ساختاریافته، این فاصله را با Python، Machine Learning، Deep Learning و پروژه‌های عملی طی کن.

شروع مسیر AI Engineer →

منابع

  • Kim, P. (2017), Convolutional Neural Network, MATLAB Deep Learning, Apress.
  • Analytics Vidhya — منابع آموزشی شبکه‌های عصبی کانولوشن
  1. علی گفت:

    با سلام
    برای شروع یادگیری CNN چه منابعی را پیشنهاد میکنید؟

    1. مدیر سایت گفت:

      سلام وقتتون بخیر. منابع مختلفی وجود داره. پیشنهاد ما به شما مطالعه این مقاله است که در انتها منابعش هم ذکر کرده و میتونید استفاده کنید.

      https://www.sciencedirect.com/science/article/abs/pii/B9780128157398000109?via%3Dihub

  2. صادق گفت:

    سلام
    سطح مطلب شما ابتدایی هست همه چیز را گفتید ولی سطحی این نوع مطالب همه جا گیر میاد به نظر من بحث های جزیی تر و نکات فنی تر برای مخاطب جذاب تر هست ممنون

    1. مدیر سایت گفت:

      ممنون از اینکه نظرتون رو با ما در میون گذاشتید.

دیدگاهتان را بنویسید

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