Browse Source

Fix PSM

pull/333/head
Jerome Wu 5 years ago
parent
commit
ce4d4d51be
  1. 6
      package-lock.json
  2. 2
      package.json
  3. 5
      src/common/dump.js
  4. 2
      src/common/types.js
  5. 43
      src/common/workerUtils.js
  6. 20
      tests/recognize.test.js

6
package-lock.json generated

@ -8553,9 +8553,9 @@
} }
}, },
"tesseract.js-core": { "tesseract.js-core": {
"version": "2.0.0-beta.10", "version": "2.0.0-beta.11",
"resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.10.tgz", "resolved": "https://registry.npmjs.org/tesseract.js-core/-/tesseract.js-core-2.0.0-beta.11.tgz",
"integrity": "sha512-QmNgMA9m5ES5uMTqpOAPysrUA80vUx/6WKQlfkK3zhOeAgqv8DjwwcDv9tQv2TgRzOQ+LFKrJn94Y2rw5b2IGw==" "integrity": "sha512-07haKH2JYYo0OfIJoioMS9dDiI5Hrl7+r1MqjeNAAT5WpKO0ATe4cpncC8s1kz0e3s1kaC5WOwL3YJcjbJE+hg=="
}, },
"tesseract.js-utils": { "tesseract.js-utils": {
"version": "1.0.0-beta.8", "version": "1.0.0-beta.8",

2
package.json

@ -57,7 +57,7 @@
"node-fetch": "^2.3.0", "node-fetch": "^2.3.0",
"opencollective-postinstall": "^2.0.2", "opencollective-postinstall": "^2.0.2",
"resolve-url": "^0.2.1", "resolve-url": "^0.2.1",
"tesseract.js-core": "^2.0.0-beta.10", "tesseract.js-core": "^2.0.0-beta.11",
"tesseract.js-utils": "^1.0.0-beta.8" "tesseract.js-utils": "^1.0.0-beta.8"
}, },
"repository": { "repository": {

5
src/common/dump.js

@ -78,7 +78,10 @@ module.exports = (TessModule, api, {
for (let i = 0; i < n; i += 1) { for (let i = 0; i < n; i += 1) {
polygon.push([px.getValue(i), py.getValue(i)]); polygon.push([px.getValue(i), py.getValue(i)]);
} }
TessModule._ptaDestroy(TessModule.getPointer(poly)); /*
* TODO: find out why _ptaDestroy doesn't work
*/
// TessModule._ptaDestroy(TessModule.getPointer(poly));
} }
block = { block = {

2
src/common/types.js

@ -12,7 +12,6 @@ module.exports = {
LSTM_ONLY: 1, LSTM_ONLY: 1,
TESSERACT_LSTM_COMBINED: 2, TESSERACT_LSTM_COMBINED: 2,
DEFAULT: 3, DEFAULT: 3,
COUNT: 4,
}, },
/* /*
* PSM = Page Segmentation Mode * PSM = Page Segmentation Mode
@ -31,6 +30,5 @@ module.exports = {
SPARSE_TEXT: '10', SPARSE_TEXT: '10',
SPARSE_TEXT_OSD: '11', SPARSE_TEXT_OSD: '11',
RAW_LINE: '12', RAW_LINE: '12',
COUNT: '13',
}, },
}; };

43
src/common/workerUtils.js

@ -11,6 +11,7 @@ const { readImage, loadLang } = require('tesseract.js-utils');
const pdfTTF = require('./pdf-ttf'); const pdfTTF = require('./pdf-ttf');
const dump = require('./dump'); const dump = require('./dump');
const { defaultParams } = require('./options'); const { defaultParams } = require('./options');
const { OEM, PSM } = require('./types');
/* /*
* Tesseract Module returned by TesseractCore. * Tesseract Module returned by TesseractCore.
@ -201,11 +202,33 @@ const loadLanguage = ({ langs, options }, res) => {
* @param {object} res - job instance * @param {object} res - job instance
*/ */
const handleRecognize = ({ const handleRecognize = ({
image, langs, options, params: customParams, image, langs: iLangs, options, params: customParams,
}, res) => ( }, res) => {
handleInit(options, res) const params = {
...defaultParams,
...customParams,
};
const { tessedit_pageseg_mode } = params;
let langs = iLangs;
/*
* When PSM === OSD_ONLY or AUTO_OSD or RAW_LINE
* osd.traineddata must be included and
* OEM must be TESSERACT_ONLY (LSTM doesn't support OSD)
*/
if ([
PSM.OSD_ONLY,
PSM.AUTO_OSD,
PSM.RAW_LINE,
].includes(tessedit_pageseg_mode)) {
langs = (typeof iLangs === 'string')
? `${iLangs}+osd`
: [...iLangs, 'osd'];
params.tessedit_ocr_engine_mode = OEM.TESSERACT_ONLY;
}
return handleInit(options, res)
.then(() => ( .then(() => (
loadLanguage({ langs, options }, res) loadLanguage({ langs, params, options }, res)
.catch((e) => { .catch((e) => {
if (e instanceof DOMException) { if (e instanceof DOMException) {
/* /*
@ -222,10 +245,6 @@ const handleRecognize = ({
const progressUpdate = (progress) => { const progressUpdate = (progress) => {
res.progress({ status: 'initializing api', progress }); res.progress({ status: 'initializing api', progress });
}; };
const params = {
...defaultParams,
...customParams,
};
progressUpdate(0); progressUpdate(0);
handleParams(langs, params); handleParams(langs, params);
progressUpdate(0.5); progressUpdate(0.5);
@ -241,8 +260,8 @@ const handleRecognize = ({
res.reject({ err }); res.reject({ err });
} }
}) })
)) ));
); };
/** /**
* handleDetect * handleDetect
@ -263,8 +282,8 @@ const handleDetect = ({
.then(() => ( .then(() => (
loadLanguage({ langs, options }, res) loadLanguage({ langs, options }, res)
.then(() => { .then(() => {
api.Init(null, getLangsStr(langs)); api.Init(null, getLangsStr(langs), OEM.TESSERACT_ONLY);
api.SetPageSegMode(TessModule.PSM_OSD_ONLY); api.SetPageSegMode(PSM.OSD_ONLY);
const params = { const params = {
...defaultParams, ...defaultParams,
...customParams, ...customParams,

20
tests/recognize.test.js

@ -1,4 +1,4 @@
const { TesseractWorker } = Tesseract; const { TesseractWorker, PSM } = Tesseract;
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
const SIMPLE_PNG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAIAAABqhmJGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASuSURBVHhe7dftVdswAIbRzsVAzMM0XabDUCOUxLYsWW4Jp+/pvf9w9GH76CHw4x2IJWAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAI9p8G/PbyY8rL2686g8t+vnqHTyfgIYfvz/26veTXn/UKX8+f0EU9bHrtu/6KfAN/AwEXAj7lFf2TBFw4nae8on+SgIvJ01n/KLzpDK+L3bT/Ap4O+HC+V12mTH+M3gzcLbIY/EO6HfxYp13k09nb6r3UqcdnjoCL3ll72J26h+35Oxy2XvZ0wOLaXq9v2+F1UC+7RZtMZ/DnfX1lwDOPzwUCLo7O2trtDK8H3M/iqoc6bj1subT68XTA/F7bGJooyzKbhTvLPHY8eJLHlbNX1DqYUVfdXbqwJjsCLsans37aNNJM6w68OR0wv9f9ymKw3k67yn2ZZpHlg3a3zis60s6oV+ZvlzMCLoanc3Dsdt9TdWT/lM8OmNjr5KY72jmzq1zfrbvXtVtmRMDF8HTWcgaaqIrD1U4G/MFewxrW262s5jS/Fzpmdts6mnHy+Fwl4GJ0OjsNrG1P/y7CNo3+gEt7jW56MVprNed7A/5w+n6YJ+BieDpnj/jO6pweTz0acGWvmZveL9XOmd3x6wKuTt8PEwRczLRw4eje1XX7c/cDruw1uuneOu2c4aOvzI57mJhRh1xZlQ0BF+Oz9vcF96fuB1zYa7R2b5mD6/XSwdfg8snj4q21+W/L02dfzIxhQMDFyTm6Hd7m+JYP7rPKT5sRuzhOBywm91rUkYc3fV9ltchtr8VmzuGOdfDB9N1tFYefNfdXLmyGjNZkhoCLUQufVqd/7z7rUcLW/XieDvg0s9difNOdRV5ePibt5vTuazusWbF9rs2E5v4mH58LBFyMW7g5OID7s9cMuTygmt9rcNPb5MrAz0lHc3Z9Ht7XZsxqxO36ZtLR/c0+PpMEzLOc/4LhrwmYZ6lfywJ+JgHzJPr9DgLmi23/zdXvcwmYL7YKWL1PJ2AIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmCI9f7+G6yFxVg/GyYwAAAAAElFTkSuQmCC'; const SIMPLE_PNG = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAC0CAIAAABqhmJGAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAASuSURBVHhe7dftVdswAIbRzsVAzMM0XabDUCOUxLYsWW4Jp+/pvf9w9GH76CHw4x2IJWAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAI9p8G/PbyY8rL2686g8t+vnqHTyfgIYfvz/26veTXn/UKX8+f0EU9bHrtu/6KfAN/AwEXAj7lFf2TBFw4nae8on+SgIvJ01n/KLzpDK+L3bT/Ap4O+HC+V12mTH+M3gzcLbIY/EO6HfxYp13k09nb6r3UqcdnjoCL3ll72J26h+35Oxy2XvZ0wOLaXq9v2+F1UC+7RZtMZ/DnfX1lwDOPzwUCLo7O2trtDK8H3M/iqoc6bj1subT68XTA/F7bGJooyzKbhTvLPHY8eJLHlbNX1DqYUVfdXbqwJjsCLsans37aNNJM6w68OR0wv9f9ymKw3k67yn2ZZpHlg3a3zis60s6oV+ZvlzMCLoanc3Dsdt9TdWT/lM8OmNjr5KY72jmzq1zfrbvXtVtmRMDF8HTWcgaaqIrD1U4G/MFewxrW262s5jS/Fzpmdts6mnHy+Fwl4GJ0OjsNrG1P/y7CNo3+gEt7jW56MVprNed7A/5w+n6YJ+BieDpnj/jO6pweTz0acGWvmZveL9XOmd3x6wKuTt8PEwRczLRw4eje1XX7c/cDruw1uuneOu2c4aOvzI57mJhRh1xZlQ0BF+Oz9vcF96fuB1zYa7R2b5mD6/XSwdfg8snj4q21+W/L02dfzIxhQMDFyTm6Hd7m+JYP7rPKT5sRuzhOBywm91rUkYc3fV9ltchtr8VmzuGOdfDB9N1tFYefNfdXLmyGjNZkhoCLUQufVqd/7z7rUcLW/XieDvg0s9difNOdRV5ePibt5vTuazusWbF9rs2E5v4mH58LBFyMW7g5OID7s9cMuTygmt9rcNPb5MrAz0lHc3Z9Ht7XZsxqxO36ZtLR/c0+PpMEzLOc/4LhrwmYZ6lfywJ+JgHzJPr9DgLmi23/zdXvcwmYL7YKWL1PJ2AIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmAIJmCI9f7+G6yFxVg/GyYwAAAAAElFTkSuQmCC';
@ -145,6 +145,24 @@ describe('recognize()', () => {
)); ));
}); });
describe('should support all page seg modes', () => {
Object
.keys(PSM)
.map(name => ({ name, mode: PSM[name] }))
.forEach(({ name, mode }) => (
it(`support PSM.${name} mode`, (done) => {
const worker = getWorker();
worker
.recognize(`${IMAGE_PATH}/testocr.png`, 'eng', { tessedit_pageseg_mode: mode })
.then((ret) => {
expect(Object.keys(ret).length).not.to.be(0);
worker.terminate();
done();
});
}).timeout(30000)
));
});
describe('should recognize base64 image', () => { describe('should recognize base64 image', () => {
[ [
{ format: 'png', image: SIMPLE_PNG, ans: SIMPLE_TEXT }, { format: 'png', image: SIMPLE_PNG, ans: SIMPLE_TEXT },

Loading…
Cancel
Save