自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

gaussrieman123的博客

Marking is Believing.

  • 博客(67)
  • 资源 (2)
  • 收藏
  • 关注

原创 为什么TensorFlow要使用图结构?

当我们说起TensorFlow,不可避免会提到图结构,为什么TensorFlow要用图结构呢?有什么好处呢?为了搞清楚这些问题,我们先从深度学习的计算过程说起。深度学习计算过程作为图像计算的一种,深度学习计算与其他图计算并没有什么本质的区别,输入图像,根据定义好的规则对图像进行计算,并输出计算结果,然后按照规则对计算结果,然后得到最终场景需要的结果。其中,这个规则就是由深度学习模型来定义,决定我们如何对图像进行一层层计算,并得到结果。我们稍微细化一下,从结果倒推,为了得到计算结果,我们至少需要什么?

2020-12-16 16:00:19 628 1

原创 从DistBelief看深度学习早期的并行化

从DistBelief看深度学习早期的并行化背景DistBelief是TensorFlow的前身,与TF的名扬天下如雷贯耳相比,DistBelief简直是不值一提,但是仔细琢磨就能发现,大部分深度学习框架的问题,在DistBelief里面就已经有了回答。其中就有今天要讨论的并行部分。一言以蔽之,深度学习,或者说机器学习,在工程上最大的难题就是满足大规模数据的要求。与摩尔定律相比,数据的爆发显然更令人惊讶,所以如何处理大规模数据,并从中学习到一个好的模型,是一个非常严肃的问题。大规模数据首先是大规模的

2021-01-12 17:05:23 1672

原创 CoreML 的 C++部署 [2] 模型类抽象

接上一篇CoreML 的 C++部署 [1] 模型转换和预处理再解决了预处理的问题后,部署部署还剩下模型类的抽象,主要包括初始化、推理以及获取输出。模型类的抽象什么是模型类?可以参考:CoreML模型分析我们是以MobileNetV2.mlmodel为例说明了mlmodel的结构。这里有一个预备知识,模型头文件中的类仅仅是对底层MLModel和MLFeatureProvider的封装。也就是说,每一个mlmodel,真正的实现是通过MLModel和MLFeatureProvider进行的,上层做

2020-12-31 11:11:07 787

原创 Core ML简史

背景深度学习是最新一波技术发展的最大增长点,随着研究的深入和算力的发展,深度学习也逐渐从论文走到了实际应用。由于现在我们仍然处于移动互联网的成熟期,手机仍然是今年最通用的计算平台,所以深度学习不可避免的也要跑在手机上,这是技术+时代的共同需求。为了应对这个需求,科技行业的巨头们都提出了自己的解决办法,2017年3月,Google就在TensorFlow的基础上开源了TensorFlow Lite,目标就是完成移动端深度学习计算。Google做这个事情是非常好理解的,因为TensorFlow太重了,不太可

2020-12-30 17:43:24 1571

原创 CoreML 的 C++部署 [1] 模型转换和预处理

背景当写下这个题目的时候,我是有疑问的。为什么要用C++来部署CoreML?是OC不香还是Swift不甜了?如此简单的CoreML模型部署,使用OC或者Swift几行代码就搞定的事情,非要整一个C++版本,实属想不通,是真的想不通。。。可能唯一能够理解的是,当模型推理只是一个很大的功能中的一部分,而这个功能又无法快速通过OC或者Swift搞定的时候,还是需要将整个模型推理部分下沉到C++中,与其他底层逻辑保持一致。简单来说就是为了满足程序架构的完整性,就牺牲了开发中的便捷性。但是如果是上面这个理由,

2020-12-29 10:54:51 1367

原创 CoreML模型分析

准备工作首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程;下载模型,如官方推荐的MobileNetV2将模型导入到工程中,并添加到你的编译项目中双击打开,会看到这么一个页面:然后点击 就可以进入到模型自动生成的头文件中:模型分析1.关键词@interface通过搜索关键词interface,我们可以得到三个结果:@interface MobileNetV2Input : NSObject@interface MobileNetV2Output :

2020-12-23 20:09:15 1443 2

原创 gRPC c++版本安装使用实录

背景gRPC作为google全家桶之一,拥有极高的传输效率,最近想把它加入到我们云端协议中去,提供高效的传输,解决进程间通信的问题。看着很诱人,但是用起来却不是那么简单,花了一些功夫才把完整的Demo给跑起来,也遇到不少问题,大部分与环境有关,少部分需要改一些代码,在此记录并分享一下,怕忘了。环境OS : macOS Catalina 10.15.7 (19H2)clang : Apple clang version 12.0.0 (clang-1200.0.32.27)protoBuf: 3

