پلاک‌خوان خودرو

تغییرات پروژه از تاریخ 1393/04/01 تا حالا
<img src="http://amirajorloo.com/static/header2.jpg" style="width:600px;-webkit-border-radius:20px;-moz-border-radius: 20px;border-radius: 20px;	box-shadow: 0px 0px 7px 1px #202020;-webkit-box-shadow: 0px 0px 7px 1px #202020;-moz-box-shadow: 0px 0px 7px 1px #202020;">

<h1 style="color:#851401">مقدمه</h1>
<p>
سیستم پلاک خوان یکی از مهترین سیستم ها در کنترل ترافیک است که با استفاده از میتوان رانندگان متخلف و نوع خلاف را ثبت کرد.
عملکرد این سیستم به گونه ای است که با استفاده از دوربین های مخصوصی که در سطح شهر و اتوبان ها قرار داده شده اند و برنامه تشخیص تخلف از لحظاتی که در آنها تخلفی صورت گرفته عکس برداری شده و سیستم تشخیص محل پلاک خودرو محل پلاک را بدست آورده و در اختیار سیستم پلاک خوان که موضوع این پروژه میباشد قرار میدهد و این سیستم اعداد و حروف پلاک را استخراج کرده و برای فرد متخلف جریمه ثبت شود.هدف اصلی این پروژه مکانیزه کردن که علاوه بر کاهش نیروی انسانی و کاهش هزینه ها افزایش دقت و سرعت در تصمیم گیری و انجام کارها است.
<br/>
علاوه بر هدف اصلی که ذکر شد از این سیستم میتوان در سیستم های دیگر مانند پارکینگ های عمومی و یا خصوصی استفاده کرد.در پارکینگ های عمومی میتوان با تشخیص شماره پلاک ساعت ورود را در سیستم ذخیره کرده و در هنگام خروج مدت زمان حضور در پارکینگ معلوم گردد و دیگر نیازی به ثبت توسط نیروی انسانی نیست.همچنین میتوان با ذخیره کردن پلاک ماشین ها برای مدت خاصی یک پایگاه داده ایجاد کرد و در مسایل امنیتی از آن استفاده نمود.در پارکینگ های خصوصی نیز میتوان از این جهت در این سیستم استفاده کرد که پلاک خودرو های افراد ساختمان در سیستم ذخیره شود و هنگامی که خودرویی با یکی از پلاک های ذخیره شده در مقابل دوربین قرار گرفت درب پارکینگ باز شده و دیگر نیازی به استفاده از دستگاه کنترل از راه نباشد.
</p>
<p>
الگوریتم مورد استفاده در این پروژه از دو قسمت تشکیل شده است.
</p>
<ul>
<li>تفکیک اعداد و حروف</li>
<li>تشخیص اعداد و حروف</li>
</ul>
<p>
جهت تفکیک اعداد از تصویر که به صورت باینری تبدیل شده برای تشخیص هر عدد ابتدا از پایین سمت چپ شروع کرده و به سمت راست حرکت میکنیم.هرگاه به مقداری برابر با مقدا شروع رسیدیم پهنای باند طی شده را محاسبه میکنیم.اگر از مقدار از پیش تعیین شده بیشتر باشد مقدار اولیه جهت شروع عملیات را افزایش  داده و عملیات را تکرار میکنیم.حال حال اگر از مقدار اولیه کمتر یا مساوی بود این دو نقطه مرز ابتدایی و انتهایی عدد اول از سمت چپ را مشخص میکند.سپس همین روش را برای بقیه تصویر انجام میدهیم تا در نهایت هشت عدد بدست بیاوریم.
اگر تمام مراحل انجام شده ولی کمتر از هشت عدد بدست آمد آنگاه پهنای باند را کمتر در نظر میگیریم و مراحل قبل را دوباره تکرار میکنیم.
از نقاط ضعف این الگوریتم میتوان به این اشاره کرد که در بعضی موارد یه عدد نصف شده و یا دو عدد به عنوان یک عدد نمایش داده میشوند.

