【PaddleNLP-kie】关键信息抽取2:UIE模型做图片信息提取全流程

文章目录

  • 本文参考
  • UIE理论部分
  • step0、UIEX原始模型使用
    • 网页体验
    • 本机安装使用
      • 环境安装
      • 使用docker的环境安装
      • 快速开始
  • step1、UIEX模型微调(小样本学习)
    • 数据标注(label_studio)
    • 导出数据转换
    • 微调训练:
    • 评估:
    • 定制模型一键预测
    • 微调模型对比
  • step2、服务化部署
  • step3、提升推理速度
    • 模型量化
    • 更换模型
    • fast-tokenizer
    • 提高batch_size(没用)

大模型时代来咯!讲究的就是一个通用!
本文记录我使用PaddleNLP中UIE做增值税发票信息提取的过程,同理适用于任何图片信息提取

首先上个图镇场子,里面红底的就是做图片信息提取,所需要重点关注的文件
在这里插入图片描述

本文参考

  • 项目
    PaddleNLP:https://github.com/PaddlePaddle/PaddleNLP
    其中UIE部分:
    https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie
    发票信息提取使用的UIEX:
    https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/information_extraction/document

  • 教程/文档
    跨模态文档通用信息抽取模型UIE-X来了
    uie的简单介绍b站视频【AI快车道|通用信息抽取技术与产业应用实战】 https://www.bilibili.com/video/BV1Q34y1E7SW/?share_source=copy_web&vd_source=679c63061dfbdf7484b5a4a666d4b9e1
    AI快车道PaddleNLP系列直播课https://aistudio.baidu.com/aistudio/education/group/info/24902
    UIE(Universal Information Extraction)

UIE理论部分

  • UIE原始论文
    论文阅读笔记
    在这里插入图片描述
    在这里插入图片描述

  • Paddle-UIE-X

UIE(Universal Information Extraction):Yaojie Lu等人在ACL-2022中提出了通用信息抽取统一框架UIE。该框架实现了实体抽取、关系抽取、事件抽取、情感分析等任务的统一建模,并使得不同任务间具备良好的迁移和泛化能力。为了方便大家使用UIE的强大能力,PaddleNLP借鉴该论文的方法,基于ERNIE 3.0知识增强预训练模型,训练并开源了首个中文通用信息抽取模型UIE。该模型可以支持不限定行业领域和抽取目标的关键信息抽取,实现零样本快速冷启动,并具备优秀的小样本微调能力,快速适配特定的抽取目标。
来源:https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie

官方大佬对UIEX的解释:https://zhuanlan.zhihu.com/p/592422623
paddle基于论文中的UIE做了修改,论文中的UIE是对text文本字段进行实体抽取、关系抽取、事件抽取、情感分析四种任务处理的,Paddle全新升级UIE-X,除已有纯文本抽取的全部功能外,新增文档抽取能力,具体来说paddle就是在前面增加了paddleOCR的det和rec功能,图片转化为识别出来的文本,再送入进行UIE,再结合布局分析等功能做了优化。UIE-X把这个功能端到端打通了。使用起来非常方便
在这里插入图片描述

step0、UIEX原始模型使用

网页体验

🤗Huggingface hub 正式兼容 PaddleNLP 预训练模型,支持 PaddleNLP Model 和 Tokenizer 直接从 🤗Huggingface hub 下载和上传,欢迎大家在 🤗Huggingface hub 体验 PaddleNLP 预训练模型效果

网页直接体验UIEX原始模型:https://huggingface.co/spaces/PaddlePaddle/UIE-X
输入schema,点击submit即可
在这里插入图片描述

本机安装使用

环境安装

基本都是使用一键预测功能:Taskflow API去做使用的,安装包,引入库,然后就三行代码,就可以使用了,封装得很完善

安装
环境依赖

  • python >= 3.7
  • paddlepaddle >= 2.3
    pip安装
pip install --upgrade paddlenlp

或者可通过以下命令安装最新 develop 分支代码:

pip install --pre --upgrade paddlenlp -f https://www.paddlepaddle.org.cn/whl/paddlenlp.html