2020-12-08 17:31:30 3051 5

原创 Docker文件的存储位置

Ubuntu上docker文件的存储位置/var/lib/dockerMac 上docker文件的存储位置$HOME/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw和Ubuntu不同,在mac上,所有docker相关的文件都被保存到这一个文件中,默认大小是64GB,设置是在docker Desktop的Preferences/Resources中:...

2020-10-19 17:09:28 3034

原创 [续] TensorFlow + MKL 内存泄漏及解决办法

[续] TensorFlow + MKL 内存泄漏及解决办法背景之前就发现了tf+mkl的内存泄漏问题,当时给出的办法是不用mkl了,使用原版的TensorFlow C++动态库。这样内存确实不怎么泄漏了(实测还是会有一点点上涨),但是CPU上的性能也就没有了,毕竟已知在我们的机器上,mkl的4个线程单次推理能够比原版快一倍,从600ms降到300ms,相当可观的性能提升了。思来想去,还是要把这个坑填上。填坑之旅1.重燃希望本来已经不抱希望的,直到发现百度的paddle库中有一个issue说解决

2020-10-13 09:24:48 1182 6

原创 tfjs进行RGB-BGR转换的三种方法

变量定义var t_rgb; 原始RGB的tensorvar t_bgr; 目标BGR的tensor小结默认从frame数组构造的tensor的hwc格式的,所以我们先要将hwc格式转成chw格式,然后再去交换R和B通道的数据,这是从图像层面比较容易想到的过程,但是也比较复杂,方法1就描述了这个过程。然后我们可以注意到,实际上并不需要显示的CHW格式,我们要做的事情就是交换R和B的值,所以方法2直接在第三个维度去做split,然后重新组合成新的tensor即可。进一步,我们考虑一下宏观的信息,注

2020-08-05 15:30:17 826

原创 TensorFlow + MKL 内存泄漏及解决办法

TensorFlow + MKL 内存泄漏及解决办法背景最近在做深度学习在线推理相关的项目,底层使用TF来作为推断框架,我们知道,TF底层是用Eigen完成CPU的计算的,而Eigen的速度只能说一般般,与成熟的计算库在性能上的差距还是比较明显的,比如TF支持的intel MKL。之于如何使用TF+MKL,可以参考此文,其实就是在编译时加上--config=mkl选项,然后在生成可执行文件时链接libmkldnn.so, libmklml_intel.so, libimop5.so,就可以使用TF+

2020-06-08 20:32:24 1303 4

原创 TensorFlow c++ SessionFactory注册与No session factory registered错误

TensorFlow c++ SessionFactory注册与No session factory registered错误背景近期我们在服务器上使用TensorFlow来进行推理,作为云推理服务的基础。具体如何使用tensorflow c++库来进行推断可以参考之前的记录《从0开始使用tensorflow的c++库进行模型推断》。在经过一些demo的验证之后,我们开始在项目中正式使用TensorFlow的c++库,简单描述我们的用法:tensorflow作为最底层,上面有一层对推理框架的封装静态库

2020-05-27 16:34:01 1458 4

原创 java.library.path和LD_LIBRARY_PATH的介绍与区别

背景近期要将算法部署到一个机群的虚拟主机(Debian 9.1 gcc 6.3.0)上,采用的是Java + JNI + shared library的方式来完成底层算法能力的部署。其中需要用到各种第三方库,有从源码编译的,也有直接下载的so,包括OpenCV相关、TensorFlow相关、MKL以OpenMP相关的动态库。遇到一个问题,libmklml_intel.so 这个库只能放在 LD_LIBRARY_PATH中进行加载,而不能通过java.library.path完成加载,所以有必要搞清楚这

2020-05-21 15:11:10 9811

原创 从0开始使用tensorflow的c++库进行模型推断

背景之前我们一直用MNN来作为推断框架,且取得了不错的效果!近期要在服务器上跑一下模型,我们也顺理成章想到用MNN的GPU,主要是OpenCL和Vulkan,因为在Android手机上已经验证过这两个backend的可行性,所以认为在x86平台上也是顺水推舟的事情。然后就打脸了,而且是在项目快到期之前才发现这些问题:心慌意乱,然后只能赶紧用Tensorflow的c++库救急:主要内容...

2020-04-20 20:15:16 1547 1

