From 8b993c49540377979cf6ae291b8999bc68a1a5e3 Mon Sep 17 00:00:00 2001 From: Guten Ye Date: Tue, 7 May 2024 07:55:31 +0800 Subject: [PATCH] run format & lint --- biome.jsonc | 14 ++- bun.lockb | Bin 253840 -> 291800 bytes examples/browser/browser.ts | 8 +- examples/browser/package.json | 2 +- examples/node/node.ts | 2 +- examples/node/package.json | 12 +- examples/react-native/App.tsx | 2 +- examples/react-native/babel.config.js | 8 +- examples/react-native/package.json | 2 +- index.ts | 1 - package.json | 7 +- packages/browser/package.json | 9 +- packages/browser/src/ImageRaw.ts | 25 +--- packages/browser/src/index.ts | 2 +- packages/common/package.json | 10 +- packages/common/src/Ocr.ts | 8 +- packages/common/src/backend/backend.ts | 3 +- packages/common/src/models/Detection.ts | 16 +-- packages/common/src/models/ModelBase.ts | 20 +--- packages/common/src/models/Recognition.ts | 44 +++---- packages/common/src/splitIntoLineImages.ts | 111 +++++------------- packages/common/src/types/types.ts | 2 +- .../common/src/use-default-models.node.ts | 5 +- packages/node/package.json | 9 +- packages/node/src/FileUtils.ts | 2 +- packages/node/src/ImageRaw.ts | 8 +- packages/node/src/index.ts | 2 +- packages/react-native/package.json | 7 +- packages/react-native/src/ImageRaw.ts | 2 +- packages/react-native/src/index.ts | 2 +- 30 files changed, 112 insertions(+), 233 deletions(-) delete mode 100644 index.ts diff --git a/biome.jsonc b/biome.jsonc index 8a62a1d..701cd05 100644 --- a/biome.jsonc +++ b/biome.jsonc @@ -3,6 +3,10 @@ "organizeImports": { "enabled": true }, + "formatter": { + "indentStyle": "space", + "lineWidth": 120 + }, "linter": { "enabled": true, "rules": { @@ -14,5 +18,13 @@ "quoteStyle": "single", "semicolons": "asNeeded" } + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignore": ["ios", "android"] } -} \ No newline at end of file +} diff --git a/bun.lockb b/bun.lockb index 751f510bbb1c635211eccf926a8cec852aa6378c..cfd4162a459af44757a2a2b355d2f1d88c519b39 100755 GIT binary patch delta 74383 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 YV{4b+>&7lR|GJ4U!m4a+u5#}G1KFKaYXATM delta 51369 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 { const file = (event.target as HTMLInputElement).files?.[0] if (!file) { diff --git a/examples/browser/package.json b/examples/browser/package.json index 9c16ec4..94b5837 100644 --- a/examples/browser/package.json +++ b/examples/browser/package.json @@ -3,4 +3,4 @@ "dependencies": { "@gutenye/ocr-browser": "worksapce:*" } -} \ No newline at end of file +} diff --git a/examples/node/node.ts b/examples/node/node.ts index dbd4299..b3b5dbe 100644 --- a/examples/node/node.ts +++ b/examples/node/node.ts @@ -1,6 +1,6 @@ +import filePath from 'path' import Ocr from '@gutenye/ocr-node' import fs from 'fs/promises' -import filePath from 'path' async function main() { const ocr = await Ocr.create() diff --git a/examples/node/package.json b/examples/node/package.json index ad098b5..6e271aa 100644 --- a/examples/node/package.json +++ b/examples/node/package.json @@ -1,7 +1,7 @@ { - "name": "node-example", - "type": "module", - "dependencies": { - "@gutenye/ocr-node": "^1.0.0" - } -} \ No newline at end of file + "name": "node-example", + "type": "module", + "dependencies": { + "@gutenye/ocr-node": "^1.0.0" + } +} diff --git a/examples/react-native/App.tsx b/examples/react-native/App.tsx index a458267..e6fda39 100644 --- a/examples/react-native/App.tsx +++ b/examples/react-native/App.tsx @@ -1,6 +1,6 @@ import camera from 'expo-camera' -import * as ort from 'onnxruntime-react-native' import { StatusBar } from 'expo-status-bar' +import * as ort from 'onnxruntime-react-native' import { StyleSheet, Text, View } from 'react-native' import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context' import { Ocr } from '../build/ocr' diff --git a/examples/react-native/babel.config.js b/examples/react-native/babel.config.js index 2900afe..9f057ea 100644 --- a/examples/react-native/babel.config.js +++ b/examples/react-native/babel.config.js @@ -1,6 +1,6 @@ -module.exports = function(api) { - api.cache(true); +module.exports = (api) => { + api.cache(true) return { presets: ['babel-preset-expo'], - }; -}; + } +} diff --git a/examples/react-native/package.json b/examples/react-native/package.json index 62e5e57..0adec52 100644 --- a/examples/react-native/package.json +++ b/examples/react-native/package.json @@ -24,4 +24,4 @@ "typescript": "^5.1.3" }, "private": true -} \ No newline at end of file +} diff --git a/index.ts b/index.ts deleted file mode 100644 index f67b2c6..0000000 --- a/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log("Hello via Bun!"); \ No newline at end of file diff --git a/package.json b/package.json index 3642ba7..801af67 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,10 @@ { "name": "@gutenye/ocr", - "workspaces": [ - "packages/*" - ], + "workspaces": ["packages/*"], "devDependencies": { + "@biomejs/biome": "1.7.3", "@types/bun": "latest", "tsc-alias": "^1.8.8", "typescript": "^5.0.0" } -} \ No newline at end of file +} diff --git a/packages/browser/package.json b/packages/browser/package.json index 62761e3..9fe9df0 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -13,12 +13,7 @@ "bun": "./src/index.ts", "default": "./build/index.js" }, - "files": [ - "src", - "build", - "tsconfig.json", - "!**/__tests__" - ], + "files": ["src", "build", "tsconfig.json", "!**/__tests__"], "scripts": { "prepublishOnly": "./ake build" }, @@ -26,4 +21,4 @@ "@gutenye/ocr-common": "^1.2.0", "onnxruntime-web": "^1.17.3" } -} \ No newline at end of file +} diff --git a/packages/browser/src/ImageRaw.ts b/packages/browser/src/ImageRaw.ts index a8637fa..e30427a 100644 --- a/packages/browser/src/ImageRaw.ts +++ b/packages/browser/src/ImageRaw.ts @@ -1,5 +1,5 @@ import { ImageRawBase } from '@gutenye/ocr-common' -import type { ImageRawData, SizeOption, LineImage } from '@gutenye/ocr-common' +import type { ImageRawData, LineImage, SizeOption } from '@gutenye/ocr-common' import invariant from 'tiny-invariant' export class ImageRaw extends ImageRawBase { @@ -39,10 +39,7 @@ export class ImageRaw extends ImageRawBase { } async resize({ width, height }: SizeOption) { - invariant( - width !== undefined || height !== undefined, - 'both width and height are undefined', - ) + invariant(width !== undefined || height !== undefined, 'both width and height are undefined') const newWidth = width || Math.round((this.width / this.height) * height!) const newHeight = height || Math.round((this.height / this.width) * width!) const newCanvas = document.createElement('canvas') @@ -92,24 +89,14 @@ export class ImageRaw extends ImageRawBase { } } -function canvasDrawImage( - canvas: HTMLCanvasElement, - image: CanvasImageSource, - width?: number, - height?: number, -) { +function canvasDrawImage(canvas: HTMLCanvasElement, image: CanvasImageSource, width?: number, height?: number) { canvas.width = width || image.width canvas.height = height || image.height const ctx = canvas.getContext('2d')! ctx.drawImage(image, 0, 0, canvas.width, canvas.height) } -function canvasPutImageData( - canvas: HTMLCanvasElement, - imageData: ImageData, - width?: number, - height?: number, -) { +function canvasPutImageData(canvas: HTMLCanvasElement, imageData: ImageData, width?: number, height?: number) { const ctx = canvas.getContext('2d')! canvas.width = width || imageData.width canvas.height = height || imageData.height @@ -117,9 +104,7 @@ function canvasPutImageData( } function canvasGetImageData(canvas: HTMLCanvasElement) { - return canvas - .getContext('2d')! - .getImageData(0, 0, canvas.width, canvas.height) + return canvas.getContext('2d')!.getImageData(0, 0, canvas.width, canvas.height) } async function imageFromUrl(url: string) { diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index 1c513ea..3de4ef4 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -1,7 +1,7 @@ import Ocr, { registerBackend } from '@gutenye/ocr-common' +import { InferenceSession } from 'onnxruntime-web' import { FileUtils } from './FileUtils' import { ImageRaw } from './ImageRaw' -import { InferenceSession } from 'onnxruntime-web' registerBackend({ FileUtils, ImageRaw, InferenceSession }) diff --git a/packages/common/package.json b/packages/common/package.json index 535d305..cc6c34e 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -19,13 +19,7 @@ "default": "./build/use-default-models.node.js" } }, - "files": [ - "assets", - "src", - "build", - "tsconfig.json", - "!**/__tests__" - ], + "files": ["assets", "src", "build", "tsconfig.json", "!**/__tests__"], "scripts": { "prepublishOnly": "./ake build" }, @@ -34,4 +28,4 @@ "js-clipper": "^1.0.1", "tiny-invariant": "^1.3.3" } -} \ No newline at end of file +} diff --git a/packages/common/src/Ocr.ts b/packages/common/src/Ocr.ts index 498b661..80c9187 100644 --- a/packages/common/src/Ocr.ts +++ b/packages/common/src/Ocr.ts @@ -1,5 +1,5 @@ -import { Detection, Recognition } from './models' import invariant from 'tiny-invariant' +import { Detection, Recognition } from './models' export class Ocr { static DEFAULT_DETECTION_PATH: string @@ -17,11 +17,9 @@ export class Ocr { } = {}) { const detectionPath = this.DEFAULT_DETECTION_PATH || models?.detectionPath invariant(detectionPath, 'detectionPath is required') - const recognitionPath = - this.DEFAULT_RECOGINTION_PATH || models?.recognitionPath + const recognitionPath = this.DEFAULT_RECOGINTION_PATH || models?.recognitionPath invariant(recognitionPath, 'recognitionPath is required') - const dictionaryPath = - this.DEFAULT_DICTIONARY_PATH || models?.dictionaryPath + const dictionaryPath = this.DEFAULT_DICTIONARY_PATH || models?.dictionaryPath invariant(dictionaryPath, 'dictionaryPath is required') const detection = await Detection.create({ diff --git a/packages/common/src/backend/backend.ts b/packages/common/src/backend/backend.ts index e3dca72..e676186 100644 --- a/packages/common/src/backend/backend.ts +++ b/packages/common/src/backend/backend.ts @@ -6,8 +6,7 @@ import type { let FileUtils: FileUtilsType = undefined as unknown as FileUtilsType let ImageRaw: ImageRawType = undefined as unknown as ImageRawType -let InferenceSession: InferenceSessionType = - undefined as unknown as InferenceSessionType +let InferenceSession: InferenceSessionType = undefined as unknown as InferenceSessionType export function registerBackend(backend: { FileUtils: FileUtilsType diff --git a/packages/common/src/models/Detection.ts b/packages/common/src/models/Detection.ts index 7067188..06f28c7 100644 --- a/packages/common/src/models/Detection.ts +++ b/packages/common/src/models/Detection.ts @@ -1,8 +1,8 @@ +import type { Tensor } from 'onnxruntime-common' import { ImageRaw, InferenceSession } from '#/backend' import { splitIntoLineImages } from '#/splitIntoLineImages' -import { Tensor } from 'onnxruntime-common' +import type { ModelBaseConstructorArgs, Size } from '#/types' import { ModelBase } from './ModelBase' -import type { Size, ModelBaseConstructorArgs } from '#/types' const BASE_SIZE = 32 @@ -25,7 +25,7 @@ export class Detection extends ModelBase { // - image width and height must be a multiple of 32 // - bigger image -> more accurate result, but takes longer time // inputImage = await Image.resize(image, multipleOfBaseSize(image, { maxSize: 960 })) - let inputImage = await image.resize(multipleOfBaseSize(image)) + const inputImage = await image.resize(multipleOfBaseSize(image)) this.debugImage(inputImage, './output/out1-multiple-of-base-size.jpg') // Covert image data to model data @@ -59,10 +59,7 @@ export class Detection extends ModelBase { } } -function multipleOfBaseSize( - image: ImageRaw, - { maxSize }: { maxSize?: number } = {}, -): Size { +function multipleOfBaseSize(image: ImageRaw, { maxSize }: { maxSize?: number } = {}): Size { let width = image.width let height = image.height if (maxSize && Math.max(width, height) > maxSize) { @@ -76,10 +73,7 @@ function multipleOfBaseSize( Math.ceil(width / BASE_SIZE) * BASE_SIZE, BASE_SIZE, ) - const newHeight = Math.max( - Math.ceil(height / BASE_SIZE) * BASE_SIZE, - BASE_SIZE, - ) + const newHeight = Math.max(Math.ceil(height / BASE_SIZE) * BASE_SIZE, BASE_SIZE) return { width: newWidth, height: newHeight } } diff --git a/packages/common/src/models/ModelBase.ts b/packages/common/src/models/ModelBase.ts index a7e08c6..1eaa77b 100644 --- a/packages/common/src/models/ModelBase.ts +++ b/packages/common/src/models/ModelBase.ts @@ -1,11 +1,5 @@ import { Tensor } from 'onnxruntime-common' -import type { - ModelData, - InferenceSession, - ImageRaw, - ReshapeOptions, - ModelBaseConstructorArgs, -} from '#/types' +import type { ImageRaw, InferenceSession, ModelBaseConstructorArgs, ModelData, ReshapeOptions } from '#/types' export class ModelBase { isDebug: boolean @@ -27,18 +21,10 @@ export class ModelBase { #prepareInput(modelData: ModelData) { const input = Float32Array.from(modelData.data) - return new Tensor('float32', input, [ - 1, - 3, - modelData.height, - modelData.width, - ]) + return new Tensor('float32', input, [1, 3, modelData.height, modelData.width]) } - imageToInput( - image: ImageRaw, - { mean = [0, 0, 0], std = [1, 1, 1] }: ReshapeOptions, - ): ModelData { + imageToInput(image: ImageRaw, { mean = [0, 0, 0], std = [1, 1, 1] }: ReshapeOptions): ModelData { const R: number[] = [] const G: number[] = [] const B: number[] = [] diff --git a/packages/common/src/models/Recognition.ts b/packages/common/src/models/Recognition.ts index cd88d11..c1eb580 100644 --- a/packages/common/src/models/Recognition.ts +++ b/packages/common/src/models/Recognition.ts @@ -1,12 +1,7 @@ +import type { Tensor } from 'onnxruntime-common' import { FileUtils, InferenceSession } from '#/backend' -import { Tensor } from 'onnxruntime-common' +import type { Dictionary, Line, LineImage, ModelBaseConstructorArgs } from '#/types' import { ModelBase } from './ModelBase' -import type { - LineImage, - Line, - Dictionary, - ModelBaseConstructorArgs, -} from '#/types' export class Recognition extends ModelBase { #dictionary: Dictionary @@ -69,8 +64,8 @@ export class Recognition extends ModelBase { decodeText(output: Tensor) { const data = output - let predLen = data.dims[2] - let line: Line[] = [] + const predLen = data.dims[2] + const line: Line[] = [] let ml = data.dims[0] - 1 for (let l = 0; l < data.data.length; l += predLen * data.dims[1]) { const predsIdx: number[] = [] @@ -78,7 +73,7 @@ export class Recognition extends ModelBase { for (let i = l; i < l + predLen * data.dims[1]; i += predLen) { const tmpArr = data.data.slice(i, i + predLen) as Float32Array - const tmpMax = tmpArr.reduce((a, b) => Math.max(a, b), -Infinity) + const tmpMax = tmpArr.reduce((a, b) => Math.max(a, b), Number.NEGATIVE_INFINITY) const tmpIdx = tmpArr.indexOf(tmpMax) predsProb.push(tmpMax) predsIdx.push(tmpIdx) @@ -90,12 +85,7 @@ export class Recognition extends ModelBase { } } -function decode( - dictionary: string[], - textIndex: number[], - textProb: number[], - isRemoveDuplicate: boolean, -) { +function decode(dictionary: string[], textIndex: number[], textProb: number[], isRemoveDuplicate: boolean) { const ignoredTokens = [0] const charList = [] const confList = [] @@ -137,9 +127,9 @@ function calculateBox({ }) { let mainLine = lines const box = lineImages - for (let i in mainLine) { - let b = box[mainLine.length - Number(i) - 1].box - for (let p of b) { + for (const i in mainLine) { + const b = box[mainLine.length - Number(i) - 1].box + for (const p of b) { p[0] = p[0] p[1] = p[1] } @@ -151,9 +141,9 @@ function calculateBox({ } function afAfRec(l: Line[]) { - let line: Line[] = [] - let ind: Map = new Map() - for (let i in l) { + const line: Line[] = [] + const ind: Map = new Map() + for (const i in l) { ind.set(l[i].box, Number(i)) } @@ -198,13 +188,13 @@ function afAfRec(l: Line[]) { return result } - let boxes = groupBoxesByMidlineDifference([...ind.keys()]) + const boxes = groupBoxesByMidlineDifference([...ind.keys()]) - for (let i of boxes) { - let t = [] + for (const i of boxes) { + const t = [] let m = 0 - for (let j of i) { - let x = l[ind.get(j)] + for (const j of i) { + const x = l[ind.get(j)] t.push(x.text) m += x.mean } diff --git a/packages/common/src/splitIntoLineImages.ts b/packages/common/src/splitIntoLineImages.ts index 4dfced7..317ffc4 100644 --- a/packages/common/src/splitIntoLineImages.ts +++ b/packages/common/src/splitIntoLineImages.ts @@ -1,5 +1,5 @@ -import clipper from 'js-clipper' import cv from '@techstark/opencv-js' +import clipper from 'js-clipper' import { ImageRaw } from '#/backend' import type { LineImage } from '#/types' @@ -7,48 +7,34 @@ type pointType = [number, number] type BoxType = [pointType, pointType, pointType, pointType] type pointsType = pointType[] -export async function splitIntoLineImages( - image: ImageRaw, - sourceImage: ImageRaw, -): Promise { +export async function splitIntoLineImages(image: ImageRaw, sourceImage: ImageRaw): Promise { const w = image.width const h = image.height const srcData = sourceImage - let edgeRect: { box: BoxType; image: ImageRaw }[] = [] + const edgeRect: { box: BoxType; image: ImageRaw }[] = [] - let src = cvImread(image) + const src = cvImread(image) cv.cvtColor(src, src, cv.COLOR_RGBA2GRAY, 0) - let contours = new cv.MatVector() - let hierarchy = new cv.Mat() + const contours = new cv.MatVector() + const hierarchy = new cv.Mat() - cv.findContours( - src, - contours, - hierarchy, - cv.RETR_LIST, - cv.CHAIN_APPROX_SIMPLE, - ) + cv.findContours(src, contours, hierarchy, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) for (let i = 0; i < contours.size(); i++) { - let minSize = 3 - let cnt = contours.get(i) - let { points, sside } = getMiniBoxes(cnt) + const minSize = 3 + const cnt = contours.get(i) + const { points, sside } = getMiniBoxes(cnt) if (sside < minSize) continue // TODO sort fast - let clipBox = unclip(points) + const clipBox = unclip(points) - const boxMap = new cv.matFromArray( - clipBox.length / 2, - 1, - cv.CV_32SC2, - clipBox, - ) + const boxMap = new cv.matFromArray(clipBox.length / 2, 1, cv.CV_32SC2, clipBox) const resultObj = getMiniBoxes(boxMap) - let box = resultObj.points + const box = resultObj.points if (resultObj.sside < minSize + 2) { continue } @@ -56,24 +42,24 @@ export async function splitIntoLineImages( return Math.max(min, Math.min(n, max)) } - let rx = srcData.width / w - let ry = srcData.height / h + const rx = srcData.width / w + const ry = srcData.height / h for (let i = 0; i < box.length; i++) { box[i][0] *= rx box[i][1] *= ry } - let box1 = orderPointsClockwise(box) + const box1 = orderPointsClockwise(box) box1.forEach((item) => { item[0] = clip(Math.round(item[0]), 0, srcData.width) item[1] = clip(Math.round(item[1]), 0, srcData.height) }) - let rect_width = int(linalgNorm(box1[0], box1[1])) - let rect_height = int(linalgNorm(box1[0], box1[3])) + const rect_width = int(linalgNorm(box1[0], box1[1])) + const rect_height = int(linalgNorm(box1[0], box1[3])) if (rect_width <= 3 || rect_height <= 3) continue - let c = getRotateCropImage(srcData, box) + const c = getRotateCropImage(srcData, box) edgeRect.push({ box, @@ -90,9 +76,9 @@ export async function splitIntoLineImages( function getMiniBoxes(contour: any) { const boundingBox = cv.minAreaRect(contour) - const points = Array.from( - boxPoints(boundingBox.center, boundingBox.size, boundingBox.angle), - ).sort((a, b) => a[0] - b[0]) as pointsType + const points = Array.from(boxPoints(boundingBox.center, boundingBox.size, boundingBox.angle)).sort( + (a, b) => a[0] - b[0], + ) as pointsType let index_1 = 0, index_2 = 1, @@ -113,12 +99,7 @@ function getMiniBoxes(contour: any) { index_3 = 2 } - const box = [ - points[index_1], - points[index_2], - points[index_3], - points[index_4], - ] as BoxType + const box = [points[index_1], points[index_2], points[index_3], points[index_4]] as BoxType const side = Math.min(boundingBox.size.height, boundingBox.size.width) return { points: box, sside: side } } @@ -139,11 +120,7 @@ function unclip(box: pointsType) { tmpArr.push(obj) }) const offset = new clipper.ClipperOffset() - offset.AddPath( - tmpArr, - clipper.JoinType.jtRound, - clipper.EndType.etClosedPolygon, - ) + offset.AddPath(tmpArr, clipper.JoinType.jtRound, clipper.EndType.etClosedPolygon) const expanded: { X: number; Y: number }[][] = [] offset.Execute(expanded, distance) let expandedArr: pointsType = [] @@ -182,18 +159,8 @@ function int(num: number) { } function getRotateCropImage(imageRaw: ImageRaw, points: BoxType): ImageRaw { - const img_crop_width = int( - Math.max( - linalgNorm(points[0], points[1]), - linalgNorm(points[2], points[3]), - ), - ) - const img_crop_height = int( - Math.max( - linalgNorm(points[0], points[3]), - linalgNorm(points[1], points[2]), - ), - ) + const img_crop_width = int(Math.max(linalgNorm(points[0], points[1]), linalgNorm(points[2], points[3]))) + const img_crop_height = int(Math.max(linalgNorm(points[0], points[3]), linalgNorm(points[1], points[2]))) const pts_std = [ [0, 0], [img_crop_width, 0], @@ -210,15 +177,7 @@ function getRotateCropImage(imageRaw: ImageRaw, points: BoxType): ImageRaw { const dst = new cv.Mat() const dsize = new cv.Size(img_crop_width, img_crop_height) // 透视转换 - cv.warpPerspective( - src, - dst, - M, - dsize, - cv.INTER_CUBIC, - cv.BORDER_REPLICATE, - new cv.Scalar(), - ) + cv.warpPerspective(src, dst, M, dsize, cv.INTER_CUBIC, cv.BORDER_REPLICATE, new cv.Scalar()) const dst_img_height = dst.matSize[0] const dst_img_width = dst.matSize[1] @@ -229,15 +188,7 @@ function getRotateCropImage(imageRaw: ImageRaw, points: BoxType): ImageRaw { const dsize_rot = new cv.Size(dst.rows, dst.cols) const center = new cv.Point(dst.cols / 2, dst.cols / 2) const M = cv.getRotationMatrix2D(center, 90, 1) - cv.warpAffine( - dst, - dst_rot, - M, - dsize_rot, - cv.INTER_CUBIC, - cv.BORDER_REPLICATE, - new cv.Scalar(), - ) + cv.warpAffine(dst, dst_rot, M, dsize_rot, cv.INTER_CUBIC, cv.BORDER_REPLICATE, new cv.Scalar()) } src.delete() @@ -250,11 +201,7 @@ function getRotateCropImage(imageRaw: ImageRaw, points: BoxType): ImageRaw { return cvImshow(dst_rot || dst) } -function boxPoints( - center: { x: number; y: number }, - size: { width: number; height: number }, - angle: number, -) { +function boxPoints(center: { x: number; y: number }, size: { width: number; height: number }, angle: number) { const width = size.width const height = size.height diff --git a/packages/common/src/types/types.ts b/packages/common/src/types/types.ts index 7f76488..b12d09c 100644 --- a/packages/common/src/types/types.ts +++ b/packages/common/src/types/types.ts @@ -1,5 +1,5 @@ -import { ImageRawBase as ImageRaw } from '#/backend/ImageRawBase' import { InferenceSession } from 'onnxruntime-common' +import { ImageRawBase as ImageRaw } from '#/backend/ImageRawBase' export { FileUtilsBase as FileUtils } from '#/backend/FileUtilsBase' export { ImageRaw, InferenceSession } diff --git a/packages/common/src/use-default-models.node.ts b/packages/common/src/use-default-models.node.ts index 0102cd1..f6cfb6b 100644 --- a/packages/common/src/use-default-models.node.ts +++ b/packages/common/src/use-default-models.node.ts @@ -9,8 +9,5 @@ export default function useDefaultModels() { } function resolve(path: string) { - return filePath.resolve( - filePath.dirname(fileURLToPath(import.meta.url)), - path, - ) + return filePath.resolve(filePath.dirname(fileURLToPath(import.meta.url)), path) } diff --git a/packages/node/package.json b/packages/node/package.json index d6f2151..2510ac6 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -13,12 +13,7 @@ "bun": "./src/index.ts", "default": "./build/index.js" }, - "files": [ - "src", - "build", - "tsconfig.json", - "!**/__tests__" - ], + "files": ["src", "build", "tsconfig.json", "!**/__tests__"], "scripts": { "prepublishOnly": "./ake build" }, @@ -27,4 +22,4 @@ "onnxruntime-node": "^1.17.3-rev.1", "sharp": "^0.33.3" } -} \ No newline at end of file +} diff --git a/packages/node/src/FileUtils.ts b/packages/node/src/FileUtils.ts index 73337fe..8fe954b 100644 --- a/packages/node/src/FileUtils.ts +++ b/packages/node/src/FileUtils.ts @@ -1,5 +1,5 @@ -import fs from 'fs/promises' import { FileUtilsBase } from '@gutenye/ocr-common' +import fs from 'fs/promises' export class FileUtils extends FileUtilsBase { static async read(path: string) { diff --git a/packages/node/src/ImageRaw.ts b/packages/node/src/ImageRaw.ts index fbb9241..9a1526b 100644 --- a/packages/node/src/ImageRaw.ts +++ b/packages/node/src/ImageRaw.ts @@ -1,7 +1,7 @@ -import sharp from 'sharp' import filePath from 'node:path' import { ImageRawBase } from '@gutenye/ocr-common' -import type { ImageRawData, SizeOption, LineImage } from '@gutenye/ocr-common' +import type { ImageRawData, LineImage, SizeOption } from '@gutenye/ocr-common' +import sharp from 'sharp' export class ImageRaw extends ImageRawBase { #sharp: sharp.Sharp @@ -41,9 +41,7 @@ export class ImageRaw extends ImageRawBase { .join('\n')} ` - return this.#apply( - this.#sharp.composite([{ input: Buffer.from(svg), left: 0, top: 0 }]), - ) + return this.#apply(this.#sharp.composite([{ input: Buffer.from(svg), left: 0, top: 0 }])) } async #apply(sharp: sharp.Sharp) { diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index 8c9348d..e6be5a6 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,8 +1,8 @@ import Ocr, { registerBackend } from '@gutenye/ocr-common' import useDefaultModels from '@gutenye/ocr-common/use-default-models.node' +import { InferenceSession } from 'onnxruntime-node' import { FileUtils } from './FileUtils' import { ImageRaw } from './ImageRaw' -import { InferenceSession } from 'onnxruntime-node' useDefaultModels() registerBackend({ FileUtils, ImageRaw, InferenceSession }) diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 967640e..b0c3f8c 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -13,12 +13,7 @@ "react-native": "./src/index.ts", "default": "./build/index.js" }, - "files": [ - "src", - "build", - "tsconfig.json", - "!**/__tests__" - ], + "files": ["src", "build", "tsconfig.json", "!**/__tests__"], "scripts": { "prepublishOnly": "./ake build" }, diff --git a/packages/react-native/src/ImageRaw.ts b/packages/react-native/src/ImageRaw.ts index 29b3ef6..7af7440 100644 --- a/packages/react-native/src/ImageRaw.ts +++ b/packages/react-native/src/ImageRaw.ts @@ -1,5 +1,5 @@ import { ImageRawBase } from '@gutenye/ocr-common' -import type { ImageRawData, SizeOption, LineImage } from '@gutenye/ocr-common' +import type { ImageRawData, LineImage, SizeOption } from '@gutenye/ocr-common' export class ImageRaw extends ImageRawBase { static async open(path: string): Promise {} diff --git a/packages/react-native/src/index.ts b/packages/react-native/src/index.ts index 50a54b1..f80794c 100644 --- a/packages/react-native/src/index.ts +++ b/packages/react-native/src/index.ts @@ -1,7 +1,7 @@ import Ocr, { registerBackend } from '@gutenye/ocr-common' +import { InferenceSession } from 'onnxruntime-react-native' import { FileUtils } from './FileUtils' import { ImageRaw } from './ImageRaw' -import { InferenceSession } from 'onnxruntime-react-native' registerBackend({ FileUtils, ImageRaw, InferenceSession })