কনভলিউশন তৈরি করুন এবং পুলিং করুন

১. শুরু করার আগে

এই কোডল্যাবে, আপনি কনভলিউশন সম্পর্কে এবং কম্পিউটার ভিশন পরিস্থিতিতে কেন তারা এত শক্তিশালী তা শিখবেন।

আগের কোডল্যাবে, আপনি ফ্যাশন আইটেমগুলির কম্পিউটার ভিশনের জন্য একটি সহজ ডিপ নিউরাল নেটওয়ার্ক (DNN) তৈরি করেছিলেন। এটি সীমিত ছিল কারণ এতে পোশাকের জিনিসটিকে ছবিতে একমাত্র জিনিস হিসাবে দেখাতে হত এবং এটিকে কেন্দ্রীভূত করতে হত।

অবশ্যই, এটি বাস্তবসম্মত দৃশ্য নয়। আপনি চাইবেন আপনার DNN যেন ছবিতে পোশাকের জিনিসটিকে অন্য বস্তুর সাথে শনাক্ত করতে পারে, অথবা যেখানে এটি সামনে এবং মাঝখানে অবস্থিত নয়। এটি করার জন্য, আপনাকে কনভলিউশন ব্যবহার করতে হবে।

পূর্বশর্ত

এই কোডল্যাবটি আগের দুটি কিস্তিতে সম্পন্ন কাজের উপর ভিত্তি করে তৈরি, "মেশিন লার্নিংয়ের "হ্যালো, ওয়ার্ল্ড" কে হ্যালো বলুন , এবং একটি কম্পিউটার ভিশন মডেল তৈরি করুন । চালিয়ে যাওয়ার আগে দয়া করে সেই কোডল্যাবগুলি সম্পূর্ণ করুন।

তুমি কি শিখবে

  • কনভোলিউশন কি?
  • কিভাবে একটি ফিচার ম্যাপ তৈরি করবেন
  • পুলিং কী?

তুমি কী তৈরি করবে

  • একটি ছবির একটি বৈশিষ্ট্য মানচিত্র

তোমার যা লাগবে

আপনি Colab-এ চলমান বাকি কোডল্যাবের কোড খুঁজে পেতে পারেন।

আপনার TensorFlow ইনস্টল করা এবং পূর্ববর্তী কোডল্যাবে ইনস্টল করা লাইব্রেরিগুলিও প্রয়োজন হবে।

2. কনভোলিউশন কি?

কনভলিউশন হলো এমন একটি ফিল্টার যা একটি ছবির উপর দিয়ে যায়, এটি প্রক্রিয়া করে এবং গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি বের করে।

ধরুন আপনার কাছে স্নিকার পরা একজন ব্যক্তির একটি ছবি আছে। আপনি কীভাবে বুঝতে পারবেন যে ছবিতে একটি স্নিকার আছে? আপনার প্রোগ্রামটি ছবিটিকে স্নিকার হিসেবে "দেখতে" চাইলে, আপনাকে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলি বের করতে হবে এবং অপ্রয়োজনীয় বৈশিষ্ট্যগুলি ঝাপসা করতে হবে। একে বলা হয় ফিচার ম্যাপিং

ফিচার ম্যাপিং প্রক্রিয়াটি তাত্ত্বিকভাবে সহজ। আপনি ছবির প্রতিটি পিক্সেল স্ক্যান করবেন এবং তারপর এর পার্শ্ববর্তী পিক্সেলগুলি দেখবেন। আপনি একটি ফিল্টারে সেই পিক্সেলগুলির মানগুলিকে সমতুল্য ওজন দিয়ে গুণ করবেন।

উদাহরণস্বরূপ:

ছবির উপর কনভলিউশন

এই ক্ষেত্রে, একটি 3x3 কনভোলিউশন ম্যাট্রিক্স, অথবা ইমেজ কার্নেল , নির্দিষ্ট করা হয়।

বর্তমান পিক্সেলের মান হল ১৯২। আপনি প্রতিবেশী মানগুলি দেখে, ফিল্টারে উল্লেখিত মানগুলি দিয়ে গুণ করে এবং নতুন পিক্সেলের মানটিকে চূড়ান্ত পরিমাণ করে নতুন পিক্সেলের মান গণনা করতে পারেন।

এখন সময় এসেছে একটি 2D গ্রেস্কেল ছবিতে একটি মৌলিক কনভলিউশন তৈরি করে কনভলিউশন কীভাবে কাজ করে তা অন্বেষণ করার।