原创 TensorFlow 源码阅读[0]

背景最近有一点时间,决定撸一撸TF的源码,知其然也希望能知其所以然,想从四个方面来学习:接口层设计以及C到各平台接口转换Graph编译和executor执行过程解析Ops和OpKernel的解析重点Kernel的实现解析网上没找到趁手的资料,只能硬着头皮写一写,一方面当做记录,另一方面也是一种鞭策和激励,希望能多写一点。1.TensorFlow 源码阅读[1] OpKernel的...

2020-04-10 21:46:54 276

原创 TensorFlow 源码阅读[1] OpKernel的注册

OpKernel介绍在TF的架构中,OpKernel是Ops和硬件的中间层,用来抽象统一各个硬件平台上的Kernel类和接口。注册过程我们首先大致列出OpKernel注册的过程,后面再详细分析,我们按照调用顺序,从上层往下说:在各个xxx_op.cc文件中调用REGISTER_KERNEL_BUILDER()调用OpKernelRegistrar的构造函数并在该构造函数中调用OpK...

2020-04-10 21:43:33 1486

原创 OpenCV Mat相关结构体详细介绍 [1]

class Mat 定义及其构造函数定义OpenCV最重要的数据结构,官方对Mat的定义是:Mat类表示的是一个n维的稠密的单通道或多通道的数值数组。定义是非常重要的,能把一个类的定义看明白,也就了解了它最重要的作用。我们看定义中的几个定语:n维的、任意通道的、稠密的、数值的。前面两个用来描述形状,说明Mat类几乎可以描述任意形状;“稠密的”主要是为了说明它并没对内存做特殊处理,如果你的目标...

2020-04-02 11:40:04 1314

原创 OpenCV Mat相关结构体详细介绍 [0]