در تشخیص اعداد که ورودی آن اعداد جدا شده از قسمت قبل است,توسط الگوریتمی ورودی ها به شبکه عصبی داده شده و آنگاه شبکه عصبی تصویر داده شده را با تصاویر داخل پایگاه داده خود که هنگام آموزش آنها را دریافت و دسته بندی کرده است تطبیق داده و پس از الگوریتم های درونیابی,تقریب و تصمیم,بیشترین احتمال اینکه به کدام عدد نزدیک تر است را به عنوان خروجی قرار خواهد داد.
برای آنکه از اشتباهات احتمالی جلوگیری شود,در قسمت آموزش میبایست از بانک اطلاعاتی کاملی استفاده کرد.
از عوامل ایجاد خطا در این سیستم میتوان به این اشاره کرد که در بعضی موارد عکس ها تار هستند و یا در پلاک نویز وجود دارد که احتمال تشخیص صحیح را کاهش میدهند.
</p>
<h1 style="color:#851401">کارهای مرتبط</h1>
همانطور که در مقدمه ذکر شد،مرحله اول خواندن پلاک خودرو تفکیک حروف و اعداد پلاک میباشد.برای تفکیک ابتدا لازم است که پلاک در شرایط مناسبی قرار گیرد.برای مثال ممکن است به دلایل مختلفی مانند اتصال نامناسب روی خودرو،پلاک نسبت به افق دارای زاویه باشد و در نتیجه حروف و اعداد دارای زاویه باشند و تشخیص آنها مشکل باشد و از احتمال درست تشخیص دادن کاسته شود.از مشکلات دیگر میتوان به وجود نویز در پلاک اشاره کرد که در تشخیص حروف اخلال ایجاد میکند.
برای برطرف کردن این مشکلات از الگوریتم های GaussianBlur و threshold  استفاده میکنیم.
با استفاده از الگوریتم اول نویز های احتمالی پلاک تا کاهش داده و با استفاده از الگوریتم threshold عکس را به صورت باینری تبدیل میکنیم.باینری کردن تصاویر انواع مختلفی دارد که عبارتند از :
</p>
<ul>
<li>Threshold Binary</li>
<li>Inverted Threshold Binary</li>
<li>Truncate</li>
<li>Threshold to Zero</li>
<li>Inverted Threshold to Zero</li>
<li>OTSU Threshold</li>
</ul>
<p>
به دلیل اینکه تصاویر به صورت خودکار گرفته شده و خودرو ها در حال حرکت هستند،در بسیاری از موارد تصاویر شرایط مناسبی جمله نور مناسب را نخواهند داشت.به همین دلیل در این پروژه از نوع otsu_thresholding استفاده شده است،زیرا این الگوریتم تصویر را به صورت محلی به صورت باینری تبدیل میکند و از مشکلاتی مانند سیاه شدن کامل قسمتی از تصویر به دلیل نا مناسب بودن نور جلوگیری میکند.
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
  	<img src="http://amirajorloo.com/static/original.jpg">
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
<img src="http://amirajorloo.com/static/blackwhite.jpg">
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
  	<img src="http://amirajorloo.com/static/threshold.jpg">
  </td>

</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
  	<p >تصویر اولیه همراه با نویز</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
  	<p >تصویر نتیجه با الگوریتم Blur</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;">
  	<p >تصویر نتیجه با الگوریتم Otsu Threshold</p>
  </td>

</tr>
</table>
<p>
با توجه به نتیجه تصویری که با استفاده از الگوریتم otsu threshold بدست آمده است،مشاهده میشود که نویز ها و علامت های اضافی که در پلاک بیشتر کشور ها وجود دارد،کمتر شده و یا از بین رفته اند.
برای تفکیک حروف و اعداد از یکدیگر راه های مختلفی وجود.در روند این پروژه از سه الگوریتم مختلف استفاده شده است:

</p>
<p style="font-size:1.5em;">
	۱.با استفاده از کتابخانه pytesser
</p>
<p>
این کتابخانه که با استفاده با استفاده از opencv و OCR نوشته شده است و قابل استفاده میباشد،با استفاده از نمونه های بسیار آموزش دیده و قادر به تشخیص متون در تصاویر در زبان های تعریف شده با دقت بالایی میباشد.
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/original.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/pytesser.png">
  </td>
