热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PaddleOCR本地部署(安装,使用,模型优化/加速)

之前在服务器上要训练ppocr模型,所以需要额外安装PaddlePaddle,但是自己训练后已经把模型变成了推理模型,直接可以使用padd

之前在服务器上要训练ppocr模型,所以需要额外安装PaddlePaddle,但是自己训练后已经把模型变成了推理模型,直接可以使用paddleocr package这一个包来进行运行,所以在迁移到别的环境时候,可以不再进行paddlepaddle的安装。

参考:
和之前的文章:

文章目录

  • 🥞1. 安装
    • 1.1 还是需要paddle
    • 1.2 确认各种包和环境
    • 1.3 可能不需要paddle?
  • 🍤2. 使用
    • 2.1 配置摄像头,读取,识别,显示
    • 2.3 检测模型的问题
      • 2.3.1 换个模型
      • 2.3.2 限定检测位置
  • 🍳3. 性能改进
    • 3.0 基本情况
    • X 自己模型的速度和全用默认的速度对比
    • 3.1 端侧部署
    • 3.2 加速
      • 3.2.1 CPU下使用mkldnn加速
      • 3.2.2 修改参数
      • 3.2.3 内存泄露
      • 3.2.4 内存泄漏的问题记录
    • 3.3 剪枝
    • 3.4 其他可能的途径
      • 3.3 更换模型
      • 3.4 多进程
    • 3.5 cpu占用问题
      • 3.5.1 paddle绑定cpu问题
    • 3.6 推理部署文档


🥞1. 安装

1.1 还是需要paddle

根据:paddleocr package使用说明
一开始以为:

pip install "paddleocr>=2.0.1"

但是果然:
在这里插入图片描述
so就在本机安装一下paddle好了,但是也仅需要paddle,参考:快速安装

# windows下 直接 python 不是python3
python3 -m pip install paddlepaddle==2.0.0 -i https://mirror.baidu.com/pypi/simple

安装好再去运行,遇到经典的shapely错误,参考:Win10 CPU环境,OSError: [WinError 126] 找不到指定的模块
#212
在这里插入图片描述
windows下安装shapely,需要从这里下载,然后再

pip uninstall shapely
pip install Shapely-1.7.1-cp37-cp37m-win_amd64.whl
conda install shapely -c conda-forge

或者

更名为Shapely-1.7.0-cp39-cp39-win_amd64.rar,然后解压缩,从其子目录shapely\DLLs\中找到geos_c.dll,并将geos_c.dll拷贝到conda的环境(我的命名是ocr)目录 C:\Users\myusername\Miniconda3\envs\ocr\Library\bin中。问题解决
同时把geos.dll和geos_c.dll拷贝至你anaconda环境中的library\bin中

最简单的方案!!!
或者🍖(我直接选择了这个方案,成功!)

删除anaconda中之前装的shaply(文件夹和程序都删掉),重新安装,

参考:anaconda3+ paddleOCR安装使用

1.2 确认各种包和环境

本机上,使用了anaconda默认环境,各种版本如下:

  • python 3.7.6
  • paddleocr 使用pip安装后看到的版本是: paddleocr-2.0.6-py3

requirments文件中的内容:

shapely
scikit-image == 0.17.2
imgaug == 0.4.0
pyclipper
lmdb
opencv-python == 4.2.0.32
tqdm
numpys
visualdl
python-Levenshtein


1.3 可能不需要paddle?

根据paddleocr的FAQ文档

Q3.4.23:安装paddleocr后,提示没有paddle
A:这是因为paddlepaddle gpu版本和cpu版本的名称不一致,现在已经在whl的文档里做了安装说明。

但是参考:预测示例 (Python)
可知,想使用paddle系列的模型,是必须要使用paddle的inference的。

所以还是老老实实安装上paddle吧

🍤2. 使用

改改路径就好了。

其中有一点需要注意:

[[[[72.0, 149.0], [113.0, 151.0], [113.0, 166.0], [72.0, 163.0]], ('40', 0.7172388)],
[[[62.0, 170.0], [237.0, 175.0], [233.0, 300.0], [58.0, 294.0]], ('1076', 0.9666834)]]

可以看到输出文件的结构,每一个文本识别结果,都包括四个点的坐标,一个二位数组,以及一个最后识别结果的元组(识别的文字结果,置信度),结构就是一个数组涵盖这两部分内容。
如果是多个文本识别结果,会有再外层的一个数组。

