远程连接到服务器后查看是否已安装docker,没有的话安装一下
# 查看是否安装
docker
# 安装
sudo apt install docker.io
# 查看系统信息
docker info
# 查找docker仓库中的镜像
docker search
# 查看本地镜像
docker images
# 拉取docker仓库的镜像
docker pull
# 创建容器
docker create
# 开启容器
docker start
# 重启容器
docker restart
# 关闭容器
docker stop
# 查看正在运行的容器
docker ps -a
# 查看容器的所有信息
docker inspect
# 删除容器
docker rm
# 运行一个容器
docker run
# 进入某个容器
docker exec
# 监控容器运行情况
sudo docker stats
# 搜索一下
sudo docker search mysql
# 第一个STARS最多的官方镜像拉拉到本地
sudo docker pull mysql
# 新建一个文件夹保存数据
mkdir mysql
# 先简单启动一下容器
sudo docker run -p 3306:3306 --name mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest
# 将容器内的mysql配置文件复制到本地
sudo docker cp 9d65155d846e:/etc/mysql/ /home/xxtc/lichuan/mysql/conf
# 停止容易然后删除
sudo docker stop 9d65155d846e
sudo docker rm 9d65155d846e
# 启动容器,将配置文件,数据,日志,映射到本机
sudo docker run -p 3306:3306 --name mysql \
-v /home/xxtc/lichuan/mysql/conf:/etc/mysql/conf.d \
-v /home/xxtc/lichuan/mysql/data:/var/lib/mysql \
-v /home/xxtc/lichuan/mysql/logs:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:latest
# 查看正在运行的容器
sudo docker ps
如果正在运行的容器中没从日志看一下具体哪里报错了
# 查看容器日志
sudo docker logs 607ecbdc0345
mysql容器正常启动之后就可以进入容器操作数据库了
# 进入Docker容器内
sudo docker exec -it mysql bash
# 链接mysql
mysql -uroot -p123456
# 查看数据库状态
status
# 查看都有什么表
show databases
# 切换数据库
use mysql
# 更新密码
update user set authentication_string = password('root') where user = '123456Q@';
# 开放局域网访问
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
# 推出容器
exit
# 查看开机自启应用
systemctl list-unit-files | grep enabled
# Ubuntu下设置docker开机自启
sudo systemctl enable docker
# 设置容器开机自启
# 如果当前容器没有启动可以在启动时增加以下参数
sudo docker run --restart=always ...
# 如果容器已启动可以追加参数
sudo docker update --restart=always 607ecbdc0345
]]>在目标设备可以正常联网的情况下,导出pip清单然后重新在线下载包、安装。缺点是还需要重新花时间下载,有些包的版本可能会找不到。
# 源电脑导出 conda 清单
conda {env_name} export > {conda_list_name}
conda env export > conda.yaml
conda.yaml内容如下
name: tra
channels:
- defaults
dependencies:
- ca-certificates=2021.10.26=haa95532_2
- certifi=2021.10.8=py37haa95532_0
- openssl=1.1.1l=h2bbff1b_0
- pip=21.2.4=py37haa95532_0
- python=3.7.11=h6244533_0
- setuptools=58.0.4=py37haa95532_0
- sqlite=3.37.0=h2bbff1b_0
- vc=14.2=h21ff451_1
- vs2015_runtime=14.27.29016=h5e58377_2
- wheel=0.37.1=pyhd3eb1b0_0
- wincertstore=0.2=py37haa95532_2
- pip:
- albumentations==1.1.0
- charset-normalizer==2.1.1
- colorama==0.4.4
- conda-pack==0.6.0
- cycler==0.11.0
- docopt==0.6.2
- et-xmlfile==1.1.0
- fonttools==4.28.5
- idna==3.3
- imageio==2.16.0
- importlib-metadata==4.12.0
- jinja2==3.1.2
- joblib==1.1.0
- kiwisolver==1.3.2
- llvmlite==0.37.0
- loguru==0.6.0
- markupsafe==2.1.1
- matplotlib==3.5.1
- networkx==2.6.3
- numba==0.54.1
- numpy==1.20.3
- opencv-python==3.4.3.18
- openpyxl==3.0.10
- packaging==21.3
- pandas==1.3.5
- pillow==9.0.0
- pipreqs==0.4.11
- prettytable==3.3.0
- pyecharts==1.9.1
- pyparsing==3.0.6
- python-dateutil==2.8.2
- pytz==2022.2.1
- pywavelets==1.2.0
- pyyaml==6.0
- qudida==0.0.4
- requests==2.28.1
- scikit-image==0.19.2
- scikit-learn==1.0.2
- scipy==1.7.3
- simplejson==3.17.6
- six==1.16.0
- threadpoolctl==3.1.0
- tifffile==2021.11.2
- tqdm==4.62.3
- typing-extensions==4.1.1
- urllib3==1.26.11
- wcwidth==0.2.5
- win32-setctime==1.1.0
- xlrd==2.0.1
- xlwt==1.3.0
- yarg==0.1.9
- you-get==0.4.1555
- zipp==3.8.1
prefix: D:\Program\miniconda3\envs\tra
以上代码会把pip list下的所有包都包含进来,如果想只打包某个项目的包可以使用pipreqs。
# 源电脑导出 pip 清单
pipreqs {project_path} {requirements_name}
pipreqs ./ --encoding=utf8
# requirements.txt
folium==0.13.0
imageio==2.16.0
loguru==0.6.0
matplotlib==3.5.1
numba==0.54.1
opencv_python==3.4.3.18
pandas==1.3.5
pyaudio==0.2.12
pyecharts==1.9.1
pyparsing==3.0.6
PyYAML==6.0
requests==2.28.1
scikit_image==0.19.2
scipy==1.7.3
skimage==0.0
sympy==1.11.1
目标电脑新建虚拟环境重新安装库
conda env create -f conda.yaml
在目标电脑不能联网的情况下需要把源电脑conda环境整理打包迁移,在目标电脑上将环境解压到conda环境的保存路径下,如果解压到自己设定的路径,还需要将路径保存到conda环境保存路径的列表中
# 源电脑打包
pip install conda-pack
conda pack -n {env_name} -o {name.tar.gz}
conda pack
# 目标电脑解压
tar -xzf {name.tar.gz} -C {path/env_name}
tar - E:/tra.tat.gz -c D:/CODE/conda_env/tra
# 将路径添加到conda环境的保存路径
conda config --add env_dirs D:/CODE/conda_env
# conda env list就可以看到虚拟环境了
]]>screen命令类似于“虚拟桌面”的概念,可以启动一个Linux下的虚拟桌面,在其中可以和普通终端一样执行各种命令。可以实现远程操作服务器把程序运行起来,退出远程后程序不终止
# 检查是否安装
screen -ls
# 安装
sudo apt install screen
# 创建窗口
screen -S name
# 退出当前窗口
ctrl +a d
# 查看已创建窗口
screen -ls
# 关闭窗口
ctrl+d
# 进入名为name的窗口
screen -r name
# 远程连接进入screen窗口后突然掉线,重连遇到进不去窗口时可以通过以下命令踢掉上一个进入窗口的进程,然后进入窗口
screen -D -r name
]]>使用传感器,型号:蚌埠 LCF-6-V,接线方式如下:
USB转485接口 | 传感器变送器接口 | 电源 |
---|---|---|
T/R- | 白 | |
T/R+ | 绿 | |
红 | 24V+ | |
黑 | 24V- |
串口号:COM4
波特率:2400~~~~38400,,,,默认默认 9600)。
数据位:8
校验位:None
停止位:1.0
SEND:AA AA AA 01 B3 00 00 18
RECV:BB BB BB 01 B3 06 02 02 02 0D
其中数据位“06 02”转为十进制为“1538”,“02”表示小数点位于十位,“02”表示单位为“Kg”
SEND:AA AA AA 01 A7 00 00 0C
RECV:BB BB BB 01 A7 00 00 02 02 1D
功能:对变送器数字输出进行校准,需需加确定的负载
说明:在对变送器数字输出校准 在对变送器数字输出校准前,读出读出原来的校准系数,按照按照以下公式 1 计算出修改后的系数,
校准前数字输出值/原来的校准系数数数数 = 校准后的数字输出值/修改后的校准系数…(公式 1)
SEND:AA AA AA 01 A8 03 E8 E8
RECV:BB BB BB 01 A8 03 E8 02 02 F9
设置变送器数字输出模式为单次输出模式(实时实时采集时定时发送该指令)
SEND:AA AA AA 01 B1 00 00 1A
RECV:
python deploy/python/predict_cls.py -c deploy/configs/PULC/person_exists/inference_person_exists.yaml -o Global.use_gpu=False -o Global.inference_model_dir=models/PULC_person_exists -o Global.infer_imgs=deploy/images/PULC/person_attribute/
# 输出,其中,someone 表示该图里存在人,nobody 表示该图里不存在人。
090004.jpg: class id(s): [0], score(s): [0.58], label_name(s): ['nobody']
090007.jpg: class id(s): [1], score(s): [0.59], label_name(s): ['someone']
python tools/infer.py -c ppcls/configs/PULC/safety_helmet/PPLCNet_x1_0.yaml -o Global.device=cpu -o Global.checkpoints=models/safety_helmet_pretrained -o Infer.infer_imgs=deploy/images/PULC/safety_helmet/safety_helmet_test_1.png -o Arch.use_sync_bn=False
# 输出
[{'class_ids': [0], 'scores': [0.8114636987447739], 'label_names': ['wearing_helmet'], 'file_name': 'deploy/images/PULC/safety_helmet\\safety_helmet_test_1.png'}]
[{'class_ids': [0], 'scores': [0.5641067326068878], 'label_names': ['wearing_helmet'], 'file_name': 'deploy/images/PULC/safety_helmet\\safety_helmet_test_2.png'}]
python deploy/python/predict_cls.py -c deploy/configs/PULC/safety_helmet/inference_safety_helmet.yaml -o Global.use_gpu=False -o Global.inference_model_dir=models\PULC_safety_helmet_infer -o Global.infer_imgs=deploy/images/PULC/safety_helmet/
# 输出
safety_helmet_test_1.png: class id(s): [1], score(s): [1.00], label_name(s): ['unwearing_helmet']
safety_helmet_test_2.png: class id(s): [0], score(s): [1.00], label_name(s): ['wearing_helmet']
python tools/infer.py -c ppcls/configs/PULC/person_attribute/PPLCNet_x1_0.yaml -o Global.device=cpu -o Global.pretrained_model=models\person_attribute_pretrained -o Infer.infer_imgs=deploy/images/PULC/person_attribute/
# 输出
[{'attributes': ['Male', 'Age18-60', 'Back', 'Glasses: False', 'Hat: False', 'HoldObjectsInFront: False', 'Backpack', 'Upper: LongSleeve UpperPlaid', 'Lower: Trousers', 'No boots'], 'output': [0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1]},
{'attributes': ['Female', 'Age18-60', 'Side', 'Glasses: False', 'Hat: False', 'HoldObjectsInFront: False', 'No bag', 'Upper: ShortSleeve', 'Lower: Skirt&Dress', 'No boots'], 'output': [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0]}]
PP-ShiTuV2 是基于 PP-ShiTuV1 改进的一个实用轻量级通用图像识别系统,由主体检测、特征提取、向量检索三个模块构成,相比 PP-ShiTuV1 具有更高的识别精度、更强的泛化能力以及相近的推理速度
主体检测inference模型: picodet_PPLCNet_x2_5_mainbody_lite_v1.0_infer
特征提取动态图模型: general_PPLCNetV2_base_pretrained_v1.0_infer
特征提取inference模型: general_PPLCNetV2_base_pretrained_v1.0_infer
# 预测单张图片
python deploy/python/predict_system.py -c deploy/configs/inference_general.yaml -o Global.use_gpu=False -o Global.infer_imgs=deploy/drink_dataset_v2.0/test_images/001.jpeg
# 输出
[{'bbox': [0, 0, 600, 600], 'rec_docs': '红牛-强化型', 'rec_scores': 0.74081033}]
# 预测文件夹内所有图片
python deploy/python/predict_system.py -c deploy/configs/inference_general.yaml -o Global.use_gpu=False -o Global.infer_imgs=deploy/drink_dataset_v2.0/test_images
# 输出
[{'bbox': [0, 0, 600, 600], 'rec_docs': '红牛-强化型', 'rec_scores': 0.74081033}]
Inference: 78.38726043701172 ms per batch image
[{'bbox': [0, 0, 514, 436], 'rec_docs': '康师傅矿物质水', 'rec_scores': 0.6918598}]
Inference: 72.65782356262207 ms per batch image
[{'bbox': [138, 40, 573, 1198], 'rec_docs': '乐虎功能饮料', 'rec_scores': 0.6821406}]
Inference: 72.5698471069336 ms per batch image
[{'bbox': [328, 7, 467, 272], 'rec_docs': '脉动', 'rec_scores': 0.6040604}]
Inference: 79.4534683227539 ms per batch image
[{'bbox': [242, 82, 498, 726], 'rec_docs': '味全_每日C', 'rec_scores': 0.54286546}]
Inference: 73.96435737609863 ms per batch image
[{'bbox': [437, 71, 660, 728], 'rec_docs': '元气森林', 'rec_scores': 0.77402496}, {'bbox': [221, 72, 449, 701], 'rec_docs': '元气森林', 'rec_scores': 0.6950992}, {'bbox': [794, 104, 979, 652], 'rec_docs': '元气森林', 'rec_scores': 0.6305152}]
Inference: 78.69076728820801 ms per batch image
[{'bbox': [0, 0, 768, 1024], 'rec_docs': '脉动', 'rec_scores': 0.5190187}]
Inference: 79.32877540588379 ms per batch image
[{'bbox': [233, 57, 525, 1038], 'rec_docs': '康师傅冰红茶', 'rec_scores': 0.6001749}]
Inference: 76.13968849182129 ms per batch image
[{'bbox': [493, 13, 803, 829], 'rec_docs': '康师傅冰红茶', 'rec_scores': 0.70879036}, {'bbox': [189, 17, 495, 793], 'rec_docs': '康师傅冰红茶', 'rec_scores': 0.69420344}]
Inference: 71.82860374450684 ms per batch image
[]
Inference: 91.88318252563477 ms per batch image
[]
Inference: 75.86908340454102 ms per batch image
[{'bbox': [0, 0, 730, 1095], 'rec_docs': '农夫山泉-饮用天然水', 'rec_scores': 0.68553746}]
Inference: 74.47957992553711 ms per batch image
# 预测单张图片
python deploy/python/predict_det.py -c deploy/configs/inference_general.yaml -o Global.use_gpu=False -o Global.infer_imgs=deploy/drink_dataset_v2.0/test_images/002.jpeg
# 输出
[{'class_id': 0, 'score': 0.8008015, 'bbox': array([2.3382977e+02, 1.4137268e-02, 3.7298141e+02, 4.3600000e+02],
dtype=float32), 'label_name': 'foreground'}, {'class_id': 0, 'score': 0.42941576, 'bbox': array([ 0. , 272.02524, 514. , 435.15088], dtype=float32), 'label_name': 'foreground'}, {'class_id': 0, 'score': 0.26006204, 'bbox': array([229.9466 , 266.22577, 379.64105, 435.57114], dtype=float32), 'label_name': 'foreground'}, {'class_id': 0, 'score': 0.21821804, 'bbox': array([234.0829 , 279.89706, 514. , 435.49277], dtype=float32), 'label_name': 'foreground'}, {'class_id': 0, 'score': 0.21736334, 'bbox': array([ 0. , 3.8394742, 472.9032 , 435.02594 ], dtype=float32), 'label_name': 'foreground'}]
]]>python deploy/pipeline/pipeline.py --config deploy\pipeline\config\examples\infer_cfg_smoking.yml --video_file D:\Data\Smoke\test2_video\video3-1.mp4
# 单张图片
python deploy/python/infer.py --model_dir=models\mot_ppyoloe_l_36e_pipeline --image_file=demo/000000014439_640x640.jpg --device=cpu
# 单个视频
python deploy/python/infer.py --model_dir=models\mot_ppyoloe_l_36e_pipeline --video_file=D:/Data/Smoke/test2_video/video3-1.mp4 --device=cpu
# 图像中有人时的输出结果
detect frame: 357
Test iter 0
class_id:0, confidence:0.9342, left_top:[183.13,122.14],right_bottom:[247.16,245.90]
python deploy/python/infer.py --model_dir models\ppyoloe_crn_s_80e_smoking_visdrone --image_file D:\Data\Smoke\test1\000067.jpg --device=cpu
待完成
使用开源数据集,下载后解压文件夹按照以下结构重命名
# paddledetection训练数据格式
-- Helmet
|-- Annotations
|-- 001.jpg
|-- ...
|-- JPEGImages
|-- 001.xml
|-- ...
使用以下数据将数据划分为训练集、验证集、测试集
paddlex --split_dataset --format VOC --dataset_dir datasets/Helmet --val_value 0.2 --test_value 0.1
完成后数据集文件结构如下
-- Helmet
|-- JPEGImages
|-- 001.jpg
|-- ...
|-- Annotations
|-- 001.xml
|-- ...
|-- train_list.txt
|-- val_list.txt
|-- test_list.txt
|-- labels.txt
# 开始训练
python -m paddle.distributed.launch --gpus 0,1 tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_m_80e_Helmet.yml --use_vdl True --vdl_log_dir output/scalar --eval
# 可视化查看训练数据
visualdl --logdir output/scalar --host 0.0.0.0 --port 8041
# 评估验证集结果
CUDA_VISIBLE_DEVICES=0
python tools/eval.py -c configs/ppyoloe/ppyoloe_plus_crn_m_80e_Helmet.yml -o weights=output/ppyoloe_plus_crn_m_80e_Helmet/weights/best_model.pdparams
# 终端输出
[10/17 12:24:57] ppdet.engine INFO: Eval iter: 0
[10/17 12:25:09] ppdet.engine INFO: Eval iter: 100
[10/17 12:25:21] ppdet.engine INFO: Eval iter: 200
[10/17 12:25:33] ppdet.engine INFO: Eval iter: 300
[10/17 12:25:45] ppdet.engine INFO: Eval iter: 400
[10/17 12:25:57] ppdet.metrics.metrics INFO: Accumulating evaluatation results...
[10/17 12:25:57] ppdet.metrics.metrics INFO: mAP(0.50, 11point) = 61.77%
[10/17 12:25:57] ppdet.engine INFO: Total sample number: 1000, averge FPS: 16.343893553616113
# 预测单张图片
CUDA_VISIBLE_DEVICES=0
python tools/infer.py -c configs/ppyoloe/ppyoloe_plus_crn_m_80e_Helmet.yml -o weights=output/ppyoloe_plus_crn_m_80e_Helmet/weights/best_model.pdparams --infer_img=dataset/Helmet/JPEGImages/hard_hat_workers1783.png --output_dir output --visualize True
# 终端输出结果
W1017 12:26:25.761562 788568 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 6.1, Driver API Version: 11.6, Runtime API Version: 10.2
W1017 12:26:25.769194 788568 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.
[10/17 12:26:28] ppdet.utils.checkpoint INFO: Finish loading model weights: output/ppyoloe_plus_crn_m_80e_Helmet/weights/best_model.pdparams
100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:01<00:00, 1.30s/it]
[10/17 12:26:29] ppdet.engine INFO: Detection bbox results save in output/hard_hat_workers1783.png
python tools/export_model.py -c configs\ppyoloe\ppyoloe_plus_crn_m_80e_box.yml -o weights=models\ppyoloe_plus_crn_m_80e_box26_train20221111\best_model.pdparams use_gpu=false --output_dir models
# 终端输出结果
[11/13 14:30:01] ppdet.utils.checkpoint INFO: Finish loading model weights: models\ppyoloe_plus_crn_m_80e_box26_train20221111\best_model.pdparams
[11/13 14:30:01] ppdet.engine INFO: Export inference config file to models\ppyoloe_plus_crn_m_80e_box\infer_cfg.yml
[11/13 14:30:06] ppdet.engine INFO: Export model and saved in models\ppyoloe_plus_crn_m_80e_box
# 单张图片
python deploy/python/infer.py --model_dir=models/ppyoloe_plus_crn_m_80e_box --image_file=D:\Data\Expressbox\images_test\1.jpg --device=cpu --save_results
# 终端输出结果
# 文件夹
python deploy/python/infer.py --model_dir=models/ppyoloe_plus_crn_m_80e_box --image_dir=D:\Data\Expressbox\images_test --device=cpu --save_results
# 终端输出结果
Found 2 inference images in total.
class_id:0, confidence:0.5832, left_top:[1960.35,1210.66],right_bottom:[2880.86,2070.92]
save result to: output\1.jpg
Test iter 0
class_id:0, confidence:0.7591, left_top:[291.97,273.54],right_bottom:[451.52,398.73]
save result to: output\2.jpg
Test iter 1
Start saving coco json files...
The bbox result is saved to output\bbox.json
------------------ Inference Time Info ----------------------
total_time(ms): 1718.0, img_num: 2
average latency time(ms): 859.00, QPS: 1.164144
preprocess_time(ms): 84.60, inference_time(ms): 774.40, postprocess_time(ms): 0.00
python tools/infer.py -c configs/ppyoloe/ppyoloe_plus_crn_m_80e_coco.yml -o weights=models\ppyoloe\ppyoloe_plus_crn_m_80e_coco.pdparams use_gpu=false --infer_img=demo\hrnet_demo.jpg
python tools/export_model.py -c configs/ppyoloe/ppyoloe_plus_crn_m_80e_coco.yml -o weights=models\ppyoloe\ppyoloe_plus_crn_m_80e_coco.pdparams use_gpu=False --output_dir models
python deploy/python/infer.py --model_dir=models/ppyoloe_plus_crn_m_80e_coco --image_file=demo/000000014439_640x640.jpg --device=cpu
python tools/infer.py -c configs\picodet\application\mainbody_detection\picodet_lcnet_x2_5_640_mainbody.yml --infer_dir=demo --output_dir=output -o weights=models\picodet\picodet_PPLCNet_x2_5_mainbody_lite_v1.0_pretrained.pdparams --save_results True
python tools/export_model.py -c configs\picodet\application\mainbody_detection\picodet_lcnet_x2_5_640_mainbody.yml -o weights=models\picodet\picodet_PPLCNet_x2_5_mainbody_lite_v1.0_pretrained.pdparams --output_dir models
python deploy/python/infer.py --model_dir=models\picodet_lcnet_x2_5_640_mainbody --image_file=D:\Data\Retail_Product_Identification\test_image\recognition_2.jpg --device=cpu --save_results True
]]>输入“张三18625584663广东省深圳市南山区学府路东百度国际大厦”,目标是识别出其中的“张三”为人名(用符号 P 表示),“18625584663”为电话名(用符号 T 表示),“广东省深圳市南山区百度国际大厦”分别是 1-4 级的地址(分别用 A1~A4 表示,可以释义为省、市、区、街道)。
这是一个典型的命名实体识别(Named Entity Recognition,NER)场景,各实体类型及相应符号表示见下表:
抽取实体/字段 | 符号 | 抽取结果 |
---|---|---|
姓名 | P | 张三 |
电话 | T | 18625584663 |
省 | A1 | 广东省 |
市 | A2 | 深圳市 |
区 | A3 | 南山区 |
详细地址 | A4 | 百度国际大厦 |
此处略过
下载waybill数据集:https://paddlenlp.bj.bcebos.com/paddlenlp/datasets/waybill.tar.gz
。解压后文件结构如下
--waybil
|-- train.txt
|-- dev.txt
|-- test.txt
|-- word.dic
|-- tag.dic
conda activate paddle
cd D:\Code\PADDLE\PaddleNLP-develop
python examples\information_extraction\waybill_ie\run_ernie.py --save_dir examples/information_extraction/waybill_ie/ernir_ckpt --epochs 20 --batch_size 64 --device cpu --data_dir D:\Data\waybill
python examples\information_extraction\waybill_ie\export_model.py --params_path examples\information_extraction\waybill_ie\ernir_ckpt\model_100\model_state.pdparams --output_path examples/information_extraction/waybill_ie/ernir_inference --data_dir D:\Data\waybill
python examples/information_extraction/waybill_ie/deploy/python/predict.py --model_dir examples\information_extraction\waybill_ie\ernir_inference\ --data_dir D:\Data\waybill
# 输出
('黑龙江省', 'A1')('双鸭山市', 'A2')('尖山区', 'A3')('八马路与东平行路交叉口北40米', 'A4')('韦业涛', 'P')('18600009172', 'T')
('广西壮族自治区', 'A1')('桂林市', 'A2')('雁山区', 'A3')('雁山镇西龙村老年活动中心', 'A4')('17610348888', 'T')('羊卓卫', 'P')
('15652864561', 'T')('河南省', 'A1')('开封市', 'A2')('顺河回族区', 'A3')('顺河区公园路32号', 'A4')('赵本山', 'P')
('河北省', 'A1')('唐山市', 'A2')('玉田县', 'A3')('无终大街159号', 'A4')('18614253058', 'T')('尚汉生', 'P')
('台湾', 'A1')('台中市', 'A2')('北区', 'A3')('北区锦新街18号', 'A4')('18511226708', 'T')('蓟丽', 'P')
('廖梓琪', 'P')('18514743222', 'T')('湖北省', 'A1')('宜昌市', 'A2')('长阳土家族自治县', 'A3')('贺家坪镇贺家坪村一组临河1号', 'A4')
]]>方法有:N-gram LM、FeedForward Neural Network LM、RNN LM和GPT系列,具体可以看 https://zhuanlan.zhihu.com/p/32292060。语言模型训练工具有:KenLM、Srilm。
这里主要使用KenLM训练N-gram LM用于deepspeech2的语音识别,环境为Ubuntu20.04。
依赖安装
sudo apt-get install build-essential libboost-all-dev cmake zlib1g-dev libbz2-dev liblzma-dev
kenlm安装
wget -O - https://kheafield.com/code/kenlm.tar.gz |tar xz
mkdir kenlm/build
cd kenlm/build
cmake ..
make -j2
kenlm训练使用C++,内部给了易于调用的接口,具体命令如下:
kenlm/build/bin/lmplz -o 4 --prune 0 4 4 4 -S 80% --text PaddleSpeech/demos/language_model/address_corpus_chars.txt --arpa PaddleSpeech/demos/language_model/address_corpus_chars.arpa --discount_fallback
ERROR: 4-gram discount out of range for adjusted count 2: -5.980026. This means modified Kneser-Ney smoothing thinks something is weird about your data. To override this error for e.g. a class-based model, rerun with --discount_fallback
训练完成后的输出如下
=== 1/5 Counting and sorting n-grams ===
Reading /home/xxtc/lichuan/CODE/PaddleSpeech/demos/language_model/address_corpus_chars.txt
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
****************************************************************************************************
Unigram tokens 63667 types 1504
=== 2/5 Calculating and sorting adjusted counts ===
Chain sizes: 1:18048 2:9124712448 3:17108837376 4:27374139392
Substituting fallback discounts for order 3: D1=0.5 D2=1 D3+=1.5
Statistics:
1 1504 D1=0.548324 D2=1.11646 D3+=1.43081
2 1460/11077 D1=0.841168 D2=1.21918 D3+=1.35424
3 1564/16532 D1=0.908341 D2=0.836226 D3+=1.79261
4 1508/20400 D1=0.5 D2=1 D3+=1.5
Memory estimate for binary LM:
type kB
probing 135 assuming -p 1.5
probing 159 assuming -r models -p 1.5
trie 74 without quantization
trie 57 assuming -q 8 -b 8 quantization
trie 73 assuming -a 22 array pointer compression
trie 56 assuming -a 22 -q 8 -b 8 array pointer compression and quantization
=== 3/5 Calculating and sorting initial probabilities ===
Chain sizes: 1:18048 2:23360 3:31280 4:36192
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
*******#############################################################################################
=== 4/5 Calculating and writing order-interpolated probabilities ===
Chain sizes: 1:18048 2:23360 3:31280 4:36192
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
####################################################################################################
=== 5/5 Writing ARPA model ===
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
****************************************************************************************************
Name:lmplz VmPeak:52507348 kB VmRSS:6648 kB RSSMax:10477732 kB user:2.8795 sys:8.74262 CPU:11.6222 real:11.5914
生成的模型字典文件ngram.arpa格式如下
\data\
ngram 1=1504
ngram 2=1460
ngram 3=1564
ngram 4=1508
\1-grams:
-4.0209603 <unk> 0
0 <s> -0.9991864
-1.9057258 </s> 0
-1.8332356 中 -0.29883626
-2.137954 国 -0.17699695
-1.6351237 科 -0.6701027
\2-grams:
-1.8534635 科 </s> 0
-1.4849854 公 </s> 0
-1.9052719 司 </s> 0
-1.8912891 京 </s> 0
-1.0746682 招 </s> 0
\3-grams:
-0.99153876 公 司 </s> 0
-1.8763832 北 京 </s> 0
-0.20964877 高 招 </s> 0
-0.24112433 中 心 </s> 0
\4-grams:
-0.15717009 限 公 司 </s>
-0.46751702 团 公 司 </s>
-0.14627926 分 公 司 </s>
-0.25886127 支 公 司 </s>
-0.07823124 任 公 司 </s>
-0.41149858 总 公 司 </s>
-0.08007565 易 公 司 </s>
\end\
kenlm训练语言模型需要的输入主要为词料库 text,按照词料库的细粒度又可以分为词颗粒度和字颗粒度,文件每一行的内容如下所示。这里用用的是字颗粒度。
原始数据
今天天气不错
而对楼市成交抑制作用最大的限购
词颗粒度
今天 天气 不错
而 对 楼市 成交 抑制 作用 最 大 的 限 购
字颗粒度
今 天 天 气 不 错
而 对 楼 市 成 交 抑 制 作 用 最 大 的 限 购
低阶数据部分(3-grams为最高阶的情况下,1-grams与2-grams即为低阶数据部分)每行有三个元素,左边的是该短语出现的概率,右边为该短语的 backoff 概率(衡量的是某个词后面能接不同词的能力),中间则为短语(即一元短语或二元短语);
高阶数据部分每行只有两个元素,缺少一个 backoff 概率。
文件中记录的概率都是实际概率的常用对数值(10为底)
以最高阶为3-grams的短语(wd1,wd2,wd3)概率计算为例,如果3-grams数据部分出现了(wd1,wd2,wd3),则直接使用它的概率即可;如果数据中没有出现过(wd1,wd2,wd3)这个短语的话,但是找到了(wd1,wd2)这个短语,以(wd1,wd2)的 backoff 概率乘以短语(wd2,wd3)的概率即可;若都找不到就以的(wd2,wd3)概率作为(wd1,wd2,wd3)的概率处理。
至于降到2-grams的情况后,仍然类比3-grams的情况,如果找不到该二元短语,就用第一个单词的 backoff 概率和第二个单词的概率相乘即可。
p(wd3|wd1,wd2)= if(trigram exists) p_3(wd1,wd2,wd3)
else if(bigram w1,w2 exists) bo_wt_2(w1,w2)*p(wd3|wd2)
else p(wd3|w2)
p(wd2|wd1)= if(bigram exists) p_2(wd1,wd2)
else bo_wt_1(wd1)*p_1(wd2)
一般训练的模型比较大,为了便于使用,kenlm提供了模型量化的接口,具体如下:
# 查看量化参数
kenlm/build/bin/build_binary -s PaddleSpeech/demos/language_model/address_corpus_chars.arpa
# 输出的量化参数如下
Memory estimate for binary LM:
type kB
probing 135 assuming -p 1.5
probing 159 assuming -r models -p 1.5
trie 74 without quantization
trie 57 assuming -q 8 -b 8 quantization
trie 73 assuming -a 22 array pointer compression
trie 56 assuming -a 22 -q 8 -b 8 array pointer compression and quantization
根据上述结果选择合适参数量化
# 参数量化
kenlm/build/bin/build_binary -s PaddleSpeech/demos/language_model/address_corpus_chars.arpa PaddleSpeech/demos/language_model/address_corpus_chars.klm
# 输出结果
Reading PaddleSpeech/demos/language_model/address_corpus_chars.arpa
----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100
****************************************************************************************************
SUCCESS
# 安装python 包
pip install pypi-kenlm
# 设置模型路径导入模型
import kenlm
import numpy as
model=kenlm.Model("ngram.pt")
# model.score() 对句子进行打分
# bos=True, eos=True 给句子开头和结尾加上标记符
# 返回输入字符串的 log10 概率,得分越高,句子的组合方式越好
score = model.score('今 天 天 气 不 错',bos = True,eos = True)
print(score)
# model.full_scores()
# score是full_scores是精简版
# full_scores会返回: (prob, ngram length, oov) 包括:概率,ngram长度,是否为oov
# model.perplexity() 计算句子的困惑度。
perplexity =model.perplexity('今 天 天 气 不 错')
print(perplexity)
# model.full_scores() 计算句子的困惑度
s = '今 天 天 气 不 错'
prob = np.prod([math.pow(10.0, score) for score, _, _ in model.full_scores(s)])
n = len(list(m.full_scores(s)))
perplexity = math.pow(prob, 1.0/n)
print(perplexity)
10条音频的平均字错率从9.5%降到了2.1%
zh_giga.no_cna_cmn.prune01244.klm预测结果
tts_0_0.wav 中国科技出版传媒股份有限公司 中国科技出版传媒股份有限公司 0.0
tts_1_0.wav 中国石化国际事业有限公司北京招标中心 中国石化国际事业有限公司北京招标中心 0.0
tts_2_8.wav 泽国蒋欢飞中国小年度快递包裹 祖国讲话非中国少年都快递包裹 0.42857142857142855
tts_3_10.wav 加多宝中国饮料有限公司 加多宝中国饮料有限公司 0.0
tts_4_9.wav 中国长城科技集团股份有限公司 中国长城科技集团股份有限公司 0.0
tts_5_6.wav 诺维信中国投资有限公司 莫为信中国投资有限公司 0.18181818181818182
tts_6_3.wav 中国人寿保险股份有限公司北京市分公司 中国人受保险股份有限公司北京市分公司 0.05555555555555555
tts_7_2.wav 中国人民财产保险股份有限公司北京市大兴支公司 中国人民财产保险股份有限公司北京市大兴职公司 0.045454545454545456
tts_8_5.wav 淡水河谷矿产品中国有限公司 但水和古矿产品中国有限公司 0.23076923076923078
tts_9_6.wav 中国民生信托有限公司 中国民生信托有限公司 0.0
address_corpus_chars_n5.klm预测结果
tts_0_0.wav 中国科技出版传媒股份有限公司 中国科技出版传媒股份有限公司 0.0
tts_1_0.wav 中国石化国际事业有限公司北京招标中心 中国石化国际事业有限公司北京招标中心 0.0
tts_2_8.wav 泽国蒋欢飞中国小年度快递包裹 泽国蒋欢飞中国小年度快递包裹 0.0
tts_3_10.wav 加多宝中国饮料有限公司 加多宝中国饮料有限公司 0.0
tts_4_9.wav 中国长城科技集团股份有限公司 中国长城科技集团股份有限公司 0.0
tts_5_6.wav 诺维信中国投资有限公司 诺维信中国投资有限公司 0.0
tts_6_3.wav 中国人寿保险股份有限公司北京市分公司 中国人手保险股份有限公司北京市分公司 0.05555555555555555
tts_7_2.wav 中国人民财产保险股份有限公司北京市大兴支公司 中国人民财产保险股份有限公司北京市大兴支公司 0.0
tts_8_5.wav 淡水河谷矿产品中国有限公司 但水和谷矿产品中国有限公司 0.15384615384615385
tts_9_6.wav 中国民生信托有限公司 中国民生信托有限公司 0.0
]]>目前用的是apt install的方式安装,使用中没有发现什么问题。
我这里用的ubuntu20.04,由于没有指定版本,下载的18.04的版本
cuda下载链接:
https://developer.nvidia.com/cuda-downloads
cuda历史版本下载链接:
https://developer.nvidia.com/cuda-toolkit-archive
(或点击 ‘Archive of Previous CUDA Releases’进入下载页面)
有的博主说需要关闭图形界面,但我是直接在文件所在目录的终端里安装成功的
# Ctrl+Alt+F1 退出图形界面
sudo service lightdm stop
sudo sh ./cuda_10.2.89_440.33.01_linux.run
如果提示gcc版本问题:
Failed to verify gcc version.
See log at /var/log/cuda-installer.log for details.
解决方式1:cat /var/log/cuda-installer.log 则会看到问题及解决方法,执行时加上 --override 来忽略gcc版本不匹配问题。
sudo sh cuda_10.2.89_440.33.01_linux.run --override
gedit ~/.bashrc
# 在末尾加上以下内容:
export PATH=/usr/local/cuda-10.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH
source ~/.bashrc
nvcc -V
下载链接:
https://developer.nvidia.com/rdp/cudnn-download
下载 cuda10.2 对应的版本,解压,进入解压后的文件夹打开终端
tar -xzvf {cudnn文件名}.tgz
cd cudnn-linux-x86_64-8.5.0.96_cuda10-archive
sudo cp include/cudnn*.h /usr/local/cuda/include
sudo cp -P lib/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
]]>2022年4月1日(星期五),托朋友帮忙购买了12个冰墩墩钥匙扣和8个雪融融钥匙扣,并通过顺丰快递邮寄给我,发货地和收货地均为北京,付款方式为到付。晚上通过顺丰官网的快递查询到,下午17:32已经被快递员揽收(单号:SF1413968843540),23:31由北京顺航中转场发出。虽然为同城快递,但是考虑到正处于清明假期期间,一直在等待快递信息的更新。
4月3日上午9:47,经过咨询顺丰官方客服电话(95338),答复是48小时内如果找不到就认定为快递丢失,并且登记了商品的价值1360和索赔金额2000。但是48小时后顺丰并没有主动联系我。
4月6日上午10:00左右,再次拨通顺丰官方客服电话,答复是开始走索赔流程,再次确认了商品的价值1360元和索赔金额2000元。
4月7日,收到顺丰索赔经理的电话,需要提供商品价值的证明,本人按照要求提供了购买小票照片、微信转账截图和快递揽收前的商品照片。可以证明钥匙扣的单价为68元、总价为1360元。
4月8日,经过主动咨询顺丰官方客服电话(95338),从客服得到的赔偿方案:由于商品没有报价,只能赔偿运费的7倍即98元。本人答复是:对目前的赔偿非常不满意,要求按照之前登记的索赔金额2000赔偿。客服的回答:需要和公司反馈,后续有消息再联系。
4月9日,再次拨通顺丰官方客服电话,客服答复:当天处于非工作日,需要下周一才能给我确定的答复,但是
4月11日,截止到下午15:00还没有收到答复电话,已经在国家邮政局投诉网站登记投诉。
4月12日下午13:38,收到顺丰索赔经理的电话,目前的赔偿方案是原价值的50%即680元,我的回答是完全不能接受。猜测是在邮政局的投诉顺丰还没有开始处理,等一波消息。
丢件实践最终以快递员全额赔偿大结局。
由于快递没有报价,所以沟通起来比较被动,但是还是有切入点的。后续贵重物品发快递一定报价。
1、由于本人还是学生,没有经济收入,商品的丢失对我造成了重大的经济损失。
2、钥匙扣购买时是按照人头对应购买的,快递丢失本人无法和其他人解释,对本人的口碑和信用造成了极坏的影响。
3、快递的收费方式为到付,快递员揽收时并没有向我询问商品是否保价。
4、顺丰官方客服两次询问并登记了商品的价值1360和索赔金额2000,均没有提出异议,本人认为已经默许同意次赔偿方案。