</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >تصویر ورودی</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >نتیجه با استفاده از pytesser</p>
  </td>
</tr>
</table>
<p style="font-size:1.5em;">
	۲.با استفاده از کتابخانه CvBlob
</p>
این کتابخانه که توسط مایکروسافت در سال ۲۰۰۵ پیاده سازی شده و هماهنگ با opencv میباشد،در تصویر داده شده،تمامی لکه ها را پیدا کرده و آنها را با خط کشیدن نمایش میدهد.از مشکلات آن میتوان به این اشاره کرد که نویز های کوچک را نیز به عنوان لکه تشخیص داده و برای تشخیص حروف و اعداد میبایست تمامی آنها را امتحان نمود و پردازش این قسمت کمی بیشتر میشود.
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/original.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/cvblob.jpg">
  </td>

</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >تصویر ورودی</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >نتیجه با استفاده از cvblob</p>
  </td>


</tr>
</table>
<p style="font-size:1.5em;">
	۳.تفکیک با استفاده از تراکم
</p>
<p>
الگوریتم مورد استفاده در این قسمت به این صورت است که از سمت چپ تصویر شروع کرده و به سمت راست حرکت میکنیم.برای تشخیص هر حرف یا عدد به این صورت عمل میکنیم که هنگامی که رنگی مخالف با رنگ پس زمینه نمایان شد،آن مکان را نقطه شروع حرف در نظر گرفته و هنگامی که تراکم رنگ مخالف به صفر رسید،به عنوان نقطه پایان آن حرف علامت گذاری میکنیم.با توجه به تعداد حرف و عدد خاص در هر کشور،با توجه به پلاک مورد نظر این الگوریتم را تکرار میکنیم تا تمامی حروف جدا شوند و از جدا شدن تکه های اضافی جلوگیری شود.
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/original.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/chegali.jpg">
  </td>
</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >تصویر ورودی</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >حروف و اعداد به صورت تفکیک شده</p>
  </td>
</tr>
</table>
<p>
<p style="font-size:1.5em;">
	۴.استفاده از خوطوط تصویر
</p>
<p>
در این روش تمامی خطوط داخل تصویر را در نظر گرفته،سپس مستطیل هایی که محاط بر این خطوط هستن جمع آوری میکنیم.برای کاهش مستطیل های اضافی که در اطراف نویز ها قرار دارند،شرطی مانند حداقل طول و عرض قابل قبول قرار داده و تعدادی از آنها را حذف میکنیم.
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/original.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/rect.jpg">
  </td>
</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >تصویر ورودی</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >پیدا کردن محل حروف و اعداد</p>
  </td>