2.1 配置摄像头,读取,识别,显示

参考另一个文章:python opencv调用摄像头识别并绘制结果

发现一个神奇的事情,当你插着usb摄像头启动电脑时,cap = cv2.VideoCapture(0),usb摄像头的序号就是0;当启动电脑之后再插上usb摄像头,usb摄像头的序号就是2(我的电脑是一个前置+一个后置摄像头)

关于摄像头参数的调节,可以参考另一篇文章:Opencv摄像头相关参数



2.3 检测模型的问题

由于使用了摄像头读取图像,图片背景比较杂,对检测有难度,发现使用DB效果不是很好。(由于还没怎么研究过检测模型,所以很难判断问题到底出在哪里)

2.3.1 换个模型

参考:
paddleocr文档
在这里插入图片描述
可以看到,其实EAST的准确率要比DB高,虽然存在过检。

EAST高效,准确,但对弯曲文本检测较差。

paddleocr.py文件中看到:

parser.add_argument("--det_algorithm", type=str, default='DB')
# 调用时修改为EAST,但是报错

在这里插入图片描述
然后看到代码中有:

SUPPORT_DET_MODEL = ['DB']
VERSION = 2.0
SUPPORT_REC_MODEL = ['CRNN']
BASE_DIR = os.path.expanduser("~/.paddleocr/")

结论:
发现下载的是预训练模型,不是推理模型,无法使用EAST算法。


2.3.2 限定检测位置

设置一个按键,opencv摄像头有键盘响应,可以有相应的操作,参考:cv2.VideoCapture.get、set详解可以获取相机参数。

另外,参考:opencv python全屏显示、置窗口大小和位置

cap=cv2.VideoCapture(1)cv2.VideoCapture.get(3) # CV_CAP_PROP_FRAME_WIDTH 在视频流的帧的宽度
cv2.VideoCapture.get(4) # CV_CAP_PROP_FRAME_HEIGHT 在视频流的帧的高度# 除了get,还有set
capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080); 宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960); 高度frame[top:bottom,left:right]

参考:python cv2图片剪裁

🍳3. 性能改进

3.0 基本情况

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
检测时间比较久,检测+识别的时间差不多是0.7~1.2s,在cpu机器上,其实比较尴尬。

先查看一下模型的size,运行检测的时候会打印出模型的配置信息,可以从这里看到

Namespace(cls_batch_num=6, cls_image_shape='3, 48, 192',
cls_model_dir='C:\\Users\\huangshan/.paddleocr/2.1/cls', cls_thresh=0.9, det=True,
det_algorithm='DB', det_db_box_thresh=0.3, det_db_thresh=0.2,
det_db_unclip_ratio=2.2, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2,
det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max',
det_model_dir='C:\\Users\\huangshan/.paddleocr/2.1/det/ch', drop_score=0.5,
enable_mkldnn=False, gpu_mem=8000, image_dir='', ir_optim=True, label_list=['0',
'180'], lang='ch', max_text_length=25, rec=True, rec_algorithm='CRNN',
rec_batch_num=6, rec_char_dict_path='C:/shaiic_work/ZhiNengKeJiOCR/digit.txt',
rec_char_type='ch', rec_image_shape='3, 32, 320',
rec_model_dir='C:/shaiic_work/ZhiNengKeJiOCR/rec_crnn_digit', use_angle_cls=False,
use_dilation=False, use_gpu=False, use_pdserving=False, use_space_char=True,
use_tensorrt=False, use_zero_copy_run=False)

采用的检测模型是自带的,位置在:det_model_dir='C:\\Users\\huangshan/.paddleocr/2.1/det/ch',检测模型只有3M
在这里插入图片描述
先确认一下这个默认模型的信息,从代码中可以看到:

