কনভল্যুশন তৈরি করুন এবং পুলিং সঞ্চালন করুন

1. আপনি শুরু করার আগে

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

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

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

পূর্বশর্ত

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

আপনি কি শিখবেন

  • convolutions কি
  • কিভাবে একটি বৈশিষ্ট্য মানচিত্র তৈরি করতে হয়
  • পুলিং কি

আপনি কি নির্মাণ করবেন

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

আপনি কি প্রয়োজন হবে

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

আপনাকে টেনসরফ্লো ইনস্টল করতে হবে, এবং আগের কোডল্যাবে আপনি যে লাইব্রেরিগুলি ইনস্টল করেছেন।

2. convolutions কি?

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

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

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

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

ইমেজ উপর আবর্তন

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

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

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

আপনি SciPy-এর ঊর্ধ্বগামী চিত্রের সাথে এটি প্রদর্শন করবেন। এটি প্রচুর কোণ এবং লাইন সহ একটি সুন্দর অন্তর্নির্মিত ছবি।

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

কিছু পাইথন লাইব্রেরি এবং আরোহণ ছবি আমদানি করে শুরু করুন:

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 অ্যারে হিসাবে সংরক্ষণ করা হয়, তাই আমরা কেবল সেই অ্যারেটি অনুলিপি করে রূপান্তরিত চিত্র তৈরি করতে পারি। সাইজ_এক্স এবং সাইজ_ওয়াই ভেরিয়েবলগুলি ছবির মাত্রা ধরে রাখবে যাতে আপনি পরে এটি লুপ করতে পারেন।

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

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

প্রথমে, একটি 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

এখন, আউটপুট পিক্সেল গণনা করুন। একটি 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

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

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

# 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।

6. পুলিং বোঝা

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

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

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

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

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

নিম্নলিখিত কোড একটি (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

সেই প্লটের অক্ষগুলি নোট করুন। ইমেজটি এখন 256x256, এটির আসল আকারের এক-চতুর্থাংশ, এবং শনাক্ত করা বৈশিষ্ট্যগুলি এখন ইমেজে কম ডেটা থাকা সত্ত্বেও উন্নত করা হয়েছে।

8. অভিনন্দন

আপনি আপনার প্রথম কম্পিউটার ভিশন মডেল তৈরি করেছেন! আপনার কম্পিউটার ভিশন মডেলগুলিকে কীভাবে আরও উন্নত করতে হয় তা শিখতে, কম্পিউটারের দৃষ্টিশক্তি উন্নত করতে কনভোলিউশনাল নিউরাল নেটওয়ার্ক (CNNs) তৈরিতে এগিয়ে যান।