diff --git "a/OpenCV/OpenCV 4.5.2 \345\217\221\345\270\203-2021-04-06.md" "b/OpenCV/OpenCV 4.5.2 \345\217\221\345\270\203-2021-04-06.md" deleted file mode 100644 index eaec62357005a0c3ddc77e64345e8efd5f98dac4..0000000000000000000000000000000000000000 --- "a/OpenCV/OpenCV 4.5.2 \345\217\221\345\270\203-2021-04-06.md" +++ /dev/null @@ -1,81 +0,0 @@ -**春季更新OpenCV 4.5.2发布了!** - -来看看4.5.2都有哪些重要改进: - -- **core模块**:增加并行后端的支持。特殊编译的OpenCV可以允许选择并行后端,并/或通过plugin动态载入。 -- **imgpro模块**:增加智能剪刀功能(如下演示)。CVAT标注工具已经集成此功能,可在线体验[https://cvat.org](https://cvat.org)。 - -- **videoio模块**:改进硬件加速的视频编解码任务。从4.5.2开始,新的内置属性让用户更容易使用API - -``` -VideoCapture capture(filename, CAP_FFMPEG, - { - CAP_PROP_HW_ACCELERATION, VIDEO_ACCELERATION_ANY, - } -); -``` - -- **DNN模块:** - - - 改进TensorFlow解析错误的调试 - - - 改进layers和activations,支持更多模型 - - - - 优化NMS处理、DetectionOutput - - 修复Div with constant、MatMul、Reshape(TensorFlow) - - 支持Mish ONNX子图、NormalizeL2(ONNX)、LeakyReLU(TensorFlow)、TanH(Darknet)、SAM(Darknet)和Exp - - - 支持*OpenVINO* 2021.3 release支持 - -- **G-API模块:** - - - Python支持 - - - - 引入新的Python后端:G-API可以运行Python的任意kernels作为pipeline的一部分 - - 扩展G-API Python绑定的推理支持 - - G-API Python绑定增加更多的图数据类型支持 - - - 推理支持 - - - - OpenVINO推理后端引入动态输入/CNN reshape功能 - - OpenVINO推理后端引入异步执行支持:推理可以在多个request并行运行以增加流密度/处理量 - - ONNX后端扩展对INT64/INT32数据类型的支持,OpenVINO后端扩展对INT32的支持 - - ONNX后端引入cv::GFrame/cv::MediaFrame和常量支持 - - - 媒体支持 - - - - 在绘制/渲染接口引入cv::GFrame/cv::Media支持 - - Streaming模式引入multi-stream输入支持以及帧同步以支持某些情况如Stereo - - 增加Y和UV操作以访问图级别cv::GFrame的NV12数据;若媒体格式不同,转换是同时的 - - - 运算符和核 - - - - 增加新操作(MorphologyEx, BoundingRect, FitLine, FindLine, FindContours, KMeans, Kalman, BackgroundSubtractor)的性能测试 - - 修复PlaidML后端的RMat输入支持 - - 增加Fluid AbsDiffC, AddWeighted和位操作的ARM NEON优化 - - - 其他静态分析和警告修复 - -- **文档:** - - - [GSoC]增加TF和PyTorch分类转换案例 - - [GSoC]增加TF和PyTorch分割转换案例 - - [GSoC]增加TF和PyTorch检测转换案例 - -- **社区贡献:** - - - core:增加带cuda stream标志的cuda::Stream构造函数 - - highgui:Win32上的OpenGL暴露VSYNC窗口属性 - - highgui:Win32上的pollKey()实现 - - imgcodecs:增加PNG的Exif解析 - - imgcodecs:OpenEXR压缩类型可选 - - imgproc:优化connectedComponents - - videoio:Android NDK摄像头支持 - - (opencv_contrib):腾讯微信QR码识别模块 - - (opencv_contrib):实现cv::cuda::inRange() - - (opencv_contrib):增加Edge Drawing Library中的算法 - - (opencv_contrib):Viz模块增加Python绑定 - -更多详细信息请参考: - -[https://github.com/opencv/opencv/wiki/ChangeLog#version452](https://github.com/opencv/opencv/wiki/ChangeLog#version452) \ No newline at end of file diff --git "a/OpenCV/OpenCV-Python\346\210\220\344\270\272\345\256\230\346\226\271OpenCV\351\241\271\347\233\256-2021-02-26.md" "b/OpenCV/OpenCV-Python\346\210\220\344\270\272\345\256\230\346\226\271OpenCV\351\241\271\347\233\256-2021-02-26.md" deleted file mode 100644 index f7a4b92c13cd05b353af9bdfbc1c5ad16028eed3..0000000000000000000000000000000000000000 --- "a/OpenCV/OpenCV-Python\346\210\220\344\270\272\345\256\230\346\226\271OpenCV\351\241\271\347\233\256-2021-02-26.md" +++ /dev/null @@ -1,15 +0,0 @@ -**好消息!曾为非正式但又广为流行的OpenCV-Python软件包现已成为官方OpenCV项目了!** - -OpenCV-Python是Python的一个预编译的只支持CPU的OpenCV包,使用pip install opencv-python便可在Windows、Linux(x86_64和aarch64)以及MacOS(x86_64)上安装Python的OpenCV。 - -此软件包包含预编译的OpenCV以及Python绑定,所以无需单独安装OpenCV。软件包的开发和维护者Olli-Pekka Heinisuo([https://github.com/skvark](https://github.com/skvark))同意将此方案转交给OpenCV成为官方项目。感谢Olli-Pekka Heinisuo和其他33名贡献者的工作。OpenCV团队目前正在针对最新的基于Apple M1的硬件提供支持。 - -非常高兴opencv-python、opencv-python-headless、opencv-contrib-python和opencv-contrib-python-headless终于“回家”了! - -更多OpenCV-Python信息: - -[https://github.com/opencv/opencv-python](https://github.com/opencv/opencv-python) - -新闻链接: - -[https://opencv.org/opencv-python-is-now-an-official-opencv-project/](https://opencv.org/opencv-python-is-now-an-official-opencv-project/) \ No newline at end of file diff --git "a/OpenCV/OpenCV\344\270\255\347\232\204\345\271\266\350\241\214\350\256\241\347\256\227parallel_for_(1)-2021-04-07.md" "b/OpenCV/OpenCV\344\270\255\347\232\204\345\271\266\350\241\214\350\256\241\347\256\227parallel_for_(1)-2021-04-07.md" deleted file mode 100644 index 33e5a4265b44cc314e353d8d24ccee63963581b7..0000000000000000000000000000000000000000 --- "a/OpenCV/OpenCV\344\270\255\347\232\204\345\271\266\350\241\214\350\256\241\347\256\227parallel_for_(1)-2021-04-07.md" +++ /dev/null @@ -1,167 +0,0 @@ -OpenCV中的parallel_for_为用户提供了快速并行化代码的途径。 - -先来看一个用parallel_for_并行化矩阵相乘的简单例子。这个例子是对输入为128x128x32进行核为3x3x64的卷积操作。 - -直接计算的代码如下: - -``` -void conv3x3(const Mat& inp, const Mat& weights, Mat& out) -{ - int out_cn = weights.size[0]; - int inp_cn = weights.size[1]; - int kh = weights.size[2], kw = weights.size[3]; - int inp_h = inp.size[1], inp_w = inp.size[2]; - int out_h = inp_h - kh + 1, out_w = inp_w - kw + 1; - int size[] = {out_cn, out_h, out_w}; - - CV_Assert( inp.size[0] == inp_cn && kw == 3 && kh == 3 ); - - out.create(3, size, CV_32F); - - for( int oc = 0; oc < out_cn; oc++ ) - for( int y = 0; y < out_h; y++ ) - { - int iidx[] = { 0, y, 0 }; - int widx[] = { oc, 0, 0, 0 }; - int oidx[] = { oc, y, 0 }; - - const float* iptr0 = inp.ptr(iidx); // &inp[0, y, 0] - const float* wptr0 = weights.ptr(widx); // &weights[oc, 0, 0, 0] - float* optr = out.ptr(oidx); // &out[oc, y, 0] - - for( int x = 0; x < out_w; x++ ) - { - float sum = 0.f; - for( int ic = 0; ic < inp_cn; ic++ ) - { - const float* iptr = iptr0 + x + ic*(inp_h*inp_w); // &inp[ic, y, x] - const float* wptr = wptr0 + ic*(kw*kh); // &weights[oc, ic, 0, 0] - - sum += iptr[0]*wptr[0] + iptr[1]*wptr[1] + iptr[2]*wptr[2] + - iptr[inp_w]*wptr[3] + iptr[inp_w+1]*wptr[4] + iptr[inp_w+2]*wptr[5] + - iptr[inp_w*2]*wptr[6] + iptr[inp_w*2+1]*wptr[7] + iptr[inp_w*2+2]*wptr[8]; - } - optr[x] = sum; - } - } -} -``` - -使用parallel_for_进行并行计算的代码如下: - -``` -void conv3x3_parallel(const Mat& inp, const Mat& weights, Mat& out) -{ - int out_cn = weights.size[0]; - int inp_cn = weights.size[1]; - int kh = weights.size[2], kw = weights.size[3]; - int inp_h = inp.size[1], inp_w = inp.size[2]; - int out_h = inp_h - kh + 1, out_w = inp_w - kw + 1; - int size[] = {out_cn, out_h, out_w}; - - CV_Assert( inp.size[0] == inp_cn && kw == 3 && kh == 3 ); - - out.create(3, size, CV_32F); - - // 用parallel_for_按ch进行并行计算 - parallel_for_(Range(0, out_cn), [&](const Range& r) - { - for( int oc = r.start; oc < r.end; oc++ ) - for( int y = 0; y < out_h; y++ ) - { - int iidx[] = { 0, y, 0 }; - int widx[] = { oc, 0, 0, 0 }; - int oidx[] = { oc, y, 0 }; - - const float* iptr0 = inp.ptr(iidx); // &inp[0, y, 0] - const float* wptr0 = weights.ptr(widx); // &weights[oc, 0, 0, 0] - float* optr = out.ptr(oidx); // &out[oc, y, 0] - - for( int x = 0; x < out_w; x++ ) - { - float sum = 0.f; - for( int ic = 0; ic < inp_cn; ic++ ) - { - const float* iptr = iptr0 + x + ic*(inp_h*inp_w); // &inp[ic, y, x] - const float* wptr = wptr0 + ic*(kw*kh); // &weights[oc, ic, 0, 0] - - sum += iptr[0]*wptr[0] + iptr[1]*wptr[1] + iptr[2]*wptr[2] + - iptr[inp_w]*wptr[3] + iptr[inp_w+1]*wptr[4] + iptr[inp_w+2]*wptr[5] + - iptr[inp_w*2]*wptr[6] + iptr[inp_w*2+1]*wptr[7] + iptr[inp_w*2+2]*wptr[8]; - } - optr[x] = sum; - } - } - }); -} -``` - -来运行一下 - -``` -int main(int argc, char** argv) -{ - const int inp_h = 128, inp_w = 128, inp_cn = 32; - const int out_cn = 64; - const int kh = 3, kw = 3; - - Mat inp, w, out_ref, out_curr; - gen_inp(inp_cn, inp_h, inp_w, inp); - gen_weights(out_cn, inp_cn, kh, kw, w); - - conv3x3(inp, w, out_ref); - conv3x3(inp, w, out_curr); - double t = (double)getTickCount(); - conv3x3(inp, w, out_curr); - t = (double)getTickCount() - t; - - double t2 = (double)getTickCount(); - conv3x3_parallel(inp, w, out_curr); - t2 = (double)getTickCount() - t2; - - printf("conv3x3 time = %.1fms\n", t * 1000 / getTickFrequency()); - printf("conv3x3_parallel time = %.1fms\n", t2 * 1000 / getTickFrequency()); - - return 0; -} -``` - -conv3x3和conv3x3_parallel在我的笔记本电脑上运行时间对比如下: - -![](./imgs/7.png) - -对比conv3x3和conv3x3_parallel的内部实现,基本相同,只是conv3x3_parallel代码中多了一句用parallel_for_按照输出通道的数量进行并行计算。parallel_for_根据用户计算机上的并行框架在其内部完成了代码的并行化,非常简便易用! - -使用parallel_for_的一个前提条件是OpenCV需要与并行框架一起编译。OpenCV中支持以下并行框架,并按照下面的顺序选取进行处理: - -- Intel TBB (第三方库,需显式启用) -- C=并行C/C++编程语言扩展 (第三方库,需显式启用) -- OpenMP (编译器集成, 需显式启用) -- APPLE GCD (苹果系统自动使用) -- Windows RT并发(Windows RT自动使用) -- Windows并发(运行时部分, Windows,MSVC++ >= 10自动使用) -- Pthreads - -在刚发布的OpenCV 4.5.2版本,增加了支持并行框架的选择。特殊编译的OpenCV可以允许选择并行后端,并/或通过plugin动态载入。如: - -``` -# TBB plugin -cd plugin_tbb -cmake /modules/core/misc/plugins/parallel_tbb -cmake --build . --config Release - -# OpenMP plugin -cd plugin_openmp -cmake /modules/core/misc/plugins/parallel_openmp -cmake --build . --config Release -``` - -第二个条件是所要完成的计算任务是适宜并可以进行并行化的。简言之,可以分解成多个子任务并且没有内存依赖的就容易并行化。例如,对一个像素的处理并不与其他像素的处理冲突,计算机视觉相关的任务多数情况下容易进行并行化。 - -参考资料: - -[1] [https://docs.opencv.org/master/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html](https://docs.opencv.org/master/d7/dff/tutorial_how_to_use_OpenCV_parallel_for_.html) - -[2] [https://github.com/opencv/opencv/wiki/ChangeLog](https://github.com/opencv/opencv/wiki/ChangeLog) - -[3] [https://github.com/opencv/opencv/pull/19470](https://github.com/opencv/opencv/pull/19470) \ No newline at end of file diff --git a/PaddlePaddle/PaddlePaddle2.1.0 Release Note-2021-05-19.md b/PaddlePaddle/PaddlePaddle2.1.0 Release Note-2021-05-19.md deleted file mode 100644 index e0a221f1ba167198f242ad13c4b1f63d1eb041e4..0000000000000000000000000000000000000000 --- a/PaddlePaddle/PaddlePaddle2.1.0 Release Note-2021-05-19.md +++ /dev/null @@ -1,148 +0,0 @@ -## 重要更新 - -飞桨框架2.1.0 版本有如下重要更新: - -- 环境适配: 增加了对Python 3.9、CUDA 11.2的支持;提供了对[ROCm平台](https://rocmdocs.amd.com/en/latest/)的支持(experimental);提供了对[昇腾AI处理器](https://e.huawei.com/cn/products/cloud-computing-dc/atlas/ascend-910)的支持(experimental);增加了可在[百度昆仑芯片](https://cloud.baidu.com/product/kunlun.html)上运行的模型数量;详情请见:[开始使用](https://www.paddlepaddle.org.cn/install/quick)。 - -- 分布式训练:在已有静态图的[多维混合并行](https://mp.weixin.qq.com/s/BblzcVn0NQ-QIhywvmoOuA)的基础上,新增动态图实现。 - -- 框架功能:完成了多项功能增强和性能优化,特别的,新增了以下重要功能: - - 自定义算子:提供了在框架外部自定义算子的新方案,简化了自定义算子写法与训练推理部署流程,详情请见:[自定义外部算子](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/guides/07_new_op/new_custom_op_cn.html)。 - - 新增inplace操作:新增可降低显存占用与提升性能的inplace操作,包括View策略,与12个inplace API。 - - 高层API相关:新增支持混合精度训练的高层API;新增通过`paddle.hub`来查看、共享、加载模型。 - - 自动混合精度训练优化: 优化了混合精度训练中slice、where、range等多个op的计算性能,提升了在MaskRCNN、ERNIE等模型上的加速效果。 - - oneDNN下BF16训练:新增支持了AMP(AutoMixedPrecision) pure_BF16模式; 新增支持了BF16类型的SGD和initializers初始值设定并减小了内存;新增支持了大部分word2vec BF16训练需要的前向和反向op。 - -飞桨的官方模型库和套件的最新更新请参见:[Paddle projects notes along with PaddlePaddle2.1](https://github.com/PaddlePaddle/Paddle/wiki/Paddle-projects-notes-along-with-PaddlePaddle2.1)。 - -## 不兼容升级 - -- 飞桨框架2.1放弃了对python2和python3.5的支持,建议您升级python到3.8版本来使用飞桨。飞桨框架2.1不再提供支持CUDA9的预编译包,建议您升级CUDA版本来使用飞桨。 -- 对API可见性的优化,会导致无法使用`from deeply_nested_namespace import *`的方式导入被认为是实现细节的位于最底层的命名空间中的私有API。建议您通过查看飞桨官网的[API文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/index_cn.html)说明来使用飞桨。具体的,以下行为在飞桨框架2.1版本中不再被允许。 - -## 训练框架 - -### 功能优化(含分布式) - -#### 基础API - -- 新增`paddle.dtype` 以及 `paddle.float32` 等数据类型,作为 paddle 内的数据类型。 ([#32012](https://github.com/PaddlePaddle/Paddle/pull/32012)) -- 新增`paddle.nn.functional.glu`。 ([#32096](https://github.com/PaddlePaddle/Paddle/pull/32096)) -- 新增`paddle.nn.utils.spectral_norm`。[#32633](https://github.com/PaddlePaddle/Paddle/pull/32633) -- 新增`paddle.Tensor.register_hook` API,用于在动态图场景中为前向Tensor对应的梯度Tensor注册hook函数。([#31775](https://github.com/PaddlePaddle/Paddle/pull/31775)) -- 新增`Tensor.__array__`函数,支持`numpy.array(Tensor)`和`numpy.asarray(Tensor)`将`paddle.Tensor`类型转换成`numpy.ndarray`类型 。([#32300](https://github.com/PaddlePaddle/Paddle/pull/32300)) - -#### 高层API - -- 新增`paddle.hub`功能,提供`help`、`list`和`load`函数用于查看和加载第三方模型,支持加载远程和本地repository。([#31873](https://github.com/PaddlePaddle/Paddle/pull/31873)) -- 支持混合精度训练,提供O0, O1, O2三种模式,分别对应FP32训练、自动混合精度训练、纯FP16训练。目前纯FP16训练仅支持静态图。([#31417](https://github.com/PaddlePaddle/Paddle/pull/31417)) -- 支持`paddle.Tensor`类型的图像变换,包括`normalize, to_grayscale, vflip, hflip, crop, center_crop, pad, rotate, resize`等算子 。([#32705](https://github.com/PaddlePaddle/Paddle/pull/32705)) - -#### 动态图转静态图 - -修复了动态图转静态图的bug: - -- 静态图`arange、range` API返回的shape与动态图不一致。 -- `paddle.to_tensor`在动转静中支持输入为`int,float,bool`基础类型。 -- for循环中支持解析dict推导式语法。([#32159](https://github.com/PaddlePaddle/Paddle/pull/32159)) -- 修复部分场景下嵌套控制流语句中存在变量未声明报错的问题。([#32153](https://github.com/PaddlePaddle/Paddle/pull/32153)) -- 修复了`expand` op缺少float16类型的bug。([#32238](https://github.com/PaddlePaddle/Paddle/pull/32238)) -- 修复了`expand_v2、tile、expand、expand_as、expand_as_v2、meshgrid`等6个OP反向梯度求解,当shape维度为6时,返回梯度信息为None的bug。([#32004](https://github.com/PaddlePaddle/Paddle/pull/32004)) -- 修复了`paddle.jit.TraceLayer.save_inference_model`接口中因未同时保存网络结构和参数导致与`paddle.static.load_inference_model`搭配使用不一致的问题。([#31989](https://github.com/PaddlePaddle/Paddle/pull/31989) ) - -#### 混合精度训练 - -- 动态图混合精度接口 auto_cast 中自动将不支持fp16 kernel的op保持为fp32计算。([#32543](https://github.com/PaddlePaddle/Paddle/pull/32543)) -- 修复静态图混合精度训练中因不支持FP16计算的Op列表(`unsupported_fp16_list`)统计不完整导致的意外报错问题,当前不支持FP16计算的Op列表可根据运行时环境自动生成。([#32102](https://github.com/PaddlePaddle/Paddle/pull/32102)) -- 优化`update_loss_scaling` for循环起多个相同cuda kernel问题,融合为一个cuda kernel。([#32554](https://github.com/PaddlePaddle/Paddle/pull/32554)) -- 优化`slice`多维情况下性能较慢问题。([#32266](https://github.com/PaddlePaddle/Paddle/pull/32266)) -- 优化`elementwise_add_grad`输入输出相同时的冗余拷贝问题。([#32051](https://github.com/PaddlePaddle/Paddle/pull/32051)) -- 优化`check_finite_and_unscale` for循环起多个相同cuda kernel问题,融合为一个cuda kernel。([#31954](https://github.com/PaddlePaddle/Paddle/pull/31954)) -- 优化`range`参数冗余拷贝问题。([#30811](https://github.com/PaddlePaddle/Paddle/pull/30811)) -- 优化`top_k_v2`在`input_width <= 1024`时性能较慢问题。([#30403](https://github.com/PaddlePaddle/Paddle/pull/30403)) -- 移植`where_index` CPU计算流程到GPU上完成。([#30601](https://github.com/PaddlePaddle/Paddle/pull/30601)) - -#### BF16训练 - -- 增加了初级 BF16 AMP 集成, 通过在前向网络中添加`cast op`来修改图使一些 operator 使用 BF16 kernel 。([#31093](https://github.com/PaddlePaddle/Paddle/pull/31093)) -- 增加了 BF16 `pure_mode`模式, 在此模式下,默认开启使用 BF16 数据类型的模型参数,BF16的operator,对于optimizer的BF16 decorator。([#32281](https://github.com/PaddlePaddle/Paddle/pull/32281), [#32681](https://github.com/PaddlePaddle/Paddle/pull/32681)) -- 增加了对于CPU flags的检查以确认是否支持oneDNN BF16性能提升。([#30551](https://github.com/PaddlePaddle/Paddle/pull/30551)) -- 对BF16支持进行过程统一。([#31034](https://github.com/PaddlePaddle/Paddle/pull/31034)) -- 增加了对于constant initilizer的BF16数据类型的支持。([#31935](https://github.com/PaddlePaddle/Paddle/pull/31935)) - -#### 分布式训练优化 - -- 加入图检索引擎,支持万亿边规模的分布式图神经网络存储、采样、训练([#31226](https://github.com/PaddlePaddle/Paddle/pull/31226))。 -- 加入基于索引的数据采样类,支持图、树深度匹配等模型的采样([#31696](https://github.com/PaddlePaddle/Paddle/pull/31696))。 -- 新增`paddle.distributed.send, paddle.distributed.recv,paddle.distributed.new_group,paddle.distributed.wait`,完善分布式通信API。([#32504](https://github.com/PaddlePaddle/Paddle/pull/32504), [#31682](https://github.com/PaddlePaddle/Paddle/pull/31682)) - -#### 自定义OP - -- 新增支持Mac平台上使用自定义OP功能。([#31976](https://github.com/PaddlePaddle/Paddle/pull/31976))。 -- Mac平台下支持C++/v11头文件目录的自动搜索功能,兼容本地可能存在多版本clang的情况。 -- 新增支持Op前反向函数Attribute参数以及inferShape, InferDtype函数输入参数使用const &类型。([#31588](https://github.com/PaddlePaddle/Paddle/pull/31588)) -- 新增支持在自定义Op实现时使用三种框架内部数据类型`paddle::complex64, paddle::complex128, paddle::float16`。([#31602](https://github.com/PaddlePaddle/Paddle/pull/31602), [#31657](https://github.com/PaddlePaddle/Paddle/pull/31657), [#31669](https://github.com/PaddlePaddle/Paddle/pull/31669), [#31725](https://github.com/PaddlePaddle/Paddle/pull/31725)) - -#### 模型保存与载入 - -- `paddle.save, paddle.load`支持Tensor的保存加载。([#31756](https://github.com/PaddlePaddle/Paddle/pull/31756)) -- `paddle.save, paddle.load`支持`list[Tensor]、dict[Tensor]、tuple[Tensor]`以及`list、tuple、dict`嵌套的包含Tensor的结构的保存加载。([#32446](https://github.com/PaddlePaddle/Paddle/pull/32446)) -- `paddle.save, paddle.load`支持Layer的保存加载。([#32446](https://github.com/PaddlePaddle/Paddle/pull/32446)) - -### 性能优化(含分布式) - -- 优化重点算子,提升多个模型单GPU训练性能,Deeplabv3+单卡FP32和AMP性能分别提升11%、72%,TSM单卡AMP性能提升44.5%,HRNet单卡FP32、AMP分别提升46%、51%。 -- 增加 `index_sample` CUDA实现。([#30380](https://github.com/PaddlePaddle/Paddle/pull/30380)) -- 实现`relu, leaky_relu`算子的CUDA Kernel,代替原Eigen实现,正反向共提升5% ~ 20%。([#31869](https://github.com/PaddlePaddle/Paddle/pull/31869), [#31841](https://github.com/PaddlePaddle/Paddle/pull/31841)) -- `temporal_shift` 性能提升20%~40%。([#31642](https://github.com/PaddlePaddle/Paddle/pull/31642)) - -## 推理部署 - -### 模型量化 - -- 新增支持将FP32模型保存为FP16模型。([#32112](https://github.com/PaddlePaddle/Paddle/pull/32112)) -- 重构动态图量化训练中统计输出量化信息模块,支持多Block和多分支的模型,增强通用性。([#31680](https://github.com/PaddlePaddle/Paddle/pull/31680) [#31710](https://github.com/PaddlePaddle/Paddle/pull/31710) [#31784](https://github.com/PaddlePaddle/Paddle/pull/31784) [#31861](https://github.com/PaddlePaddle/Paddle/pull/31861)) -- 动态图量化训练功能支持跳过量化OP,并且和预测端形成打通。([#31704](https://github.com/PaddlePaddle/Paddle/pull/31704)) - -### Paddle Inference - -#### 功能升级 - -- 发布C API (experimental), 功能与C++ API基本对齐。([#32225](https://github.com/PaddlePaddle/Paddle/pull/32225)) -- 重构Tensor 底层代码,与旧有 ZeroCopyTensor 数据结构解耦。此升级不涉及用户 API 改动,对用户透明。([#31402](https://github.com/PaddlePaddle/Paddle/pull/31402)) -- 预测框架python接口接入训练自定义算子。用户在训练过程中加载自定义算子后,即可像框架原生算子那样,通过 PaddlePredictor 直接执行包含此自定义算子的预测模型部署。([#32533](https://github.com/PaddlePaddle/Paddle/pull/32533)) -- 支持从内存加载模型时TensorRT序列化和反序列化功能。([#31342](https://github.com/PaddlePaddle/Paddle/pull/31342)) - -#### 性能优化 - -- 支持ERNIE量化模型在NV GPU上混合精度推理,其中MatMul以Int8精度计算,其他部分以FP16精度计算。相比纯FP16推理,在T4上batch size=40时,标准ERNIE模型在XNLI数据集上推理性能由1898 seq/s提升至2310 seq/s,提升17.8%。([#32232](https://github.com/PaddlePaddle/Paddle/pull/32232)) - -#### 易用性优化 - -- 用户开启TensorRT变长输入,输入shape超出限定范围时增加报错信息。([#32155](https://github.com/PaddlePaddle/Paddle/pull/32155)) -- 增加运行时TensorRT版本检查,若运行和编译时TensorRT大版本号不一致会以warning提示。([#32443](https://github.com/PaddlePaddle/Paddle/pull/32443)) -- 增加TensorRT VERBOSE级别log开关,用户可通过`export GLOG_v=3`开启TensorRT VERBOSE日志,打印更多调试信息。([#32459](https://github.com/PaddlePaddle/Paddle/pull/32459)) - -## 环境适配 - -### 编译安装 - -- 新增支持CUDA11.2编译,支持3070/3080/3090显卡架构的编译。([#31529](https://github.com/PaddlePaddle/Paddle/pull/31529)) -- 新增支持Windows Visual Studio 2017编译,并将发版、CI/CE、编译文档等各项配套设施,由VS2015全面升级至VS2017。([#311652](https://github.com/PaddlePaddle/Paddle/pull/31652)) -- 新增对cuda11.2镜像的支持。([#32531](https://github.com/PaddlePaddle/Paddle/pull/32531)) -- cuda10.1镜像支持gcc 5.4。([#32531](https://github.com/PaddlePaddle/Paddle/pull/32531)) -- 镜像中新增对python 3.9的支持。([#32385](https://github.com/PaddlePaddle/Paddle/pull/32385)) -- 修复`run_check`接口的bug,并在`run_check`接口里新增了对动态图的检查:现在`run_check`检测paddle安装的逻辑里,首先检测用户机器上是否有GPU,没有则报warning,未考虑安装cpu包的用户。([#32428](https://github.com/PaddlePaddle/Paddle/pull/32428)) -- 修复Windows系统上缺乏 symlink 方法的问题。([#31006](https://github.com/PaddlePaddle/Paddle/pull/31006)) - -### 新硬件训练支持 - -- 新增支持海光芯片:飞桨基于 ROCM 4.0.1 版本可以在海光CPU与DCU上进行模型训练与推理。已经验证支持图像分类、目标检测、图像分割、自然语言处理、推荐系统、视频分类与语音合成共计7个分类的36个模型。([#29342](https://github.com/PaddlePaddle/Paddle/pull/29342), [#30758](https://github.com/PaddlePaddle/Paddle/pull/30758), [#30639](https://github.com/PaddlePaddle/Paddle/pull/30639), [#31009](https://github.com/PaddlePaddle/Paddle/pull/31009), [#31077](https://github.com/PaddlePaddle/Paddle/pull/31077)) -- 新增支持昇腾芯片:支持在昇腾NPU上进行单机多卡训练。([#31957](https://github.com/PaddlePaddle/Paddle/pull/31957), [#32381](https://github.com/PaddlePaddle/Paddle/pull/32381), [#32197](https://github.com/PaddlePaddle/Paddle/pull/32197), ...) -- 昆仑硬件训练支持 - - 昆仑XPU支持动态图分布式训练。([#30455](https://github.com/PaddlePaddle/Paddle/pull/30455), [#30671](https://github.com/PaddlePaddle/Paddle/pull/30671)) - - 昆仑XPU支持fleet分布式训练。([#30858](https://github.com/PaddlePaddle/Paddle/pull/30858)) - - 昆仑XPU支持spawn启动多卡训练,优化XPU动态图多卡性能。([#31130](https://github.com/PaddlePaddle/Paddle/pull/31130)) - - 昆仑XPU静态图多卡支持fuse allreduce及gradient merge优化。([#31104](https://github.com/PaddlePaddle/Paddle/pull/31104)) - - 支持昆仑XPU暴露all_reduce/reduce集合通信API。([#32303](https://github.com/PaddlePaddle/Paddle/pull/32302)) - - 修复昆仑XPU动态图多卡随机hang住的bug。([#32662](https://github.com/PaddlePaddle/Paddle/pull/32662)) \ No newline at end of file diff --git "a/PaddlePaddle/WAVE SUMMIT 2021\351\243\236\346\241\250\344\271\235\345\244\247\345\205\250\346\226\260\345\217\221\345\270\203\357\274\214\346\225\262\345\223\215\344\272\247\344\270\232\346\231\272\350\203\275\345\214\226\345\215\207\347\272\247\346\234\200\345\274\272\351\237\263-2021-05-21.md" "b/PaddlePaddle/WAVE SUMMIT 2021\351\243\236\346\241\250\344\271\235\345\244\247\345\205\250\346\226\260\345\217\221\345\270\203\357\274\214\346\225\262\345\223\215\344\272\247\344\270\232\346\231\272\350\203\275\345\214\226\345\215\207\347\272\247\346\234\200\345\274\272\351\237\263-2021-05-21.md" deleted file mode 100644 index beba8e18bd279ba0f26ff65f33c770c806ee4540..0000000000000000000000000000000000000000 --- "a/PaddlePaddle/WAVE SUMMIT 2021\351\243\236\346\241\250\344\271\235\345\244\247\345\205\250\346\226\260\345\217\221\345\270\203\357\274\214\346\225\262\345\223\215\344\272\247\344\270\232\346\231\272\350\203\275\345\214\226\345\215\207\347\272\247\346\234\200\345\274\272\351\237\263-2021-05-21.md" +++ /dev/null @@ -1,25 +0,0 @@ -5月20日,由深度学习技术及应用国家工程实验室与百度联合主办的WAVE SUMMIT 2021深度学习开发者峰会在北京召开。飞桨框架进入2.0时代后,带来九大全新发布,包括飞桨核心框架V2.1、大规模图检索引擎、文心ERNIE四大预训练模型、推理部署导航图、硬件生态进展、开放云原生机器学习核心PaddleFlow,以及投入15亿资金、聚焦生态发展的飞桨“大航海”计划全面开启。飞桨持续引领深度学习技术发展和跨界科研突破,同时不断降低技术应用门槛,加速AI大生产,推动产业智能化进程。 - -飞桨以百度多年的深度学习技术研究和业务应用为基础,是中国首个开源开放、技术领先、功能完备的产业级深度学习平台。百度深度学习技术平台部高级总监马艳军现场发布了飞桨开源的最新进展。 - -今年初,飞桨正式发布了开源框架2.0版本,是飞桨发展历程中的重要里程碑。2.0版本默认的编程范式由静态图升级为动态图,而且实现了动静统一的设计,很好地兼顾了科研和产业的需求。目前,飞桨深度学习开源平台从基础模型库、端到端开发套件到工具组件,都基于框架2.0版本进行了升级,开发体验得到了全面提升。2.0版本的大规模训练能力持续突破,参数服务器技术迭代到第三代,是业内首个通用异构参数服务器架构。最近又发布了4D混合并行技术,支持超大模型训练。 - -此次峰会上,马艳军全新发布飞桨开源框架V2.1,自动混合精度、动态图、高层API等进行了优化和增强。尤其是自定义算子功能全面升级,降低开发者自定义算子的学习与开发成本,大幅提升开发灵活性。 - -分布式训练方面,发布大规模图检索引擎,支持万亿边的图存储和检索,大规模图模型训练架构支持网易云音乐等企业大规模应用落地。 - -模型套件方面,文心ERNIE全新开源发布 4大预训练模型,分别是多粒度语言知识增强模型ERNIE-Gram、超长文本理解模型ERNIE-Doc、融合场景图知识的跨模态理解模型ERNIE-ViL和语言与视觉一体的模型ERNIE-UNIMO。知识与深度学习相结合实现知识增强的语义理解,不仅仅能理解语言,还可以理解图像,实现统一的跨模态语义理解。 - -部署方面,飞桨提供全面的推理部署工具链,重磅发布推理部署导航图,其中已验证300多条部署通路,助力开发者打通AI应用的“最后一公里”。 - -硬件生态方面,从去年520峰会发布硬件生态伙伴圈到今天的一年时间里,飞桨已经和包括百度昆仑、英特尔在内的22家国内外硬件厂商开展适配和联合优化,已完成和正在适配的芯片或IP达到了31款。 - -百度AI产品研发部总监忻舟带来了飞桨企业版“一核两翼”AI开发双平台的全新升级,并宣布正式开放飞桨企业版的“核”——PaddleFlow,一个专为AI平台开发者打造的易被集成的云原生机器学习核心系统。 - -PaddleFlow提供了计算和存储资源管理与调度、作业执行与服务部署等AI开发平台核心能力,并提供灵活的用户接入和二次开发支持,具备云原生、性能优异、轻量易用等产业特色,助力AI平台开发者高效构建更多细分场景和深度定制的AI平台。 - -“两翼”中的EasyDL零门槛AI开发平台面向AI应用开发者,预置17种任务场景,通过端到端全流程的自动化建模与优化机制,极致提升AI应用开发效率,本次EasyDL带来了自动场景适配优化、模型自动化评估与辅助诊断两项新特性,不断提升细分场景的模型效果和模型优化迭代效率。 - -BML全功能AI开发平台面向AI算法开发者,提供灵活全面的建模方式,预置模型开发是BML最具特色的功能之一,它是一种基于预训练的低代码建模方式,集成了飞桨优秀的开发套件和工具组件,结合产业最佳实践,**优选出67套预置场景形成模型生产线,可节约80%左右的开发时间**,本次预置模型开发新增支持了机器学习任务并进一步丰富工具组件,满足更广泛的AI开发场景需求。 - -飞桨一系列的新发布和升级,让深度学习落地产业应用的门槛不断降低,持续助力工业大生产第一线。作为全面推动中国产业智能化的重要基石,飞桨在加快技术迭代创新的同时,也在不断加强产学研合作,构建日益繁荣的协同生态。 \ No newline at end of file diff --git "a/PaddlePaddle/\345\237\272\344\272\216\351\243\236\346\241\250\345\256\236\347\216\260\351\253\230\347\262\276\345\272\246\345\262\251\347\233\270\350\207\252\345\212\250\345\210\206\346\236\220\357\274\214\345\212\251\345\212\233\346\262\271\346\260\224\347\224\260\345\213\230\346\216\242\345\274\200\345\217\221\350\256\276\350\256\241-2021-05-24.md" "b/PaddlePaddle/\345\237\272\344\272\216\351\243\236\346\241\250\345\256\236\347\216\260\351\253\230\347\262\276\345\272\246\345\262\251\347\233\270\350\207\252\345\212\250\345\210\206\346\236\220\357\274\214\345\212\251\345\212\233\346\262\271\346\260\224\347\224\260\345\213\230\346\216\242\345\274\200\345\217\221\350\256\276\350\256\241-2021-05-24.md" deleted file mode 100644 index 0561fbe7b8ecf74a078c7614205f1ea3f83d4e46..0000000000000000000000000000000000000000 --- "a/PaddlePaddle/\345\237\272\344\272\216\351\243\236\346\241\250\345\256\236\347\216\260\351\253\230\347\262\276\345\272\246\345\262\251\347\233\270\350\207\252\345\212\250\345\210\206\346\236\220\357\274\214\345\212\251\345\212\233\346\262\271\346\260\224\347\224\260\345\213\230\346\216\242\345\274\200\345\217\221\350\256\276\350\256\241-2021-05-24.md" +++ /dev/null @@ -1,494 +0,0 @@ -# 概述 - -## 行业背景与痛点 - -岩相分析是以岩石薄片的微观描述和分类为基础的研究工作,也是沉积和成岩研究的一项重要技术,对于油气勘探开发的工程实践具有基础性指导地位。通过薄片分析矿物的比例、分布、质地、孔隙空间、胶结成分等因素,给后续的油气田开发方案设计作为保障提供了更好、更准确的手段。 - -工程实践中,大多数岩相分析依赖大量的地质学家使用显微镜,进行岩石薄片的目视检查,标准规范和时间紧迫之间的矛盾日益突出。总体来说,存在三个核心痛点:第一,人类专家面临大量繁重的重复性劳动,精力与效率的平衡问题无法忽视。同时,多位岩石学家共同工作,可能会出现分析不一致的情况。第二,由于分布在世界各地的油田,其地质特征、发育机理等因素存在差异,因此还需要充分考虑跨源识别这一重要因素。第三,现有自动化识别方法对于岩相覆盖范围仅针对若干个特定区块的几种类型;同时也不具备迁移能力。 - -## 项目价值 - -为了解决上述问题,我们采用专业的深度学习框架——飞桨,自动识别单张薄片的耗时约为0.03秒,并且面对大规模的工区数据时,不存在精力不足的问题。不同地区的薄片跨源分布问题,也可以通过基于大规模训练的模型进行优化,最终得到高精度的预测模型,精确预测不同地层、不同区块的分布差异。针对现有自动化方法覆盖范围小的问题,我们采取了大规模的模型训练,将岩相的类型覆盖到90%以上的常见岩相类型,并且覆盖到95%以上地质专业要求掌握的范围。未覆盖的岩相由于样本稀缺的因素未被纳入分析,但在后续的研究过程中也可以通过迁移的方法来优化。应用本方法不仅可以完成跨源大规模层级岩相分析工作,还可以加速和量化各类地质任务,提供基础性迁移基础。 - -# 实验过程 - -## 数据准备与分析 - -南京大学[1] 数据集,囊括了三大类岩石中的90%以上的常见岩石类型,共105种岩石类型进行分析。数据集一共由2634张图片组成,实验以8:2的比例将数据集随机划分成训练集与测试集。 - -``` -# 数据加载 -import paddle -import paddle.vision.transforms as T -def get_transforms(): - return T.Compose([ - T.Resize((224, 224)), - T.ToTensor(), - T.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)) - ]) - -def get_transforms_single(): - return T.Compose([ - T.Resize((224, 224)), - T.ToTensor() - ]) - - -# 基本参数配置 -train_parameters = { - "data_dir": "data/data57425", # 训练数据存储地址 - "num_epochs": 10, - "train_batch_size": 64, - "infer_img": 'data/data57425/sunflowers/14646283472_50a3ae1395.jpg', - - - "mean_rgb": [85, 96, 102], # 常用图片的三通道均值,通常来说需要先对训练数据做统计,此处仅取中间值 - - "input_size": [3, 224, 224], - "class_dim": -1, # 分类数,会在初始化自定义 reader 的时候获得 - "image_count": -1, # 训练图片数量,会在初始化自定义 reader 的时候获得 - "label_dict": {}, - "train_file_list": "train.txt", - "eval_file_list": "eval.txt", - "label_file": "label_list.txt", - "save_model_dir": "./save_dir/model", - "continue_train": True, # 是否接着上一次保存的参数接着训练,优先级高于预训练模型 - "image_enhance_strategy": { # 图像增强相关策略 - "need_distort": True, # 是否启用图像颜色增强 - "need_rotate": True, # 是否需要增加随机角度 - "need_crop": True, # 是否要增加裁剪 - "need_flip": True, # 是否要增加水平随机翻转 - "hue_prob": 0.5, } -``` - -## 数据增强预处理模块 - -原始数据集的单张样本存储空间约为1M,在保证图像信息的条件下进行压缩,既能让图片不损失特征信息,也能充分提高每个批次所能加载的样本数量减小模型的训练开销。采用数据增强技术以增加模型的鲁棒性。图1说明了数据增强的几种方式:首先将图片缩放成指定尺寸以供网络进行加载;进行随机裁剪策略使得样本的各个局部都可以在训练过程中呈现,增强模型对于图片局部的识别能力;以概率触发模式进行旋转、亮度、对比度、饱和度的调整来模拟实验图片在不同情况下都可以进行识别。 - -![](./imgs\14.png) - -使用缩放与随机裁剪来作为数据预处理方法。 - -``` -# 随机改变亮度 -def random_brightness(img, lower=0.5, upper=1.5): - e = np.random.uniform(lower, upper) - return ImageEnhance.Brightness(img).enhance(e) -# 对读入的图像数据进行预处理 -def transform_img_batchs(img):#批处理图片使用 - # 读入的图像数据格式是[B,H, W, C] - # 使用转置操作将其变成[B,C, H, W] - #img=transformer(img) - #img=image_augment(img) - constant = cv2.copyMakeBorder(img, 32, 32, 72, 72,cv2.BORDER_CONSTANT, value=0) - img = np.transpose(img, (0,3,1,2)) - - img = img.astype('float32') - - # 将数据范围调整到[-1.0, 1.0]之间 - img = img / 255. - img = img * 2.0 - 1.0 - return img - - -# 定义训练集数据读取器 -def data_loader(imgs_name,train_class_dict,path_dir=train_dir, batch_size=10, mode = 'train'): - # 将datadir目录下的文件列出来,每条文件都要读入 - def reader(): - if mode == 'train': - random.shuffle(imgs_name)# 训练时随机打乱数据顺序 - batch_imgs = [] - batch_labels = [] - for name in imgs_name: - filepath = os.path.join(path_dir, name) - img = plt.imread(filepath) - img = transform_img(img) - label=train_class_dict[name[:4]] - # 每读取一个样本的数据,就将其放入数据列表中 - batch_imgs.append(img) - batch_labels.append(label) - if len(batch_imgs) == batch_size: - # 当数据列表的长度等于batch_size的时候, - # 把这些数据当作一个mini-batch,并作为数据生成器的一个输出 - imgs_array = np.array(batch_imgs) - labels_array = np.array(batch_labels).reshape(-1, 1) - #images_aug = seq.augment_images(imgs_array) - #images_aug=transform_img(imgs_array) - #print(images_aug.shape) - yield imgs_array, labels_array - batch_imgs = [] - batch_labels = [] - - if len(batch_imgs) > 0: - # 剩余样本数目不足一个batch_size的数据,一起打包成一个mini-batch - imgs_array = np.array(batch_imgs) - labels_array = np.array(batch_labels).reshape(-1, 1) - #images_aug = seq.augment_images(imgs_array) - #images_aug=transform_img(imgs_array) - #print(images_aug.shape) - yield imgs_array, labels_array - - return reader -``` - -## 网络模块设计 - -为了提升模型的通道间特征信息能够在网络模型中充分的利用,MaSE-ResNext网络结构采用多模块嵌套设计,如图2。 - -![](./imgs/8.jpg) - -图2 MaSE-ResNext网络结构 - -- 主线模块: - - 输入样本后经过Conv模块,进行池化、 数量的BottleneckBlock层堆叠、池化、概率丢弃、重组特征形状、进入FC层、输出所属类型。 - -- Conv模块: - - 二维卷积计算后,进行批归一化; - -- BottleneckBlock: - - 三次Conv模块堆叠、SE模块、Short模块、Add模块; - -- SE模块: - - 池化层、挤压层FC、激励层FC、Rescaling层; - -- Rescaling层: - - 将SE模块的输入值与Rescaling层的输入值进行矩阵乘法运算; - -- Short模块: - - 判断Short模块输入属性是否采用Short策略,若答案为“是”,则输出Short模块的输入值,若答案为“否”,则进行Conv模块计算并输出; - -- Add模块: - - 将Short模块与SE模块的输出值进行矩阵加法,并将其结果作为BottleneckBlock模块的返回值。 - -``` -class BasicBlock(nn.Layer): - expansion = 1 - - def __init__(self, - inplanes, - planes, - stride=1, - downsample=None, - groups=1, - base_width=64, - dilation=1, - norm_layer=None): - super(BasicBlock, self).__init__() - # 判断是否为标准块 - if norm_layer is None: - norm_layer = nn.BatchNorm2D - - if dilation > 1: - raise NotImplementedError( - "Dilation > 1 not supported in BasicBlock") - # 定义计算操作 - self.conv1 = nn.Conv2D( - inplanes, planes, 3, padding=1, stride=stride, bias_attr=False) - self.bn1 = norm_layer(planes) - self.relu = nn.ReLU() - self.conv2 = nn.Conv2D(planes, planes, 3, padding=1, bias_attr=False) - self.bn2 = norm_layer(planes) - self.downsample = downsample - self.stride = stride - # 前向传播 - def forward(self, x): - identity = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - # 下采样 - if self.downsample is not None: - identity = self.downsample(x) - - out += identity - out = self.relu(out) - - return out -# 定义瓶颈块 -class BottleneckBlock(nn.Layer): - - expansion = 4 - - def __init__(self, - inplanes, - planes, - stride=1, - downsample=None, - groups=1, - base_width=64, - dilation=1, - norm_layer=None): - super(BottleneckBlock, self).__init__() - if norm_layer is None: - norm_layer = nn.BatchNorm2D - width = int(planes * (base_width / 64.)) * groups - # 定义计算操作 - self.conv1 = nn.Conv2D(inplanes, width, 1, bias_attr=False) - self.bn1 = norm_layer(width) - - self.conv2 = nn.Conv2D( - width, - width, - 3, - padding=dilation, - stride=stride, - groups=groups, - dilation=dilation, - bias_attr=False) - self.bn2 = norm_layer(width) - - self.conv3 = nn.Conv2D( - width, planes * self.expansion, 1, bias_attr=False) - self.bn3 = norm_layer(planes * self.expansion) - self.relu = nn.ReLU() - self.downsample = downsample - self.stride = stride - # 前向传播 - - def forward(self, x): - identity = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - out = self.relu(out) - - out = self.conv3(out) - out = self.bn3(out) - # 判断是否下采样 - - if self.downsample is not None: - identity = self.downsample(x) - - out += identity - out = self.relu(out) - - return out - -# 定义主线模型 - -class MSRNet(nn.Layer): - - def __init__(self, block, depth, num_classes=751, with_pool=True,dropout_p = 0.4): - super(MSRNet, self).__init__() - layer_cfg = { - 18: [2, 2, 2, 2], - 34: [3, 4, 6, 3], - 50: [3, 4, 6, 3], - 101: [3, 4, 23, 3], - 152: [3, 8, 36, 3] - } - layers = layer_cfg[depth] - self.num_classes = num_classes - self.with_pool = with_pool - self._norm_layer = nn.BatchNorm2D - - self.inplanes = 64 - self.dilation = 1 - - self.conv1 = nn.Conv2D( - 3, - self.inplanes, - kernel_size=7, - stride=2, - padding=3, - bias_attr=False) - self.bn1 = self._norm_layer(self.inplanes) - self.relu = nn.ReLU() - self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1) - self.layer1 = self._make_layer(block, 64, layers[0]) - self.layer2 = self._make_layer(block, 128, layers[1], stride=2) - self.layer3 = self._make_layer(block, 256, layers[2], stride=2) - self.layer4 = self._make_layer(block, 512, layers[3], stride=2) - self.dropout = nn.Dropout(dropout_p) if dropout_p is not None else None - self.batchnorm=nn.BatchNorm(2048) - self.sigmoid = nn.Sigmoid() - if with_pool: - self.avgpool = nn.AdaptiveAvgPool2D((1, 1)) - - if num_classes > 0: - self.fc = nn.Linear(512 * block.expansion, num_classes) - - def _make_layer(self, block, planes, blocks, stride=1, dilate=False): - norm_layer = self._norm_layer - downsample = None - previous_dilation = self.dilation - if dilate: - self.dilation *= stride - stride = 1 - if stride != 1 or self.inplanes != planes * block.expansion: - downsample = nn.Sequential( - nn.Conv2D( - self.inplanes, - planes * block.expansion, - 1, - stride=stride, - bias_attr=False), - norm_layer(planes * block.expansion), ) - - layers = [] - layers.append( - block(self.inplanes, planes, stride, downsample, 1, 64, - previous_dilation, norm_layer)) - self.inplanes = planes * block.expansion - for _ in range(1, blocks): - layers.append(block(self.inplanes, planes, norm_layer=norm_layer)) - - return nn.Sequential(*layers) - - - def forward(self, x): - x = self.conv1(x) - x = self.bn1(x) - x = self.relu(x) - x = self.maxpool(x) - x = self.layer1(x) - x = self.layer2(x) - x = self.layer3(x) - x = self.layer4(x) - - if self.with_pool: - x = self.avgpool(x) - if self.dropout is not None: - x = self.dropout(x) - if self.num_classes > 0: - x = paddle.flatten(x, 1) - x1=self.batchnorm(x) - x = self.fc(x1) - #x= self.sigmoid(x) - - return x1,x -``` - -# 实验结果与分析 - -图3为模型训练过程中的损失函数,随epoch的增加有减小的趋势。虽然在部分训练阶段出现了损失,没有下降甚至还有上升的趋势,但模型最终通过深化样本学习,克服了局部优化的陷阱,从而使损失进一步降低。 - -![](./imgs/9.jpg) - -图3 训练损失 - -![](./imgs/10.jpg) - -图4 训练精度 - -![](./imgs/11.jpg) - -表1 模型准确率 - -由于二级分类包含105个类别,其混淆矩阵太大。图5为三种主要岩石类型的一级分类混淆矩阵。 - -![](./imgs/15.png) - -图5 一级分类的混淆矩阵 - -通过分析错误分类的特征可以看出,伟晶岩和麻粒岩的样品分布特征具有很高的相似性。从图6可以看出,伟晶岩(abc)和麻粒岩(def)的单偏振光照片均为淡白色,呈斑点状。产生这种错误的原因是具有区域块结构特征的蓝色交叉偏振图像造成一定程度的干扰,这种干扰有产生错误的趋势。经验丰富的专家可以通过观察图像的特定特征来区分这些相似性,而神经网络可能会根据相似的样本分布进行错误的识别。 - -![](./imgs/13.png) - -图6 伟晶岩(abc)和麻粒岩(def)的误差分析 - -``` -# 定义训练过程 -iters_list=[] -train_acc_list=[] -train_loss_list=[] -val_acc_list=[] -triplet_loss_list=[] -val_acc=0 -iters = 0 - -def train_pm(model, optimizer): - # 开启GPU训练 - use_gpu = True - paddle.set_device('gpu') if use_gpu else paddle.set_device('cpu') - epoch_num = 140 - global iters_list - global train_acc_list - global train_loss_list - global val_acc_list - global triplet_loss_list - global val_acc - global iters - for epoch in range(epoch_num): - for batch_id, data in enumerate(triloss_loader()): - model.train() - x_data, y_data = data - #print(x_data.shape,y_data.shape,y_data) - img = paddle.to_tensor(x_data) - label = paddle.to_tensor(y_data) #[32, 1] - #print(img,label) - # 运行模型前向计算,得到预测值 - feature2048,logits = model(img) #[32, 751] - - #triplet_loss=Trihard_loss(feature2048,label,num_identities=16,num_instances=4) - ################# - triplet_loss=batch_hard_triplet_loss(feature2048, label, 0.8,64) - ################### - - loss = F.softmax_with_cross_entropy(logits, label) - #print(loss.shape) - avg_loss = paddle.mean(loss) - loss_all=avg_loss+triplet_loss - #print('avg_loss: ',avg_loss,'avg_triplet_loss: ',avg_triplet_loss) - acc = paddle.metric.accuracy(logits, label) - avg_acc=paddle.mean(acc) - if batch_id % 10 == 0: - print("epoch: {}, batch_id: {}, 《classifyloss is: {}》, 《Triple_loss is:{}》, 《classify_acc is: {}》".format(epoch, batch_id, avg_loss.numpy(),triplet_loss.numpy(),avg_acc.numpy())) - #print('P:',positive_loss,'N:',negtive_loss) - log_writer.add_scalar(tag = 'train_acc', step = iters, value = avg_acc.numpy()) - log_writer.add_scalar(tag = 'train_loss', step = iters, value = avg_loss.numpy()) - log_writer.add_scalar(tag = 'triloss', step = iters, value = triplet_loss.numpy()) - log_writer.add_histogram(tag='logits',values=logits.numpy(),step=iters,buckets=5) - log_writer.add_histogram(tag='feature2048',values=feature2048.numpy(),step=iters,buckets=30) - iters += 10 - iters_list.append([iters]) - train_acc_list.append(avg_acc.numpy()) - train_loss_list.append(avg_loss.numpy()) - triplet_loss_list.append(triplet_loss.numpy()) - val_acc_list.append([val_acc]) - # 反向传播,更新权重,清除梯度 - loss_all.backward() - #print('avg_loss.grad: ',avg_loss.grad,'triplet_loss.grad: ',triplet_loss.grad,'feature2048.grad: ',feature2048.grad,'loss_all.grad: ',loss_all.grad,'logits.grad: ',logits.grad) - optimizer.step() - optimizer.clear_grad() - model.eval() - accuracies = [] - losses = [] - for batch_id, data in enumerate(val_loader()): - x_data, y_data = data - img = paddle.to_tensor(x_data) - label = paddle.to_tensor(y_data) - # 运行模型前向计算,得到预测值 - feature2048,logits = model(img) - #print(logits) - #print('logits : ',logits.shape) - # 计算sigmoid后的预测概率,进行loss计算 - pred = F.softmax(logits) - loss = F.softmax_with_cross_entropy(logits, label) - acc = paddle.metric.accuracy(pred, label) - #print('pred = {},loss = {},acc = {}'.format(pred.shape,loss.shape,acc.shape)) - accuracies.append(acc.numpy()) - losses.append(np.mean(loss.numpy())) - #accuracies=np.array(accuracies) - val_acc=np.mean(accuracies) - lossess=np.mean(np.array(losses).reshape([-1,1])) - #print('accuracies = {},losses = {}'.format(accuracies.shape,losses.shape)) - print("$$-val>>>>>> 《loss is: {}》, 《acc is: {}》".format(lossess,val_acc)) - paddle.save(model.state_dict(), 'palm.pdparams') - paddle.save(optimizer.state_dict(), 'palm.pdopt') -``` \ No newline at end of file diff --git "a/PaddlePaddle/\351\243\236\346\241\250\346\250\241\345\236\213\345\234\250\345\234\260\345\271\263\347\272\277\345\274\200\345\217\221\346\235\277\347\232\204\351\203\250\347\275\262-2021-05-26.md" "b/PaddlePaddle/\351\243\236\346\241\250\346\250\241\345\236\213\345\234\250\345\234\260\345\271\263\347\272\277\345\274\200\345\217\221\346\235\277\347\232\204\351\203\250\347\275\262-2021-05-26.md" deleted file mode 100644 index 201ec9a07969c52780a2fea0513e029d91ea650d..0000000000000000000000000000000000000000 --- "a/PaddlePaddle/\351\243\236\346\241\250\346\250\241\345\236\213\345\234\250\345\234\260\345\271\263\347\272\277\345\274\200\345\217\221\346\235\277\347\232\204\351\203\250\347\275\262-2021-05-26.md" +++ /dev/null @@ -1,169 +0,0 @@ -随着人工智能技术的发展,深度学习的运用越来越广泛,除了理论、算法、框架不断推陈出新以外,AI已经被运用在生活的方方面面。“云侧训练,端侧推理”便是人工智能运用的主要方向之一,相比GPU昂贵的价格,使用飞桨框架(AI Studio)进行模型训练,并通过地平线开发板进行推理部署,成为了经济有效,拥有着巨大潜力的方案。同时,端侧的推理部署,也不会产生隐私收集等负面问题。 - -# 开发板与开发工具介绍 - -本次部署使用旭日3开发板,简称X3。它是地平线针对 AIoT 场景,推出的新一代低功耗、高性能的 AI 处理器,集成了地平线最先进的伯努利2.0 架构 AI 引擎(BPU),可提供 5TOPS 等效算力。BPU 架构极大提升了对CNN 网络架构的支持效果,降低了 AI 运算对 DDR 带宽的占用率。 - -开发工具是地平线 “天工开物” AI 开发平台,极大简化算法开发与部署过程,降低 AI 产品的落地成本。 - -# Paddle2ONNX介绍 - -Paddle2ONNX支持静态图和动态图模型转为ONNX格式,在飞桨框架升级2.0后,框架已经内置paddle.onnx.export接口,用户在代码中可以调用接口以ONNX协议格式保存模型。此外,用户已经保存的飞桨模型,也可以通过Paddle2ONNX加载后进行转换。 - -Paddle2ONNX支持多达88个Paddle OP算子。在转换过程中,支持用户指定转换为ONNX 1到12任意版本的模型,提升模型的适配能力。 - -它覆盖CV和NLP领域主流模型,不仅支持PP-YOLO这样模型新星的转换,还开始支持ERNIE这样NLP领域的王牌!它们均已支持转为ONNX进行部署,有需求的同学快去试试吧,更多详情请参考Paddle2ONNX的Github! - -# 开发流程 - -如下图1所示,通过飞桨框架训练好模型之后,使用Paddle2ONNX模块进行模型转化,通过地平线天工开物平台进行模型转化与校验,最终完成上板测试整个流程。 - -![](./imgs/16.png) - -# 模型训练与转化 - -飞桨高阶API对基础API进行了封装,模型调用与数据预处理几行代码就可以搞定,建议大家多多使用。 - -本次教程使用mobilenetv2进行分类。数据预处理的时候,模型标签是从1-102,但是深度学习标签都是从0开始。修改的方法为:需要把标签数直接减去1,这样标签数据对齐到0-101,可以直接训练,否则会报错,标签索引超出! - -使用百度的Paddle2ONNX工具进行转化,按照官方demo示例,加载模型,然后使用paddle.onnx.export接口进行转化。现在流行动态图,我们直接使用动态图操作方式进行。 - -``` -import paddle -from paddle.vision.datasets import Flowers -from paddle.vision.models import MobileNetV2,mobilenet_v2 -from paddle.vision.transforms import ToTensor,Compose, Resize, ColorJitter - -transform = Compose([Resize(size=[228,228]),ToTensor()])#预处理 -train_dataset = Flowers(mode='train',transform=transform) -#标签转换为0-101 -train_dataset.labels = train_dataset.labels-1 -test_dataset.labels = test_dataset.labels-1 - -mobilenetv2 = MobileNetV2(num_classes=102) #创建模型 -model = paddle.Model(mobilenetv2)#模型封装 -model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), - paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy()) -model.fit(train_dataset,eval_data=test_dataset,epochs=200,batch_size=64, -save_dir='Model/five',save_freq=1,verbose=1) -net = model.network#把模型从封装的Model中剥离出来 -net.eval()# 将模型设置为推理状态 -input_spec = paddle.static.InputSpec(shape=[1, 3, 224, 224], dtype='float32', name='image') -# ONNX模型导出 -# enable_onnx_checker设置为True,表示使用官方ONNX工具包来check模型的正确性,需要安装ONNX(pip install onnx) -paddle.onnx.export(net, 'mobilenet_v2', input_spec=[input_spec], opset_version=10, enable_onnx_checker=True) -``` - -# 模型校验 - -成功得到ONNX模型之后,我们需要把ONNX模型转化为板端部署文件,地平线提供了天工开物工具链,可以有效地对ONNX模型进行验证并转化。 - -**部署第一步**,使用工具链对ONNX模型进行校验,校验不通过的模型目前无法上板部署,需要调整算子或提交地平线开发人员进行算子支持升级!! - -工具链可在地平线生态社区获取:[https://developer.horizon.ai/resource](https://developer.horizon.ai/resource) - -![](./imgs/17.jpg) - -``` -model_type="onnx" -onnx_model="../../../01_common/modelzoo/mapper/classification/mobilenet/mobilenet_v2.onnx" -output="./mobilenet_checker.log" -march="bernoulli2" -hb_mapper checker --model-type ${model_type} \ - --model ${onnx_model} \ - --output ${output} --march ${march} -``` - -![](./imgs/18.jpg) - -图3 Check结果图 - -使用Checker 模型校验可以判断地平线BPU模块是否支持算子推理,这是模型上板的第一步。上图为校验结果,显示出算子的运行设备。 - -**第二步**是数据准备,从训练或测试集中选取50-100张图像作为校准图像。 - -**第三步**是使用makertbin工具把ONNX模型转化为半段推理的二进制bin文件。 - -``` -config_file="./mobilenet_config.yaml" -model_type="caffe" -# build model -hb_mapper makertbin --config ${config_file} \ - --model-type ${model_type} -``` - -Model-type为ONNX、Caffe等可选模型,config_file中包含了模型转化的各种参数,包括模型输入大小,节点名称,输入类型(此处非常重要,因为板端通常接入MIPI相机等,NV12的图像数据结构与训练使用的NCHW差别较大,大部分MIPI相机输入都需要增加转化节点),模型输出layout以及推理优先级(速度优先还是带宽优先)等,下图为转化推理文件的输出结果,模型的精度保持达到97.76%。 - -![](./imgs/19.png) - -图4 量化模型输出图 - -# 推理测试 - -使用天公开物工具链,调用上板测试模块: - -**构建应用:** - -``` -# parallel_process_num的设置,参考您的cpu配置,如果不设置这个环境变量,默认为单进程 -cd samples/04_detection/01_yolov2/runtime_arm -sh 01_build.sh -``` - -**数据预处理** - -``` -# parallel_process_num的设置,参考您的cpu配置,如果不设置这个环境变量,默认为单进程 -export PARALLEL_PROCESS_NUM=${parallel_process_num} -sh 02_preprocess.sh -``` - -处理好的图像将会用于后续的评测eval。 - -**将构建好的应用传到开发板** - -``` -sh 03_scp_to_board.sh ${board_ip} -``` - -执行这个命令,会将构建好的应用,通过scp,传输到开发板的 /userdata/samples/mobilenet 目录下。 - -若要执行单张图片的infer, 则可通过下面的代码操作远程登录开发板进行执行: - -``` -ssh root@${board_ip} -cd /userdata/samples/yolov2 -sh dev_board_01_infer.sh -``` - -**执行评测** - -``` -sh 04_eval.sh ${board_ip} -``` - -该脚本会将图片传输至板上进行运行和评测, 此过程将持续很久. - -**执行性能测试** - -``` -sh 05_perf.sh ${board_ip} -``` - -同时该操作也可从开发板上单独完成, 则可通过下面的代码操作远程登录开发板进行执行: - -``` -ssh root@${board_ip} -cd /userdata/samples/yolov2 -sh dev_board_03_perf.sh -``` - -![](./imgs/20.png) - -图5 速度验证与精度验证图 - -在测试集上获取70%左右的准确率,训练精度约为72.3%,保留了较高的精度,可以满足板端推理需求。 - -# 总结 - -飞桨高阶API可以快速有效地构建深度学习模型,地平线的天公开物开发板可以快速进行嵌入式开发部署,而且速度与精度都能得到有效的保证。百度飞桨和地平线的强强联合,进一步扩大了地平线芯片的算法生态,同时助力百度飞桨用户更好地进行多样化的AI部署。 \ No newline at end of file diff --git a/README.md b/README.md index 6885228b084bde9e27120c4ca280cdb7673a7b18..7f33ae5dda0295fc2699545489d051724882e11d 100644 --- a/README.md +++ b/README.md @@ -24,20 +24,6 @@ ## PaddlePaddle -### 2021-05-27 - -[飞桨模型在地平线开发板的部署-2021-05-26](./PaddlePaddle/飞桨模型在地平线开发板的部署-2021-05-26.md) - -### 2021-05-26 - -[WAVE SUMMIT 2021飞桨九大全新发布,敲响产业智能化升级最强音-2021-05-21](./PaddlePaddle/WAVE SUMMIT 2021飞桨九大全新发布,敲响产业智能化升级最强音-2021-05-21.md) - -[PaddlePaddle2.1.0 Release Note-2021-05-19](./PaddlePaddle/PaddlePaddle2.1.0 Release Note-2021-05-19.md) - -### 2021-05-25 - -[基于飞桨实现高精度岩相自动分析,助力油气田勘探开发设计-2021-05-24](./PaddlePaddle/基于飞桨实现高精度岩相自动分析,助力油气田勘探开发设计-2021-05-24.md) - ### 2021-05-24 [本周AI热点回顾:傅里叶变换取代Transformer,GPU上快7倍、TPU上快2倍;DeepMind新模型自动生成CAD草图-2021-05-23](./PaddlePaddle/本周AI热点回顾:傅里叶变换取代Transformer,GPU上快7倍、TPU上快2倍;DeepMind新模型自动生成CAD草图-2021-05-23.md) @@ -50,16 +36,10 @@ [微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力-2021-01-31](./OpenCV/微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力-2021-01-31.md) -[OpenCV-Python成为官方OpenCV项目-2021-02-26](./OpenCV/OpenCV-Python成为官方OpenCV项目-2021-02-26.md) - ### 2021-05-25 [用OpenCV实现条形码识别-2021-04-22](./OpenCV/用OpenCV实现条形码识别-2021-04-22.md) -[OpenCV中的并行计算parallel_for_(1)-2021-04-07](./OpenCV/OpenCV中的并行计算parallel_for_(1)-2021-04-07.md) - -[OpenCV 4.5.2 发布-2021-04-06](./OpenCV/OpenCV 4.5.2 发布-2021-04-06.md) - [用OpenCV实现超轻量的NanoDet目标检测模型-2021-03-17](./OpenCV/用OpenCV实现超轻量的NanoDet目标检测模型-2021-03-17.md) [OpenCV中单目标跟踪算法DaSiamRPN的C++实现-2021-03-09](./OpenCV/OpenCV中单目标跟踪算法DaSiamRPN的C++实现-2021-03-09.md)