'rec': {'ch': {'url':'https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar','dict_path': './ppocr/utils/ppocr_keys_v1.txt'},

ch_ppocr_mobile_v2.0_rec_infer.tar所以这个默认的模型目测已经是剪枝过的了。同时,参考:PP-OCR 2.0系列模型列表文档
在这里插入图片描述

识别模型是自己训练之后转为推理模型的,有94MB,确实对于比较简单的一块数字仪表识别很重。

X 自己模型的速度和全用默认的速度对比

上面已经给了几个自己模型的用时图,下面给几个全用默认的时间图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可知:
不使用mkldnn加速的情况下,使用默认的检测+自己的识别速度基本在0.7~1.2s
不使用mkldnn加速的情况下,使用默认的检测+默认的识别速度基本在0.7~0.9s
所以虽然识别时间本来就不到0.2s,但是可以变得更快,这样就只剩检测时间了基本上。
个人猜测,是不是第一阶段检测模型是剪枝后的,比如是8位精度,第二阶段识别模型也是8位精度,这样系统处理是一致的。
如果两个阶段数据精度不一样,系统处理的时候不一致,是不是也会造成数据差异。


3.1 端侧部署

参考文档:端侧部署
这种会帮助有效减小模型size,但是推理速度似乎没有强调会不会变快。

3.2 加速

直接去FAQ文档中搜索加速,可以看到以下结果.

Q3.1.73: 如何使用TensorRT加速PaddleOCR预测?
A: 目前paddle的dygraph分支已经支持了python和C++ TensorRT预测的代码,python端inference预测时把参数–use_tensorrt=True即可, C++TensorRT预测需要使用支持TRT的预测库并在编译时打开-DWITH_TENSORRT=ON。 如果想修改其他分支代码支持TensorRT预测,可以参考PR。
注:建议使用TensorRT大于等于6.1.0.5以上的版本。

另外,搜索速度,可以看到:

Q3.4.40: 使用hub_serving部署,延时较高,可能的原因是什么呀?
A: 首先,测试的时候第一张图延时较高,可以多测试几张然后观察后几张图的速度;其次,如果是在cpu端部署serving端模型(如backbone为ResNet34),耗时较慢,建议在cpu端部署mobile(如backbone为MobileNetV3)模型。

这里建议在cpu端部署mobile模型

也可以只看预测部署部分,还可以看到以下比较有用的信息:

Q3.4.1:如何pip安装opt模型转换工具?
A:由于OCR端侧部署需要某些算子的支持,这些算子仅在Paddle-Lite 最新develop分支中,所以需要自己编译opt模型转换工具。opt工具可以通过编译PaddleLite获得,编译步骤参考lite部署文档 中2.1 模型优化部分。


🍱Q3.4.2:如何将PaddleOCR预测模型封装成SDK
A:如果是Python的话,可以使用tools/infer/predict_system.py中的TextSystem进行sdk封装,如果是c++的话,可以使用deploy/cpp_infer/src下面的DBDetector和CRNNRecognizer完成封装


3.2.1 CPU下使用mkldnn加速

由于慢的地方主要是检测,所以即便对剪枝进行优化也不是很有效,所以这里先尝试使用mkldnn来进行加速。

Q3.1.77: 使用mkldnn加速预测时遇到 'Please compile with MKLDNN first to use MKLDNN’
A: 报错提示当前环境没有mkldnn,建议检查下当前CPU是否支持mlkdnn(MAC上是无法用mkldnn);另外的可能是使用的预测库不支持mkldnn, 建议从这里下载支持mlkdnn的CPU预测库。


Q1.1.10:PaddleOCR中,对于模型预测加速,CPU加速的途径有哪些?基于TenorRT加速GPU对输入有什么要求?
A:(1)CPU可以使用mkldnn进行加速;对于python inference的话,可以把enable_mkldnn改为true,参考代码,对于cpp inference的话,在配置文件里面配置use_mkldnn 1即可,参考代码
(2)GPU需要注意变长输入问题等,TRT6 之后才支持变长输入

直接在inference代码中将enable_mkldnn改为true,确实变快了一些。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之前是0.7~1.2,现在基本就是0.6-0.98,反正没有超过1s的,0.8的比较多。

3.2.2 修改参数

想起来还有一些参数可以考虑修改,比如:

parser.add_argument("--det_limit_side_len", type=float, default=960)

根据FAQ文档

Q3.3.2:配置文件里面检测的阈值设置么?
A:有的,检测相关的参数主要有以下几个:
det_limit_side_len:预测时图像resize的长边尺寸
det_db_thresh: 用于二值化输出图的阈值
det_db_box_thresh:用于过滤文本框的阈值,低于此阈值的文本框不要
det_db_unclip_ratio: 文本框扩张的系数,关系到文本框的大小
这些参数的默认值见代码,可以通过从命令行传递参数进行修改。

det_limit_side_len默认是960,考虑改成32的倍数,但是改小一些,比如320。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
det_limit_side_len改的再小一些,256,识别部分最大长度max_text_length=5,rec_image_shape=(3,32,256),之前默认是(3,32,320)。
很奇怪,一开始速度是0.6,后来逐渐稳定再0.8~0.9之间。打开内存任务管理器发现,这个东西内存占用可以达到98%????
我本机是32G的内存,无语。


另外,关于常见PaddleOCR包里给出的参数说明,参考:paddleocr package使用说明最后有一个参数说明表:
在这里插入图片描述
关于检测可控的参数有很多,但是关于识别,其实并没有很多可以进行调优的参数。

3.2.3 内存泄露

根据FAQ文档,

Q3.4.43: 预测时显存爆炸、内存泄漏问题?
A: 打开显存/内存优化开关enable_memory_optim可以解决该问题,相关代码已合入,查看详情。

可以看到这个代码的位置:
https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/tools/infer/utility.py#L153

Q3.4.17: 预测内存泄漏问题
A:1. 使用hubserving出现内存泄漏,该问题为已知问题,预计在paddle2.0正式版中解决。相关讨论见issue
A:2. C++ 预测出现内存泄漏,该问题已经在paddle2.0rc版本中解决,建议安装paddle2.0rc版本,并更新PaddleOCR代码到最新。

2021.6.3查看那个issue看到:
在这里插入图片描述
这个更新是26天前,查看自己的环境,似乎不是2.0rc,换。
在这里插入图片描述
所以虽然找不到paddle2.0rc版本,但是可以直接去下载2.1版本,开始使用

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 直接用这个会显示已经安装了2.0,所以需要
pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 更新到最新,就是2.1

在这里插入图片描述
改了之后,内存依然占用量很高,而且推理速度还变慢了。。。。都超过1s了,但是效果好像好了一些,连一些虚的都变好了。换成自带的识别模型之后,也比之前时间长了,无语。
但是更新到2.1之后,打开mkldnn,速度变快了,基本控制在0.3-0.5s。。。但是内存占用是100%基本上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
加速之后,超级快,但是内存占用非常高。

最后的结论
内存泄漏是因为开启了mkldnn,需要关闭。
同时cpu thread数量改为1,不然还是会有很高的内存占用率,同时改成1,其实速度影响并不大。


3.2.4 内存泄漏的问题记录

发现paddle的issue中有很多说速度很慢的:

  • 使用CPU下进行加速处理,但是识别的速度将近30S,请问有什么方法提高嘛? #2950
    这个用的是服务器端的模型,看到了server
    在这里插入图片描述
    还有关于PPOCRLabel也是自动标记过程中由快到慢:

  • 关于半自动标注工具PPOCRLabel运行速度由快逐渐变慢的问题 #1391
    在这里插入图片描述

  • 类似的也有:PPOCRLabel自动标注跑着跑着就自己闪退了 #2724

  • 有说版本变慢的:2.x版本比1.x版本慢2倍 #2630
    在这里插入图片描述

  • 还有识别时内存一直涨 溢出 #303
    在这里插入图片描述
    虽然这个issue关闭了,但是下面还是有人再报错。。。
    在这里插入图片描述


3.3 剪枝

在上面下载支持mlkdnn的CPU预测库的时候,看到了一个很有用的说明文档:https://paddle-inference.readthedocs.io/en/latest/index.html,就是针对paddle系列的推理模型的。

模型量化(主要就是剪枝)——X86 CPU 上部署量化模型

大概介绍一下,搬运

众所周知,模型量化可以有效加快模型预测性能,飞桨也提供了强大的模型量化功能。所以,本文主要介绍在X86 CPU部署PaddleSlim产出的量化模型。
对于常见图像分类模型,在Casecade Lake机器上(例如Intel® Xeon® Gold 6271、6248,X2XX等),INT8模型进行推理的速度通常是FP32模型的3-3.7倍;在SkyLake机器上(例如Intel® Xeon® Gold 6148、8180,X1XX等),INT8模型进行推理的速度通常是FP32模型的1.5倍。
X86 CPU部署量化模型的步骤:
产出量化模型:使用PaddleSlim训练并产出量化模型
转换量化模型:将量化模型转换成最终部署的量化模型
部署量化模型:使用Paddle Inference预测库部署量化模型

一开始其实不太想用剪枝的,因为慢的原因主要在于检测,但是检测的模型已经是剪枝后的了,在比较过全都使用默认的剪枝模型(检测+识别),和使用默认的检测+自己的识别模型之后,发现其实还是有些效果的。

但是相比于剪枝的代价,并不值得。

3.4 其他可能的途径


3.3 更换模型

https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/doc/doc_ch/models_list.md
在这里插入图片描述

3.4 多进程

FAQ-如何多进程运行paddleocr?

Q3.4.33: 如何多进程运行paddleocr?
A:实例化多个paddleocr服务,然后将服务注册到注册中心,之后通过注册中心统一调度即可,关于注册中心,可以搜索eureka了解一下具体使用,其他的注册中心也行。


Q3.4.44: 如何多进程预测
A: 近期PaddleOCR新增了多进程预测控制参数,use_mp表示是否使用多进程,total_process_num表示在使用多进程时的进程数。具体使用方式请参考文档。

parser.add_argument("--use_mp", type=str2bool, default=False)
# 只能命令行调用
# 使用方向分类器
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --cls_model_dir="./inference/cls/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=true# 不使用方向分类器
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=false# 使用多进程
python3 tools/infer/predict_system.py --image_dir="./doc/imgs/00018069.jpg" --det_model_dir="./inference/det_db/" --rec_model_dir="./inference/rec_crnn/" --use_angle_cls=false --use_mp=True --total_process_num=6

在这里插入图片描述
看了一下,其实这个文件https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/paddleocr.py和另一个PaddleOCR/tools/infer/utility.py文件内容很像,wheel包里的那个paddleocr.py其实就是这个utility.py文件的一部分内容的简化,方便调用而已。

3.5 cpu占用问题

之前又说内存泄漏,还有个问题就是CPU抢占,默认会占到100%。
很多人也有这样的问题,比如:百度AI社区-ppocr部分
在这里插入图片描述
在FAQ文档中没有搜索到相关信息,移动端arm cpu优化学习笔记第3弹–绑定cpu(cpu affinity)

查看自己电脑核数
win10系统如何查看cpu核数
在这里插入图片描述
所以我这个电脑是8核。

3.5.1 paddle绑定cpu问题

3.6推理部署文档里涉及了一点点,主要是:
Docs » Python API 文档 » Config 类 » 3. 使用 CPU 进行预测

后来想到PaddleOCR的代码中有:
在这里插入图片描述
主要是这里的infer文件夹中的五个脚本文件,关键就是搞清楚utility.pyconfig文件配置的项目都是怎么搞的。
由于人工找太累了而且还没找到,所以直接在代码里调试来查看:把调用ocr的附近打个断点,然后看输出的变量,里面就有ocr对象(PaddleOCR类)
在这里插入图片描述
然后就可以看到,有一个文本检测和文本识别
在这里插入图片描述
展开,可以看到大部分参数其实都是在文本检测那里配置的
在这里插入图片描述
文本检测配置了很多东西,但是并没有cpu相关的配置。


其实utility.py文件中,有一段代码,找到自己本机安装paddleocr的地方,C:\software\anaconda\Lib\site-packages\paddleocr\tools\infer,133行左右

if args.use_gpu:config.enable_use_gpu(args.gpu_mem, 0)if args.use_tensorrt:config.enable_tensorrt_engine(precision_mode=inference.PrecisionType.Halfif args.use_fp16 else inference.PrecisionType.Float32,max_batch_size=args.max_batch_size)
else:config.disable_gpu()# cpu设置的关键🧡 config.set_cpu_math_library_num_threads(6)if args.enable_mkldnn:# cache 10 different shapes for mkldnn to avoid memory leak# mkldnn设置的关键🧡 config.set_mkldnn_cache_capacity(10)config.enable_mkldnn()# TODO LDOUBLEV: fix mkldnn bug when bach_size > 1#config.set_mkldnn_op({'conv2d', 'depthwise_conv2d', 'pool2d', 'batch_norm'})args.rec_batch_num = 1

根据文档Docs » Python API 文档 » Config 类 » 3. 使用 CPU 进行预测说明,

在 CPU 可用核心数足够时,可以通过设置 set_cpu_math_library_num_threads 将线程数调高一些,默认线程数为 1

所以如果想要限制这个使用cpu的核数量,可以设置代码中

config.set_cpu_math_library_num_threads(6)
# 把6改成4好了

另外,由于启用了mkldnn,还是根据上面那个文档:

启用 MKLDNN 的前提为已经使用 CPU 进行预测,否则启用 MKLDNN 无法生效
启用 MKLDNN BF16 要求 CPU 型号可以支持 AVX512,否则无法启用 MKLDNN BF16

# 设置 MKLDNN 的 cache 容量大小
config.set_mkldnn_cache_capacity(1)

最后将cpu个数从6变成4,mkldnn从10变成5,需要重启电脑才生效,使用reload函数重新加载库似乎没什么用,关掉pycharm重新启动pycharm也没啥用。
但是检测速度又降低了。
而且重启电脑之后,第一次是控制在了50%左右,但是第二次再去进行的时候就不行了。

这是因为 python 把ppocr这个库缓存了,需要把它从 sys.modules 里删了再导入即可。
参考另一个博文:python3 reload

3.6 推理部署文档

paddle有很多关于推理部署的专门的文档,其实可以看看。
推理部署
在这里插入图片描述
这附近文档还有个图,感觉不错
在这里插入图片描述


另外,从官网这里可以切到文档:Python预测部署示例
在这里插入图片描述
还找到了一个使用Paddle inference进行口罩检测推理的:
(二) 使用 Paddle Inference进行口罩检测


推荐阅读
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 教程:使用Source Monitor进行代码质量分析
    Source Monitor 是一款强大的代码分析工具,能够对 Java、C++、C、C# 和 Delphi 等多种编程语言进行复杂度分析,帮助开发者有效评估和提升代码质量。通过详细的指标和报告,该工具可辅助团队识别潜在问题并优化代码结构。 ... [详细]
  • 【高效构建全面的iOS直播应用】(美颜功能深度解析)
    本文深入探讨了如何高效构建全面的iOS直播应用,特别聚焦于美颜功能的技术实现。通过详细解析美颜算法和优化策略,帮助开发者快速掌握关键技术和实现方法,提升用户体验。适合对直播应用开发感兴趣的开发者阅读。 ... [详细]
  • 本文详细介绍了在Windows操作系统上使用Python 3.8.5编译支持CUDA 11和cuDNN 8.0.2的TensorFlow 2.3的步骤。文章不仅提供了详细的编译指南,还分享了编译后的文件下载链接,方便用户快速获取所需资源。此外,文中还涵盖了常见的编译问题及其解决方案,确保用户能够顺利进行编译和安装。 ... [详细]
  • Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py
    关键字:Windows、cpu模式、Python、faster-rcnn、demo.py声明:原文发表在博客园,未经允许不得转载!!!本篇blog过程已经多名读者实践验证,有人反馈报错TypeEr ... [详细]
  • 在 Windows 10 系统下配置 Python 3 和 OpenCV 3 的环境时,建议使用 Anaconda 分发版以简化安装过程。Anaconda 可以从其官方网站(https://www.anaconda.com/download)下载。此外,本文还推荐了几本关于 Python 和 OpenCV 的专业书籍,帮助读者深入理解和应用相关技术。 ... [详细]
  • 深入解析经典卷积神经网络及其实现代码
    深入解析经典卷积神经网络及其实现代码 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 使用 MyEclipse 和 TestNG 测试框架在 Java 中高效进行单元测试
    通过MyEclipse集成TestNG测试框架,可以在Java开发中高效地进行单元测试。本文介绍了在JDK 1.8.0_121和MyEclipse 10.0离线环境下配置和使用TestNG的具体步骤,帮助开发者提高测试效率和代码质量。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 如何构建和部署C# Windows服务应用程序
    本文介绍了如何从零开始构建和部署C# Windows服务应用程序。通过详细步骤和代码示例,帮助读者掌握创建、配置和部署Windows服务的关键技术点,适合初学者和有经验的开发人员参考。 ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • TensorFlow基础知识深化讲解
    批标准化批标准化(batchnormalization,BN)是为了克服神经网络层数加深导致难以训练而诞生的。深度神经网络随着深度加深,收 ... [详细]
  • [191]python3.6下scrapy框架的安装
    首先考虑使用最简单的方法安装pipinstallscrapy命令安装,提示FailedbuildingwheelforTwistedMicrosoftVisual ... [详细]
author-avatar
吃碰杠和_338
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有