Saturday, November 17, 2012

স্ক্যান করা বইয়ের পাতা থেকে শব্দগুলোর অবস্থান নির্ণয়

আগের পোস্টে দেখেছি কীভাবে স্ক্যান করা পাতাকে ঘুরিয়ে লাইনগুলোকে আনুভূমিক করা যায়। আজকের ধাপে আমরা প্রতিটি শব্দকে আলাদা আলাদাভাবে কেটে ফেলতে চাই। পরে একটা একটা করে শব্দ নিয়ে কাজ করা যাবে।

এ কাজে ইনপুট হিসাবে আমরা ব্যবহার করছি একটা সত্যিকারের বইয়ের স্ক্যান করা পাতা। শাহরিয়ার কবিরের লেখা জাহানারা ইমামের শেষ দিনগুলি বইটির ৬১ তম পৃষ্ঠার প্রথম প্যারা।

পাতাটি দেখতে বেশ ঝক ঝকে হলেও আসলে এর মধ্যে অনেক রকম খুত আছে, যেটা আমাদের কম্পিউটারকে বোকা বানিয়ে দিতে পারে। সেগুলো কেমন? একটু হিস্টোগ্রাম ইকুয়ালাইজ করে দেখি।


এটা করার ফলে, যদিও অনেক রকম খুত চোখে পড়ছে, একই সঙ্গে মূল লেখাটা আরো গাড় হয়ে গেছে। তাই আমরা এর থেকে শুধু গাড় পিক্সেলগুলো রেখে বাকি সব ফেলে দেব। কাজটা করব থ্রেশহোল্ড ফাংশনের সাহায্যে। একই সংগে ছবিটির রঙও উল্টে করে ফেলবো। 


সবকিছু একেবারে সাদা কালোয় নিয়ে এলাম। এখানে পিক্সেলগুলোর মান হয় ২৫৫ (সাদা) অথবা ০ (কালো)। এখন লাইনগুলো আলাদা করা একেবারে সহজ।

এই ছবিতে প্রতিটি লাইনের উপরে আর নীচে একটা করে দাগ দেওয়া হয়েছে। কাজটা করতে পুরো ছবিটাকে একটা ম্যাট্রিক্স ভেবে নিয়ে সেটাকে এর প্রস্থের সমান একটা বিশেষ ভেক্টরের সাথে গুন দিইয়েছি। ভেক্টরটির প্রতিটি ইলিমেন্ট ১। ফলে আমরা আউটপুটে এই ছবির উচ্চতার সমান একটা ভেক্টর পাবো, যার প্রতিটি ইলিমেন্ট ঐ লাইন বরাবর কত্টি পিক্সেল সাদা সেটা নির্দেশ করে। সেখান থেকে লাইনগুলো বোঝা যায়। একইভাবে শব্দগুলোও নির্ণয় করে ফেলি।


এখন কোথাথেকে কতটুকুর মধ্যে শব্দগুলো আছে তা আমরা পেয়ে গেছি। এখন মূল ছবিতে শব্দগুলোকে লাল রঙের বক্সে বন্দী করে ফেলি। 

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

ভাবতেই ভালো লাগছে যে সেই বুদ্ধিটা দিতে হবে আমাকেই!

সংযুক্তি: থ্রেশহোল্ডের মান পালটে একই কোড দিয়ে বর্ণগুলোকেও আলাদা করা যায়। যদিও তখন খুব একটা রোবাস্ট হয় না। এখানে তেমন একটা টেস্ট কেসের রেজাল্ট টাঙ্গিয়ে রাখি।

Wednesday, November 14, 2012

আঁকা-বাঁকা ভাবে স্ল্যান করা পাতা সোজা করার পদ্ধতি

স্ক্যান করার সময় পাতা একটু এদিক ওদিক কাত হয়ে  যেতেই পারে।
মনে করি আমাদের স্ক্যান করা পাতাটি এমন।

এখন, এই অবস্থায় স্ক্যান করা পাতা থেকে টেক্স্ট রিকগনিশন করা মুশকিল হয়ে যাবে। ওদিকে কম্পিউটারের কাছে একটা ছবি কিছু কালো আর সাদা ফোটার সমষ্টি ছাড়া কিছুই নয়। সে কীভাবে বুঝবে কোন দিকে কতটুকু ঘোরালে লেখাগুলো সোজা হবে?

এটা করতে আমরা ব্যবহার করবো ডিস্ক্রিট ফুরিয়ার ট্রান্সফর্ম। তখন যে ফলাফল পাওয়া যাবে সেটা দেখতে এমন।
দেখুন মাঝ খানে একটা সাদা দাগ দেখা যাচ্ছে। ওর মানে হলো ঐ বরাবর হাটলে বারবার সাদা থেকে কালোতে বদলায় পিক্সেলগুলো। এই দাগটা কতডিগ্রি কোনে আছে বের করতে পারলেই ততটুকু উলটো ঘুরিয়ে নিলে কাজ হয়ে যাবে। কিন্তু এই ছবিতে নানান রকম হিজিবিজি ঝিরিঝিরি। এতকিছুর মধ্যে কোন সাদা বিন্দুগুলো কাজের সেটা কম্পিউটারের পক্ষে বোঝা মুশকিল। বাড়তি বিন্দু গুলো দূর করতে তাই, আমরা একটা এজ ডিটেকশন অ্যালগরিদম চালাবো। এই অ্যালগরিদম ছবির যেসব অংশ বেশি বেশি সাদা সেগুলোকে দাগ দিয়ে ঘিরে ফেলে, আর বাকি অংশ মুছে কালো করে দেয়। ফলাফল দাঁড়ায় এমন।  অনেকটা ফটোশপের ম্যাজিক সিলেক্টর টুলের মত। এখানে বলে রাখি, ফুরিয়ার ট্রান্সফর্ম করার সুবিধা হলো, ছবিতে যদি কাটা ছেড়া, পোকামাকড়, কাগজে চায়ের কাপের দাগ, ইত্যাদি থাকে তার পরেও, ঠিকই আমাদের উদ্দিষ্ট সাদা দাগটা আমরা পেয়ে যাবো!
 এখন অন্যসব হিজিবিজির মধ্যে মাঝের দাগটা বেশ ফুটে উঠেছে! কিন্তু ছবিটাকে স্রেফ একটা কালো গ্রাফ কাগজে সাদা সাদা অনেকগুলো বিন্দু ভাবা যেতে পারে। এদের কোন বিন্দুগুলোকে যোগ করলে সবচেয়ে প্রকট রেখাটা পাওয়া যাবে সেটা সুক্ষ্মরূপে নির্নয় করতে। আমরা ব্যবহার করব হাফ ট্রান্সফর্ম। ফলাফল পাওয়া যাবে এমন।
চিত্রের এই লাল রেখাটা পোলার ফর্মে পাওয়া যায়। ফলে সে কতরেডিয়ান কোনে আছে সেটাও আমরা পেয়ে যাবো একটা ভেরিয়েবলের মধ্যে। এখন মূল ছবিটাকে স্রেফ তত খানি উলটো দিকে ঘুরিয়ে নিলেই হলো।
বাহ! কেমন সোজা হয়ে গেছে। কোনার দিকে একটু কাটা পড়েছে অবশ্য। ওসব অংশ ছবিটার আকার বাড়িয়ে কমিয়ে ধরে ফেলা যাবে।   প্রোগ্রামটা যেহেতু একবার লিখে ফেলেছি। এখন যে কোনো পাতা যেভাবেই, স্ক্যান করে দেওয়া হোক না কেন। এই প্রোগ্রামের হাতে পড়লে ঠিক ঠিক সোজা হয়ে যাবে।

পাইথন আর ওপেনসিভি লাইব্রেরী ব্যবহার করার কারণে এসব করতে তেমন কোনো কষ্টই হয়নি। তবে, এই ডিস্ক্রিট ফুরিয়ার ট্রান্সফর্ম, হাফ-ট্রান্সরর্ম, এবং এজ ডিটেকশন অ্যালগরিদমগুলোর গাণিতিক সৌন্দর্য অতুলনীয়। হায়, এই লেখায় যদি সেগুলো নিয়ে বলতে পারতাম।


Tuesday, November 13, 2012

