فصل ۱۴: بینایی ماشین عمیق با شبکههای عصبی کانولوشنی
کارهایی مثل تشخیص یک حیوان در تصویر برای انسان بدیهی به نظر میرسند، اما بخش بزرگی از ادراک پیش از رسیدن اطلاعات به آگاهی ما در سامانههای تخصصی مغز انجام میشود. شبکههای عصبی کانولوشنی یا CNN از ساختار سلسلهمراتبی سامانهٔ بینایی الهام گرفتهاند و در بسیاری از Taskهای Visual به عملکرد بسیار بالایی رسیدهاند. فصل ۱۴ ابتدا اجزای اصلی CNN را توضیح میدهد، سپس Architectureهای مشهور را بررسی میکند و در ادامه به Object Detection و Semantic Segmentation میرسد.
معماری قشر بینایی
پژوهشهای David Hubel و Torsten Wiesel نشان داد بسیاری از Neuronهای Visual Cortex فقط به Stimulusهای واقع در ناحیهٔ کوچکی از میدان دید پاسخ میدهند؛ این ناحیه Local Receptive Field نام دارد. Receptive Fieldهای Neuronهای مختلف همپوشانی دارند و در مجموع کل Field را میپوشانند. برخی Neuronها فقط به Lineهای افقی یا جهتهای خاص پاسخ میدهند و Neuronهای سطح بالاتر Patternهای پیچیدهتر را از ترکیب Outputهای سطح پایین میسازند.
شکل 14-1. Local Receptive Fieldهای Neuronهای Visual Cortex
این مشاهدهها الهامبخش Neocognitron در سال ۱۹۸۰ شد و بعدها به CNNهای امروزی تکامل یافت. LeNet-5 در سال ۱۹۹۸ یک نقطهٔ عطف عملی بود و برای تشخیص رقمهای دستنویس روی Checkها استفاده شد. دو Building Block مهم آن Convolutional Layer و Pooling Layer بودند.
Convolutional Layer
در Dense Layer هر Neuron به تمام Inputها وصل است؛ در Convolutional Layer هر Neuron فقط به Pixelهای داخل یک Receptive Field کوچک از Layer قبلی متصل میشود. Neuronهای یک Layer در موقعیتهای مختلف Image قرار میگیرند و همین Local Connectivity اجازه میدهد Featureهای کوچک سطح پایین در Layerهای ابتدایی و Featureهای بزرگتر سطح بالا در Layerهای بعدی ساخته شوند.
شکل 14-2. Layerهای CNN با Receptive Field مستطیلی
در CNN، Layerها معمولاً به شکل Grid دوبعدی نمایش داده میشوند و Image لازم نیست پیش از Convolution به Vector یکبعدی Flatten شود.
Zero Padding و Stride
اگر Receptive Field با اندازهٔ f_h × f_w در لبههای Image حرکت کند، بدون Padding اندازهٔ Output کوچکتر میشود. با افزودن Zero Padding اطراف Input میتوان اندازه را حفظ کرد یا کنترل بیشتری روی Output داشت.
شکل 14-3. اتصال Layerها و Zero Padding
Stride فاصلهٔ حرکت Receptive Field در هر Step است. Stride برابر ۲ یعنی Layer هر بار دو Pixel جلو میرود و در نتیجه Height/Width Output تقریباً نصف میشود. این Downsampling میتواند Compute و Memory را کاهش دهد، ولی Resolution مکانی را نیز کم میکند.
شکل 14-4. کاهش Dimension با Stride برابر ۲
Filter یا Convolution Kernel
Weightهای یک Neuron را میتوان به شکل Matrix کوچکی هماندازهٔ Receptive Field دید که Filter یا Kernel نام دارد. اگر همهٔ Neuronهای یک Feature Map از یک Kernel مشترک استفاده کنند، Pattern مشخصی را در هر موقعیت Image تشخیص میدهند. مثال کتاب دو Kernel سادهٔ عمودی و افقی را روی یک Image اعمال میکند؛ Outputهای حاصل لبهها یا Structureهای متناظر را برجسته میکنند.
شکل 14-5. اعمال دو Filter و تولید دو Feature Map
در شبکهٔ واقعی Kernelها دستی تعیین نمیشوند؛ Weightها Random Initialize و با Training یاد گرفته میشوند. شبکه ممکن است در Layer اول Edge، Line یا Color Transition بیاموزد و در Layerهای بعدی این Featureها را به Shape و Object ترکیب کند.
چند Feature Map و Weight Sharing
Convolutional Layer معمولاً چند Filter دارد و برای هر Filter یک Feature Map Output تولید میکند. بنابراین Tensor Layer سهبعدی است: Height، Width و Depth یا تعداد Feature Mapها. هر Neuron در یک Feature Map Kernel و Bias مشترک دارد، اما Feature Mapهای مختلف Parameterهای متفاوت دارند. Receptive Field هر Neuron تمام Channelهای Layer قبلی را دربر میگیرد.
شکل 14-6. دو Convolutional Layer با چند Filter روی تصویر رنگی
Weight Sharing تعداد Parameterها را بهشدت کاهش میدهد و Translation Equivariance ایجاد میکند: Patternی که در یک Location یاد گرفته شود در Locationهای دیگر نیز با همان Filter شناسایی میشود. Input Image رنگی سه Channel قرمز، سبز و آبی دارد و Kernel هر Feature Map روی هر سه Channel Weight دارد.
معادلهٔ Convolution
برای Neuron واقع در Row i، Column j و Feature Map k از Layer l، Output از مجموع Weightدار تمام Inputهای Receptive Field در همهٔ Feature Mapهای Layer قبل بهعلاوهٔ Bias ساخته میشود و سپس Activation Function اعمال میشود:
z[i,j,k] = b[k] + Σ(u) Σ(v) Σ(k') x[i',j',k'] × w[u,v,k',k]
Indexهای i' و j' با Stride و Padding تعیین میشوند. نکتهٔ مهم این است که تعداد Parameterها به Spatial Size Input وابسته نیست؛ به Kernel Size، تعداد Input Channel و تعداد Filter بستگی دارد.
پیادهسازی Convolution با Keras
در Keras از Conv2D استفاده میشود. مثال پایه:
conv = tf.keras.layers.Conv2D(
filters=32,
kernel_size=7,
strides=1,
padding="valid",
activation="relu")
output = conv(images)
filters=32 یعنی ۳۲ Kernel مستقل و در نتیجه ۳۲ Feature Map Output. kernel_size=7 Kernel هفتدرهفت را تعیین میکند. با padding="valid" Padding انجام نمیشود و Spatial Size کاهش مییابد. اگر padding="same" و Stride برابر ۱ باشد، Keras به اندازهٔ لازم Zero Padding اضافه میکند تا Height/Width Output با Input برابر بماند.
Shape معمول Input به صورت [batch_size, height, width, channels] است. برای مثال دو Image با Shape [2, 70, 120, 3] پس از Conv2D با ۳۲ Filter، Outputی با Depth برابر ۳۲ تولید میکنند. اگر Padding معتبر باشد Height/Width کاهش مییابد و با Same Padding حفظ میشود. جزئیات دقیق رابطهٔ Padding و Stride در ادامهٔ فصل بررسی میشود.