背景众所周知,Mat是OpenCV最核心的核心数据结构,没有这个灵活高效的Mat,OpenCV也就没有了灵魂。作为一个初学者,只需要会简单用一下Mat当然就够了,但是作为一个有理想的程序猿,我们还是要挖掘挖掘,看看Mat里面还藏着什么宝藏。mat.hpp我们将目光投向OpenCV/modules/core/include/opencv2/core/mat.hpp,这个3600多行(v3.4...

2020-04-01 11:41:42 426 2

翻译 TensorFlow2.0的动态图和静态图切换 part 2

TensorFlow2.0的动态图和静态图切换 part 2在part1中,我们学习了如何使用tf.function将python函数转换成tf的静态图,也学习了转换时创建一个状态(tf.Variable)可能出现的问题以及解决办法。在第二部分,我们将尝试传入一个tf.Tensor,而不是tf.Variable,来确定转换是否和我们想象的一样。tf.function使用AutoGraph为...

2020-03-31 11:36:57 2605

翻译 TensorFlow2.0的动态图和静态图切换 part 1

TensorFlow2.0的动态图和静态图切换tf.function介绍动态图是tf2.0最引人注目的特征,大部分其他改动都是为了适应动态图。它允许将一部分python语法转换为可移植、高性能、语言无关的TensorFlow1.x语法,通过这种方式完成tf1.x静态库和tf2.0动态图的切换。尽管听起来很美好,但是tf.function还是有一些不为人知的细节值得我们注意,本文就是通过错误驱...

2020-03-30 11:47:58 6191 3

原创 深度学习应用开发架构的一种思路

深度学习应用开发架构的一种思路背景深度学习当下依然处在风口,它从一开始解决单一场景中单一问题的算法,逐步成长为能够解决复杂问题的效率工具。随着深度学习相关的各项技术的发展,对深度学习的要求也越来越具体:一方面是朝着小而快的方向发展,不断针对特定场景做深度定制优化、精简模型,将算法部署到到移动端甚至嵌入式设备;另一方面是朝着大而全的方向演进,目标是解决一些复杂但是通用的问题,这部分模型大多部署...

2020-03-25 14:22:23 453

原创 详解100行c11线程池 ThreadPool.h

介绍这个大神的100行实现c11线程池,真的是相当简洁给力,偶尔会在项目里面使用,但是老实说一直是迷迷糊糊,并不清楚具体实现细节,现在有空学习了一波,记录一下,方便以后查阅。ThreadPool.h#ifndef THREAD_POOL_H#define THREAD_POOL_H#include <vector>#include <queue>#inclu...

2020-03-12 17:49:49 1879 3

原创 google/mediapipe Demo

背景最近项目中要用到手势检测以及手势关键点追踪,回想起google的这篇文章“On-Device, Real-Time Hand Tracking with MediaPipe”,打不开这个的,也可以看“中文版”,给出的效果是这样的:看到demo图片很心动,就想试试。过程1.下载项目代码git clone [email protected]:google/mediapipe.git...

2020-01-14 19:50:02 8601 12

原创 从0开始使用TensorFlow.js进行深度学习推断

原因最近项目里面考虑要在微信小程序里面加上识别触发以及检测追踪的功能,所以需要调研一下在Web端进行深度学习前向的可行性。这个可行性主要包含两个方面,一是模型是否支持:能否从现有模型转换为tfjs支持的模型;二是性能:tfjs的前向推断效率是否能满足我们的需求。名词解释JavaScriptJavaScript通常简写为JS,是一种高级的解释性脚本语言,遵循ECMAScript标准。JS支持...

2019-11-19 14:48:37 1279

原创 Cook-Toom 算法做快速卷积

背景卷积是信号处理中的重要操作,在深度学习中更是重中之重,所以有必要对一些经典的快速卷积方法做一些了解。在查阅了若干资料后,对于Cook-Toom算法,以下简称CT算法,有了一定的了解,记录一下,便于以后查阅。卷积介绍由于这个算法比较经典,所以默认处理的是信号系统中的一维卷积,此文也是基于一维卷积对CT算法做一个介绍。一维卷积过程如下:给定信号f[n]以及滤波器g[m],则卷积过后的信...

2019-10-31 10:35:24 2233

原创 MNN 中的矩阵乘法

背景之前也写过sgemm,然后就想看看MNN是如何实现的,有没有什么可以借鉴的地方,看完之后发现MNN的实现也是简单的按行数据并行处理,记录一下。矩阵乘法矩阵乘法的目的是完成一个计算:C = A * B,其中A是h * k, B是k * w,所以C是h * w。常用的方式是分行处理,对于C的第一行,可以按如下方式处理:C(0,j) += A(0,i)*B(i,j)对于行主序矩阵,每...

2019-10-29 14:22:23 1033 1

翻译 ARMv8 Caches

ARMv8 cache 模型L1 cache是每个核心独有,L2 cache是每个簇共享, L3 cache是所有簇共享cache 术语tag是内存地址的一部分,保存在cache中,用来唯一标识主内存和cache line 之间的联系。一个cache line最高位的几位,是用来告诉cache这个信息是保存在内存什么地方,也被称作tag。总的cache大小是它能保存的所有数据的大小...

2019-10-24 16:34:39 1945

翻译 ARMv8 浮点及NEON指令集

通常,每个NEON指令都会导致n个指令并行执行!向量寄存器32个128位寄存器32个64位寄存器所有的寄存器都可以在任意时间被访问,且访问者不需要显式地在两种表示之间切换,指令会说明是使用64位还是128位寄存器形式。浮点寄存器标量与NEON标量就相当于是向量中的某一个lane,通过index获取。MOV V0.B[3], W0只会把w0的第一个字节拷到v0寄存器的第...

2019-10-23 15:32:21 5425 1

原创 MNN中的for循环并行Concurrency.h

for循环并行概念性的东西可以参考c++ 对for循环的并行优化例子,此文中使用多线程对for循环进行了优化,并提出可能遇到的一些问题。实际上for循环还有一种可用的优化方法是使用OpenMP来进行多线程的加速。OpenMp提供了对于并行描述的高层抽象,降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。实际在一些开源库当中,大多数都使用OpenM...

2019-10-12 15:15:18 904

原创 resize函数查表优化

接着https://blog.csdn.net/gaussrieman123/article/details/100153994写,对于输入输出图像大小已知,且通道数相同的resize操作,可以使用查表的方法来进行优化,先生成输出图像中每个点对应原图的位置,然后拷贝原图像素点到目标图像。这里的拷贝操作,也可以换成最邻近、插值等。创建表int createTable(int *table, i...

2019-10-12 11:39:25 805 3

翻译 cmake 使用Openmp

cmake版本3.9及以上find_package(OpenMP)if(OpenMP_CXX_FOUND) target_link_libraries(MyTarget PUBLIC OpenMP::OpenMP_CXX)endif()旧版本的cmakeif(NOT TARGET OpenMP::OpenMP_CXX) find_package(Threads REQU...

2019-10-12 11:31:46 6046

原创 OpenCV的resize函数优化

背景在使用OpenCV做图像处理的时候,最常见的问题是c++版本性能不足,以resize函数为例来说明,将size为[864,1323,3]的函数缩小一半:Mat img0; gettimeofday(&t4, NULL); cv::resize(source, img0, cv::Size(cols_out,rows_out)); gettimeofday(&...

2019-08-30 11:37:48 7185 9

原创 mxnet中的SoftmaxCrossEntropyLoss损失函数

在看mxnet的Loss函数源码的时候,发现SoftmaxCrossEntropyLoss的实现很有意思,记录一下。SoftmaxCrossEntropyLoss概念性的东西,可以参考此文p = softmax({pred})L = -\sum_i \sum_j {label}_j \log p_{ij}调用实例如下:import mxnet.gluon.loss as gloss...

2019-08-29 17:16:16 3226 1

原创 mxnet 学习率设置详解

学习率目前深度学习使用的都是非常简单的一阶收敛算法,梯度下降法,不管有多少自适应的优化算法,本质上都是对梯度下降法的各种变形,所以初始学习率对深层网络的收敛起着决定性的作用,下面就是梯度下降法的公式ω:=ω−α∗ααωloss(ω) \omega:=\omega - \alpha * \frac{\alpha}{\alpha \omega}loss(\omega)ω:=ω−α∗αωα​loss...

2019-08-13 15:42:22 2282 3

原创 AR内容平台介绍

IntroductionAR已经经过了一段时间的发展,有了VR的前车之鉴,AR行业一开始就显得冷静很多,不管是市场还是创业团队,都是在一步步探索和推进。抛开AR的技术不谈,AR的产品目前主要有3大类:一是硬件如AR眼镜、AR投影等;二是AR SDK,主要集中在移动端;三是AR云和平台。硬件发展慢且烧钱,所以肯做能做的不多;SDK成型快但是回报率低,各大SDK厂商很少能靠卖SDK赚到钱,且单一的S...

2019-07-19 17:42:48 2309

原创 aarch64 neon指令集拾遗

太常用就不列出了。读写指令读向量/浮点数ld1ld1 {v0.S}[0], [x0], #4从x0出读一个float数,存到v0寄存器的第一个通道,并将x0加4ld1 {v0.4S, v1.4S...}, [x0] 从x0处连续读入float,依次存到各个寄存器中ld1 {v0.8B, v1.8B}, [x0] ld1不仅可以读128位向量寄存器,也可以读64位向量寄存器,此时每个寄...

2019-07-16 16:40:42 4985

原创 阿里巴巴推断框架MNN在iOS上的使用小结

MNN介绍端侧智能现在已经不是新鲜话题,不管是从数据安全出发,还是从实时性能考虑,端侧深度学习算法推理都有其不可替代的优势。之前已经有一段时间的端侧推理框架热潮,google、Facebook、百度、腾讯、小米以及一些名气不大但是实力很强的小公司,都开源了自家的端侧推理框架,阿里MNN在18年年底开源,有后来居上的趋势和决心,不仅工程结构的完备性和规范性很好,开发团队和应用场景也有一定的优势。...

2019-07-03 11:17:34 5417 15

原创 堆破坏(heap corruption)常见原因

堆破坏堆破坏是比较常见的一种错误类型,一般属于偶发性bug。由于其偶发的特性,排查起来比较困难,可能尝试改了很多地方,问题还是存在,就会比较头疼,所以最好是能对症下药,主项排查,这样会更有效率,也能在debug时保持良好的心态。常见原因数组越界,这是最常见的原因char *stuff = new char[10]; stuff[10] = 3;强制转换到一个错误的类型未初始化的指针...

2019-06-17 14:32:11 11851

原创 在Ubuntu18.04上构建Halide

build halide on ubuntu18.04下载Halidehttps://github.com/halide/Halide使用LLVM和Makefile构建Halide1.打开 http://releases.llvm.org/download.html2.选择适合你机型的prebuilte库3.在环境变量中添加LLVMexport LLVM_CONFIG=<pa...

2019-05-14 15:57:27 1451

原创 Halide Lesson05: 向量化, 并行, 循环展开 以及 分块

Halide Lesson05: 向量化, 并行, 循环展开 以及 分块注意:Halide 默认图像按列存储 column first,x为内循环,y为外循环Func gradient("gradient");gradient(x, y) = x + y;gradient.trace_stores();打印gradient的所有中间结果。gradient.print_loop_ne...

2019-05-14 15:53:54 952

基于率失真优化的视频编码研究

基于率失真优化的视频编码研究

2016-10-09

264学习总结

2016-10-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除