Installing OpenCV with Python on mac osx

There are many ways to do it and I have tried most of them but got only troubles. Only one worked for me. Lo and behold, here it is

For the record, I have Mac OS X 10.7.4

The recipe.

  1. Install Xcode from apple app store then install command line tools from xcode preference
  2. Install macports from here http://www.macports.org/install.php
  3. Open terminal put the command: sudo port selfupdate
  4. Install python26 by: sudo port install python26
  5. then: sudo port install py26-numpy
  6. (probably you don't need this step but I am recording it just because I have done it) then: sudo port install python_select 
  7. then: sudo port -v install opencv +python26
  8. it will take several hours. and install opencv-2.4.3
  9. then: sudo port select python python26
  10. this will select the newly installed python as your default. Which is absolutely necessary
  11. note, that IDLE will not work at this point. But python + opencv will. 
  12. now: sudo port install py26-tkinter
  13. this will make idle work
  14. to check it, run python from terminal and put: import cv2
  15. this should work smoothly. 
  16. do it step by step in the order stated in this recipe. Otherwise there is a high chance of falling in trouble. 
  17. now do amazing projects :) 
I have failed trying to use opencv-2.4.3 with python27. It simply does not work. If you don't want to take extra pain do it with python26 as I did. But If you really want to figure out how to use python27 check this link http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port 
And please let me know how you made it work. 


Monday, November 12, 2012

OCR Notes - 1

There are people who only appreciates the end result. Then there are people who appreciates the struggle. 

FFT can help figuring out the text orientation.

http://homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm

I wil first try to implement this.

Next step will be filters http://homepages.inf.ed.ac.uk/rbf/HIPR2/filtops.htm

tesseract-ocr looks great
http://code.google.com/p/tesseract-ocr/

This python implementation looks promising http://code.google.com/p/ocropus/

Page layout analysis

a good book on OCR problems
 Optical character recognition : an illustrated guide to the frontier / by Stephen V. Rice, George Nagy, Thomas A. Nartker.



http://libencore.nus.edu.sg/iii/encore/record/C%7CRb2109828%7CSoptical+character+recognition%7COrightresult%7CX5?lang=eng&suite=def

Installation of opencv on mac
http://www.youtube.com/watch?v=i9hYiMXLZRs

http://www.opencvpython.blogspot.sg/2011/04/welcome-to-opencv-python.html

http://opencv.willowgarage.com/wiki/InstallGuide

opencv+python+mac nightmare 

Nice blog with many functionality implemented 
http://felix.abecassis.me/2011/10/opencv-rotation-deskewing/

ওসিআর প্রোজেক্ট

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

আজকাল প্রোগ্রামিং করার জন্য হাত নিশ-পিশ করছে। প্রোটোটাইপটা তৈরি করে ফেলার তাই এখনই শ্রেষ্ঠ সময়। 

Tuesday, November 6, 2012

correlation vs. causation

Data will provide you with correlations. But figuring out the causal chain requires originality and creative thinking. 

Sunday, November 4, 2012

One thing I have learned

One thing I have learned and I don't want to forget is- you must have brave people around you. You might not meet them 'just out of luck'. You have to search for them, spot them and take action to get acquainted.

All the human difference we see, be it in brilliance or in depth of thought, be it in creativity or in throughput, boils down to who is a coward and who is not.

When something is important enough you do it even thought the odds are not in your favor.  -Elon Musk
You need people who have a mindset like this around you.

যারা নিজেকে দুর্বল ভাবে, তারা সেটা ভাবে কারণ তারা আসলেই তাই। কাউয়ার্ডদের সাথে কথা বলে তাদের কিছুতেই উদ্বুদ্ধ করা যায় না। মনে রেখ, যে তোমাকে দেখে শিখবে না, সে তোমার কথা শুনেও শিখবে না। অনর্থক মানুষকে "বুঝিয়ে" সময় নষ্ট কোরো না। তবে এই দেখার সুযোগটা করে দিতে হবে। এ যুগে সেটা কঠিন কিছু নয়।

I look for good-hearted people which is always very very important. But goodhearted cowards amounts to nothing.



এই ভিডিওটা এখানে রেখে দিই।