从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类

这篇具有很好参考价值的文章主要介绍了从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类

从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类,《🌹从零开发短视频电商》,java,ocr,r语言文章来源地址https://www.toymoban.com/news/detail-799047.html

参考:https://github.com/mymagicpower/AIAS/blob/9dc3c65d07568087ac71453de9070a416eb4e1d0/1_image_sdks/ocr_v4_sdk/src/main/java/top/aias/ocr/OcrV4RecExample.java

import ai.djl.inference.Predictor;
import ai.djl.modality.Classifications;
import ai.djl.modality.cv.Image;
import ai.djl.modality.cv.ImageFactory;
import ai.djl.modality.cv.output.BoundingBox;
import ai.djl.modality.cv.output.DetectedObjects;
import ai.djl.modality.cv.output.Rectangle;
import ai.djl.modality.cv.util.NDImageUtils;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDManager;
import ai.djl.paddlepaddle.zoo.cv.imageclassification.PpWordRotateTranslator;
import ai.djl.repository.zoo.Criteria;
import ai.djl.repository.zoo.ZooModel;
import lombok.SneakyThrows;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

public class PPOCR {
    static ZooModel<Image, DetectedObjects> detectionModel = null;
    static ZooModel<Image, Classifications> rotateModel = null;
    static ZooModel<Image, String> recognitionModel;

