package com.xindao.ocr.smartjavaai.model.common.direction.translator; import ai.djl.modality.cv.Image; import ai.djl.modality.cv.util.NDImageUtils; import ai.djl.ndarray.NDArray; import ai.djl.ndarray.NDList; import ai.djl.ndarray.index.NDIndex; import ai.djl.ndarray.types.Shape; import ai.djl.translate.Batchifier; import ai.djl.translate.Translator; import ai.djl.translate.TranslatorContext; import com.xindao.ocr.smartjavaai.entity.DirectionInfo; import java.util.Arrays; import java.util.List; import java.util.Map; /** * 方向检测 * * @author Calvin * @mail 179209347@qq.com * @website www.aias.top */ public class PpWordRotateTranslator implements Translator { List classes = Arrays.asList("No Rotate", "Rotate"); private String batchifier; private int resizeHeight; private int resizeWidth; public PpWordRotateTranslator(Map arguments) { batchifier = arguments.containsKey("batchifier") ? arguments.get("batchifier").toString() : "padding"; resizeWidth = arguments.containsKey("resizeWidth") ? (Integer) arguments.get("resizeWidth") : 192; resizeHeight = arguments.containsKey("resizeHeight") ? (Integer) arguments.get("resizeHeight") : 48; } @Override public DirectionInfo processOutput(TranslatorContext ctx, NDList list) { NDArray prob = list.singletonOrThrow(); float[] res = prob.toFloatArray(); int maxIndex = 0; if (res[1] > res[0]) { maxIndex = 1; } return new DirectionInfo(classes.get(maxIndex), Double.valueOf(res[maxIndex])); } // public NDList processInput2(TranslatorContext ctx, Image input){ // NDArray img = input.toNDArray(ctx.getNDManager()); // img = NDImageUtils.resize(img, 192, 48); // img = NDImageUtils.toTensor(img).sub(0.5F).div(0.5F); // img = img.expandDims(0); // return new NDList(new NDArray[]{img}); // } @Override public NDList processInput(TranslatorContext ctx, Image input) { NDArray img = input.toNDArray(ctx.getNDManager()); int imgC = 3; int imgH = resizeHeight; int imgW = resizeWidth; NDArray array = ctx.getNDManager().zeros(new Shape(imgC, imgH, imgW)); int h = input.getHeight(); int w = input.getWidth(); int resized_w = 0; float ratio = (float) w / (float) h; if (Math.ceil(imgH * ratio) > imgW) { resized_w = imgW; } else { resized_w = (int) (Math.ceil(imgH * ratio)); } img = NDImageUtils.resize(img, resized_w, imgH); img = NDImageUtils.toTensor(img).sub(0.5F).div(0.5F); // img = img.transpose(2, 0, 1); array.set(new NDIndex(":,:,0:" + resized_w), img); // array = array.expandDims(0); return new NDList(new NDArray[]{array}); } @Override public Batchifier getBatchifier() { return Batchifier.fromString(batchifier); } }