انجمن‌های فارسی اوبونتو

جامعه کاربران => پروژه‌ها => نویسنده: محمدرضا حقیری در 26 خرداد 1401، 09:22 ب‌ظ

عنوان: پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 26 خرداد 1401، 09:22 ب‌ظ
سلام به همگی.

من محمدرضا حقیری هستم، یک برنامه‌نویس ۲۷ ساله (تازه وارد ۲۷ شدم البته) و خب خیلی‌هاتون من رو از زمان قدیم و بخصوص پروژه جبیر می‌شناسید احتمالا. احتمالش وجود داره که من رو از توییتر، رویدادهای حول نرم‌افزار آزاد و ... بشناسید. و خب احتمالش هم هست که اصلا نشناسید 😁 در هر صورت، از این که در جمع حضور دارم و به نوعی فعال و توسعه‌دهنده نرم‌افزار آزاد محسوب میشم خوشحال و خرسندم.

از معرفی خودم که بگذرم، میخوام در مورد این پروژه کمی روده‌درازی کنم و توضیح بدم که این پروژه چیه و چرا ایجادش کردم. خب، یکی از دلایلی که ما اینجاییم (دقت کنید که الزامی هم نیست که دلیل اینجا بودنتون این باشه) اینه که ما عاشقان آزادی هستیم. ما نرم‌افزار آزاد رو شنیدیم، استفاده کردیم و درکش کردیم. پارسال بود که من پروژه  پلاک‌خوان  (https://haghiri75.com/2022/01/17/%d8%ae%d9%88%d8%a7%d9%86%d8%af%d9%86-%d9%be%d9%84%d8%a7%da%a9-%d8%ae%d9%88%d8%af%d8%b1%d9%88-%d8%a8%d8%a7-%da%a9%d9%85%da%a9-yolov5-%d9%88-%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86/) رو شروع کردم. این پروژه به نوعی یک OCR خیلی ساده به حساب میومد که می‌تونست عددهایی که با یک تایپ‌فیس خاص نوشته شدند رو بفهمه و به ما بگه که چی هستند.

راستش، من مدتها بود که هدفی در ذهن داشتم. این که یک محصول بزرگ بینایی ماشین توسعه بدم، در عین حال از آغاز امسال (یعنی ۱۴۰۱ هجری خورشیدی) به سرم زد که یک پروژه آزاد بزرگ هم داشته باشم. از اونجایی که با یک دست نمی‌شود بیش از یک هندونه بلند کرد، تصمیم گرفتم جفتش یکی باشه. یک پروژه پردازش تصویر آزاد! نتیجه این شد که بعد چند ماه فکر کردن به این نتیجه رسیدم که OCR فارسی آزاد رو توسعه بدم.

پروژه OCR فارسی آزاد

اولین سوالی که در ذهن شما ایجاد میشه احتمالا اینه که OCR چیه؟ خب توضیح ساده‌ست. OCR یا تشخیص نویسه نوری (که البته بهش نویسه‌خوان نوری هم میگن) فرایندیه که طی اون، نوشته‌های درون یک عکس رو میشه خوند. مثلا همون پلاک‌خوان (البته مثال ملموس‌ترش در نرم‌افزارهای غیرآزاد Google Lensئه). حالا چرا دارم این نمونه آزاد رو توسعه میدم؟ دلیلش واضحه. چون OCR فارسی خوب نداریم :)