    static {
        try {
            Criteria<Image, DetectedObjects> detectionCriteria = Criteria.builder()
                    .optEngine("PaddlePaddle")
                    .setTypes(Image.class, DetectedObjects.class)
                    .optModelUrls("https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar")
                    .optTranslator(new PpWordDetectionTranslator2(new ConcurrentHashMap<String, String>()))
                    .build();
            detectionModel = detectionCriteria.loadModel();

            Criteria<Image, Classifications> rotateCriteria = Criteria.builder()
                    .optEngine("PaddlePaddle")
                    .setTypes(Image.class, Classifications.class)
                    .optModelUrls("https://resources.djl.ai/test-models/paddleOCR/mobile/cls.zip")
                    .optTranslator(new PpWordRotateTranslator())
                    .build();
            rotateModel = rotateCriteria.loadModel();

            Criteria<Image, String> recognitionCriteria = Criteria.builder()
                    .optEngine("PaddlePaddle")
                    .setTypes(Image.class, String.class)
                    .optModelPath(Path.of("C:\\laker-2"))
                    .optTranslator(new PpWordRecognitionTranslator2())
                    .build();
            recognitionModel = recognitionCriteria.loadModel();


        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        doOCRFromUrl("https://img-blog.yssmx.com/direct/96de53d999c64c2589d0ab6a630e59d6.png");
//        doOCRFromFile("C:\\laker\\demo3\\1.png");
//        doOCRFromUrl("https://resources.djl.ai/images/flight_ticket.jpg");
    }

    @SneakyThrows
    public static String doOCRFromUrl(String url) {
        Image img = ImageFactory.getInstance().fromUrl(url);
        return doOCR(img);
    }

    @SneakyThrows
    public static String doOCRFromFile(String path) {
        Image img = ImageFactory.getInstance().fromFile(Path.of(path));
        return doOCR(img);
    }

    @SneakyThrows
    public static String doOCR(Image img) {


        List<DetectedObjects.DetectedObject> boxes = detection(img);

        List<String> names = new ArrayList<>();
        List<Double> prob = new ArrayList<>();
        List<BoundingBox> rect = new ArrayList<>();

        BoundingBox firstBox = boxes.get(0).getBoundingBox();
        List<ArrayList<String>> lines = new ArrayList<>();
        List<String> line = new ArrayList<>();
        lines.add((ArrayList) line);
        for (int i = 0; i < boxes.size(); i++) {
            System.out.println(boxes.get(i).getBoundingBox());
            BoundingBox tmpBox = boxes.get(i).getBoundingBox();
            double y1 = firstBox.getBounds().getY();
            double y2 = tmpBox.getBounds().getY();
            double dis = Math.abs(y2 - y1) * img.getHeight();

            Image subImg = getSubImage(img, boxes.get(i).getBoundingBox());
            if (subImg.getHeight() * 1.0 / subImg.getWidth() > 1.5) {
                subImg = rotateImg(subImg);
            }
            Classifications.Classification result = getRotateResult(subImg);
            if ("Rotate".equals(result.getClassName()) && result.getProbability() > 0.8) {
                subImg = rotateImg(subImg);
            }
            String name = recognizer(subImg);
            names.add(name);
            prob.add(-1.0);
            rect.add(boxes.get(i).getBoundingBox());

            if (dis < 20) { // 认为是同 1 行  - Considered to be in the same line
                line.add(name);
            } else { // 换行 - Line break
                firstBox = tmpBox;
                line = new ArrayList<>();
                line.add(name);
                lines.add((ArrayList) line);
            }

        }
        String fullText = "";
        for (int i = 0; i < lines.size(); i++) {
            for (int j = 0; j < lines.get(i).size(); j++) {
                String text = lines.get(i).get(j);
                if (text.trim().equals(""))
                    continue;
                fullText += text + " ";
            }
            fullText += '\n';
        }

        System.out.println("fullText--------------\n" + fullText);

        Image newImage = img.duplicate();
        newImage.drawBoundingBoxes(new DetectedObjects(names, prob, rect));
        newImage.getWrappedImage();
        newImage.save(Files.newOutputStream(Paths.get("C:\\laker\\demo3\\1-1-1.png")), "png");
        return "";
    }

    @SneakyThrows
    private static List<DetectedObjects.DetectedObject> detection(Image img) {
        Predictor<Image, DetectedObjects> detector = detectionModel.newPredictor();
        DetectedObjects detectedObj = detector.predict(img);
        System.out.println(detectedObj);
        return detectedObj.items();
    }

    @SneakyThrows
    private static Classifications.Classification getRotateResult(Image img) {
        Predictor<Image, Classifications> rotateClassifier = rotateModel.newPredictor();
        Classifications predict = rotateClassifier.predict(img);
        System.out.println(predict);
        return predict.best();
    }

    @SneakyThrows
    private static String recognizer(Image img) {

        Predictor<Image, String> recognizer = recognitionModel.newPredictor();
        String text = recognizer.predict(img);
        System.out.println(text);
        return text;
    }

    static Image getSubImage(Image img, BoundingBox box) {
        Rectangle rect = box.getBounds();
        double[] extended = new double[]{rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight()};
        int width = img.getWidth();
        int height = img.getHeight();
        int[] recovered = {
                (int) (extended[0] * width),
                (int) (extended[1] * height),
                (int) (extended[2] * width),
                (int) (extended[3] * height)
        };
        return img.getSubImage(recovered[0], recovered[1], recovered[2], recovered[3]);
    }


    private static Image rotateImg(Image image) {
        try (NDManager manager = NDManager.newBaseManager()) {
            NDArray rotated = NDImageUtils.rotate90(image.toNDArray(manager), 1);
            return ImageFactory.getInstance().fromNDArray(rotated);
        }
    }
}

输出纯文本

 java   博客之望 
 lakernote @ te码龄11年 (编辑资料) 
907,648 总访问量丨 丨499原创丨 |2,426排名| |52,478粉丝| 702铁粉| 」学习成就 
个人简介:不停的复盘自己,砥砺前行,不忘初衷 
IP属地:日本 
查看详细资料 
成就〉 最近  文章514  问答5 適资源42 原力等级 
CSDN @lakernote 

结果

从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类,《🌹从零开发短视频电商》,java,ocr,r语言

到了这里,关于从零开发短视频电商 PaddleOCR Java推理 (四)优化OCR工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开发短视频电商 使用nimbus-jose-jwt进行对称签名和非对称签名的JWT实现

    JWT的基础介绍可以参见这个地址:https://jwt.io/introduction,下面都是从上面摘录的。 JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种 紧凑且自包含 的方式,用于 安全地在各方之间传输信息 ,其格 式为JSON对象 。这些 信息可以被验证和信任 ,因为它们是 数字签名

    2024年02月12日
    浏览(43)
  • PaddleOCR #PP-OCR常见异常扫雷