</tr>
</table>
اگرچه این در این الگوریتم ها سعی شده تشخیص به بهترین صورت انجام شود،اما ممکن هست به دلیل کیفیت کم عکس ها و یا وجود نویز هایی که قادر به حذف آنها نبودیم،یک حرف به دو حرف تشخیص داده شود(مانند 11 به جای 0 ) و یا l  بجای I تشخیص داده شود.با استفاده از قوانین پلاک گذاری(مانند عدم استفاده از حروف کوچک به دلیل تشابه بعضی از حروف و عدم استفاده از عدد صفر به دلیل تشابه با پرچ پلاک)،میتوان از این نوع مشکلات جلوگیری کرد و تشخیص دقیق تری داشته باشیم.
</p>
<h1 style="color:#851401"> تشخیص اعداد </h1>
<p>
پس از تفکیک کردن اعداد با استفاده از الگوریتم های مختلف،در مرحله دوم و پایانی می بایست به تشخیص اعداد و حروف تفکیک شده بپردازیم.همانند مرحله اول این مرحله نیز را میتوان با استفاده از روش های مختلفی انجام داد که در زیر به دو روش اصلی آن میپردازیم.
در روش اول با استفاده از دیتابیس های آماده که شامل تعداد بسیاری از تصویر اعداد و حروف هستند و پردازش تصویر،فایل ها را به هش کد تبدیل کرده و در یک Dictionary ذخیره میکنیم و با استفاده از حرف و عدد مورد نظر قابل دسترسی هستن.از مشکلات این روش این است که اگرچه حالت هایی که به هش کد تبدیل میشود،اما با کوچکترین تغییر هش کد بدست آمده تغییر میکند و در حالت های آموزش داده شده یافت نشود.
در روش دوم که در این پروژه نیز از این روش استفاده شده،به این صورت است که همه اعداد تفکیک شده از پلاک های نمونه جدا کرده و ذخیره میکنیم.سپس در حالت آموزش به کاربر نمایش داده و عدد و حرف متناظر را بدست می آوریم.برای ذخیره آموزش به این صورت عمل میکنیم که تصاویر را به سایز خاصی (مانند ۱۰x۱۰ ) تبدیل کرده و با این دید که این تصویر تبدیل شده همانند یک ماتریس ۱۰x۱۰ میباشد،برای ذخیره راحت تر،آن را به ماتریس ‌۱x۱۰۰ تبدیل کرده و مانند روش اول در ساختما داده Dictionary ذخیره کرده.به دلیل آنکه در این روش تصویر به هش کد تبدیل نشده،میتوان ماتریس بدست آمده در حالت استفاده را با درصد خطایی مشخص با ماتریس های بدست آمده در آموزش تطبیق داد.
</p> 
<h1 style="color:#851401"> ارزیابی </h1>
<p>
در ارزیابی انجام شده در با استفاده از نمونه های بدست آماده،بیش از ۷۵٪ نمونه ها را به صورت کامل و درست تشخیص داده میشود.در بیشتر نمونه های تشخیص غلط نیز مشکل در تعداد کم یا زیاد تعداد حروف است دلیل این مشکل این است که سعی شده است در این پروژه هرگونه پلاک با حروف لاتین تشخیص داده شود و محدود به کشور و یا استاندارد خاصی نباشد.به همین دلیل نمیتوان با تعداد اعداد تشخیص داده شده،کد به این نتیجه برسد که در تشخیص مشکل داشته و اقدام به تغییر پارامتر ها کند.
لینک پروژه در گیت هاب در پایان مطلب موجود میباشد.در زیر نیز قسمتی از نتیجه و نمونه ها آورده شده است

<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/resultplate.jpg">

  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/resultcode.png">
  </td>

</tr>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >تعدادی از نمونه های استفاده شده</p>
  </td>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<p >نمونه ای از خروجی برنامه</p>
  </td>
</tr>
</table>