(https://github.com/prp-e/persian_ocr_project/raw/main/final_tests.png)

تصویر بالا، نمونه‌ای از خروجی این نرم‌افزاره که فعلا در فاز آزمایشگاهیش قرار گرفته. این نرم‌افزار، تحت پروانه GPL-3 منتشر میشه و خب من تضمین می‌کنم تا وقتی من مسولیتش رو بر عهده دارم همین پروانه بمونه. اگر چنانچه روزی این پروژه دست شخص/شرکت دیگری بود، باز هم تلاش می‌کنم تا آزاد بمونه.

به‌روزرسانی به تاریخ ۳۱ خرداد ۱۴۰۱:
کار بر روی تشخیص حروف فارسی هم تمام شد و این نتیجه‌ش:
(https://github.com/prp-e/persian_ocr_project/raw/main/final_tests_letters.png)

کدها در گیتهاب: https://github.com/prp-e/persian_ocr_project

منتظر نظرات و پرسش‌ها و بازخوردهای شما عزیزان هستم.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: جعفر فرقانلوژ در 26 خرداد 1401، 09:32 ب‌ظ
خیلی عالیه جناب حقیری خیلی !
چه کمکی از دستمون بر میاد ؟ احتمالا پایگاه اطلاعات برای تصاویر داره درسته ؟ برای تکمیلش کمکی از دست ما برمیاد ؟ (گرفتن تصاویر یا جدا جدا کردن حروف )
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 30 خرداد 1401، 11:22 ق‌ظ
خیلی عالیه جناب حقیری خیلی !
چه کمکی از دستمون بر میاد ؟ احتمالا پایگاه اطلاعات برای تصاویر داره درسته ؟ برای تکمیلش کمکی از دست ما برمیاد ؟ (گرفتن تصاویر یا جدا جدا کردن حروف )

سلام.
ببینید یک مرحله آزمایشگاهی/آزمایشی باید بره جلو (که الان در اون مراحلیم) و خب اینجا مشخص میشه چقدر مدل ما بهینه‌ست و چطور کار می‌کنه و ... .
بعدش یه مرحله محصولی داریم که در اون مرحله، نیازمند یاری سبز دوستانم 😁
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: جعفر فرقانلوژ در 30 خرداد 1401، 11:35 ق‌ظ
در خدمتم !
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: ɴɪᴍᴀ در 30 خرداد 1401، 11:43 ق‌ظ
عالیه! البته خود Google Lens تا حدی از فارسی پشتیبانی میکنه ولی آزاد نیست :)
پیشنهاد میکنم بعد از کامل شدن پروژه یه محیط گرافیکی براش با کیوی نوشته بشه و برای اندروید هم کامپایل شه : )
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 30 خرداد 1401، 12:00 ب‌ظ
عالیه! البته خود Google Lens تا حدی از فارسی پشتیبانی میکنه ولی آزاد نیست :)
پیشنهاد میکنم بعد از کامل شدن پروژه یه محیط گرافیکی براش با کیوی نوشته بشه و برای اندروید هم کامپایل شه : )

بحث گوگل‌لنز رو حالا کاری نداریم (چون خودت هم اشاره کردی که آزاد نیست و این دقیقا همون دلیلیه که من این پروژه رو شروع کردم) اما در مورد اندروید حرف زیاده. چندتا چیز باید سنجیده شه و بعد براش اپ‌های موبایل و دسکتاپ نوشته شه. فعلا ترجیح اصلی خودم وب‌سرویس و نرم‌افزار تحت ترمیناله (شاید هم کتابخونه پایتون)
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: ABOLDOM در 30 خرداد 1401، 06:43 ب‌ظ
وای این عالیههه(: دمتون گرممم، بعدش میشه کارهای خیلی زیادی باهاش کرد :) موفق باشید
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 31 خرداد 1401، 09:53 ب‌ظ
پست نخست به‌روز شد و نماگرفت از نتیجه تشخیص حروف، قرار داده شد.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: جعفر فرقانلوژ در 01 تیر 1401، 10:59 ق‌ظ
تا الان دقتش چقدره ؟ مصلا تصویریک برگه کاغذ که دست نویس باشه هنوز می تونه تشخیص بده ؟
یک فکری با خط من تمرینش بدید بعد میتونه هر خطی رو بخونه  :P خط من رو خودم نمیتونم بخونم !
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 01 تیر 1401، 05:08 ب‌ظ
تا الان دقتش چقدره ؟ مصلا تصویریک برگه کاغذ که دست نویس باشه هنوز می تونه تشخیص بده ؟
یک فکری با خط من تمرینش بدید بعد میتونه هر خطی رو بخونه  :P خط من رو خودم نمیتونم بخونم !