    实验案例: PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别) 参考代码: 图片文本检测实验时,运行代码出现异常:ModuleNotFoundError: No module named ‘tools.infer’ 异常信息: 异常原因: 这是由于 python 本来有个 tools,和 paddleocr 内部的 tools 冲突导致。可能是 paddleo

    2024年02月15日
    浏览(35)
  • ocr之opencv配合paddleocr提高识别率

    背景1:在这篇文章编写之前使用到的工具并不是opencv,而是java原有的工具BufferedImage。但因为在使用过程中会频繁切图,放大,模糊,所以导致的jvm内存使用量巨大,分秒中都在以百兆的速度累加内存空间。这种情况会让程序卡顿,频繁的发生full gc。增加了jvm宕机的不确定性

    2024年04月16日
    浏览(51)
  • 搭建自己的OCR服务,第二步:PaddleOCR环境安装

    PaddleOCR环境安装,遇到了很多问题,根据系统不同问题也不同,不要盲目看别人的教程,有的教程也过时了,根据实际情况自己调整。 我这边目前是使用windows 10系统+CPU + python 3.7 搭建。 熟悉OCR的人应该知道,最好用GPU,性能差距不是一点点,但是普通人没有那个条件怎么办

    2024年02月09日
    浏览(48)
  • windows系统搭建OCR半自动标注工具PaddleOCR

    PaddleOCR是一个基于飞桨开发的OCR(Optical Character Recognition,光学字符识别)系统。其技术体系包括文字检测、文字识别、文本方向检测和图像处理等模块。 Windows和Mac用户推荐使用Anaconda搭建Python环境,Linux用户建议使用docker搭建Python环境。 已搭建过查看环境: 确认python的版本

    2024年04月17日
    浏览(39)
  • PaddleOCR Docker 容器快捷调用,快捷调用OCR API

    OCR可以用于清洗数据、文字识别,还是挺有用的,paddleOCR是一个开源的COR工具,效果还是不错的,现在paddleOCR迎来大更新,搞一把新的api接口,直接用起来。直接写调用代码去调用OCR即可,不用关心docker算法启动细节。 如果想直接执行OCR服务,请直接看最后一个章节,启动

    2024年01月16日
    浏览(41)
  • 【PaddleOCR-kie】关键信息抽取1:使用VI-LayoutXLM模型推理预测(SER+RE)

    背景:在训练自己数据集进行kie之前,想跑一下md里面的例程,但md教程内容混乱,而且同一个内容有多个手册,毕竟是多人合作的项目,可能是为了工程解耦,方便更新考虑……需要运行的模型和运行步骤散落在不用文件夹下的不同md里面……很无语,对于新手小白真的很不

    2024年02月09日
    浏览(48)
  • 文字识别(OCR)专题——基于NCNN轻量级PaddleOCRv4模型C++推理

    PaddleOCR 提供了基于深度学习的文本检测、识别和方向检测等功能。其主要推荐的 PP-OCR 算法在国内外的企业开发者中得到广泛应用。在短短的几年时间里,PP-OCR 的累计 Star 数已经超过了32.2k,常常出现在 GitHub Trending 和 Paperswithcode 的日榜和月榜第一位,被认为是当前OCR领域最

    2024年03月11日
    浏览(86)
  • 从零搭建仿抖音短视频APP-后端开发短视频业务模块(1)

    项目持续更新中: 仿抖音短视频APP专栏 目录 发布短视频的流程梳理 传统上传流程  传统上传 CDN上传 CDN上传流程 使用Unicloud云端功能  实现app端视频上传 保存视频信息入库 注:controller接受到文件之后会把文件上传到服务器,同时controller获得某一帧帧来获得我们的封面图,

    2023年04月12日
    浏览(49)
  • 【学习】从零开发的Android音视频开发(13)——MediaCodec到OMX框架过程及其硬解码

    在讲NuPlayer时,NuPlayer解码部分会创建MediaCodec,并且最终到达OMX框架,先看MediaCodec的 init 函数 从init函数中可以看到,首先创建了 ACodec ,并且初始化了 ALooper 、 AMessage ,由于ACodec继承自 AHandler ,那么一套消息机制就有了。最后发送 kWhatInit 消息,收到消息的逻辑位于ACodec.

    2023年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包