百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践
什么是OCR?
OCR(Optical Character Recognition,光学字符识别)是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式(如TXT、Word、PDF等)的技术。它广泛应用于文档数字化、信息提取、自动化处理等领域。
OCR的核心功能
-
图像转文本
将纸质文档、照片、PDF扫描件等图像中的文字提取为计算机可识别的字符。- 例如:从一张发票中提取金额、日期等信息。
-
多语言支持
支持多种语言的字符识别(如中文、英文、日文、阿拉伯语等),甚至能处理手写体、特殊符号。 -
格式保留
部分高级OCR工具可保留原文档的排版、表格结构、字体样式等。
OCR的工作原理
-
图像预处理
- 去噪、二值化、倾斜校正等,优化图像质量以提高识别准确率。
-
字符检测与分割
- 定位图像中的文字区域,并将单个字符或单词分割出来。
-
特征提取与匹配
- 通过算法(如深度学习模型)分析字符形状,与已知字符库比对,确定最可能的字符。
-
后处理与优化
- 结合上下文语义修正识别结果(如将“0”修正为字母“O”),提升文本准确性。
常见应用场景
-
文档数字化
- 将纸质书籍、合同、档案扫描为电子文本,便于存储和检索。
-
自动化办公
- 提取发票、收据、表单中的数据,自动导入数据库或财务系统。
-
移动应用
- 手机APP(如Google Keep、扫描全能王)通过拍照提取文字,支持翻译、复制粘贴。
-
车牌识别与安防
- 监控摄像头捕捉车牌信息,用于交通管理或停车场系统。
-
残障人士辅助
- 帮助视障用户通过图像识别文字,再转为语音朗读。
技术挑战与局限性
- 复杂背景干扰:如花纹背景、低对比度文字可能导致识别失败。
- 特殊字体或手写体:艺术字体、潦草手写体可能降低准确率。
- 多语言混合:不同语言字符的混合场景需要更复杂的模型支持。
- 图像质量依赖:模糊、倾斜、光照不均的图像会影响识别效果。
主流OCR工具/服务
-
商业工具
- Adobe Acrobat(PDF文字提取)、Google Drive(在线OCR)、ABBYY FineReader。
-
开源项目
- Tesseract OCR(Google开源,支持多种语言)。
- PaddleOCR(基于深度学习的高精度识别)。
-
云服务API
- Google Cloud Vision API、Amazon Textract、百度AI开放平台OCR。
未来趋势
- 深度学习优化:通过Transformer、CNN等模型提升复杂场景的识别准确率。
- 端侧部署:轻量化模型(如移动端OCR)实现实时处理。
- 多模态融合:结合语音、图像、上下文信息提升语义理解能力。
来源于qwen3
百度飞桨OCR(python)
开源地址:
https://github.com/PaddlePaddle/PaddleOCR
文档:
https://paddlepaddle.github.io/PaddleOCR/latest/index.html
文本检测+方向分类+文本识别
以cpu为例:
conda create -n py310 python=3.10 -y
conda activate py310
python -m pip install paddlepaddle==3.0.0rc1 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/
pip install paddleocrfrom paddleocr import PaddleOCR, draw_ocr# Paddleocr supports Chinese, English, French, German, Korean and Japanese
# You can set the parameter `lang` as `ch`, `en`, `french`, `german`, `korean`, `japan`
# to switch the language model in order
ocr = PaddleOCR(use_angle_cls=True, lang='en') # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs_en/img_12.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):res = result[idx]for line in res:print(line)# draw result
from PIL import Image
result = result[0]
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
低代码平台:
https://github.com/PaddlePaddle/PaddleX
文档:
https://paddlepaddle.github.io/PaddleX/latest/module_usage/tutorials/ocr_modules/text_detection.html
开箱即用:
PaddleX:
conda create -n py310 python=3.10 -y
conda activate py310from paddlex import create_model
## 文本检测 PP-OCRv4_server_det
## 文本识别 PP-OCRv4_server_rec_doc# 车牌检测 : PP-YOLOE-L_vehicle
# 车辆属性检测: PP-LCNet_x1_0_vehicle_attribute
model = create_model(model_name="PP-LCNet_x1_0_vehicle_attribute")
output = model.predict(input="img/cc.jpg", batch_size=1)
# print("----",str(output))for res in output:res.print()res.save_to_img(save_path="./output/")res.save_to_json(save_path="./output/res.json")
cnocr 开源项目(python)
https://github.com/breezedeus/cnocr
开箱即用:
conda create -n py310 python=3.10 -y
conda activate py310
## cpu版本
pip install cnocr[ort-cpu] -i https://mirrors.aliyun.com/pypi/simple## gpu版本
pip install cnocr[ort-gpu] -i https://mirrors.aliyun.com/pypi/simple# 简单使用
from cnocr import CnOcr
img_fp = './docs/examples/huochepiao.jpeg'
ocr = CnOcr() # 所有参数都使用默认值
out = ocr.ocr(img_fp)
print(out)## 使用百度飞桨的版本
from cnocr import CnOcr
img_fp = './docs/examples/shupai.png'
ocr = CnOcr(rec_model_name='ch_PP-OCRv4')
out = ocr.ocr(img_fp)
print(out)
RapidOCR
用于PaddleOCR onnx的跨平台 (python|java|C++|C#)
开源地址:
https://github.com/RapidAI/RapidOCR
文档:
https://rapidai.github.io/RapidOCRDocs/main/
jvm:jni 方式调用 onnx
https://github.com/RapidAI/RapidOcrOnnxJvm
https://github.com/RapidAI/RapidOcrOnnx
开箱即用
conda create -n py310 python=3.10 -y
conda activate py310pip install onnxruntime
pip install rapidocrfrom rapidocr import RapidOCR
engine = RapidOCR(params={"Global.with_torch": True})
img_url = "https://img1.baidu.com/it/u=3619974146,1266987475&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=516"
result = engine(img_url)
print(result)
result.vis("vis_result.jpg")
RapidOCRJava
开源地址:
https://gitee.com/lc_monster/rapid-ocr-java
开箱即用:
<dependency><groupId>io.github.mymonstercat</groupId><artifactId>rapidocr-onnx-platform</artifactId><version>0.0.7</version>
</dependency><dependency><groupId>io.github.mymonstercat</groupId><artifactId>rapidocr-ncnn-platform</artifactId><version>0.0.7</version>
</dependency>public static void main(String[] args) {InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);OcrResult ocrResult = engine.runOcr("/images/test.png");System.out.println(ocrResult.getStrRes().trim());}
场景
(标准的印刷体电子文档识别和数据抽取)
一般地OCR识别底层处理
1, 文字区域识别 (det)
2,方向分类(cls)
3,文字光学识别 (rec)
PaddleOCR to onnx
## det
paddle2onnx --model_dir C:/Users/linpx/.paddlex/official_models/PP-OCRv4_server_det --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ppocrv4_det.onnx --opset_version 11# rec
paddle2onnx --model_dir C:/Users/linpx/.paddlex/official_models/PP-OCRv4_server_rec_doc --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./ppocrv4_rec_doc.onnx --opset_version 11
项目使用
- 底层使用 PP-OCRv4_server_det + PP-OCRv4_server_rec_doc
- onnxruntime(2onnx): ppocrv4_det.onnx + ppocrv4_rec_doc.onnx
- 使用rapidOCR的跨平台的jni
- rapidOCRJava pom依赖 快速的项目集成简单ocr能力
代码部分
主要有:pdf文件转图片》图片OCR》结果重画
package app;import com.alibaba.fastjson.JSON;
import com.benjaminwan.ocrlibrary.OcrResult;
import com.benjaminwan.ocrlibrary.Point;
import com.benjaminwan.ocrlibrary.TextBlock;
import com.visual.open.anpr.core.domain.DrawImage;
import io.github.mymonstercat.Model;
import io.github.mymonstercat.ocr.InferenceEngine;
import io.github.mymonstercat.ocr.config.ParamConfig;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import nu.pattern.OpenCV;
import org.apache.commons.collections4.list.TreeList;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;
import java.util.List;public class RapidOCRJavaDemo {static {OpenCV.loadShared();System.out.println("Loaded OpenCV version: " + Core.VERSION);}public static void main(String[] args) throws IOException {System.out.println("----------start-----------------");String parentPath = "D:\\work\\ocr-img\\pdf";pdfToPng(parentPath);File parent = new File(parentPath,"pdf2img");File[] files = parent.listFiles();for (File file : files){runOcr(file.getAbsolutePath());}System.out.println("----------end-----------------");}private static void runOcr(String filePath) {File file = new File(filePath);File parent = file.getParentFile();new File(parent.getAbsolutePath()+"/ocr").mkdirs();ParamConfig paramConfig = ParamConfig.getDefaultConfig();// 图像外接白框,用于提升识别率,文字框没有正确框住所有文字时,增加此值。默认50。paramConfig.setPadding(50);// 按图像长边进行总体缩放,放大增加识别耗时但精度更高,缩小减小耗时但精度降低,maxSideLen为0表示不缩放paramConfig.setMaxSideLen(0);// 文字框置信度门限,文字框没有正确框住所有文字时,减小此值paramConfig.setBoxScoreThresh(0.5f);// 同上,自行试验paramConfig.setBoxThresh(0.3f);// 单个文字框大小倍率,越大时单个文字框越大paramConfig.setUnClipRatio(1.6f);// 启用(true)/禁用(false) 文字方向检测,只有图片倒置的情况下(旋转90~270度的图片),才需要启用文字方向检测,默认关闭paramConfig.setDoAngle(false);// 启用(1)/禁用(0) 角度投票(整张图片以最大可能文字方向来识别),当禁用文字方向检测时,此项也不起作用,默认关闭paramConfig.setMostAngle(false);InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);String outFileBox = parent.getAbsolutePath()+"/ocr/result_box_"+file.getName();String outFileFill = parent.getAbsolutePath()+"/ocr/result_fill_"+file.getName();OcrResult ocrResult = engine.runOcr(filePath, paramConfig);System.out.println(JSON.toJSONString(ocrResult));
// System.out.println(ocrResult.getStrRes().trim());// 画框版本DrawImage drawBox = DrawImage.build(filePath);drawTextToImg(ocrResult.getTextBlocks(), drawBox);saveFileToDir(drawBox, outFileBox);createGrayBackgroundImage(filePath, outFileFill);// 填充文本版本DrawImage drawFill = DrawImage.build(outFileFill);drawFilledTextToImg(ocrResult.getTextBlocks(), drawFill);saveFileToDir(drawFill, outFileFill);}private static void pdfToPng(String parentPath) throws IOException {File parent = new File(parentPath);File[] files = parent.listFiles();new File(parent.getAbsolutePath()+"/pdf2img").mkdirs();for (int i = 0; i < files.length; i++) {File file = files[i];PDDocument document = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(document);String newFileName = UUID.randomUUID().toString().replace("-","");for (int j = 0; j < document.getNumberOfPages(); j++) {BufferedImage image = renderer.renderImageWithDPI(j, 300); // 300 DPIImageIO.write(image, "PNG", new File(parent.getAbsolutePath()+"/pdf2img",newFileName+"_page_" + (j + 1) + ".png"));}document.close();}}/*** 根据源图片生成一个灰色背景的新空白图片** @param sourceImagePath 源图片路径* @param outputImagePath 输出图片路径* @param grayValue 灰色值(0~255),推荐 128*/public static void createGrayBackgroundImage(String sourceImagePath, String outputImagePath) {int grayValue = 100;// 读取源图片Mat src = Imgcodecs.imread(sourceImagePath);if (src.empty()) {throw new RuntimeException("无法读取源图片: " + sourceImagePath);}// 获取源图尺寸int width = src.cols();int height = src.rows();// 创建一个与源图尺寸相同的新 Mat 对象,3 通道,8 位无符号整型Mat grayImage = new Mat(height, width, CvType.CV_8UC3, new Scalar(grayValue, grayValue, grayValue));// 释放源图资源(如果不需要后续使用)src.release();// 保存新图片boolean success = Imgcodecs.imwrite(outputImagePath, grayImage);if (!success) {throw new RuntimeException("无法保存新图片到: " + outputImagePath);}System.out.println("灰色背景图片已保存至: " + outputImagePath);// 释放新图片资源(如果不需要后续使用)grayImage.release();}private static void drawTextToImg(List<TextBlock> textBlocks, DrawImage drawImage) {for (TextBlock block : textBlocks) {List<Point> points = block.getBoxPoint();if (points == null || points.size() != 4) {continue; // 忽略无效数据}// 依次绘制四条线,形成闭合四边形for (int i = 0; i < 4; i++) {Point p1 = points.get(i);Point p2 = points.get((i + 1) % 4);drawImage.drawLine(new DrawImage.Point(p1.getX(), p1.getY()),new DrawImage.Point(p2.getX(), p2.getY()),2, Color.RED);}// 可选:绘制文本内容和置信度String displayText = String.format("%s", block.getText());// 文本位置设置在框的上方Point topLeft = points.get(0);int textX = topLeft.getX();int textY = topLeft.getY() - 25;drawImage.drawText(displayText,new DrawImage.Point(textX, textY),13,Color.GREEN);}}private static void saveFileToDir( DrawImage drawImage, String outputFilePath) {Mat outputMat = drawImage.toMat();Imgcodecs.imwrite(outputFilePath, outputMat);ByteArrayOutputStream plateStream = convertMatToStream(outputMat);saveStreamToFile(plateStream, outputFilePath);System.out.println("Saved to: " + outputFilePath);outputMat.release();}public static ByteArrayOutputStream convertMatToStream(Mat image) {MatOfByte matOfByte = new MatOfByte();Imgcodecs.imencode(".jpg", image, matOfByte); // 将 Mat 编码成 JPG 格式ByteArrayOutputStream outputStream = new ByteArrayOutputStream();try {outputStream.write(matOfByte.toArray()); // 写入字节流} catch (IOException e) {throw new RuntimeException("Error converting Mat to stream", e);}image.release();return outputStream;}public static void saveStreamToFile(ByteArrayOutputStream stream, String filePath) {try (FileOutputStream fileOutputStream = new FileOutputStream(filePath)) {stream.writeTo(fileOutputStream); // 将流写入文件} catch (IOException e) {throw new RuntimeException("Error writing stream to file", e);}}@Data@AllArgsConstructor@NoArgsConstructor@Builderstatic class OcrTextDTO{private String text;private int x1;private int x2;private int y1;private int y2;}private static void drawFilledTextToImg(List<TextBlock> textBlocks, DrawImage drawImage) {// System.out.println("textBlocks sort pre:"+JSON.toJSONString(textBlocks));Map<String,List<OcrTextDTO>> tableGroup = new LinkedHashMap<>();int currentY = 0;textBlocks.sort(Comparator.comparingInt(o ->o.getBoxPoint().stream().mapToInt(Point::getY).min().orElse(Integer.MAX_VALUE)));
// System.out.println("textBlocks sort end:"+JSON.toJSONString(textBlocks));for (TextBlock block : textBlocks) {List<Point> points = block.getBoxPoint();if (points == null || points.size() != 4) {continue; // 忽略无效数据}int minY = Integer.MAX_VALUE;int maxY = Integer.MIN_VALUE;int minX = Integer.MAX_VALUE;int maxX = Integer.MIN_VALUE;System.out.println("points:"+JSON.toJSONString(points));// [{"x":1022,"y":971},{"x":1116,"y":971},{"x":1116,"y":1000},{"x":1022,"y":1000}]// 依次绘制四条线,形成闭合四边形for (int i = 0; i < 4; i++) {Point p1 = points.get(i);Point p2 = points.get((i + 1) % 4);drawImage.drawLine(new DrawImage.Point(p1.getX(), p1.getY()),new DrawImage.Point(p2.getX(), p2.getY()),2, Color.RED);minY = Math.min(minY, p1.getY());maxY = Math.max(maxY, p1.getY());minX = Math.min(minX, p1.getX());maxX = Math.max(maxX, p1.getX());}int height = maxY - minY;// 可选:绘制文本内容和置信度String displayText = String.format("%s", block.getText());// 文本位置设置在框的上方Point topLeft = points.get(0);int textX = topLeft.getX();int textY = topLeft.getY();
// System.out.println("maxY:"+maxY+",minY:"+minY+",height:"+height);
// System.out.println("currentY:"+currentY+",minY-currentY:"+(minY-currentY)+",minY:"+minY);if(currentY == 0){currentY = minY;}else {if(minY-currentY > 18){currentY = minY;}}
// System.out.println("----currentY:"+currentY+",minY:"+minY+",height:"+height);List<OcrTextDTO> orDefault = tableGroup.getOrDefault(currentY+"", new TreeList<>());orDefault.add(OcrTextDTO.builder().text(displayText).x1(minX).y1(minY).x2(maxX).y2(maxY).build());orDefault.sort(Comparator.comparingInt(OcrTextDTO::getX1));tableGroup.put(currentY+"",orDefault);
// System.out.println("textY:"+textY+",height:"+height+",text:"+displayText);int fontSize;if (height > 40) {fontSize = (int) (height * 0.6);} else if (height > 25) {fontSize = (int) (height * 0.7);} else if (height > 15) {fontSize = (int) (height * 0.8);}else {fontSize = height;}drawImage.drawText(displayText,new DrawImage.Point(textX, textY),fontSize,Color.GREEN);}System.out.println(JSON.toJSONString(tableGroup));}
}
扩展
在java平台可以直接使用 onnxrunntime来进行解析,不使用 jni的方式
免责声明:样例仅供参考,如有错误还请纠正!谢谢
相关文章:
百度飞桨OCR(PP-OCRv4_server_det|PP-OCRv4_server_rec_doc)文本识别-Java项目实践
什么是OCR? OCR(Optical Character Recognition,光学字符识别)是一种通过技术手段将图像或扫描件中的文字内容转换为可编辑、可搜索的文本格式(如TXT、Word、PDF等)的技术。它广泛应用于文档数字化、信息提取、自动化…...
救生衣穿戴检测数据集VOC+YOLO格式2171张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2171 标注数量(xml文件个数):2171 标注数量(txt文件个数):2171 …...
JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received.
环境: vllm 0.8.5 java 17 Qwen3-32B-FP8 问题描述: JAVA请求vllm的api服务报错Unsupported upgrade request、 Invalid HTTP request received. WARNING: Unsupported upgrade request. INFO: - "POST /v1/chat/completions HTTP/1.1&…...
信号量基础入门:并发控制的核心概念
问题的复杂性产生的根本原因在于,如 2.2 节所述,共享变量的访问始终是“单向信息流”。也就是说,一个进程可以分配新值或检查当前值,但这种检查不会为其他进程留下任何痕迹。结果是,当一个进程想要对共享变量的当前值作…...
物联网之使用Vertx实现HTTP/WebSocket最佳实践
小伙伴们,你们好呀,我是老寇,跟我一起学习使用Vertx实现HTTP-Server和WebSocket-Server 实现Http/WebSocket【响应式】 Vertx-Web地址 实现过程 查看源码 代码比较简单,懒得讲解啦 代码比较简单,懒得讲解啦 代码…...
【神经网络与深度学习】GAN 生成对抗训练模型在实际训练中很容易判别器收敛,生成器发散
引言部分 在深度学习领域,生成对抗网络(GAN)是一种强大的数据生成方法,它通过生成器(G)和判别器(D)之间的博弈来不断优化模型。然而,在实际训练过程中,GAN 往…...
使用 NGINX 的 `ngx_http_secure_link_module` 模块保护资源链接
一、模块简介 版本:自 NGINX 0.7.18 起引入 功能: 签名校验:对请求 URI 中的签名进行校验,保证链接未经篡改。时效控制:根据请求中携带的过期时间,判断链接是否仍在有效期。 启用方式:编译 NG…...
5月19日day30打卡
模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 …...
NW860NW894美光闪存颗粒NX770NX789
在数字化浪潮席卷全球的当下,数据存储技术的革新正以惊人的速度推动着硬件性能的边界。美光科技作为半导体存储领域的领军者,其NW860、NW894、NX770、NX789系列闪存颗粒凭借前沿架构与精密工艺,成为高性能存储解决方案的核心载体。本文将深入…...
高性能锁机制 CAS:Java 并发编程中的深度剖析
引言 在并发编程领域,i操作的非线程安全性是开发者们熟知的问题。这一现象根源在于i并非原子操作,其内部执行过程包含读取、修改和写入三个步骤,在多线程环境下极易因线程切换导致数据竞争与不一致,这与我们此前探讨的多线程常见问…...
leetcode 每日一题 1931. 用三种不同颜色为网格涂色
题目 1931. 用三种不同颜色为网格涂色 思路 先获取列表,上下左右的所有情况。解决一维的问题 然后所有一维的问题暴力循环。已知一个一维的解,可以对应其他一维解的列表(用于记忆化搜索) 然后使用递归,进行累加 代…...
解决Windows磁盘管理中因夹卷导致的无法分区问题
解决Windows磁盘管理中因夹卷导致的无法分区问题 在现代计算机管理中,磁盘分区是一个常见且重要的操作。无论是为了优化存储空间,还是为了实现多系统安装,合理的磁盘分区都是必不可少的。然而,许多用户在使用Windows磁盘管理工具…...
龙虎榜——20250519
上证指数缩量收十字星,个股涨多跌少,这周反弹的概率比较大。 深证指数缩量调整,临近反弹,个股表现更好。 2025年5月19日龙虎榜行业方向分析 化工(新能源材料国产替代) • 代表个股:红宝丽、…...
Python在自动驾驶数据清洗中的应用
Python在自动驾驶数据清洗中的应用 在自动驾驶领域,数据是算法的燃料。高质量的数据意味着更精准的模型,更稳定的驾驶体验。然而,原始数据通常充满噪声、缺失值、不一致格式,甚至有异常点,这些都会严重影响自动驾驶系统的可靠性。因此,数据清洗是一道绕不开的关卡。 一…...
腾讯云Mysql实现远程链接
1.SQL语句:CREATE USER remote_user% IDENTIFIED BY YourPassword; GRANT ALL PRIVILEGES ON *.* TO remote_user%; FLUSH PRIVILEGES; 2.设置入站规则 3.设置安全组 4.效果...
大模型(2)——提示工程(Prompt Engineering)
文章目录 一、提示工程的核心概念为什么需要提示工程? 二、提示设计的基本原则三、实用提示工程技巧1. 角色设定法2. 示例引导法(Few-Shot Learning)3. 分阶段提问4. 负面约束5. 温度(Temperature)控制 四、不同任务类…...
深入Java G1 GC调优:如何解决高延迟与吞吐量瓶颈
引言 Java的垃圾回收(GC)机制是JVM性能的核心,但即使是最先进的G1(Garbage-First)收集器,在复杂场景下仍可能引发长时间停顿(Stop-The-World, STW)或吞吐量骤降。许多开发者虽然熟…...
DAPO:用于指令微调的直接偏好优化解读
一、背景与动机:从RLHF到DPO,再到DAPO 大型语言模型(LLM)经过海量无监督预训练后,往往需要对齐人类偏好或遵循指令的微调,使模型的回答更符合人类期望。这一过程通常通过人类反馈强化学习(RLHF)来实现。例如OpenAI的ChatGPT就使用了RLHF:先让人工标注对模型输出进行偏…...
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
vue2 打包生成text文件 和 前端项目的版本号json文件 项目打包生成txt文件-自动记录git版本、当前分支、提交人姓名、提交日期、提交描述等信息生成版本号json文件-自动记录当前版本号、打包时间等信息新建branch-version-webpack-plugin.js文件 // 同步子进程 const execSyn…...
iOS解码实现
import Foundation import VideoToolboxclass KFVideoDecoderInputPacket {var sampleBuffer: CMSampleBuffer? }class KFVideoDecoder {// MARK: - 常量private let kDecoderRetrySessionMaxCount 5private let kDecoderDecodeFrameFailedMaxCount 20// MARK: - 回调var pi…...
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全
Windows中PDF TXT Excel Word PPT等Office文件在预览窗格无法预览的终级解决方法大全 参考链接: https://zhuanlan.zhihu.com/p/454259765...
在Excel中使用函数公式时,常见错误对应不同的典型问题
在Excel中使用函数公式时,常见错误对应不同的典型问题 1. #DIV/0!(除以零错误)2. #N/A(值不可用)3. #NAME?(名称错误)4. #NULL!(空交集错误)5. #NUM!(数值错…...
Excel
1.快捷键 CtrlE 快速填充 CtrlQ 快速分析 CtrlEnter 原位填充 Tab 横向移动到下一个单元格 Enter 移动到下一行起始位置对应单元格 Shift 返回上一个单元格 0空格分数 显示分数 1.if if(condition,true,false)if(A1>10,"true","fa…...
Rust 学习笔记:错误处理
Rust 学习笔记:错误处理 Rust 学习笔记:错误处理不可恢复的错误带有结果的可恢复错误匹配不同的错误出现错误时 panic 的快捷方式:unwrap 和 expect传播错误传播错误的快捷方式:? 操作符哪里可以使用 ? 操作符 panic or not pan…...
【Linux】系统指令与开发全栈(vim、ssh、gcc)
【Linux】系统指令与开发全栈(vim、ssh、gcc) 一、Linux 系统指令大全 1、文件与目录管理 基础操作 指令参数说明典型用例注意事项cd~ 家目录,- 返回上级,.. 上级目录cd ~/Documents 进入文档目录无目录权限时会报错ls-l 详情&am…...
用 CodeBuddy 搭建「MiniGoal 小目标打卡器」:一次流畅的 UniApp 开发体验
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 在日常生活中,我们总是希望能够坚持一些小习惯,比如每天锻炼十分钟、读一页书、早睡十分…...
前端(vue)学习笔记(CLASS 6):路由进阶
1、路由的封装抽离 将之前写在main.js文件中的路由配置与规则抽离出来,放置在router/index.js文件中,再将其导入回main.js文件中,即可实现路由的封装抽离 例如 //index.js import { createMemoryHistory, createRouter } from vue-routerim…...
ubuntu 安装 Redis新版Redis 7.x
以下是在Ubuntu系统中安装Redis的详细指南, 一、官方APT源安装 sudo apt install redis-server -y 默认安装最新APT源版本(Ubuntu 22.04通常为Redis 6.x) 服务自动启动,配置文件路径:/etc/redis/redis.conf验证安装 …...
Httphelper: Http请求webapi小记
文章目录 1、HttpHelper.cs Framework4.812、HttpHelper.cs NET83、JsonHelper.cs Framework4.814、JsonHelper.cs NET85、uniapp request.js 访问WEBAPI 每次查找、测试都比较费事,记录一下把 1、HttpHelper.cs Framework4.81 using System; using System.IO; usi…...
【Linux】进程控制(进程创建、进程终止、进程等待、进程替换)
目录 一、进程创建 1、fork函数 2、页表权限 二、进程终止 1、main函数返回值(退出码) 2、常见错误码及其对应的错误描述: 将错误退出码转化为错误描述的方法: 3、进程退出的三种场景 4、由上我们可以知道: 5…...
java+selenium专题->启动浏览器下篇
1.简介 上一篇文章,我们已经在搭建的java项目环境中实践了,今天就在基于maven项目的环境中演示一下。 2.eclipse中新建maven项目 1.依次点击eclipse的file - new - other ,如下图所示: 2.在搜索框输入关键字“maven”ÿ…...
sqlserver 循环删除1000行
在SQL Server中,如果你想循环删除1000行数据,有几种方法可以实现,但值得注意的是,频繁使用循环删除操作可能会对数据库性能造成影响,尤其是在处理大量数据时。下面介绍几种方法,并讨论它们的优缺点。 方法…...
亚信电子与联发科技携手打造AIoT新未来
[台湾新竹讯, 2025年5月19日] 智能物联网(AIoT)融合人工智能与物联网技术,通过边缘AI的实时数据分析及设备智能联网能力,加速智能物联网创新应用的蓬勃发展。为满足AIoT产业对多网络端口的应用需求,全球半导体公司【联…...
【成品设计】基于STM32的人体健康监测系统
《基于STM32的人体健康监测系统》 Ps:有4个版本。 V1硬件设计: 主控:STM32F103C8T6:作为系统主控芯片。 血氧心率传感器:用于采集当前心率、血氧值。 温湿度传感器:用于采集当前环境温湿度。 有源低电平触发蜂鸣器&…...
【MySQL进阶】了解linux操作系统下mysql的配置文件和常用选项
前言 🌟🌟本期讲解关于linux下mysql配置选项的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么…...
LeetCode 219.存在重复元素 II
目录 题目: 题目描述: 题目链接: 思路: 核心思路: 思路详解: 代码: C代码: Java代码: 题目: 题目描述: 题目链接: 219. 存…...
解释:神经网络
在过去的10年里,表现最好的artificial-intelligence系统——比如智能手机上的语音识别器或谷歌最新的自动翻译——都是由一种叫做“深度学习”的技术产生的 深度学习实际上是一种被称为神经网络的人工智能方法的新名称,这种方法已经流行了70多年。1944年…...
Java 泛型详解
在 Java 的类型系统中,泛型(Generics) 是一个非常重要的特性。它让我们能够编写更通用、更安全的代码,尤其是在处理集合类(如 List、Map 等)时,泛型的使用可以大大减少类型转换的麻烦࿰…...
React集成百度【JSAPI Three】教程(001):快速入门
文章目录 1、快速入门1.1 创建react项目1.2 安装与配置1.3 静态资源配置1.4 配置百度地图AK1.5 第一个DEMO1、快速入门 JSAPI Three版本是一套基于Three.js的三维数字孪生版本地图服务引擎,一套引擎即可支持2D、2.5D、3D全能力的地理投影与数据源加载,帮助开发者轻松搞定平面…...
WPF中资源(Resource)与嵌入的资源(Embedded Resource)的区别及使用场景详解
🌟 开发WPF项目时图片、SVG、配置文件等到底该设置为哪种资源?如何正确读取、跨程序集访问?一篇文章全解答。 在使用 WPF 进行项目开发时,很多开发者在设置文件“生成操作(Build Action)”时,常常会在“资源(Resource)”和“嵌入的资源(Embedded Resource)”之间感…...
如何在 Windows 11 或 10 上安装 Fliqlo 时钟屏保
了解如何在 Windows 11 或 10 上安装 Fliqlo,为您的 PC 或笔记本电脑屏幕添加一个翻转时钟屏保以显示时间。 Fliqlo 是一款适用于 Windows 和 macOS 平台的免费时钟屏保。它也适用于移动设备,但仅限于 iPhone 和 iPad。Fliqlo 的主要功能是在用户不活动时在 PC 或笔记本电脑…...
【STM32】ST-Link V2.1制作
一、下载烧写工具及程序 下载器制作(ST-Link V2.1) 链接: 提取码:6666https://pan.baidu.com/s/1n0RYNDEw5mBT_CsTFoqrIg?pwd6666 二、安装STM32 CubeProgrammer 双击安装包,点击Next 继续点击Next 选择安装路径,再…...
day30python打卡
知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 我们复盘下学习py…...
AI大语言模型评测体系演进与未来展望
随着人工智能技术的飞速发展,大语言模型(LLMs)已成为自然语言处理领域的核心研究方向。2025年最新行业报告显示,当前主流模型的评测体系已从单一任务评估转向多维度、全链路的能力剖析。例如,《全球首个大语言模型意识水平”识商”白盒DIKWP测评报告》通过数据、信息、知识…...
用Python将 PDF 中的表格提取为 Excel/CSV
*用Python将 PDF 中的表格提取为 Excel/CSV,*支持文本型 PDF 和 扫描件/图片型 PDF(需 OCR 识别)。程序包含以下功能: 1.自动检测 PDF 类型(文本 or 扫描件) 2.提取表格数据并保存为 Excel/CSV 3.处理多页…...
【工具】ncdu工具安装与使用指南:高效管理Linux磁盘空间
磁盘空间管理是Linux系统维护中的关键任务。当系统提示"磁盘空间不足"时,快速找出占用大量空间的文件和目录变得尤为重要。虽然传统的du命令可以完成这项工作,但其输出往往难以阅读和分析。本文介绍的ncdu(NCurses Disk Usage&…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Progress Steps (步骤条)
📅 我们继续 50 个小项目挑战!—— Progress Steps 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ ✨ 组件目标 展示一个多步骤的进度条,指示当前所…...
数据分析—Excel数据清洗函数
在做数据分析的过程中,我们从数据库或者网页中获取的外部数据,通常是无法直接使用进行数据分析的。数据经常会有尾随的空格、奇奇怪怪的前缀和非打印字符等等问题,那么我们就需要先对数据进行清洗。下面介绍一些在数据清洗过程中常用的Excel函…...
CEF源码历史版本编译避坑指南
cef编译,网上查到的相关资料大多是官网上自动化编译的翻版,可能较新的版本按照那个步骤编译是没问题的。但是,对于历史版本的编译就会遇到各种坑。步骤大同小异,所以不再赘述,重点记录下针对历史版本编译要注意的点&am…...
看之前熟悉双亲委派加载机制,看之后了解双亲委派加载机制
今天面试被拷打双亲委派加载机制了,麻了。 首先要介绍双亲委派加载机制,就需要先搞明白啥是Java的类加载机制。 一.介绍 Java虚拟机(JVM)作为Java语言的核心运行环境,承担着将Java字节码转换为机器码并执行的重任。…...