SciPy এর ascent ছবির মাধ্যমে আপনি এটি প্রদর্শন করতে পারবেন। এটি অনেক কোণ এবং রেখা সহ একটি সুন্দর বিল্ট-ইন ছবি।

৩. কোডিং শুরু করুন

কিছু পাইথন লাইব্রেরি এবং অ্যাসেন্ট ছবি আমদানি করে শুরু করুন:

import cv2
import numpy as np
from scipy import misc
i = misc.ascent()

এরপর, Pyplot লাইব্রেরি matplotlib ব্যবহার করে ছবিটি আঁকুন যাতে আপনি জানতে পারেন এটি কেমন দেখাচ্ছে:

import matplotlib.pyplot as plt
plt.grid(False)
plt.gray()
plt.axis('off')
plt.imshow(i)
plt.show()

edb460dd5397f7f4.png সম্পর্কে

তুমি দেখতে পাচ্ছো যে এটি একটি সিঁড়ির ছবি। অনেকগুলি বৈশিষ্ট্য আছে যা তুমি চেষ্টা করে আলাদা করতে পারো। উদাহরণস্বরূপ, শক্তিশালী উল্লম্ব রেখা আছে।

ছবিটি একটি NumPy অ্যারে হিসেবে সংরক্ষণ করা হয়েছে, তাই আমরা কেবল সেই অ্যারেটি অনুলিপি করে রূপান্তরিত চিত্রটি তৈরি করতে পারি। size_x এবং size_y ভেরিয়েবলগুলি চিত্রটির মাত্রা ধরে রাখবে যাতে আপনি পরে এটি লুপ করতে পারেন।

i_transformed = np.copy(i)
size_x = i_transformed.shape[0]
size_y = i_transformed.shape[1]

৪. কনভোলিউশন ম্যাট্রিক্স তৈরি করুন

প্রথমে, 3x3 অ্যারে হিসেবে একটি কনভোলিউশন ম্যাট্রিক্স (অথবা কার্নেল) তৈরি করুন:

# This filter detects edges nicely
# It creates a filter that only passes through sharp edges and straight lines. 
# Experiment with different values for fun effects.
#filter = [ [0, 1, 0], [1, -4, 1], [0, 1, 0]] 
# A couple more filters to try for fun!
filter = [ [-1, -2, -1], [0, 0, 0], [1, 2, 1]]
#filter = [ [-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
 # If all the digits in the filter don't add up to 0 or 1, you 
# should probably do a weight to get it to do so
# so, for example, if your weights are 1,1,1 1,2,1 1,1,1
# They add up to 10, so you would set a weight of .1 if you want to normalize them
weight  = 1

এবার, আউটপুট পিক্সেল গণনা করুন। ১-পিক্সেল মার্জিন রেখে চিত্রটির উপর পুনরাবৃত্তি করুন, এবং বর্তমান পিক্সেলের প্রতিটি প্রতিবেশীকে ফিল্টারে সংজ্ঞায়িত মান দিয়ে গুণ করুন।

এর মানে হল যে বর্তমান পিক্সেলের উপরে এবং বামে থাকা প্রতিবেশীকে ফিল্টারের উপরের বাম দিকের আইটেম দ্বারা গুণ করা হবে। তারপর, ফলাফলটিকে ওজন দিয়ে গুণ করুন এবং নিশ্চিত করুন যে ফলাফলটি 0 থেকে 255 এর মধ্যে রয়েছে।

অবশেষে, রূপান্তরিত ছবিতে নতুন মানটি লোড করুন:

for x in range(1,size_x-1):
  for y in range(1,size_y-1):
      output_pixel = 0.0
      output_pixel = output_pixel + (i[x - 1, y-1] * filter[0][0])
      output_pixel = output_pixel + (i[x, y-1] * filter[0][1])
      output_pixel = output_pixel + (i[x + 1, y-1] * filter[0][2])
      output_pixel = output_pixel + (i[x-1, y] * filter[1][0])
      output_pixel = output_pixel + (i[x, y] * filter[1][1])
      output_pixel = output_pixel + (i[x+1, y] * filter[1][2])
      output_pixel = output_pixel + (i[x-1, y+1] * filter[2][0])
      output_pixel = output_pixel + (i[x, y+1] * filter[2][1])
      output_pixel = output_pixel + (i[x+1, y+1] * filter[2][2])
      output_pixel = output_pixel * weight
      if(output_pixel<0):
        output_pixel=0
      if(output_pixel>255):
        output_pixel=255
      i_transformed[x, y] = output_pixel

৫. ফলাফল পরীক্ষা করুন

এবার, ছবিটির উপর দিয়ে ফিল্টারটি যাওয়ার প্রভাব দেখতে ছবিটি প্লট করুন:

# Plot the image. Note the size of the axes -- they are 512 by 512
plt.gray()
plt.grid(False)
plt.imshow(i_transformed)
#plt.axis('off')
plt.show()   

48ff667b2df812ad.png সম্পর্কে

নিম্নলিখিত ফিল্টার মান এবং ছবির উপর তাদের প্রভাব বিবেচনা করুন।

[-1,0,1,-2,0,2,-1,0,1] ব্যবহার করলে আপনি উল্লম্ব রেখার একটি খুব শক্তিশালী সেট পাবেন:

উল্লম্ব রেখা ফিল্টার সনাক্তকরণ

[-1,-2,-1,0,0,0,1,2,1] ব্যবহার করলে আপনি অনুভূমিক রেখা পাবেন:

অনুভূমিক রেখা সনাক্তকরণ

বিভিন্ন মান অন্বেষণ করুন! এছাড়াও, 5x5 বা 7x7 এর মতো বিভিন্ন আকারের ফিল্টার ব্যবহার করে দেখুন।

৬. পুলিং বোঝা

এখন আপনি ছবির প্রয়োজনীয় বৈশিষ্ট্যগুলো শনাক্ত করেছেন, তাহলে আপনি কী করবেন? ফলাফলের বৈশিষ্ট্য মানচিত্রটি কীভাবে ব্যবহার করে ছবিগুলোকে শ্রেণীবদ্ধ করবেন?

কনভলিউশনের মতোই, পুলিং বৈশিষ্ট্য সনাক্তকরণে ব্যাপকভাবে সাহায্য করে। পুলিং স্তরগুলি একটি ছবিতে তথ্যের সামগ্রিক পরিমাণ হ্রাস করে এবং সনাক্ত হওয়া বৈশিষ্ট্যগুলিকে বর্তমান হিসাবে বজায় রাখে।

পুলিং এর বিভিন্ন ধরণ আছে, কিন্তু আপনি সর্বোচ্চ (সর্বোচ্চ) পুলিং নামক একটি ব্যবহার করবেন।

ছবিটির উপর আবার ঘুরুন এবং প্রতিটি বিন্দুতে, ডানদিকে, নীচে এবং ডানদিকে পিক্সেল এবং এর নিকটবর্তী প্রতিবেশীদের বিবেচনা করুন। এর মধ্যে সবচেয়ে বড়টি নিন (অতএব সর্বাধিক পুলিং) এবং এটি নতুন ছবিতে লোড করুন। সুতরাং, নতুন ছবিটি পুরানোটির আকারের এক-চতুর্থাংশ হবে। সর্বোচ্চ পুলিং

৭. পুলিং এর জন্য কোড লিখুন

নিচের কোডটি (2, 2) পুলিং দেখাবে। আউটপুট দেখতে এটি চালান।

তুমি দেখতে পাবে যে ছবিটি মূল ছবির এক-চতুর্থাংশ আকারের হলেও, এটি সমস্ত বৈশিষ্ট্য ধরে রেখেছে।

new_x = int(size_x/2)
new_y = int(size_y/2)
newImage = np.zeros((new_x, new_y))
for x in range(0, size_x, 2):
  for y in range(0, size_y, 2):
    pixels = []
    pixels.append(i_transformed[x, y])
    pixels.append(i_transformed[x+1, y])
    pixels.append(i_transformed[x, y+1])
    pixels.append(i_transformed[x+1, y+1])
    pixels.sort(reverse=True)
    newImage[int(x/2),int(y/2)] = pixels[0]
 
# Plot the image. Note the size of the axes -- now 256 pixels instead of 512
plt.gray()
plt.grid(False)
plt.imshow(newImage)
#plt.axis('off')
plt.show()

1f5ebdafd1db2595.png সম্পর্কে

সেই প্লটের অক্ষগুলি লক্ষ্য করুন। ছবিটি এখন ২৫৬x২৫৬, তার মূল আকারের এক-চতুর্থাংশ, এবং ছবিতে এখন কম তথ্য থাকা সত্ত্বেও সনাক্ত করা বৈশিষ্ট্যগুলি উন্নত করা হয়েছে।

৮. অভিনন্দন

তুমি তোমার প্রথম কম্পিউটার ভিশন মডেল তৈরি করে ফেলেছো! তোমার কম্পিউটার ভিশন মডেলগুলিকে আরও উন্নত করার পদ্ধতি শিখতে, কম্পিউটার ভিশন উন্নত করার জন্য কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNN) তৈরি করতে এগিয়ে যাও।