ঠিক আছে, উপরের সমস্যা সমাধানের জন্য আমি আমার প্রশ্নে নিজেকে ওয়ার্কআউট করার সিদ্ধান্ত নিয়েছি। আমি যা চেয়েছিলাম তা হল ওপেনসিভিতে কে নেয়ারেস্ট বা এসভিএম বৈশিষ্ট্যগুলি ব্যবহার করে একটি সাধারণ ওসিআর বাস্তবায়ন করা। এবং নীচে আমি কি করেছি এবং কীভাবে তা করছি। (এটি কেবল ওসিআরের সাধারণ উদ্দেশ্যে কী-কেয়ারস্টকে কীভাবে ব্যবহার করতে হয় তা শেখার জন্য)।
1) আমার প্রথম প্রশ্নটি ছিল লেটার_সেকগনিশন.ডাটা ফাইল সম্পর্কে যা ওপেনসিভি নমুনাগুলি নিয়ে আসে। আমি জানতে চেয়েছিলাম যে এই ফাইলটির ভিতরে কী আছে।
এটিতে একটি চিঠি এবং সেই চিঠির 16 টি বৈশিষ্ট্য রয়েছে।
এবং this SOF
এটি খুঁজে পেতে আমাকে সহায়তা করেছে। এই 16 বৈশিষ্ট্যগুলি কাগজে ব্যাখ্যা করা হয়েছে Letter Recognition Using Holland-Style Adaptive Classifiers
। (যদিও আমি কিছু বৈশিষ্ট্যগুলি শেষ পর্যন্ত বুঝতে পারি নি)
2) যেহেতু আমি জানতাম, এই সমস্ত বৈশিষ্ট্যগুলি না বুঝে, সেই পদ্ধতিটি করা কঠিন। আমি অন্য কিছু কাগজপত্র চেষ্টা করেছিলাম, তবে একটি শিক্ষানবিশের জন্য সমস্ত কিছুটা কঠিন ছিল।
So I just decided to take all the pixel values as my features.
(আমি নির্ভুলতা বা পারফরম্যান্স নিয়ে চিন্তিত নই, আমি কেবল এটি কাজ করতে চেয়েছিলাম, কমপক্ষে কমপক্ষে নির্ভুলতার সাথে)
আমি আমার প্রশিক্ষণের ডেটার জন্য চিত্রটি নীচে নিয়েছি:
(আমি জানি প্রশিক্ষণের ডেটার পরিমাণ কম But তবে, যেহেতু সমস্ত বর্ণগুলি একই হরফ এবং আকারের, তাই আমি এটি চেষ্টা করার সিদ্ধান্ত নিয়েছিলাম)।
প্রশিক্ষণের জন্য ডেটা প্রস্তুত করতে, আমি ওপেনসিভিতে একটি ছোট কোড তৈরি করেছি। এটি নিম্নলিখিত জিনিসগুলি করে:
- এটি চিত্রটি লোড করে।
- অঙ্কগুলি নির্বাচন করে (স্পষ্টতই মিথ্যা সনাক্তকরণ এড়াতে অক্ষরের ক্ষেত্র এবং উচ্চতার ক্ষেত্রে সীমাবদ্ধতা সন্ধান এবং প্রয়োগের মাধ্যমে)।
- একটি বর্ণের চারদিকে আবদ্ধ আয়তক্ষেত্রটি আঁকুন এবং অপেক্ষা করুন
key press manually
। এবার আমরা বাক্সের চিঠির সাথে অনুরূপ ডিজিট কীটি টিপব ।
- একবার সম্পর্কিত অঙ্ক কী টিপে গেলে, এটি এই বাক্সটিকে 10x10 এ আকার দেয় এবং 100 টি পিক্সেল মান সংরক্ষণ করে (এখানে, নমুনা) এবং ম্যানুয়ালি অন্য একটি অ্যারে অঙ্কিত অঙ্ক (এখানে প্রতিক্রিয়া))
- তারপরে উভয় অ্যারে পৃথক txt ফাইলগুলিতে সংরক্ষণ করুন।
অঙ্কগুলির ম্যানুয়াল শ্রেণিবিন্যাসের শেষে, ট্রেনের সমস্ত অংকের (ট্রেন.পিএনজি) সমস্ত অঙ্কগুলি নিজে নিজে লেবেলযুক্ত হয়, চিত্রটি নীচের মত দেখাবে:
উপরের উদ্দেশ্যগুলির জন্য আমি নীচের কোডটি ব্যবহার করেছি (অবশ্যই, এত পরিষ্কার নয়):
import sys
import numpy as np
import cv2
im = cv2.imread('pitrain.png')
im3 = im.copy()
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)
################# Now finding Contours ###################
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
samples = np.empty((0,100))
responses = []
keys = [i for i in range(48,58)]
for cnt in contours:
if cv2.contourArea(cnt)>50:
[x,y,w,h] = cv2.boundingRect(cnt)
if h>28:
cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2)
roi = thresh[y:y+h,x:x+w]
roismall = cv2.resize(roi,(10,10))
cv2.imshow('norm',im)
key = cv2.waitKey(0)
if key == 27: # (escape to quit)
sys.exit()
elif key in keys:
responses.append(int(chr(key)))
sample = roismall.reshape((1,100))
samples = np.append(samples,sample,0)
responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))
print "training complete"
np.savetxt('generalsamples.data',samples)
np.savetxt('generalresponses.data',responses)
এখন আমরা প্রশিক্ষণ এবং পরীক্ষার অংশে প্রবেশ করি।
অংশটি পরীক্ষার জন্য আমি চিত্রের নীচে ব্যবহার করেছি, যার ট্রেনিংয়ের জন্য একই ধরণের অক্ষর রয়েছে।
প্রশিক্ষণের জন্য আমরা নিম্নরূপ করি :
- আমরা ইতিমধ্যে সংরক্ষিত txt ফাইলগুলি লোড করুন
- আমরা যে শ্রেণিবদ্ধের ব্যবহার করছি তার একটি উদাহরণ তৈরি করুন (এখানে, এটি কেএনরেস্ট)
- তারপরে আমরা ডেটা প্রশিক্ষণের জন্য KNearest.train ফাংশনটি ব্যবহার করি
পরীক্ষার উদ্দেশ্যে, আমরা নিম্নলিখিত হিসাবে করি:
- আমরা পরীক্ষার জন্য ব্যবহৃত চিত্রটি লোড করি
- পূর্বের মতো চিত্রটি প্রক্রিয়া করুন এবং কনট্যুর পদ্ধতি ব্যবহার করে প্রতিটি অঙ্কটি বের করুন
- এর জন্য সীমানা বাক্স আঁকুন, তারপরে 10x10 এ আকার দিন এবং এর পিক্সেল মানগুলি আগের মতো করে অ্যারেতে সংরক্ষণ করুন।
- তারপরে আমরা যেটি দিয়েছি তার নিকটতম আইটেমটি সন্ধান করতে আমরা কেএনরেস্ট.ফাইন্ড_নেস্ট () ফাংশনটি ব্যবহার করি। (ভাগ্যবান হলে, এটি সঠিক সংখ্যাটি স্বীকৃতি দেবে))
আমি নীচে একক কোডে শেষ দুটি পদক্ষেপ (প্রশিক্ষণ এবং পরীক্ষা) অন্তর্ভুক্ত করেছি:
import cv2
import numpy as np
####### training part ###############
samples = np.loadtxt('generalsamples.data',np.float32)
responses = np.loadtxt('generalresponses.data',np.float32)
responses = responses.reshape((responses.size,1))
model = cv2.KNearest()
model.train(samples,responses)
############################# testing part #########################
im = cv2.imread('pi.png')
out = np.zeros(im.shape,np.uint8)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
if cv2.contourArea(cnt)>50:
[x,y,w,h] = cv2.boundingRect(cnt)
if h>28:
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
roi = thresh[y:y+h,x:x+w]
roismall = cv2.resize(roi,(10,10))
roismall = roismall.reshape((1,100))
roismall = np.float32(roismall)
retval, results, neigh_resp, dists = model.find_nearest(roismall, k = 1)
string = str(int((results[0][0])))
cv2.putText(out,string,(x,y+h),0,1,(0,255,0))
cv2.imshow('im',im)
cv2.imshow('out',out)
cv2.waitKey(0)
এবং এটি কাজ করেছে, নীচে আমি পেয়েছি ফলাফল:
এখানে এটি 100% নির্ভুলতার সাথে কাজ করেছে। আমি ধরে নিলাম এটি কারণ সমস্ত অঙ্কগুলি একই ধরণের এবং একই আকারের।
তবে যে কোনও উপায়ে, এটি নতুনদের জন্য যাওয়ার জন্য একটি ভাল শুরু (আমি আশা করি))