自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 资源 (1)
  • 收藏
  • 关注

原创 pytorch distributed 分布式训练踩坑记录

pytorch distributed 分布式训练

2022-01-29 17:35:35 6441

原创 MNN量化源码解析

Int8量化流程收集激活值的直方图;基于不同的阈值产生不同的量化分布;然后计算每个分布与原分布的相对熵,然后选择熵最少的一个,也就是跟原分布最像的一个。MNN量化代码分析量化代码入口int main(int argc, const char* argv[]) { if (argc < 4) { DLOG(INFO) << "Usage: ./quantized.out src.mnn dst.mnn preTreatConfig.json\n";

2021-07-16 14:31:41 1719 2

原创 MNN源码阅读之模型转换

模型转换每一个开源框架,都有自己的模型格式,MNN中支持,CAFFE,TensorFLow,ONNX等格式的网络结构转换成mnn格式。为了方便大多都会将训练好的网络模型转成ONNX第三方通用的结构,这里主要分析mnn如何将ONNX的结构转换成自己支持的mnn格式。模型转换的流程:Created with Raphaël 2.2.0开始读取模型转换成mnn模型mnn模型写入文件结束0. onnx结构在此之前,需要先了解下onnx的结构。onnx最外层是model,包含一些基础信息,onnx版本,

2021-05-12 10:49:06 1057

原创 MNN源码阅读之推理流程(三)——Session run

之前两篇博客介绍了,Interpreter和Session的创建,接下来就是如何执行推理。1. 数据拷贝在执行推理之前,必然需要将图片数据拷贝到Session的input中,先来简单看下数据拷贝。1.1 输入MNN中的demo中加载图片以及normalize的代码如下。 auto dims = input->shape(); int inputDim = 0; int size_w = 0; int size_h = 0; int bp

2021-05-06 15:39:35 1023

原创 MNN源码阅读之推理流程(二)——创建Session

上篇博客中,了解了解释器Interpreter的创建(MNN源码阅读解析(一)——Interpreter),按照推理步骤,接下来就要创建Session。ScheduleConfig config;config.type = MNN_FORWARD_AUTO;auto session = net->createSession(config);可见Interpreter创建Session分为两个过程,创建Schedule配置信息根据配置创建Session0. 创建SessionS

2021-04-30 14:51:06 1180 1

原创 MNN源码阅读之推理流程(一)——Interpreter

根据MNN源码所提供的demo可以考出推理的流程。根据模型文件创建解释器Interpreter。根据ScheduleConfig配置创建会话Session。将数据填入session的input tensor中。run session。从output tensor获取推理结果。1. Interpreter先来看Interpreter的定义。class MNN_PUBLIC Interpreter {public: /** * @brief create net from

2021-04-28 16:30:04 1882

原创 代码优化技巧总结

有时代码逻辑相同,但是因为一些不同的书写习惯,性能会有很大的差距。总结为下面几种情况:for循环展开避免执行不必要的隐藏代码消除不必要的内存引用循环展开当循环次数巨大的时候,可以通过将循环内的操作展开的方式,减少循环次数。long a = 0;for (long i = 0; i < 1 << 20; i += 2){ a *= i * (i + 1);}需要做1<<20次累成的时候,我们一次计算i和i+1两次乘法运算,循环操作耗时远比乘法指令耗时更

2021-04-26 16:30:15 1820

原创 CDUA学习笔记(六)——流

锁页内存在前文中提到过通过cudaHostAlloc的方式申请锁页内存,锁页内存申请在物理内存上后,不会再被系统分页交换到磁盘上(虚拟内存),位置相对固定。GPU在是通过“直接内存访问(DMA)”的方式在主机和设备上来回复制内存,是不需要CPU的介入的。然而在复制内存的过程中CPU有可能更新操作系统的可分页表,移动可分页内存数据。GPU在复制可分页内存时,实际上是执行了两边复制操作,先把可分页内存复制到临时锁页内存内,然后再从临时内存复制到GPU设备上。如此可见,申请锁页内存是非常重要的。但是如果申

2021-04-02 13:49:10 409

原创 CUDA学习笔记(五)——原子性操作

说明原子性操作不是所有的显卡都支持的,只有算力在1.1及以上的才支持全局内存的原子操作,只有1.2及以上算力的才支持共享内存上的原子操作。由于显卡算力高的是低的一个超集,类似可理解为于高算力版本可以向下兼容。同时,在编译代码的时候,可以告诉nvcc编译器需要什么样的版本,nvcc -arch=sm_1.2即需要1.2算力版本的支持。如果不支持就需要考虑升级硬件了。原子操作原子操作的概念是由多部操作构成的一个操作集合,如果执行该操作集合,就必须全部执行,不能执行部分操作。如:x++;定义上述

2021-03-31 16:03:08 1108

原创 CUDA学习笔记(四)——常量内存&纹理内存

常量内存常量内存是用于存储代码执行期间不会发生改变的数据,其不同于全局内存,使用常量内存替换全局内存能有效的减少内存带宽。

2021-03-31 14:38:27 728 1

原创 CUDA学习笔记(三)——共享内存

在cuda设备端的内存包括,全局内存(global memory),共享内存(shared memory),纹理内存(texture memory),常量内存(constant memory)等。在我是小将的博文中,详细画出了内存的分布情况,很清晰,一目了然。全局内存,每个block中的thread都可以访问,可以用来存储和host端交互数据。这里主要来学习共享内存。共享内存共享内存在block内的线程都可以访问,但是不同的block不能互相访问。共享内存的存取速度非常块,极大程度上解决出现内

2021-03-30 16:49:59 2043 1

原创 CUDA学习笔记(二)——核函数简单例程

先看代码,再说细节。// kernel__global__ void plus_array(int *x, int* y, int* z, int len){ int index = threadIdx.x + blockIdx.x * blockDIm.x; if (index < len) z[index] = x[index] * y[index];}int main(){ int num = 1 << 20; int buff_size = num *

2021-03-30 10:56:39 1520

原创 CUDA学习笔记(一)——基础

CUDA架构众所周知,cuda可以做并行加速计算,具体怎么并行运算还要从其架构说起。首先,CUDA的程序分为两个部分,host端和device端,host端代码实在cpu上执行,device端代码则是在显卡芯片上执行。host端主要负责数据准备,讲准备好的数据拷贝到显卡芯片上,进行计算,再从显卡上拷贝最终计算结果。cpu在取显卡内存数据时,速度较慢,所以不能频繁从显卡拷贝数据,最好只拷贝一次最终的结果。device端架构在设备端架构主要由grid,block,thread三部分组成。threa

2021-03-29 11:26:14 479 2

原创 ffmpeg解码出现内存泄露

原因在用ffmpeg解码rtsp流的任务时,出现内存,泄露,每次打开流–读取一帧图片–关闭流,都会有10+M的内存泄露的现象。定位通过将解码过程中每个步骤一个个逐渐放开,看内存的增长情况。最终确定是解码的frame出现的内存泄露。while (!stop) { err_code = av_read_frame(i_fmt_ctx, &pkt); // ... ret = avcodec_send_packet(codecContext, &pkt); // ... whil

2021-03-04 16:09:07 3479 1

原创 Jetson NX安装docker

Docker安装步骤docker的安装可以参考官方的文档:https://docs.docker.com/engine/install/ubuntu/其中第三步的时候注意选择arm的库。nvidia-container-toolkit安装nvidia-container-toolkit的安装,可以直接使用apt-get。当出现packet无法解析的时候,是没有添加相应的源。jetson本机上已经有了相应的源,只是被注释掉了,路径是 /etc/apt/sources.list.d/nvidia-l4

2021-01-21 11:25:17 3659 3

原创 动态规划

第一遍刷了一些动态规划的题目,很多只能参考别人的思路后写出来的。但还是没有掌握动态规划的精髓,所以回过来重新来一遍,并记录一下解题思路,以及每道题目的优化的方法。题目:404. 一和零给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。普通解法dp数据定义定义dp[m+1][n+1],意义为当前有i个0,j个1时子

2021-01-05 09:18:52 166

原创 Jetson NX交叉编译踩坑记录

进行交叉编译时,依赖包最好在target机器上编译完成,再在host机器上交叉编译使用。依赖包如果在Host上使用交叉编译的方式,如果存在一些其他未知的依赖库,可能会导致,虽然编译完成,但依然无法加载。find_path /find_library NOTFOUND交叉编译toolchain.cmake设置如下SET ( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )SET ( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY ).

2020-12-25 14:37:55 2679 18

原创 C++学习——父类指针指向子类对象的问题

父类指针指向子类实例对象,对于普通重写函数时,会调用父类中的函数。而调用被子类重写虚函数时,会调用子类中的函数。这是因为子类中被重写的虚函数的运行方式是动态绑定的,与当前指向类实例的父类指针类型无关,仅和类实例对象本身有关。静态绑定发生在编译期,动态绑定发生在运行期;对象的动态类型可以更改,但是静态类型无法更改;在继承体系中只有虚函数使用的是动态绑定,其他的全部是静态绑定(成员变量也是静态绑定);2. 对象的动态类型可以更改,但是静态类型无法更改;class A{public: v

2020-11-27 09:39:30 2835

原创 【NG DeepLearning视频笔记】目标检测

目标检测标签y=[pc, bx, by, bw, bh, c1, c2, c3]^T其中pc表示是否存在目标(1:存在;0:反之)。bx,by表示目标中心点坐标,bw,bh表示目标宽高。c1,c2,c3表示是否属于对应类别。损失L(\hat{y}, y) = (\hat{y_1}, y_1)^2 + (\hat{y_2}, y_2)^2 + ... + (\hat{y_4}, y_4)^2 + ... + (\hat{y_8}, y_8)^2y1即pc,可以使用逻辑回归计算损失y2~y4,坐

2020-11-03 21:17:58 310

原创 linux常用脚本记录

路径判断#shell判断文件夹是否存在#如果文件夹不存在,创建文件夹if [ ! -d "/myfolder" ]; then mkdir /myfolderfi#shell判断文件,目录是否存在或者具有权限folder="/var/www/"file="/var/www/log"# -x 参数判断 $folder 是否存在并且是否具有可执行权限if [ ! -x "$folder"]; then mkdir "$folder"fi# -d 参数判断 $fold.

2020-10-20 10:09:25 280

原创 python ctypes记录

1. ctypes Enumfrom enum import IntEnumclass CEnum(IntEnum): @classmethod def from_param(cls, obj): return int(obj)class TaskType(CEnum): OBJ_DETECT = 0 OBJ_FEATU...

2019-11-13 16:06:18 249

原创 Flownet Demo调试

为了跑两张图片的光流图看看效果,在github上找了Flownet pytorch的这个代码(我不会说因为这个提供了测试demo的)。我的环境:ubuntu18.04python3.6pytorch0.3GTX1080ti首先按照他的提示installInstallation# install custom layerscd FlowNet2_srcbash install.s...

2019-03-25 21:49:25 1043

原创 linux常用命令记录

sudo 无法使用piphttps://www.linuxidc.com/Linux/2018-05/152231.htm

2018-09-29 21:32:12 141

原创 UBUNTU 安装caffe遇到的问题

UBUNTU 安装caffe遇到的问题在安装caffe的过程中,遇到了很多问题,网上都能找到答案,记录以下几个网上没有直接答案的问题。nvcc fatal : Unknown option ‘fPIC’nvcc本身不支持-fPIC编译参数,但是却提供了-Xcompiler 用途上,使用nvcc -h可以发现,这是提供了向低级编译工具(gcc)传递编译参数的功能,因此在编译.cu文件时...

2018-08-12 19:44:17 3789

原创 caffe的classification封装dll(遇到的坑)

无法解析的外部符号无法解析的外部符号 &quot;__declspec(dllimport) public: class std::basic_ostream&amp;lt;char,struct std::char_traits&amp;lt;char&amp;gt; &amp;gt; &amp;amp; __cdecl google::LogMessage::stream(void)&quot;的问题其中遇到了神奇的一幕,由于测试代

2018-08-08 10:34:30 1617

原创 caffe的classification封装dll

为了能在自己的项目中调用caffe框架,所以需要将caffe封装成dll。遇到了很多坑,没有随手记录的习惯,碰到的一些问题和解决方案不记得了,现在把整个过程记录一下。总之各种坑需要趴!因为本文只是使用CPU版的,所以添加了CUP_ONLY的宏定义。开始按照https://blog.csdn.net/sinat_30071459/article/details/51823390的方法进行编译...

2018-08-08 09:58:37 2093 3

原创 Pytorch学习笔记——Pytorch基础

废了不小的力气,把pytorch安装成功,网速不好,换到了清华的源,使用管理员身份运行,安装顺利完成。 使用以下代码测试,同时测试安装的CUDA和CUDNN是否可用。# CUDA TESTimport torcha = torch.Tensor([1.0])cu = a.cuda()print(cu)# CUDNN TESTfrom torch.backends import ...

2018-07-18 12:53:51 481

原创 常用工具下载地址管理

CUDA https://developer.nvidia.com/cuda-toolkit-archive

2018-07-17 15:59:36 314

原创 Kmeans C++实现

Kmeans.h#ifndef KMEANS_HPP#define KMEANS_HPP#include &amp;lt;iostream&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;cstdlib&amp;gt; #include &amp;lt;fstream&amp;gt; #include &amp;lt;sstream&a

2018-07-11 23:07:28 281

原创 Git使用笔记

Git代码维护的简单操作流程简单记录一下,使用git维护代码的流程;测试维护成功HHU4108下我自己的分支代码部分。首先要使用git维护代码要添加自己sshkey,首次添加的用户,需要现在本地生成自己sshkey。 #git bash下运行 ssh-keygen -t rsa -C &quot;[email protected]&quot; 在本地将会在C:\Users\Administrat...

2018-05-12 12:56:35 126

原创 openCV学习之accumulateWeighted方法

官方文档解释如下。 用于目标跟踪中的背景更新,然而在是这个方法的时候出现了错误: OpenCV Error: Assertion failed (func != 0) in accumulateWeighted,.。。。 这是应为方法参数src,dst的depth是有限制的,src.depth() == CV_8U && dst.depth() == CV_32Fsrc.dept

2016-08-16 18:25:28 6882

原创 numpy数组

numpy中的array

2016-08-08 15:09:08 331

原创 openCV for Python(一)——基础记录

本篇文章用于记录,经常使用的一些零碎的东西。 有些从大神博客上看到的做个记录,方便以后查询。 环境:Python2.7+opencv2.4.13import cv2

2016-08-08 11:35:36 515

原创 Python基础笔记

最近要用到一些Python的东西,开始学习一些基础东西,做以记录。Python特点总结

2016-05-20 21:19:30 325

原创 位运算符

位运算是按位或二进制数的一元和二元操作。 此中运算符主要包括: “&”按位与 “|”按位或 “^”按位异或 “~”取反 “<<”左移 “>>“右移

2016-05-13 10:43:58 376

原创 数字图象处理——滤波器(1)

滤波器的原理就是对一个领域(一块较小的区域),对该邻域包围的图像像素执行预定义操作,滤波产生一个新的像素,且坐标为邻域中心的坐标。滤波器的中心访问图像中每一个像素的位置,就产生了处理过的图像也就是滤波图像。简言之,选定要作用于目标位置的像素点(领域),按照一定的运算操作,把通过这些像素点得到的新的像素值赋给目标位置。

2016-04-26 12:25:03 712

原创 数字图象处理——仿射变换

在《数字图象处理》中提供了基于 图像仿射矩阵T。根据这些在自己实现时,可分为三个步骤:坐标转换,图像变换,坐标还原

2016-04-12 15:38:54 1877

原创 Opencv学习之零碎记录

cvRound, cvFloor, cvCeil函数 cvRound, cvFloor, cvCeil 用一种舍入方法将输入浮点数转换成整数。 cvRound 返回和参数最接近的整数值。 cvFloor 返回不大于参数的最大整数值。cvCeil 返回不小于参数的最小整数值。

2016-04-10 13:38:17 477

转载 C++学习——带默认值参数的函数

转载:http://www.360doc.com/content/13/0426/11/7044580_281031762.shtml# 我们可以赋予函数参数默认值。所谓默认值就是在调用时,可以不写某些参数的值,编译器会自动把默认值传递给调用语句中。默认值可以在声明或定义中设置;也可在声明或定义时都设置,都设置时要求默认值是相同的。关于默认值要注意几点:(1) .若在定义时而不是在声明时置默认值,

2016-04-10 13:23:18 847

转载 js ==与===区别(两个等号与三个等号)(转载)

==和===有区别

2016-03-17 10:58:47 426

gcc-4.8.5 和依赖的rpm

centos安装本地安装gcc需要的安装文件,解压到一个文件夹下, rpm -Uvh *.rpm --nodeps --force 安装即可

2019-09-26

空空如也

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

TA关注的人

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