</p>
<h1 style="color:#851401"> بهبود عملکرد </h1>
<p>
در قسمت های پیشین ذکر شد که می توان از قوانین شماره گذاری پلاک برای بهبود عملکرد خواندن پلاک استفاده کرد.قوانینی در هر منطقه متفاوت است.برای مثال با اینکه پلاک های اروپا از لحاظ ظاهری بسیار شبیه هم هستند،اما هر پلاک هر کشور در استفاده از حروف و عدد و ترکیب این دو متفاوت هستند.همین قوانین برای آمریکا و آسیا نیز بر قرار است.در ایران نیز شماره گذاری پلاک ها قوانین خاص خود را دارند.از این قوانین میتوان به این اشاره کرد که به دلیل شباهت صفر و پرچ پلاک،از عدد صفر استفاده نشده است.میتوان از قوانین هر کشور استفاده کرد و دوربین های ثبت تخلف مخصوص به آن کشور ایجاد کرد و بدین صورت میتوان مقدار زیادی از خطا هایی که فقط توسط دستگاه ایجاد میشود را رفع کرد.اما به دلیل آنکه در این پروژه سعی شده است پلاک ها صرف نظر از منطقه انتخاب و خوانده شوند،استفاده از این قوانین نشدنی است.
با توجه به اینکه مراحل خواندن پلاک به این صورت است که پس از باینری کردن تصویر ابتدا اقدام به پیدا کردن تمام رنگ مخالف پس زمینه میکنیم.از آنجا که در پلاک علایم و یا حتی زایده هایی وجود دارد و یا اعدادی مانند 8 چند بار شناسایی میشوند، قسمتای شناسایی شده میبایست از چندین صافی عبور کرده تا اعداد درست را تشخیص دهد.اولین صافی تعیین حداقل طول و عرض مستطیل های محاط بر قسمت های انتخاب شده است.این صافی مشکلاتی مانند تشخیص یکه عدد 8 و یا تشخیص تمامی پلاک به عنوان یک لکه را رفع می‌نماید.
دومین صافی مربوط به فاصله تقسیم بندی هاست.برای مثال میتوان فاصله حروف و اعداد در پلاک مورد بررسی را تشخیص داد.سپس میتوان در مورد احتمال های شبیه هم مطمئن تر نظر داد.برای مثال عدد ‌11 و H شبیه به هم میباشند.میتوان به این صورت عمل کرد که اگر فاصله دو خط کمتر از فاصله بین حروف دیگر میباشد،پس در نتیجه قسمت انتخاب شده برابر با H میباشد.
اگرچه در فونت های استفاده شده در پلاک ها بسیار متنوع نیست،اما به دلیل زاویه های مختلف عکس برداری از پلاک،برای آموزش دقیق تر،بهتر است از نمونه های حروف و اعداد در شرایط و فونت های مختلف استفاده کرد و آموزش را تقویت کرد.در پروسه آموزش،علاوه بر استفاده از تعداد زیادی نمونه های دسته بندی شده،میتوان از این روش استفاده کرد که حروف و اعداد پلاک ها توسط برنامه جدا شوند،سپس از کاربر حرف یا عدد متناسب را به برنامه بفرستد تا مرحله آموزش تکمیل شود.
در قسمت تشخیص خودکار اعداد و حروف نیز میتوان بهبود هایی بخشید.به عنوان مثال اگرچه سعی شد که کمترین زایده و مشکلی به این مرحله برسد،اما نمیتوان از عدم وجود مشکلات مطمئن شد.برای همین در این مرحله که ما از مپ کردن ماتریس های اعداد و حروف به ماتریس های ۱x۱۰۰ میکنیم،میتوان بجای تطبیق ۱۰۰٪ ای،درصدی خطا قائل شد و بدین ترتیب حروفی که دارای ناخالصی هستند نیز با تقریب خوبی درست تشخیص داده میشوند.
با توجه به این الگوریتم ها،درصد تشخیص صحیح این پروژه از ۷۵٪ به درصدی نزدیک به ۸۳٪ رسیده است.در زیر نمونه هایی که خروجی برنامه وجود دارد که به درک بیشتر این موارد کمک میکند.
</p>
<p style="font-size:1.5em;">
	تشخیص صحیح
</p>

<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/Amir/true1.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/Amir/true1.png">
  </td>
</tr>
</table>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/Amir/true2.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/Amir/true2.png">
  </td>
</tr>
</table>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/Amir/true3.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/Amir/true3.png">
  </td>
</tr>
</table>
<p style="font-size:1.5em;">
	تشخیص غلط
</p>
<table>
<tr>
  <td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  	<img src="http://amirajorloo.com/static/Amir/false1.jpg">
  </td align="center" valign="middle" style="text-align:center;vertical-align:middle;width:50%;">
  <td>
  	<img src="http://amirajorloo.com/static/Amir/false1.png">
  </td>
</tr>
</table>


<h1 style="color:#851401"> مراجع </h1>
<ul>
<li>Pishchulin, L. (2010). Matching Algorithms for Image Recognition.</li>
<li>Of, F., & Technology, I. (2007). BRNO UNIVERSITY OF TECHNOLOGY PRINCIPLES OF AUTOMATIC NUMBER PLATE.</li>
</ul>
</p>

<h1 style="color:#851401"> پیوندهای مفید </h1>
+ [کتابخانه اپن‌سی‌وی](http://opencv.org)
+ [اپن‌سی‌وی در پایتون](http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html)
+ [نصب اپن‌سی‌وی در ابونتو](https://help.ubuntu.com/community/OpenCV)
+ [نمونه محصول](http://farsiocr.ir/%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D9%BE%D9%84%D8%A7%DA%A9-%D8%AE%D9%88%D8%AF%D8%B1%D9%88-%D8%A8%D8%A7-%D8%B3%D9%88%D8%B1%D8%B3-%DA%A9%D8%AF-cpp/)
+ [لینک پروژه](http://github.com/theSinner/car_plate_reader)