در این پست وبلاگ، ما سعی خواهیم کرد تا فناوری مورد استفاده ترین موتور Tesseract را توضیح دهیم که با آخرین دانش تحقیق شده در تشخیص کاراکترهای نوری ارتقا یافته است. این مقاله همچنین به عنوان راهنمای/آموزش نحوه پیاده سازی OCR در پایتون با استفاده از موتور Tesseract است. ما از طریق ماژول های زیر قدم خواهیم زد:
- ویژگی های Tesseract OCR
- پیش پردازش برای OCR با استفاده از OpenCV
- اجرای Tesseract با CLI و Python
- محدودیت های موتور Tesseract
فهرست مندرجات
- معرفی
- ابزارهای OCR منبع باز
- Tesseract OCR
- OCR با Pytesseract و OpenCV
- آموزش Tesseract روی داده های سفارشی
- محدودیت های Tesseract
- OCR با Nanonets
- نتیجه
معرفی
OCR = تشخیص نوری شخصیت. به عبارت دیگر، سیستمهای OCR یک تصویر دو بعدی از متن را که میتواند حاوی متن چاپ شده یا دستنویس ماشینی از نمایش تصویر آن به متن قابل خواندن ماشین باشد، تبدیل میکند. OCR به عنوان یک فرآیند به طور کلی از چندین فرآیند فرعی برای انجام تا حد امکان دقیق تشکیل شده است. فرآیندهای فرعی عبارتند از:
- پیش پردازش تصویر
- محلی سازی متن
- تقسیم بندی شخصیت ها
- شخصیت شناسی
- پردازش پست
البته فرآیندهای فرعی در لیست بالا می توانند متفاوت باشند، اما اینها تقریباً مراحلی هستند که برای نزدیک شدن به تشخیص خودکار کاراکترها لازم است. در نرم افزار OCR، هدف اصلی شناسایی و ضبط تمام کلمات منحصر به فرد با استفاده از زبان های مختلف از کاراکترهای متن نوشته شده است.
برای تقریبا دو دهه، سیستم های تشخیص کاراکتر نوری به طور گسترده ای برای ارائه خودکار ورود متن به سیستم های کامپیوتری استفاده شده است. با این حال در تمام این مدت، سیستم های OCR معمولی (مانند OCR ناحیه ای) هرگز بر ناتوانی خود در خواندن بیش از تعداد انگشت شماری فونت و قالب صفحه غلبه نکرده اند. فونت های چاپگر لیزری و حتی بسیاری از فونت های غیرمتناسب ماشین تحریر از دسترس این سیستم ها خارج شده اند. و در نتیجه، OCR معمولی هرگز بیش از تأثیری حاشیه ای بر تعداد کل اسنادی که نیاز به تبدیل به فرم دیجیتال دارند، به دست نیاورده است.
موتورهای OCR نسل بعدی با استفاده از آخرین تحقیقات در زمینه یادگیری عمیق، با مشکلاتی که در بالا ذکر شد، به خوبی برخورد می کنند. با استفاده از ترکیب مدلهای عمیق و مجموعه دادههای عظیم در دسترس عموم، مدلها به دقت پیشرفتهای در وظایف داده شده دست مییابند. امروزه نیز امکان پذیر است تولید داده های مصنوعی با فونت های مختلف با استفاده از شبکه های متخاصم مولد و چند رویکرد مولد دیگر.
تشخیص کاراکتر نوری باقی می ماند مشکل چالش برانگیز زمانی که متن در محیط های نامحدود، مانند صحنه های طبیعیبه دلیل اعوجاج های هندسی، پس زمینه های پیچیده و فونت های متنوع. این فناوری هنوز هم به دلیل موارد استفاده مختلف از OCR مبتنی بر یادگیری عمیق، پتانسیل بسیار زیادی دارد
آیا مشکل OCR در ذهن دارید؟ آیا می خواهید هزینه های ورود داده های سازمان خود را کاهش دهید؟ سر به نانوت و ساخت مدل های OCR به استخراج متن از تصاویر or استخراج داده ها از فایل های PDF مبتنی بر هوش مصنوعی PDF OCR!
ابزارهای OCR منبع باز
هستند بسیاری از وجود دارد تشخیص شخصیت نوری نرم افزار موجود من هیچ مقایسه کیفیتی بین آنها پیدا نکردم، اما در مورد برخی از آنها که به نظر می رسد توسعه دهنده ترین آنها هستند، خواهم نوشت.
Tesseract – یک موتور OCR منبع باز که در بین توسعه دهندگان OCR محبوبیت پیدا کرده است. حتی اگر گاهی اوقات پیاده سازی و اصلاح آن دردناک باشد، جایگزین های OCR رایگان و قدرتمند زیادی برای طولانی ترین زمان در بازار وجود نداشت. Tesseract به عنوان Ph.D شروع به کار کرد. پروژه تحقیقاتی در آزمایشگاه HP، بریستول. این محبوبیت به دست آورد و بین سال های 1984 و 1994 توسط HP توسعه یافت. در سال 2005 HP Tesseract را به عنوان یک نرم افزار منبع باز منتشر کرد. از سال 2006 توسط گوگل توسعه یافته است.
Ocropus - ORopus یک سیستم OCR منبع باز است که امکان ارزیابی آسان و استفاده مجدد از اجزای OCR توسط محققان و شرکت ها را فراهم می کند. مجموعه ای از برنامه های تجزیه و تحلیل اسناد، نه یک سیستم OCR کلید در دست. برای اعمال آن بر روی اسناد خود، ممکن است نیاز به پیش پردازش تصویر داشته باشید و احتمالاً مدل های جدیدی را نیز آموزش دهید. علاوه بر خود اسکریپتهای تشخیص، چندین اسکریپت برای ویرایش و تصحیح حقیقت، اندازهگیری میزان خطا، تعیین ماتریسهای سردرگمی وجود دارد که استفاده و ویرایش آنها آسان است.
چشمی - Ocular روی اسنادی که با استفاده از دستگاه چاپ دستی چاپ می شوند، از جمله اسنادی که به چندین زبان نوشته شده اند، بهترین کار را دارد. با استفاده از خط فرمان عمل می کند. این یک سیستم OCR تاریخی پیشرفته است. ویژگی های اولیه آن عبارتند از:
- یادگیری بدون نظارت فونت های ناشناخته: فقط به تصاویر سند و مجموعه ای از متن نیاز دارد.
- توانایی مدیریت اسناد پر سر و صدا: جوهر ناسازگار، فاصله، تراز عمودی
- پشتیبانی از اسناد چند زبانه، از جمله اسنادی که قابلیت تعویض کد در سطح کلمه قابل توجهی دارند.
- یادگیری بدون نظارت الگوهای تنوع املایی از جمله املای قدیمی و کوتاه نویسی چاپگر.
- رونویسی همزمان، مشترک به دو شکل دیپلماتیک (اللفظی) و عادی.
SwiftOCR - من همچنین به موتور OCR نوشته شده در سوئیفت اشاره می کنم زیرا پیشرفت زیادی در استفاده از سوئیفت به عنوان زبان برنامه نویسی توسعه که برای یادگیری عمیق استفاده می شود انجام شده است. وارسی وبلاگ برای اینکه بیشتر بدانید چرا SwiftOCR یک کتابخانه OCR سریع و ساده است که از شبکه های عصبی برای تشخیص تصویر استفاده می کند. SwiftOCR ادعا می کند که موتور آنها بهتر از کتابخانه شناخته شده Tessaract عمل می کند.
در این پست وبلاگ قرار خواهیم داد تمرکز بر Tesseract OCR و در مورد نحوه عملکرد و نحوه استفاده از آن بیشتر بدانید.
Tesseract OCR
Tesseract یک موتور بازشناسی متن (OCR) است که تحت مجوز Apache 2.0 در دسترس است. می توان از آن به طور مستقیم یا (برای برنامه نویسان) با استفاده از یک API برای استخراج متن چاپ شده از تصاویر استفاده کرد. از زبان های مختلف پشتیبانی می کند. Tesseract یک رابط کاربری گرافیکی داخلی ندارد، اما چندین مورد از آن موجود است صفحه 3rdParty. Tesseract با بسیاری از زبانهای برنامهنویسی و فریمورکها از طریق wrapperهایی که میتوان یافت، سازگار است اینجا کلیک نمایید. میتوان از آن با تجزیه و تحلیل طرحبندی موجود برای تشخیص متن در یک سند بزرگ استفاده کرد، یا میتوان آن را همراه با یک آشکارساز متن خارجی برای تشخیص متن از یک تصویر از یک خط متن استفاده کرد.
Tesseract 4.00 شامل یک زیرسیستم شبکه عصبی جدید است که به عنوان یک تشخیص دهنده خط متن پیکربندی شده است. منشأ خود را در LSTM مبتنی بر پایتون ORopus پیاده سازی شده اما برای Tesseract در C++ دوباره طراحی شده است. سیستم شبکه عصبی در Tesseract قبل از TensorFlow قدمت دارد، اما با آن سازگار است، زیرا یک زبان توصیف شبکه به نام Variable Graph Specification Language (VGSL) وجود دارد که برای TensorFlow نیز موجود است.
برای تشخیص یک تصویر حاوی یک کاراکتر، ما معمولاً از یک شبکه عصبی کانولوشنال (CNN) استفاده می کنیم. متن با طول دلخواه دنباله ای از کاراکترها است و چنین مشکلاتی با استفاده از RNN حل می شوند و LSTM شکل محبوب RNN است. برای کسب اطلاعات بیشتر این پست را بخوانید LSTM.
فناوری - چگونه کار می کند
LSTM ها در یادگیری دنباله ها عالی هستند اما زمانی که تعداد حالت ها خیلی زیاد است سرعت آنها بسیار کاهش می یابد. نتایج تجربی وجود دارد که نشان می دهد بهتر است از یک LSTM برای یادگیری یک دنباله طولانی بخواهید تا یک دنباله کوتاه از بسیاری از کلاس ها. Tesseract از مدل ORopus در پایتون توسعه یافته است که یک انشعابات LSMT در C++ به نام CLSTM بود. CLSTM پیاده سازی مدل شبکه عصبی بازگشتی LSTM در C++ است که از کتابخانه Eigen برای محاسبات عددی استفاده می کند.
Legacy Tesseract 3.x به فرآیند چند مرحلهای وابسته بود که میتوانیم مراحل را متمایز کنیم:
- کلمه یابی
- خط یابی
- طبقه بندی شخصیت
کلمه یابی با سازماندهی خطوط متن به صورت حباب انجام شد و خطوط و مناطق برای زیر و بم ثابت یا متن متناسب تجزیه و تحلیل می شوند. خطوط متن با توجه به نوع فاصله کاراکترها به کلمات متفاوت تقسیم می شوند. سپس شناسایی به عنوان یک فرآیند دو گذری ادامه می یابد. در پاس اول سعی می شود هر کلمه به ترتیب تشخیص داده شود. هر کلمه ای که رضایت بخش باشد به عنوان داده آموزشی به طبقه بندی کننده تطبیقی منتقل می شود. سپس طبقهبندیکننده تطبیقی فرصتی برای تشخیص دقیقتر متن در پایین صفحه پیدا میکند.
نوسازی ابزار Tesseract تلاشی برای پاکسازی کد و افزودن یک مدل جدید LSTM بود. تصویر ورودی در جعبه ها (مستطیل) خط به خط پردازش می شود که به مدل LSTM تغذیه می کند و خروجی می دهد. در تصویر زیر می توانیم نحوه عملکرد آن را تجسم کنیم.
پس از افزودن ابزار آموزشی جدید و آموزش مدل با داده ها و فونت های زیاد، Tesseract به عملکرد بهتری دست می یابد. با این حال، برای کار بر روی متن دستنویس و فونتهای عجیب و غریب به اندازه کافی خوب نیست. تنظیم دقیق یا بازآموزی لایه های بالایی برای آزمایش امکان پذیر است.
نصب Tesseract
نصب tesseract روی ویندوز با باینری های از پیش کامپایل شده ای که پیدا شده است آسان است اینجا کلیک نمایید. فراموش نکنید که متغیر محیطی “path” را ویرایش کنید و مسیر tesseract را اضافه کنید. برای نصب لینوکس یا مک با آن نصب می شود چند دستور.
پس از نصب، با تایپ دستور در ترمینال یا cmd بررسی کنید که همه چیز کار می کند:
$ tesseract --version
و خروجی مشابه زیر را خواهید دید:
tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE
می توانید پس از این کار با استفاده از pip، wrapper پایتون را برای tesseract نصب کنید.
$ pip install pytesseract
کتابخانه Tesseract با یک ابزار خط فرمان مفید به نام tesseract ارسال می شود. می توانیم از این ابزار برای انجام OCR روی تصاویر استفاده کنیم و خروجی در یک فایل متنی ذخیره می شود. اگر بخواهیم Tesseract را در کد C++ یا Python خود ادغام کنیم، از API Tesseract استفاده خواهیم کرد.
اجرای Tesseract با CLI
با موتور Tesseract روی تصویر تماس بگیرید تصویر_مسیر و با نوشتن عبارت زیر، تصویر را به متن تبدیل کنید، خط به خط در خط فرمان نوشته شده است:
$ tesseract image_path stdout
برای نوشتن متن خروجی در یک فایل:
$ tesseract image_path text_result.txt
برای تعیین نام مدل زبان، بعد از آن میانبر زبان را بنویسید -l flag، به طور پیش فرض زبان انگلیسی را می گیرد:
$ tesseract image_path text_result.txt -l eng
بهطور پیشفرض، Tesseract وقتی یک تصویر را بخشبندی میکند، انتظار صفحهای از متن را دارد. اگر فقط به دنبال OCR یک منطقه کوچک هستید، با استفاده از حالت تقسیم بندی متفاوتی را امتحان کنید –psm بحث و جدل. 14 حالت موجود است که می توان آنها را پیدا کرد اینجا کلیک نمایید. به طور پیش فرض، Tesseract تقسیم بندی صفحه را به طور کامل خودکار می کند، اما جهت گیری و تشخیص اسکریپت را انجام نمی دهد. برای تعیین پارامتر، عبارت زیر را تایپ کنید:
$ tesseract image_path text_result.txt -l eng --psm 6
یک بحث مهم دیگر نیز وجود دارد، حالت موتور OCR (oem). Tesseract 4 دارای دو موتور OCR است - موتور Legacy Tesseract و موتور LSTM. چهار حالت کار با استفاده از گزینه –oem انتخاب شده است.
0 فقط موتور قدیمی.
1 فقط موتور LSTM شبکه های عصبی.
2 موتور Legacy + LSTM.
3 پیش فرض، بر اساس آنچه در دسترس است.
OCR با Pytesseract و OpenCV
Pytesseract یک لفاف برای Tesseract-OCR Engine است. همچنین بهعنوان یک اسکریپت فراخوانی مستقل برای تسراکت مفید است، زیرا میتواند همه انواع تصاویر را که توسط کتابخانههای تصویربرداری Pillow و Leptonica پشتیبانی میشوند، از جمله jpeg، png، gif، bmp، tiff و غیره بخواند. اطلاعات بیشتر در مورد رویکرد پایتون را بخوانید اینجا کلیک نمایید. کد این آموزش را می توانید در اینجا پیدا کنید مخزن.
import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
پیش پردازش برای Tesseract
برای جلوگیری از تمام راههایی که دقت خروجی تسراکت شما کاهش مییابد، باید مطمئن شوید که تصویر مناسب است. از پیش پردازش شده.
این شامل تغییر مقیاس، باینریزه کردن، حذف نویز، سطح زدایی و غیره است.
برای پیش پردازش تصویر برای OCR، از هر یک از توابع پایتون زیر استفاده کنید یا آن را دنبال کنید اسناد OpenCV.
import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
بیایید با یک مثال کار کنیم تا همه چیز را بهتر ببینیم. این همان چیزی است که تصویر اصلی ما به نظر می رسد -
پس از پیش پردازش با کد زیر
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
و با رسم تصاویر به دست آمده، نتایج زیر را بدست می آوریم.
خروجی تصویر اصلی به این صورت است -
GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED
در اینجا خروجی برای تصاویر مختلف از پیش پردازش شده به نظر می رسد -
تصویر Canny edge (نه چندان خوب)-
CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im
تصویر آستانه ای –
GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH
تصویر باز کردن –
GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH
گرفتن جعبه در اطراف متن
با استفاده از Pytesseract، می توانید با استفاده از موارد زیر، اطلاعات جعبه مرزی را برای نتایج OCR خود دریافت کنید رمز.
اسکریپت زیر به شما اطلاعات جعبه مرزی را برای هر کاراکتر شناسایی شده توسط tesseract در طول OCR می دهد.
import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
اگر به جای کاراکترها جعبه هایی در اطراف کلمات می خواهید، تابع image_to_data
به کار خواهد آمد می توانید استفاده کنید image_to_data
تابع با نوع خروجی مشخص شده با pytesseract Output
.
آیا مشکل OCR در ذهن دارید؟ می خواهید فاکتورها ، PDF ها یا پلاک ها را دیجیتالی کنید؟ سر به نانوت و ساخت مدل های OCR به صورت رایگان!
ما از نمونه تصویر فاکتور بالا برای آزمایش خروجی های تسراکت خود استفاده خواهیم کرد.
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())
این باید خروجی زیر را به شما بدهد -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])
با استفاده از این فرهنگ لغت، میتوانیم هر کلمه، اطلاعات جعبه مرزی آنها، متن موجود در آنها و امتیازات اطمینان برای هر یک را شناسایی کنیم.
با استفاده از کد زیر می توانید جعبه ها را رسم کنید -
n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
در اینجا به شکلی است که برای تصویر یک نمونه فاکتور به نظر می رسد.
مطابقت الگوی متن
تلاش برای یافتن مکان تاریخ در یک تصویر را مثال بزنید. در اینجا الگوی ما یک الگوی عبارت منظم خواهد بود که با نتایج OCR خود مطابقت می دهیم تا کادرهای محدود کننده مناسب را پیدا کنیم. ما استفاده خواهیم کرد regex
ماژول و image_to_data
برای این کار
import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
همانطور که انتظار می رود، یک جعبه در اطراف تاریخ فاکتور در تصویر دریافت می کنیم.
حالت های تقسیم بندی صفحه
روش های مختلفی برای تجزیه و تحلیل یک صفحه از متن وجود دارد. اگر می خواهید OCR را فقط در یک منطقه کوچک یا در جهت های مختلف و غیره اجرا کنید، api tesseract چندین حالت تقسیم بندی صفحه را ارائه می دهد.
در اینجا لیستی از حالت های تقسیم بندی صفحه پشتیبانی شده توسط tesseract آمده است –
0 فقط جهت گیری و تشخیص اسکریپت (OSD).
1 تقسیم بندی خودکار صفحه با OSD.
2 تقسیم بندی خودکار صفحه، اما بدون OSD یا OCR.
3 تقسیم بندی صفحه کاملاً خودکار، اما بدون OSD. (پیش فرض)
4 یک ستون متنی با اندازه های متغیر را فرض کنید.
5 یک بلوک یکنواخت از متن تراز عمودی را فرض کنید.
6 یک بلوک یکنواخت متن را فرض کنید.
7 با تصویر به عنوان یک خط متن برخورد کنید.
8 با تصویر به عنوان یک کلمه برخورد کنید.
9 تصویر را به عنوان یک کلمه در یک دایره در نظر بگیرید.
10 با تصویر به عنوان یک کاراکتر برخورد کنید.
11 متن پراکنده. تا جایی که ممکن است متن را بدون ترتیب خاصی پیدا کنید.
12 متن پراکنده با OSD.
13 خط خام. تصویر را به عنوان یک خط متن واحد، دور زدن هکهایی که مختص Tesseract هستند، در نظر بگیرید.
برای تغییر حالت بخش بندی صفحه، آن را تغییر دهید --psm
آرگومان در رشته پیکربندی سفارشی شما به هر یک از کدهای حالت ذکر شده در بالا.
تشخیص جهت و اسکریپت
شما می توانید جهت متن در تصویر خود و همچنین اسکریپتی که در آن نوشته شده است را تشخیص دهید. تصویر زیر –
پس از اجرای کد زیر -
osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)
خروجی زیر را چاپ خواهد کرد.
angle: 90
script: Latin
فقط ارقام را تشخیص دهید
به عنوان مثال این تصویر را در نظر بگیرید -
متن استخراج شده از این تصویر به این صورت است.
‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234
با تغییر پیکربندی به موارد زیر می توانید فقط ارقام را تشخیص دهید
custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))
خروجی به این شکل خواهد بود.
-- . 43876324
172018
0 76496234
لیست سفید شخصیت ها
بگویید فقط می خواهید کاراکترهای خاصی را از تصویر داده شده شناسایی کنید و بقیه را نادیده بگیرید. شما می توانید لیست سفید کاراکترهای خود را مشخص کنید (در اینجا ما از تمام حروف کوچک فقط از a تا z استفاده کرده ایم) با استفاده از پیکربندی زیر.
custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))
خروجی -
customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo
لیست سیاه شخصیت ها
اگر مطمئن هستید که برخی از کاراکترها یا عبارات قطعاً در متن شما ظاهر نمی شوند (در غیر این صورت OCR متن اشتباه را به جای کاراکترهای لیست سیاه نشان می دهد)، می توانید با استفاده از پیکربندی زیر آن کاراکترها را در لیست سیاه قرار دهید.
custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
خروجی -
Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono
تشخیص در چندین زبان
با تایپ این مورد در ترمینال می توانید زبان های موجود را بررسی کنید
$ tesseract --list-langs
برای دانلود tesseract برای یک زبان خاص
$ sudo apt-get install tesseract-ocr-LANG
که در آن LANG کد سه حرفی برای زبان مورد نیاز شما است. می توانید مقادیر LANG را پیدا کنید اینجا کلیک نمایید.
شما می توانید دانلود کنید .traindata
برای زبان مورد نیاز خود فایل کنید اینجا کلیک نمایید و آن را در آن قرار دهید $TESSDATA_PREFIX
دایرکتوری (این باید همان جایی باشد که tessdata
دایرکتوری نصب شده است) و باید آماده استفاده باشد.
توجه داشته باشید – فقط زبان هایی که الف دارند .traineddata
فرمت فایل توسط teseract پشتیبانی می شود.
برای تعیین زبان مورد نیاز خروجی OCR خود، از -l LANG
آرگومان در پیکربندی که در آن LANG کد 3 حرفی برای زبانی است که می خواهید استفاده کنید.
custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
به عنوان مثال این تصویر را در نظر بگیرید -
با تغییر پارامتر LANG می توانید با چندین زبان کار کنید -
custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
و خروجی زیر را دریافت خواهید کرد -
Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส
توجه داشته باشید – زبانی که ابتدا به -l
پارامتر زبان اصلی است.
متأسفانه tesseract قابلیتی برای تشخیص خودکار زبان متن در یک تصویر ندارد. یک راه حل جایگزین توسط ماژول پایتون دیگری به نام ارائه شده است langdetect
که از طریق پیپ قابل نصب است.
$ pip install langdetect
این ماژول دوباره زبان متن را با استفاده از تصویر تشخیص نمیدهد، اما برای تشخیص زبان به ورودی رشته نیاز دارد. بهترین راه برای انجام این کار این است که ابتدا از tesseract استفاده کنید تا متن OCR را به هر زبانی که احساس می کنید در آنجا وجود دارد، دریافت کنید. langdetect
برای پیدا کردن زبان های موجود در متن OCR و سپس دوباره OCR را با زبان های یافت شده اجرا کنید.
فرض کنید متنی داریم که فکر می کردیم به زبان انگلیسی و پرتغالی است.
custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)
این باید فهرستی از زبان های موجود در متن و احتمالات آنها را خروجی دهد.
[en:0.714282468983554, es:0.2857145605644145]
کدهای زبان استفاده شده توسط langdetect
کدهای ISO 639-1 را دنبال کنید. برای مقایسه لطفا بررسی کنید این و این. متوجه شدیم که زبان مورد استفاده در متن انگلیسی و اسپانیایی است.
با تغییر تنظیمات به متن دوباره دریافت می کنیم
custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)
توجه داشته باشید – هنگامی که در یک تصویر با چندین زبان، زبان های مشخص شده در پیکربندی اشتباه هستند یا اصلاً ذکر نشده اند، Tesseract عملکرد بدی دارد. این می تواند ماژول langdetect را نیز کمی گمراه کند.
با استفاده از tessdata_fast
اگر سرعت نگرانی اصلی شماست، میتوانید مدلهای زبان tessdata خود را با مدلهای tessdata_fast که نسخههای صحیح 8 بیتی مدلهای tessdata هستند جایگزین کنید.
به گزارش tessdata_fast گیتهاب -
این مخزن شامل نسخه های سریع عدد صحیح مدل های آموزش دیده برای موتور OCR منبع باز Tesseract.
این مدل ها فقط با موتور LSTM OCR Tesseract 4 کار می کنند.
- اینها یک سازش سرعت/دقت در مورد آنچه که بهترین "ارزش برای پول" را در سرعت در مقابل دقت ارائه می دهد، هستند.
- برای برخی از زبانها، این هنوز بهترین است، اما برای بسیاری از زبانها نه.
- سپس پیکربندی شبکه "بهترین ارزش برای پول" برای سرعت بیشتر یکپارچه شد.
- اکثر کاربران مایلند از این فایل های داده آموزش دیده برای انجام OCR استفاده کنند و این فایل ها به عنوان بخشی از توزیع های لینوکس ارسال می شوند. اوبونتو 18.04.
- تنظیم دقیق / آموزش افزایشی خواهد شد نه از اینها امکان پذیر است
fast
مدل ها، چون عدد صحیح 8 بیتی هستند. - هنگام استفاده از مدلهای موجود در این مخزن، فقط موتور OCR جدید مبتنی بر LSTM پشتیبانی میشود. میراث
tesseract
موتور با این فایلها پشتیبانی نمیشود، بنابراین حالتهای OEM «0» و «2» Tesseract با آنها کار نمیکنند.
برای استفاده tessdata_fast
مدل ها به جای tessdata
، تنها کاری که باید انجام دهید این است که خود را دانلود کنید tessdata_fast
فایل داده زبان از اینجا کلیک نمایید و آن را در داخل خود قرار دهید $TESSDATA_PREFIX
دایرکتوری.
آیا باید اسناد ، رسیدها یا فاکتورها را دیجیتالی کنید اما برای کدگذاری خیلی تنبل هستید؟ سر به نانوت و ساخت مدل های OCR به صورت رایگان!
آموزش Tesseract روی داده های سفارشی
Tesseract 4.00 شامل یک موتور تشخیص مبتنی بر شبکه عصبی جدید است که دقت قابل توجهی بالاتری را در تصاویر اسناد ارائه می دهد. شبکه های عصبی به داده های آموزشی بیشتری نیاز دارند و بسیار کندتر از پایه Tesseract آموزش می بینند. برای زبانهای مبتنی بر لاتین، دادههای مدل موجود ارائه شده بر روی حدود 400000 خط متنی با حدود 4500 فونت آموزش داده شده است.
برای اجرای موفقیت آمیز آموزش Tesseract 4.0 LSTM، باید یک نصب فعال Tesseract 4 و Tesseract 4 Training Tools داشته باشید و همچنین اسکریپت های آموزشی و فایل های داده های آموزشی مورد نیاز را در دایرکتوری های خاصی داشته باشید. بازدید کنید repo github برای فایل ها و ابزارها
Tesseract 4.00 برای آموزش از ابتدا چند روز تا چند هفته طول می کشد. حتی با وجود تمام این داده های آموزشی جدید، در اینجا چند گزینه برای آموزش وجود دارد:
- تنظیم دقیق – با یک زبان آموزشدیده موجود شروع کنید، بر روی دادههای اضافی خاص خود آموزش دهید. به عنوان مثال آموزش در مورد یک مجموعه داده دست نویس و برخی فونت های اضافی.
- لایه بالایی را برش دهید – از شبکه و آموزش مجدد لایه بالایی جدید با استفاده از داده های جدید. اگر تنظیم دقیق کار نمی کند، این به احتمال زیاد بهترین گزینه بعدی است. قیاس چرایی مفید بودن آن، به عنوان مثال مدل های آموزش دیده بر روی مجموعه داده ImageNet را در نظر بگیرید. هدف ساخت یک طبقهبندی گربه یا سگ است، لایههای پایینتر در مدل در انتزاع سطح پایین به عنوان گوشهها، خطوط افقی و عمودی خوب هستند، اما لایههای بالاتر در مدل این ویژگیها را ترکیب میکنند و گوش، چشم، بینی گربه یا سگ را تشخیص میدهند. و غیره با بازآموزی فقط لایههای بالا، از دانش لایههای پایینتر استفاده میکنید و با مجموعه دادههای مختلف جدید خود ترکیب میکنید.
- بازآموزی از ابتدا - این یک رویکرد بسیار کند است مگر اینکه مجموعه آموزشی بسیار نماینده و به اندازه کافی بزرگ برای مشکل خود داشته باشید. بهترین منبع برای آموزش از ابتدا دنبال کردن این است repo github.
راهنمای نحوه آموزش بر روی داده های سفارشی و ایجاد .traineddata
فایل ها را می توان یافت اینجا کلیک نمایید, اینجا کلیک نمایید و اینجا کلیک نمایید.
ما کد آموزش استفاده از Tesseract را در این پست وبلاگ پوشش نمی دهیم.
محدودیت های Tesseract
Tesseract زمانی بهترین عملکرد را دارد که متن پیشزمینه از پسزمینه تقسیم بندی شده باشد. در عمل، تضمین این نوع راه اندازی می تواند بسیار چالش برانگیز باشد. دلایل مختلفی وجود دارد که ممکن است خروجی با کیفیت خوبی از Tesseract دریافت نکنید، مثلاً اگر تصویر در پسزمینه نویز داشته باشد. هرچه کیفیت تصویر (اندازه، کنتراست، رعد و برق) بهتر باشد، نتیجه تشخیص بهتر است. برای بهبود نتایج OCR نیاز به کمی پیش پردازش دارد، تصاویر باید به طور مناسب مقیاس بندی شوند، تا حد ممکن کنتراست تصویر داشته باشند، و متن باید به صورت افقی تراز شود. Tesseract OCR بسیار قدرتمند است اما محدودیت های زیر را دارد.
محدودیت های Tesseract در لیست خلاصه شده است.
- OCR به اندازه برخی راه حل های تجاری موجود در دسترس ما دقیق نیست.
- با تصاویر متاثر از مصنوعات از جمله انسداد جزئی، پرسپکتیو تحریف شده و پسزمینه پیچیده به خوبی کار نمیکند.
- توانایی تشخیص دست خط را ندارد.
- ممکن است حرفهای بیهوده بیابد و آن را به عنوان خروجی OCR گزارش کند.
- اگر سندی حاوی زبانهایی خارج از زبانهای ارائهشده در آرگومانهای -l LANG باشد، نتایج ممکن است ضعیف باشند.
- همیشه در تجزیه و تحلیل ترتیب خواندن طبیعی اسناد خوب نیست. برای مثال، ممکن است نتواند تشخیص دهد که یک سند دارای دو ستون است و ممکن است سعی کند متن را در ستونها به هم بپیوندد.
- اسکن با کیفیت پایین ممکن است OCR با کیفیت پایین ایجاد کند.
- اطلاعاتی در مورد اینکه متن خانواده فونت متعلق به کدام قلم است را نشان نمی دهد.
البته یک راه بهتر، بسیار ساده تر و شهودی تر برای انجام وظایف OCR وجود دارد.
OCR با Nanonets
La Nanonets OCR API به شما امکان می دهد مدل های OCR را با سهولت بسازید. برای افزایش دقت مدل OCR لازم نیست نگران پردازش قبلی تصاویر خود باشید یا نگران تطبیق الگوها یا ساخت موتورهای مبتنی بر قاعده باشید.
شما می توانید داده های خود را بارگذاری کنید ، آن را حاشیه نویسی کنید ، مدل را آموزش دهید و منتظر دریافت پیش بینی از طریق رابط کاربر مبتنی بر مرورگر بدون نوشتن یک خط کد ، نگرانی در مورد پردازنده های گرافیکی یا یافتن معماری مناسب برای مدل های یادگیری عمیق خود باشید. همچنین می توانید پاسخ های JSON مربوط به هر پیش بینی را به دست آورید تا آن را با سیستم های خود ادغام کنید و برنامه های مجهز به یادگیری ماشین را با الگوریتم های پیشرفته و زیرساخت های قوی ایجاد کنید.
با استفاده از رابط کاربری گرافیکی: https://app.nanonets.com/
با دنبال کردن مراحل زیر می توانید از Nanonets-OCR API نیز استفاده کنید:
مرحله 1: شبیه سازی Repo ، نصب وابستگی ها
git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm
مرحله 2: کلید API رایگان خود را دریافت کنید
کلید API رایگان خود را از اینجا دریافت کنید http://app.nanonets.com/#/keys
مرحله 3: کلید API را به عنوان یک محیط متغیر تنظیم کنید
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
مرحله 4: یک مدل جدید ایجاد کنید
python ./code/create-model.py
توجه داشته باشید: این یک MODEL_ID تولید می کند که برای مرحله بعدی به آن نیاز دارید
مرحله 5: شناسه مدل را به عنوان متغیر محیط اضافه کنید
export NANONETS_MODEL_ID=YOUR_MODEL_ID
توجه داشته باشید: YOUR_MODEL_ID را از مرحله قبل دریافت خواهید کرد
مرحله 6: داده های آموزش را بارگذاری کنید
داده های آموزش در images
(پرونده های تصویری) و annotations
(حاشیه نویسی برای پرونده های تصویری)
python ./code/upload-training.py
مرحله 7: مدل قطار
پس از بارگذاری تصاویر ، آموزش مدل را شروع کنید
python ./code/train-model.py
مرحله 8: حالت مدل را دریافت کنید
آموزش این مدل 2 ساعت پوند طول می کشد. پس از آموزش مدل ، ایمیل دریافت خواهید کرد. در ضمن حالت مدل را بررسی می کنید
python ./code/model-state.py
مرحله 9: پیش بینی کنید
پس از آموزش مدل. با استفاده از مدل می توانید پیش بینی کنید
python ./code/prediction.py ./images/151.jpg
Nanonets و Humans in the Loop
صفحه نمایش «متوسط» به فرآیندهای تصحیح و ورود کمک میکند و حجم کاری بازبین دستی را تقریباً 90 درصد کاهش میدهد و هزینهها را تا 50 درصد برای سازمان کاهش میدهد.
امکانات شامل
- پیش بینی های صحیح را دنبال کنید
- پیگیری کنید کدام اشتباه است
- اصلاحات را در موارد غیر دقیق انجام دهید
- موارد اشتباه را حذف کنید
- پیش بینی های از دست رفته را پر کنید
- تصاویر را با دامنه تاریخ فیلتر کنید
- تعداد تصاویر تعدیل شده را در مقابل آنهایی که تعدیل نشده اند بدست آورید
تمام قسمت ها به صورت GUI با کاربرد آسان ساخته شده اند که به کاربر این امکان را می دهد تا از تکنولوژی OCR بهره ببرد و در هنگام پیشرفت و بدون نیاز به تایپ کد یا درک نحوه کارکرد فناوری ، به پیشرفت آن کمک کند.
آیا مشکل OCR در ذهن دارید؟ آیا می خواهید هزینه های ورود داده های سازمان خود را کاهش دهید؟ سر به نانوت و ساخت مدل های OCR به استخراج متن از تصاویر or استخراج داده ها از فایل های PDF!
نتیجه
همانطور که یادگیری عمیق تقریباً بر تمام جنبه های بینایی رایانه تأثیر گذاشته است، همین امر در مورد تشخیص شخصیت و تشخیص دست خط نیز صادق است. مدلهای مبتنی بر یادگیری عمیق توانستهاند دقت بیسابقهای در تشخیص متن، بسیار فراتر از سنتی به دست آورند. استخراج اطلاعات و پردازش تصویر یادگیری ماشینی رویکردها
وقتی تصاویر سند از دستورالعملهای زیر پیروی میکنند، Tesseract عملکرد خوبی دارد:
- تقسیم بندی متن پیش زمینه را از پس زمینه پاک کنید
- به صورت افقی تراز و به طور مناسب مقیاس بندی شده است
- تصویر با کیفیت بالا بدون تاری و نویز
آخرین نسخه Tesseract 4.0 از OCR مبتنی بر یادگیری عمیق پشتیبانی می کند که به طور قابل توجهی دقیق تر است. خود موتور OCR بر روی یک شبکه حافظه کوتاه مدت (LSTM) که نوعی شبکه عصبی بازگشتی (RNN) است، ساخته شده است.
Tesseract برای اسکن اسناد تمیز عالی است و از آنجایی که آموزش آن جامع بود، با دقت بسیار بالا و تنوع فونت ارائه می شود. اگر وظیفه شما اسکن کتابها، اسناد و متن چاپ شده روی پسزمینه سفید تمیز باشد، میتوانم بگویم که Tesseract ابزاری مناسب است.
برای مطالعه بیشتر
- بهترین مدل آموزش دیده برای LSTM Tesseract 4.0
- رویکرد Dropbox به OCR 4.2017
- مروری بر میراث موتور OCR Tesseract
- انجمن برای توسعه دهندگان Tesseract
- انجمن برای کاربران Tesseract
- مقایسه دقت OCR در کتاب های چاپ اولیه با استفاده از
موتورهای منبع باز Calamari و Ocropus - OCR کارآمد و بدون واژگان با استفاده از یادگیری عمیق
- مناسب بودن موتورهای OCR در سیستمهای استخراج اطلاعات - یک ارزیابی مقایسهای
- بنچمارک DeepText
- لیست پروژه OCR
- آخرین نسخه Tesseract Github
- CVPR 2019 - آگاهی از منطقه شخصیت برای تشخیص متن (CRAFT)
- OCR کارت اعتباری با OpenCV و Python
- پیش پردازش تصویر
- پیش پردازش تصویر در OpenCV
- OCR با استفاده از Tesseract در Raspberry Pi
- Tesseract OCR برای زبان های غیر انگلیسی
- نحوه انجام OCR از خط فرمان لینوکس با استفاده از Tesseract
- مروری بر موتور OCR Tesseract
به روز رسانی:
بسیاری از مردم از ما پرسیدند که چگونه میتوانند تاریخ را به صورت متن یا با استفاده از زمانی که تاریخ یا هر داده خاص دیگری را شناسایی میکند، دریافت کنند تا بتوانند به فهرست اضافه کنند.
در اینجا پاسخ است:
در کد رسم یک کادر محدود در اطراف کادر تاریخ، متوجه خطی خواهید شد که با الگوی regex مطابقت دارد.d['text']
. فقط در صورتی یک جعبه را می کشد که الگوی آن مطابقت داشته باشد. شما به سادگی می توانید مقادیر را از آن استخراج کنیدd['text']
پس از مطابقت الگو، آنها را به لیست اضافه کنید.
به روز رسانی 2:
برای پاسخگویی به سوالات مربوط به OCR غیرانگلیسی، ما لیست های خواندن بیشتر را به روز کرده ایم.
- 100
- 2019
- 7
- 9
- درباره ما
- مطابق
- دقیق
- دست
- به دست آوردن
- در میان
- اضافی
- نشانی
- مزیت - فایده - سود - منفعت
- AI
- ایدز
- الگوریتم
- معرفی
- اجازه دادن
- در میان
- تحلیل
- دیگر
- API
- روش
- برنامه های
- محدوده
- استدلال
- دور و بر
- هنر
- مقاله
- خودکار
- در دسترس
- اطلاع
- بودن
- بهترین
- بیت
- بلاگ
- کتاب
- مرز
- جعبه
- مرورگر
- ساختن
- ساخته شده در
- می توانید دریافت کنید
- CD
- تغییر دادن
- دایره
- ادعای
- تمیز کاری
- CNN
- رمز
- مجموعه
- ستون
- ترکیب
- تجاری
- شرکت
- پیچیده
- اعتماد به نفس
- پیکر بندی
- گیجی
- شامل
- تبدیل
- اصلاحات
- هزینه
- میتوانست
- زن و شوهر
- داده ها
- مقدار
- شناسایی شده
- کشف
- تعیین
- توسعه
- توسعه دهندگان
- پروژه
- DID
- متفاوت است
- مختلف
- دیجیتال
- دیجیتالی کردن
- رقم
- اسناد و مدارک
- پایین
- قطره
- Dropbox به
- در اوایل
- لبه
- پست الکترونیک
- نقطه پایانی
- انرژی
- انگلیسی
- محیط
- همه چیز
- مثال
- انتظار می رود
- انتظار می رود
- خانواده
- FAST
- ویژگی
- امکانات
- زمینه
- نام خانوادگی
- جریان
- به دنبال
- پیروی
- چنگال
- فرم
- قالب
- اشکال
- یافت
- رایگان
- تابع
- گرفتن
- رفتن
- GitHub
- دادن
- هدف
- خوب
- گوگل
- خاکستری
- سیاه و سفید
- بزرگ
- راهنمایی
- دستورالعمل ها
- هک
- داشتن
- سر
- اینجا کلیک نمایید
- زیاد
- دارای
- چگونه
- چگونه
- HTTPS
- بزرگ
- انسان
- شناسایی
- تصویر
- تأثیر
- انجام
- مهم
- بهبود
- در دیگر
- مشمول
- از جمله
- افزایش
- اطلاعات
- اطلاعات
- شالوده
- ادغام
- حسی
- IT
- پیوستن
- کلید
- کلید
- دانش
- شناخته شده
- آزمایشگاه
- زبان
- زبان ها
- بزرگ
- آخرین
- یاد گرفتن
- یادگیری
- کتابخانه
- مجوز
- رعد و برق
- لاین
- لینوکس
- فهرست
- لیست
- طولانی
- مک
- دستگاه
- فراگیری ماشین
- عمده
- ساخت
- کتابچه راهنمای
- بازار
- مسابقه
- حافظه
- ذهن
- مدل
- مدل
- اکثر
- شبکه
- مبتنی بر شبکه
- شبکه
- سر و صدا
- باز کن
- منبع باز
- افتتاح
- گزینه
- گزینه
- سفارش
- سازماندهی
- دیگر
- در غیر این صورت
- الگو
- مردم
- کارایی
- چشم انداز
- فقیر
- محبوب
- ممکن
- قوی
- پیش گویی
- پیش بینی
- فشار
- زیبا
- اصلی
- مشکل
- روند
- فرآیندهای
- تولید کردن
- برنامه نویسان
- برنامه نويسي
- زبانهای برنامه نویسی
- برنامه ها
- پروژه
- ارائه
- فراهم می کند
- کیفیت
- نرخ
- خام
- RE
- مطالعه
- دلایل
- كاهش دادن
- منظم
- باقی مانده است
- گزارش
- مخزن
- نیاز
- ضروری
- تحقیق
- منابع
- REST
- نتایج
- دویدن
- در حال اجرا
- پویش
- پرده
- تقسیم بندی
- خدمات
- تنظیم
- کوتاه
- مشابه
- ساده
- اندازه
- کوچک
- So
- نرم افزار
- مزایا
- اسپانیایی
- مشخصات
- سرعت
- دولت
- ایالات
- قوی
- موفقیت
- پشتیبانی
- پشتیبانی از
- SWIFT
- سیستم
- سیستم های
- وظایف
- پیشرفته
- پایانه
- آزمون
- از طریق
- زمان
- ابزار
- بالا
- سنتی
- آموزش
- دگرگون کردن
- درمان
- روند
- اوبونتو
- ui
- فهمیدن
- منحصر به فرد
- us
- استفاده کنید
- موارد استفاده
- کاربران
- ارزش
- دید
- W
- صبر کنيد
- راه رفتن
- چی
- چه شده است
- لیست سفید
- ویکیپدیا
- پنجره
- در داخل
- بدون
- کلمات
- مهاجرت کاری
- کارگر
- با این نسخهها کار
- نوشته
- X