更多关于PaddlePaddle和PaddleNLP安装的详细教程请查看get_started。
来源:https://github.com/PaddlePaddle/PaddleNLP#readme

使用docker的环境安装

对于环境依赖,可以直接pull预安装 PaddlePaddle 的镜像,再在docker里面安装paddlenlp

nvidia-docker pull registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.2-cudnn8.2-trt8.0
#以端口号6666对外提供SSH,挂载物理机data文件夹到虚拟机hdd文件夹
nvidia-docker run --name paddle_docker -it -v /data/:/hdd -p 6666:22 registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.2-cudnn8.2-trt8.0 /bin/bash
apt-get update
#docker自启动
docker update --restart=always paddle_docker


快速开始

这里以信息抽取-命名实体识别任务,UIE模型为例,来说明如何快速使用PaddleNLP:

  • text类信息提取
    PaddleNLP提供一键预测功能,无需训练,直接输入数据即可开放域抽取结果:
>>> from pprint import pprint
>>> from paddlenlp import Taskflow

>>> schema = ['时间', '选手', '赛事名称'] # Define the schema for entity extraction
>>> ie = Taskflow('information_extraction', schema=schema)
>>> pprint(ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!"))
[{'时间': [{'end': 6,
          'probability': 0.9857378532924486,
          'start': 0,
          'text': '2月8日上午'}],
  '赛事名称': [{'end': 23,
            'probability': 0.8503089953268272,
            'start': 6,
            'text': '北京冬奥会自由式滑雪女子大跳台决赛'}],
  '选手': [{'end': 31,
          'probability': 0.8981548639781138,
          'start': 28,
          'text': '谷爱凌'}]}]
  • 图片类信息提取(使用uie-x)
import paddlenlp, paddleocr
print(paddlenlp.__version__)
print(paddleocr.__version__)

from pprint import pprint
from paddlenlp import Taskflow
schema = ["购买方名称", "购买方纳税人识别号", "货物", "规格型号", "税率", "标题", "发票号码", "销售方名称", "销售方识别号", "销售方开户行账号"]
ie = Taskflow("information_extraction", schema=schema, model="uie-x-base")
pprint(ie({"doc": "./fp1.jpg"}))

直接在/root/目录下运行,第一次运行会在根目录生成.paddlenlp和.paddleocr的隐藏文件夹,用于存储自动下载的uie和ocr模型,然后开始推理
在这里插入图片描述

有一些字段没有显示的,应该就是没有找到,下面只显示的是找到的,可是但凡显示出来的准确度都很高,可以说效果真的很牛,就是密码区一直不认
大概可以得出的结论是:只要图像上靠近且有明显键值对的,都可以识别,只有那种键值对不明显,或者只有值没有键的信息,才会难以提取,才会需要微调。
在这里插入图片描述
测试到这里我就觉得这个方案是可行的了,所以打算基于UIEX做小样本学习,实际上除了发票,对于任何图片信息提取场景,根据它的介绍少量学习都能带来大幅提升,经过我的测试确实如此

在这里插入图片描述

step1、UIEX模型微调(小样本学习)

按https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/information_extraction/document进行模型微调,教程写的挺清楚了,我这里说一些其他的注意点
在这里插入图片描述

数据标注(label_studio)

这是本地启动服务网页使用的,为了方便数据获取,就在win装,因为我的基本环境烂了,会有一些奇怪报错:django.db.utils.OperationalError: no such function: JSON_VALID所以我在anaconda里面新建py39环境,可以正常运行

pip install label-studio#我安装的是1.7.2,教程里的1.6.0有bug
pip install -U label-studio
label-studio start
  • 这个地方,一定得是image或者text,不能是ocr什么的,在后面数据处理转换json文件为paddle数据集的时候,只认image/test,如果换成其他的会不识别报错在这里插入图片描述

  • 标注的时候,框要偏大一点,不能恰恰好贴着文字,不然会导致提取信息的时候漏掉前面几个字符
    在这里插入图片描述
    直到后来我label多了我才意识到,原始模型的可视化就是在教我怎么label最完美:都要向前框一点,包括冒号
    在这里插入图片描述

导出数据转换

ext:抽取式任务,实体收取和关系抽取都是抽取

python label_studio.py --label_studio_file ./document/data/label_studio.json --save_dir ./document/data --splits 0.8 0.1 0.1 --task_type ext

微调训练:

我在3090Ti上训练的速度基本是数据集增加一张图片,训练耗时增加一分钟,我标10张图片用了9分钟,标40张图片用了50分钟
模型大小:“uie-x-base“ 1.05G,训练过程占用显存情况:20G/24G

python finetune.py --device gpu --logging_steps 5 --save_steps 25 --eval_steps 25 --seed 42     --model_name_or_path uie-x-base --output_dir ./checkpoint/model_best --train_path data/train.txt     --dev_path data/dev.txt --max_seq_len 512 --per_device_train_batch_size  8     --per_device_eval_batch_size 8 --num_train_epochs 10 --learning_rate 1e-5 --do_train --do_eval  --do_export --export_model_dir ./checkpoint/model_best --overwrite_output_dir --disable_tqdm True     --metric_for_best_model eval_f1 --load_best_model_at_end  True --save_total_limit 1

评估:

python evaluate.py --device "gpu" --model_path ./checkpoint/model_best --test_path ./data/dev.txt --output_dir ./checkpoint/model_best --label_names 'start_positions' 'end_positions' --max_seq_len 512  --per_device_eval_batch_size 16 --debug True

在这里插入图片描述

定制模型一键预测

我写了一个脚本,来同时执行原始模型和微调模型在同一张图片上的表现,同时可视化和输出识别结果到txt,以便对比:

import pprint
from paddlenlp import Taskflow
from paddlenlp.utils.doc_parser import DocParser
import os
import sys
import time

#输入图片名参数
doc_path = str(sys.argv[1])
print(doc_path)
#发票联次,包括发票联,抵扣联,记账联


# schema = ['发票代码', '校验码', '标题', '发票联次', '发票号码', '开票日期', '购买方名称', '购买方纳税人识别号', '购买方地址电话', '购买方开户行及账号', '密码区', '货物或应税劳务服务名称', '规格型号', '单位', '数量', '单价', '金额', '税率', '税额', '合计金额', '合计税额', '价税合计(大写)', '价税合计(小写)', '销售方名称', '销售方纳税人识别号', '销售方地址电话', '销售方开户行及账号', '收款人', '复核', '开票人', '备注', '销售方(章)', '机器编号']
schema = ['发票代码', '校验码', '标题', '发票联次', '发票号码', '开票日期', '购买方名称', '购买方纳税人识别号', '购买方地址电话', '购买方开户行及账号', '货物或应税劳务服务名称', '规格型号', '单位', '数量', '单价', '金额', '税率', '税额', '合计金额', '合计税额', '价税合计(大写)', '价税合计(小写)', '销售方名称', '销售方纳税人识别号', '销售方地址电话', '销售方开户行及账号', '收款人', '复核', '开票人', '机器编号']

my_ie = Taskflow("information_extraction", model="uie-x-base", schema=schema, task_path='./checkpoint/model_best',layout_analysis=True)
ie = Taskflow("information_extraction", model="uie-x-base", schema=schema,layout_analysis=True)


filename=os.path.basename(doc_path).split('.')[0]

start_time=time.time()
my_results = my_ie({"doc": doc_path})
end_time=time.time()
print('self inference time(s):',end_time-start_time)


start_time=time.time()
results = ie({"doc": doc_path})
end_time=time.time()
print('origin inference time(s):',end_time-start_time)
# pprint(results)

if os.path.exists('./results/'+filename):
    pass
else:
    os.mkdir('./results/'+filename)
    print('mkdir ','./results/'+filename)


# 结果可视化
save_path_self='./results/'+filename+'/'+'image_show_self_'+filename+'.png'
DocParser.write_image_with_results(
    doc_path,
    result=my_results[0],
    save_path=save_path_self)

save_path_origin='./results/'+filename+'/'+'image_show_origin_'+filename+'.png'
DocParser.write_image_with_results(
    doc_path,
    result=results[0],
    save_path=save_path_origin)



#保存结果
with open('./results/'+filename+'/'+filename+'_self.txt','w') as f:
    f.write(str(str(pprint.pformat(my_results))))
    f.close()
with open('./results/'+filename+'/'+filename+'_origin.txt','w') as f:
    f.write(str(str(pprint.pformat(results))))
    f.close()

print('finished')

推理就是

λ 8be5100f3bf1 /hdd/PaddleNLP/applications/information_extraction/document python testuie_self.py data/testimages/b78.jpg

微调模型对比

总体来说微调模型相比原始模型提升很大,有学习到标记的信息,并且可以区分购买方和销售方
在这里插入图片描述
左边一列是微调后的,右边的原始UIE-X-base
在这里插入图片描述

但也有问题:比如会认密码区但不跨行,只有第一行(还不如不要),对于密码区,盖章识别,二维码识别,我就去掉了,不设schema,这些需要额外优化

我在3090Ti上推理一张的时间是5s左右,说实话还是挺慢的,后面再补充提升推理速度的问题

step2、服务化部署

这个部分可以用https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/information_extraction/document/deploy/simple_serving
结合PaddleNLP-develop\docs\server.md进行部署,教程讲的很清楚了

或者使用百度新出的专门用来部署的工具FastDeploy:https://github.com/PaddlePaddle/FastDeploy/tree/develop/examples/vision/ocr/PP-OCR/serving
client和server的简单关系:
在这里插入图片描述

我就讲一些坑:
作为服务器端的环境,如果是docker,要以--net=host进行创建,例如我之前使用的

nvidia-docker run --name paddle_docker -it -v /data/:/hdd -p 6666:22 registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.2-cudnn8.2-trt8.0 /bin/bash

是默认–net=bridge,以桥接形式对外提供,不是–net=host,所以无法对外提供服务化部署
应该:

nvidia-docker run --name paddle_serving_docker -it -v /data/:/hdd --net=host registry.baidubce.com/paddlepaddle/paddle:2.4.2-gpu-cuda11.2-cudnn8.2-trt8.0 /bin/bash
#开启进入
sudo docker start paddle_serving_docker
sudo docker exec -it paddle_serving_docker /bin/bash
#安装基本环境
pip install paddlenlp
python3 -m pip install paddleocr
#Server服务启动
paddlenlp server server:app --workers 1 --host 10.24.83.40 --port 8189

step3、提升推理速度

模型量化

可以用PaddleSlim试一下
https://github.com/PaddlePaddle/PaddleSlim/tree/develop/example/auto_compression

更换模型

因为其原理是经过OCR将图片转化为text再输入UIE模型,所以实际上其他size的UIE模型也能用,但会损失精度

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie

模型结构语言
uie-base (默认)12-layers, 768-hidden, 12-heads中文
uie-base-en12-layers, 768-hidden, 12-heads英文
uie-medical-base12-layers, 768-hidden, 12-heads中文
uie-medium6-layers, 768-hidden, 12-heads中文
uie-mini6-layers, 384-hidden, 12-heads中文
uie-micro4-layers, 384-hidden, 12-heads中文
uie-nano4-layers, 312-hidden, 12-heads中文
uie-m-large24-layers, 1024-hidden, 16-heads中、英文
uie-m-base12-layers, 768-hidden, 12-heads中、英文

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/applications/information_extraction#readme

模型名称使用场景支持任务
uie-base
uie-medium
uie-mini
uie-micro
uie-nano
面向纯文本场景的抽取式模型,支持中文具备实体、关系、事件、评论观点等通用信息抽取能力
uie-base-en面向纯文本场景的抽取式模型,支持英文具备实体、关系、事件、评论观点等通用信息抽取能力
uie-m-base
uie-m-large
面向纯文本场景的抽取式模型,支持中英具备实体、关系、事件、评论观点等通用信息抽取能力
uie-x-base面向纯文本文档场景的抽取式模型,支持中英支持纯文本场景的全部功能,还支持文档/图片/表格的端到端信息抽取

然而,经过测试uie-x-base (12L768H)本身就大概是基于uie-m-base (12L768H)进行改进的,二者模型大小差不多,但是!uie-m原始模型的推理时间3s左右,几乎减半,但是其效果也非常差!
而除了uie-m之外的其他模型不支持中英双语,就更用不了了
结论:无法更换其他模型做图片推理,其他模型都是text推理用,没有图片布局分析效果很差

fast-tokenizer

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/uie
TaskFlow的一个参数
use_fast: 使用C++实现的高性能分词算子FastTokenizer进行文本预处理加速。需要通过pip install fast-tokenizer-python安装FastTokenizer库后方可使用。默认为False。更多使用说明可参考FastTokenizer文档。

提高batch_size(没用)

Q&A里面的,但是我实测16和256一样都是5s……
在这里插入图片描述
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/14867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第二节 ogre sdk 配置使用

上一节,我们介绍过了ogre源码的编译学习,在实际项目中,我们并不需要如此复杂的编译安装过程,可以直接使用官网提供的sdk库进行项目环境配置。下面简单介绍下配置过程。 一 OgreSDK下载 https://dl.cloudsmith.io/public/ogrecav…

Centos安全加固策略

目录 密码安全策略 设置密码的有效期和最小长度 设置用户密码的复杂度 登录安全策略 设置用户远程登录的安全策略 安全的远程管理方式 访问控制 限制root用户登录 修改ssh 22端口 设置登录超时时间 限制IP访问 安全审计 审核策略开启 日志属性设置 查看系统登录…

Google Play编写长描述的最佳实践

在我们为应用编写详细说明时,要遵循以下建议: 我们作为应用营销人员,要了解受众群体的需求和顾虑,如果不知道用户关心什么,那么我们可以查看关键词的搜索量、每个关键词的 Google Play 安装报告、当前关键字排名等等。…

element+vue小技巧和报错解决(持续更新)

目录 1-关于el-table复选框中表头和内容不对齐问题 2-日期选择器传值给后端格式不对 3-获取表格的当前行数据#default"{row}" 1-关于el-table复选框中表头和内容不对齐问题 <el-table:data"tableData"stripestyle"width: 100%"tooltip-ef…

Django框架之自定义管理页面

Django框架Admin站点管理一些默认的显示和功能包括语言都可以自定义设置处理&#xff0c;以贴近我们的实际业务。 属性说明 列表页属性 配置文件myapp/admin.py from django.contrib import admin from .models import Grades, Students# Register your models here.# 注册班…

算法训练 | Day41动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

产品推荐丨智慧水利行业应用终端+云平台

智慧水利是我国智慧城市建设的重要延伸&#xff0c;是新时代水利现代化的战略目标&#xff0c;贯穿于防汛抗旱减灾、水资源合理配置和高效利用、水资源和河湖健康保障等体系。随着水利技术的集成发展与场景的成熟应用&#xff0c;我国水利现已完成从自动化阶段到信息化阶段的过…

会议论文与期刊论文的写作差异

AI领域的会议论文和期刊论文在撰写方法上存在一定的差异&#xff0c;读者需要理解这些差异&#xff0c;才能做到有的放矢&#xff0c;提高论文的命中率。如果按照会议论文的风格来写期刊论文&#xff0c;或者按照期刊论文的风格来写会议论文&#xff0c;论文命中的概率将大大降…

离散数学期末复习第一章 数理逻辑

离散数学 离散数学是研究各种各样的离散量的结构及离散量之间的关系一门学科&#xff0c;是计算机科学中基础理论的核心课程。 什么是连续变量&#xff1f; 在一定区间内可以任意取值的变量叫连续变量&#xff0c;其数值是连续不断的&#xff0c;相邻两个数值可作无限分割&a…

【社区图书馆】-《科技服务与价值链》总结

【为什么研究价值链】 价值链及价值链协同体系是现代产业集群的核心枢纽&#xff0c;是推进城市群及产业集群化、服务化、生态化发展的纽带。因而推进价值链协同&#xff0c;创新发展价值链协同业务科技资源体系&#xff0c;既是科技服务业创新的重要方向&#xff0c;也是重塑生…

第3章-运行时数据区

此章把运行时数据区里比较少的地方讲一下。虚拟机栈&#xff0c;堆&#xff0c;方法区这些地方后续再讲。 转载https://gitee.com/youthlql/JavaYouth/tree/main/docs/JVM。 运行时数据区概述及线程 前言 本节主要讲的是运行时数据区&#xff0c;也就是下图这部分&#xff0c…

ASO优化之如何回复Google Play评论

应用的平均评分会影响 Google Play 商店优化 和应用的 Google Play 排名。应用的评分越高&#xff0c;我们在搜索结果中的排名就越靠前。因此&#xff0c;当应用处于 4 星评级范围内时&#xff0c;它会被更多 Google Play 商店的访问者看到和发现。我们可以使用应用雷达中的评级…

听我一句劝,别去外包,干了三年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

SAP ABAP MARA-MSBOOKPARTNO 制造商登记部分编号

BAPI_MATERIAL_SAVEDATA CLIENTDATA结构无此字段。 DATA:LS_TE_MARA TYPE BAPI_TE_MARA. DATA:LS_TE_MARAX TYPE BAPI_TE_MARAX. DATA:LT_BAPIPAREX TYPE TABLE OF BAPIPAREX. DATA:LS_BAPIPAREX TYPE BAPIPAREX. …

学生无线耳机哪款好?两百左右适合学生党的无线耳机推荐

学生无线耳机哪款好&#xff1f;现如今&#xff0c;学生党也成为了蓝牙耳机的主要用户群体之一。接下来&#xff0c;我来给学生群体推荐几款两百左右的无线耳机&#xff0c;一起来看看吧。 一、南卡小音舱Lite2蓝牙耳机 参考价&#xff1a;299 南卡小音舱的音质和佩戴体验都在…

传统制造企业如何数字化转型?中国减速机Top 1企业给出这份答案

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 数字中国建设正在如火如荼地展开&#xff0c;百业千行也都在寻求自身业务与数字化的深度融合。 2022年制造业增加值占GDP比重约为30%&#xff0c;在数字经济赋能新发展的当下&#xff0c;制造业成为数字技术重点实施落地的载…

Authing 入选《2022年度中国高科技高成长企业》榜单

​ 近日&#xff0c;Authing 入选【2022 年度中国高科技高成长企业系列榜单 】- 【云原生高成长企业榜】&#xff0c;该榜单由【第一新声】联合【天眼查】发起的“数字中国”系列之 2022 年度中国高科技高成长企业系列榜单发布&#xff0c;该榜单旨在发现和挖掘被资本市场关注&…

优秀的FAQ示例及FAQ页面制作技巧

在网页中问答设计中&#xff0c;虽然说客服会话更有人情味、解决效率更高&#xff0c;但从实际的客户使用情况和使用偏好来看&#xff0c;越来越多的人更喜欢自助服务。数据显示&#xff0c;约67%的受访者会优先选择自助服务&#xff0c;91%的客户使用过帮助中心来解决问题。可…

薪资17K是一个怎样的水平?来看看98年测试工程师的面试全过程…

我的情况 大概介绍一下个人情况&#xff0c;男&#xff0c;本科&#xff0c;三年多测试工作经验&#xff0c;懂python&#xff0c;会写脚本&#xff0c;会selenium&#xff0c;会性能&#xff0c;然而到今天都没有收到一份offer&#xff01;从年后就开始准备简历&#xff0c;年…

【JAVA-模块五 数组】

JAVA-模块五 数组 一、数组&#xff08;一维&#xff09;1.1数组是什么&#xff1f;1.2java中数组静态初始化&#xff1a;&#xff08;存&#xff09;两种定义格式&#xff1a;数组初始化格式&#xff1a;静态初始化后&#xff0c;打印数组名&#xff1a; 1.3 数组元素访问&…
最新文章