فعلا روی داده دستنویس آموزش نشده.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 02 تیر 1401، 08:47 ب‌ظ
دوستان عزیز با کمک این دفترچه‌یادداشت ژوپیتر (https://github.com/prp-e/persian_ocr_project/blob/main/Inference.ipynb) می‌تونید مدل‌ها و ... رو تست کنید.
لطفا اگر ارور و داستانی دریافت می‌کنید، ارور رو دقیق بذارید تا بررسی بشه. چه اینجا چه در ایشوهای گیت‌هاب.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 03 تیر 1401، 08:37 ب‌ظ
دوستان عزیزم در حال حاضر در حال تدوین یک پست بلاگ پیرامون این پروژه هستم. به نظرتون چه چیزایی رو پوشش بدم تو پست بلاگم؟
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: جعفر فرقانلوژ در 03 تیر 1401، 09:00 ب‌ظ
کاربرد هایی که میتونه توی زندگی داشته باشه
کاربرد های تخصصی تر یا حتی صنعتی
مشکلاتی که میتونه حل کنه
فواید ازاد بودن این پروژه
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: جعفر فرقانلوژ در 03 تیر 1401، 09:03 ب‌ظ
دوستان عزیز با کمک این دفترچه‌یادداشت ژوپیتر (https://github.com/prp-e/persian_ocr_project/blob/main/Inference.ipynb) می‌تونید مدل‌ها و ... رو تست کنید.
لطفا اگر ارور و داستانی دریافت می‌کنید، ارور رو دقیق بذارید تا بررسی بشه. چه اینجا چه در ایشوهای گیت‌هاب.
Unable to render code block
گیتهاب دفترچه خطا میده
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 04 تیر 1401، 09:31 ق‌ظ
دوستان عزیز با کمک این دفترچه‌یادداشت ژوپیتر (https://github.com/prp-e/persian_ocr_project/blob/main/Inference.ipynb) می‌تونید مدل‌ها و ... رو تست کنید.
لطفا اگر ارور و داستانی دریافت می‌کنید، ارور رو دقیق بذارید تا بررسی بشه. چه اینجا چه در ایشوهای گیت‌هاب.
Unable to render code block
گیتهاب دفترچه خطا میده

دفترچه‌های ژوپیتر روی گیتهاب یکم سخت لود میشن. اگر clone بگیری به نظرم بهتره.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 13 تیر 1401، 06:25 ب‌ظ
این پروژه فعلا به حالت Hold درآمده، تا بعدتر در موردش یه بازنگری بکنم.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 04 امرداد 1401، 11:37 ق‌ظ
دوستان در  این مطلب وبلاگم  (http://kthkn.ir/btCM9pVI) در مورد پروژه توضیح دادم که چی شد شروع شد و تا اینجا چه کاری پیش رفته و چرا هولد شد.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 03 آذر 1401، 12:48 ق‌ظ
سلام مجدد (:

با این که انجمن این هشدار رو داد:

نقل‌قول
هشدار: این موضوع طی 120 روز اخیر هیچ ارسالی نداشته است.
با این شرایط آیا از ارسال پاسخ اطمینان دارید؟.

و خب قبل‌تر هم گفته بودم:

این پروژه فعلا به حالت Hold درآمده، تا بعدتر در موردش یه بازنگری بکنم.

حالا وقتشه که بگم بازنگری‌هایی که لازم بود رو تا حد زیادی در این قضیه انجام دادم. یکم بحث پیچیده‌تر از چیزی که فکر می‌کردم شد، ولی تا همینجایی که پیش رفته هم واقعا معجزه بوده برای خودش (:
حالا در بازنگری‌ها، یک سری مشکلاتی که خیلی می‌تونن موثر باشند رو جدا کردم که در موردش حرف بزنم:

۱. حروف فارسی، به هم می‌چسبند (حالا یا بدون هیچ فاصله‌ای یا با نیم‌فاصله) و این خودش یک مشکله در جداسازی حروف (در فارسی حروف با نقطه از هم جدا میشن. این خودش یکم باز قضیه رو پیچیده کرد ((:) 
۲. حروف شبیه به هم خیلی داریم. مثلا ج چ ح خ و تمیز دادن بین این‌ها یکم سخته، مگر این که یک سری برنامه مکمل برای OCR هم ساخته بشه، که بتونه نزدیک‌ترین کلمات به کلمات حدس‌زده شده رو، پیشنهاد بده. البته این رو بگم که این مشکل خاص رو با OCR انگلیسی هم دیدم که افراد دارند و اگر از یه حدی بیشتر نباشه فکر نکنم خیلی مشکل بغرنج و حادی باشه. یعنی اگر «اکرم» رو «رامین» تشخیص نده، اوکیه. ولی خب ممکنه «اکرم» رو «اگرم» تشخیص بده، یا حتی «چنار» رو «حنار» و این‌ها با یک سری ویرایش ساده توسط خود کاربران، درست میشن.
۳. مدل پایه‌ای که براش انتخاب شده، یکم زیادی کار می‌بره، ولی خب بهترین مدل موجود تشخیص شیء از نظر منه (دوستان متخصص و استاد، نظر منه، نه یک فکت علمی  ;D) و این خودش روند توسعه رو کمی کُند کرده.

همین دیگه، فعلا تا همینجای قضیه درآمده و امیدوارم بتونه بهتر هم بشه.
راستی برای تشخیص نسخه پزشک و تشخیص دست‌خط هم پیشنهاد‌هایی داشتم. شما هم اگر پیشنهادی دارید، ممنون میشم همینجا بگید.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: saleh143 در 03 آذر 1401، 06:29 ب‌ظ
نقل‌قول
۲. حروف شبیه به هم خیلی داریم. مثلا ج چ ح خ و تمیز دادن بین این‌ها یکم سخته، مگر این که یک سری برنامه مکمل برای OCR هم ساخته بشه، که بتونه نزدیک‌ترین کلمات به کلمات حدس‌زده شده رو، پیشنهاد بده. البته این رو بگم که این مشکل خاص رو با OCR انگلیسی هم دیدم که افراد دارند و اگر از یه حدی بیشتر نباشه فکر نکنم خیلی مشکل بغرنج و حادی باشه. یعنی اگر «اکرم» رو «رامین» تشخیص نده، اوکیه. ولی خب ممکنه «اکرم» رو «اگرم» تشخیص بده، یا حتی «چنار» رو «حنار» و این‌ها با یک سری ویرایش ساده توسط خود کاربران، درست میشن.

یه سوال مثلا نمیشه خودش از دیتابیس کلمات رو حدس بزنه و اصلاح کنه که نیازی به ویرایش کاربر هم نباشه ؟  منظورم اینه که خب ما کلمه «حنار» و «اگرم» تو فارسی که نداریم

نقل‌قول
راستی برای تشخیص نسخه پزشک و تشخیص دست‌خط هم پیشنهاد‌هایی داشتم. شما هم اگر پیشنهادی دارید، ممنون میشم همینجا بگید.

OCR برای کتاب های چاپ قدیم برای استفاده در کتاب خوان ها
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 03 آذر 1401، 11:24 ب‌ظ
نقل‌قول
یه سوال مثلا نمیشه خودش از دیتابیس کلمات رو حدس بزنه و اصلاح کنه که نیازی به ویرایش کاربر هم نباشه ؟  منظورم اینه که خب ما کلمه «حنار» و «اگرم» تو فارسی که نداریم

همین موضوع رو بهش اشاره کردم. خیلی خوبه که automate بشه.

نقل‌قول
OCR برای کتاب های چاپ قدیم برای استفاده در کتاب خوان ها

این تقریبا ویژنیه که همین پروژه باهاش شروع شده.
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: علی رزم دیده در 05 آذر 1401، 12:56 ب‌ظ
سلام
اول از همه خیلی ممنون محمدرضا جان بابت به اشتراک‌گذاری تجربه‌ها و پروژه‌هات با دنیای نرم‌افزار آزاد

یکم کدها رو یه نگاه سریعی کردم و این سوال برام پیش اومد که چرا tesseract نه؟ tesseract برای زبان فارسی هم هست و کیفیتش هم عالیه و به همراه یه spell-checker کیفیت قابل‌قبولی حتی برای production داره. (البته برای تسک OCR ونه handwritten recognition)

چیزی که از نوت‌بوک متوجه شدم ظاهراً مدل پایهٔ yolov5 برای این تسک استفاده شده. yolov5 توی تشخیص bboxها و classification اونا می‌تونه مفید باشه و کمک کنه ولی خب تسک object detection با character detection/recognition یه domain shift قابل توجه داره و لزوماً مدلی که اونور توانمند ظاهراً شده، اینور تضمینی برای کیفیتش نیست

اخیراً مدل‌های خوبی برای handwritten recognition هم رلیز شده ولی متأسفانه از فارسی پشتیبانی نمی‌کنن. این مدل‌ها هم تو بخش encoder و هم decoder از معماری ترنسفورمری استفاده می‌کنن و در صورت جمع‌آوری دیتای مناسب و trainشون، می‌تونیم مدل با خروجی ارزشمندی داشته باشیم
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: محمدرضا حقیری در 06 آذر 1401، 12:30 ق‌ظ
نقل‌قول
یکم کدها رو یه نگاه سریعی کردم و این سوال برام پیش اومد که چرا tesseract نه؟ tesseract برای زبان فارسی هم هست و کیفیتش هم عالیه و به همراه یه spell-checker کیفیت قابل‌قبولی حتی برای production داره. (البته برای تسک OCR ونه handwritten recognition)

هیچ روش درست و مطمئنی متاسفانه نیافتم که آموزش رو روی تسرکت انجام بدم، از پارسال که چنین پروژه‌هایی رو شروع کردم.

نقل‌قول
چیزی که از نوت‌بوک متوجه شدم ظاهراً مدل پایهٔ yolov5 برای این تسک استفاده شده. yolov5 توی تشخیص bboxها و classification اونا می‌تونه مفید باشه و کمک کنه ولی خب تسک object detection با character detection/recognition یه domain shift قابل توجه داره و لزوماً مدلی که اونور توانمند ظاهراً شده، اینور تضمینی برای کیفیتش نیست

درسته دقیقا همینطوره، بخصوص برای حروف پیوسته مثل حروف فارسی.

نقل‌قول
اخیراً مدل‌های خوبی برای handwritten recognition هم رلیز شده ولی متأسفانه از فارسی پشتیبانی نمی‌کنن. این مدل‌ها هم تو بخش encoder و هم decoder از معماری ترنسفورمری استفاده می‌کنن و در صورت جمع‌آوری دیتای مناسب و trainشون، می‌تونیم مدل با خروجی ارزشمندی داشته باشیم

میشه چند مدل از این‌ها رو معرفی کنید لطفا؟  ;D
عنوان: پاسخ : پروژه OCR فارسی آزاد
ارسال شده توسط: علی رزم دیده در 06 آذر 1401، 10:21 ق‌ظ
هیچ روش درست و مطمئنی متاسفانه نیافتم که آموزش رو روی تسرکت انجام بدم، از پارسال که چنین پروژه‌هایی رو شروع کردم.
ببین قبل اینکه train مدل رو شروع کنی، یه تست بکن ببین آیا مدل فعلی، نیازت رو مرتفع می‌کنه یا نه. ممکنه نیاز بشه که پشتیبانی از فونت‌های جدید رو بهش اضافه کنی ولی توی اکثر مواقع همین tesseract فعلی خوبه و معمولاً چیزی که نیازه پیش‌پردازش تصویر ورودیه نه train خود tesseract. برای tesseract فارسی تو کامند لاین:
sudo apt install -qq -y tesseract-ocr \
                    libtesseract-dev \
                    tesseract-ocr-eng \
                    tesseract-ocr-fas
tesseract ./myimage.png text_result -l fas --psm 6
cat text_result.txt

و برای tesseract تو پایتون:
اول نصب pytesseract
!pip install -q -U pytesseractو بعد هم:
import pytesseract
from PIL import Image

image = Image.open('./myimage.png')
custom_config = r'-l fas --oem 3 --psm 6'
text_result = pytesseract.image_to_string(image, config=custom_config)
print(text_result)

سعی کنین پارامتر psm رو هم یکم تغییر بدین و تأثیرش توی خروجی رو بررسی کنین. برای حریم segmentها توی تصویر صفحه استفاده می‌شه.

اگه تصویر ورودی کثیف بود، تار بود، متن خوانایی نداشت، لکه داشت، کج بود و ...، برای خروجی بهتر، نیاز به پیش‌پردازش داریم. برای شروع این داکیومنت خیلی خوبه:
https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html (https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html)

و در جواب سوال اصلی هم، برای train مدل‌های مختلف legacy و lstmای tesseract برای آموزش فونت‌های جدید و ...، این داکیومنت‌ها خوبن:
https://tesseract-ocr.github.io/tessdoc/tess4/TrainingTesseract-4.00.html
https://tesseract-ocr.github.io/tessdoc/tess5/TrainingTesseract-5.html (https://tesseract-ocr.github.io/tessdoc/tess4/TrainingTesseract-4.00.html
https://tesseract-ocr.github.io/tessdoc/tess5/TrainingTesseract-5.html)
و این ریپو:
https://github.com/tesseract-ocr/tesstrain/wiki (https://github.com/tesseract-ocr/tesstrain/wiki)

درسته دقیقا همینطوره، بخصوص برای حروف پیوسته مثل حروف فارسی.
برای رفع همچین مشکلاتی جای تشخیص دقیق bbox، برو سراغ روش‌های مبتنی بر CTC Loss. احتمالاً جواب چیزی که دنباش هستی، اونجا باشه.

میشه چند مدل از این‌ها رو معرفی کنید لطفا؟  ;D
آره حتماً. مثلاً مدل TrOCR برای تشخیص دست‌خط انگلیسیش واقعاً عالی عمل می‌کنه. ولی خب برای فارسی باید دیتاستی مشابه دیتاست انگلیسی از دست‌خط‌ها و ... جمع‌آوری بشه:
https://huggingface.co/spaces/nielsr/TrOCR-handwritten (https://huggingface.co/spaces/nielsr/TrOCR-handwritten)


یه تصویر نمونه، به همراه خروجیش رو هم ضمیمه کردم. با یه spell-checker ساده و مبتنی بر unigram/bigram مثل symspell می‌شه یه متن بدون خطای تمیز داشت.