In svn there is first part of tesseract-ocr 3.03 code. There is new contribution coming from application engineering team at AMD that saw the significant opportunity to accelerate the compute intensive portions of the code without affecting the accuracy of the algorithm. They looked at offloading modules onto the graphical processing units (GPU). The GPU programs will run OpenCL which is platform & OS agnostic. This should enable speed-up across all supported platforms.
At the moment tesseract-ocr produces time information about overall performance and some functions (regardless OpenCL is used or not)..
My first attempt to use OpenCL was on my “AMD based” (CPU and GPU) linux computer (openSUSE 13.1 64bit). Unfortunately I found out that my video card ([AMD/ATI] RV630 PRO [Radeon HD 2600 PRO]) is not supported by AMD latest version of graphic card drivers (AMD catalyst-13.1-legacy) and I was not able to install older version of driver on openSUSE 13.1.
Anyway I decide to install Accelerated Parallel Processing (APP) SDK (AMD-APP-SDK-v2.9) to see what will happened. Installation of package is very easy and without any problem. AMD OpenCL package was installed at /opt/AMDAPP/ (lib and include).
Than I needed to configure tesseract-ocr. I like to use automake VPATH Builds for different tesseract-ocr configuration. You can use it this way (I expect that you have local svn repository at /usr/src/tesseract-ocr):
cd /usr/src/tesseract-ocr svn up ./autogen.sh mkdir /usr/src/tesseract-ocr.opencl cd /usr/src/tesseract-ocr.opencl ../tesseract-ocr/configure --enable-opencl --prefix=/usr make -j 6 sudo make install
If you get error:
ld: cannot find -lOpenCL
export LIBRARY_PATH=/opt/AMDAPP/lib/x86_64/:$LIBRARY_PATH
I installed it to /usr, just to make sure I have only one version of tesseract-ocr installed. Now lets get initial information:
tesseract -v tesseract 3.03 leptonica-1.69 libgif 4.1.6 : libjpeg 8b : libpng 1.6.6 : libtiff 4.0.3 : zlib 1.2.8 OpenCL info: Found 1 platforms. Platform name: AMD Accelerated Parallel Processing. Version: OpenCL 1.2 AMD-APP (1214.3). Found 1 devices. Device 1 name: AMD Athlon(tm) X2 Dual Core Processor BE-2400.
As you can see because I use opensource radeon driver for my videocard, so OpenCL is able to find /use only my CPU with two cores, but no GPU.
For the moment I just made simple test – measure time of OCR ([Tesseract:main] lenght). I use image 8509_001.4B.tif from ISRI-OCRtk bus.4B.
Here are initial data with “noOpenCL” version of tesseract-ocr:
> tesseract 8509_001.4B.tif 8509_001.4B [ TessBaseAPI::Init], total, 0.680310 Tesseract Open Source OCR Engine v3.03 with Leptonica [ GetLineMasksMorph], total, 0.890510 [ FindAndRemoveLines], total, 1.061292 [ ProcessPage], total, 21.232282 [ ProcessPages], total, 21.273481 [ Tesseract:main], total, 21.954697
> tesseract 8509_001.4B.tif 8509_001.4B [DS] Profile file not available (tesseract_opencl_profile_devices.dat); performing profiling [DS] Device: "AMD Athlon(tm) X2 Dual Core Processor BE-2400" (OpenCL) evaluation... OpenCL error code is -1 at when clGetDeviceIDs . [ OD::CompileKernel::clBuildProgram], total, 1.223780 [OD] write binary[kernel-AMD_Athlon(tm)_X2_Dual_Core_Processor_BE-2400.bin] succesfully [ pixReadFromTiffKernel], total, 0.05976 [ HistogramRectOCL], total, 0.660465 [ ThresholdRectToPixOCL], total, 0.067328 [DS] Device: "AMD Athlon(tm) X2 Dual Core Processor BE-2400" (OpenCL) evaluated [DS] composeRGBPixel: 0.059823 (w=1.2) [DS] HistogramRect: 0.660525 (w=2.4) [DS] ThresholdRectToPix: 0.067384 (w=4.5) [DS] getLineMasksMorph: 0.205506 (w=5.0) [DS] Score: 2.987804<br/> [DS] Device: "(null)" (Native) evaluation... [ HistogramRect], total, 0.023726 [ HistogramRect], total, 0.032327 [ HistogramRect], total, 0.032890 [ HistogramRect], total, 0.032501 [DS] Device: "(null)" (Native) evaluated [DS] composeRGBPixel: 0.073872 (w=1.2) [DS] HistogramRect: 0.121674 (w=2.4) [DS] ThresholdRectToPix: 0.050257 (w=4.5) [DS] getLineMasksMorph: 0.350409 (w=5.0) [DS] Score: 2.358863 [DS] Scores written to file (tesseract_opencl_profile_devices.dat). [DS] Device[1] 1:AMD Athlon(tm) X2 Dual Core Processor BE-2400 score is 2.987804 [DS] Device[2] 0:(null) score is 2.358863 [DS] Selected Device[2]: "(null)" (Native) [ getDeviceSelection], total, 4.342579 [ TessBaseAPI::Init], total, 4.662863 Tesseract Open Source OCR Engine v3.03 with Leptonica [ GetLineMasksMorph], total, 0.864317 [ FindAndRemoveLines], total, 1.025500 [ ProcessPage], total, 11.497218 [ ProcessPages], total, 11.538741 [ Tesseract:main], total, 16.202244
Hmm, it looks like there is performed profiling at the beginning, so lets try to run command once more time:
> tesseract 8509_001.4B.tif 8509_001.4B [DS] Profile read from file (tesseract_opencl_profile_devices.dat). [DS] Device[1] 1:AMD Athlon(tm) X2 Dual Core Processor BE-2400 score is 2.987804 [DS] Device[2] 0:(null) score is 2.358863 [DS] Selected Device[2]: "(null)" (Native) [ getDeviceSelection], total, 0.032056 [ TessBaseAPI::Init], total, 0.332594 Tesseract Open Source OCR Engine v3.03 with Leptonica [ GetLineMasksMorph], total, 0.874358 [ FindAndRemoveLines], total, 1.042208 [ ProcessPage], total, 11.808473 [ ProcessPages], total, 11.850462 [ Tesseract:main], total, 12.183789
Output is shorter ;-) and total time was improved too. 12.18 to 21.95 means 44% less time to OCR one page with enabled OpenCL support.
I have possibility to run test on Windows 7 64bit on Dell notebook which is “Intel based”: Intel® Core™ i7-4800MQ CPU @ 2.70GHz. and Intel® HD Graphics 4600. According Intel web page this graphic card is supported by their OpenCL package. OpenCL runtime and compiler should be part of driver package, but I need to install Intel® SDK for OpenCL* Applications 2013) that provides Header files and libraries, Microsoft Visual Studio* 2008-2012 IDE Integration, Kernel Builder (Design, build, and analyze OpenCL kernels).
I tried to install it several time, but there were no header files installed (just libs) and installation finished with error “…Setup Wizard ended prematurely because of error”. After looking on internet I found out error message is caused by (automatically) checked option to integrate with Microsoft Visual Studio 2010. Problem is that Intel OpenCL is not able to integrate to Express version of Visual Studio 2010… Indeed turning off integration with Visual Studio helped.
OpenCL support in tesseract-ocr on Windows platform is at the moment (svn revision 929) only for VS2010. There you can find configuration “LIB_OpenCL_Release” that is based on static linked release (“LIB_Release”) of tesseract-ocr. Even OS is 64bit I used 32 bit OpenCL library because there is no 64bit configuration for tesseract-ocr VS solution.
> tesseract-opencl.exe -v tesseract 3.03 leptonica-1.68 (Mar 14 2011, 10:43:03) [MSC v.1500 LIB Release 32 bit] libgif 4.1.6 : libjpeg 8c : libpng 1.4.3 : libtiff 3.9.4 : zlib 1.2.5<br/> OpenCL info: Found 1 platforms. Platform name: Intel(R) OpenCL. Version: OpenCL 1.2 . Found 2 devices. Device 1 name: Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz. Device 2 name: Intel(R) HD Graphics 4600.
I used the same image as in linux tests. Here are the results for “noOpenCL”:
>tesseract.exe 8509_001.4B.tif 8509_001.4B [ TessBaseAPI::Init], total, 0.428550 Tesseract Open Source OCR Engine v3.03 with Leptonica [ GetLineMasksMorph], total, 0.322534 [ FindAndRemoveLines], total, 0.394429 [ ProcessPage], total, 3.578335 [ ProcessPages], total, 3.656705 [ Tesseract:main], total, 4.091411
>tesseract-opencl.exe 8509_001.4B.tif 8509_001.4B [OD] Load opencl.dll successful! [DS] Profile file not available (tesseract_opencl_profile_devices.dat); performing profiling. [DS] Device: "Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz" (OpenCL) evaluation... [ OD::CompileKernel::clBuildProgram], total, 1.041619 [OD] write binary[kernel-Intel(R)_Core(TM)_i7-4800MQ_CPU_@_2.70GHz.bin] succesfully [ pixReadFromTiffKernel], total, 0.045007 [ HistogramRectOCL], total, 0.113896 [ ThresholdRectToPixOCL], total, 0.023143 [DS] Device: "Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz" (OpenCL) evaluated [DS] composeRGBPixel: 0.045170 (w=1.2) [DS] HistogramRect: 0.114120 (w=2.4) [DS] ThresholdRectToPix: 0.023391 (w=4.5) [DS] getLineMasksMorph: 0.032764 (w=5.0) [DS] Score: 0.597172<br/> [DS] Device: "Intel(R) HD Graphics 4600" (OpenCL) evaluation... [ OD::CompileKernel::clBuildProgram], total, 0.954983 [OD] write binary[kernel-Intel(R)_HD_Graphics_4600.bin] succesfully [ pixReadFromTiffKernel], total, 0.085689 [ HistogramRectOCL], total, 0.372385 [ ThresholdRectToPixOCL], total, 0.055804 [DS] Device: "Intel(R) HD Graphics 4600" (OpenCL) evaluated [DS] composeRGBPixel: 0.086187 (w=1.2) [DS] HistogramRect: 0.372899 (w=2.4) [DS] ThresholdRectToPix: 0.056127 (w=4.5) [DS] getLineMasksMorph: 0.017175 (w=5.0) [DS] Score: 1.336826<br/> [DS] Device: "(null)" (Native) evaluation... [ HistogramRect], total, 0.017834 [ HistogramRect], total, 0.015073 [ HistogramRect], total, 0.015243 [ HistogramRect], total, 0.017316 [DS] Device: "(null)" (Native) evaluated [DS] composeRGBPixel: 0.048048 (w=1.2) [DS] HistogramRect: 0.066408 (w=2.4) [DS] ThresholdRectToPix: 0.033115 (w=4.5) [DS] getLineMasksMorph: 0.129397 (w=5.0) [DS] Score: 1.013041 [DS] Scores written to file (tesseract_opencl_profile_devices.dat). [DS] Device[1] 1:Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz score is 0.597172 [DS] Device[2] 1:Intel(R) HD Graphics 4600 score is 1.336826 [DS] Device[3] 0:(null) score is 1.013041 [DS] Selected Device[1]: "Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz" (OpenCL) [ getDeviceSelection], total, 3.254269 [ OD::CompileKernel::clBuildProgram], total, 1.027866 [ TessBaseAPI::Init], total, 4.401662 Tesseract Open Source OCR Engine v3.03 with Leptonica [ pixReadTiffCL], total, 0.006628 [ GetLineMasksMorph], total, 0.033356 [ FindAndRemoveLines], total, 0.034604 [ ProcessPage], total, 3.377405 [ ProcessPages], total, 3.391607 [ Tesseract:main], total, 7.795046
>tesseract-opencl.exe 8509_001.4B.tif 8509_001.4B [OD] Load opencl.dll successful! [DS] Profile read from file (tesseract_opencl_profile_devices.dat). [DS] Device[1] 1:Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz score is 0.597172 [DS] Device[2] 1:Intel(R) HD Graphics 4600 score is 1.336826 [DS] Device[3] 0:(null) score is 1.013041 [DS] Selected Device[1]: "Intel(R) Core(TM) i7-4800MQ CPU @ 2.70GHz" (OpenCL) [ getDeviceSelection], total, 0.157346 [ OD::CompileKernel::clBuildProgram], total, 1.040238 [ TessBaseAPI::Init], total, 1.491639 Tesseract Open Source OCR Engine v3.03 with Leptonica [ pixReadTiffCL], total, 0.006641 [ GetLineMasksMorph], total, 0.034659 [ FindAndRemoveLines], total, 0.082480 [ ProcessPage], total, 3.274738 [ ProcessPages], total, 3.288972 [ Tesseract:main], total, 4.782504 –-------------------------------------------------------------- [ TessBaseAPI::Init], total, 0.428550 Tesseract Open Source OCR Engine v3.03 with Leptonica [ GetLineMasksMorph], total, 0.322534 [ FindAndRemoveLines], total, 0.394429 [ ProcessPage], total, 3.578335 [ ProcessPages], total, 3.656705 [ Tesseract:main], total, 4.091411
Well I try to avoid any conclusion, because I am not familiar with OpenCL, its implementations by AMD and INTEL, hardware effects etc. Anyway here are some remarks: