自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 cuBLAS gemv调用

使用cuBLAS做行优先矩阵的矩阵乘(https://blog.csdn.net/weixin_52027058/article/details/136652593)在上面文章基础上补充下gemv的例子。

2024-12-04 17:22:37 182

原创 一个基于c++11的多线程池实现(std::thread)

需求分析任何一个对性能有所要求的程序中,多线程是个绕不过去的优化手段。直接使用多线程并不能完全的发挥其作用。假设某个算法的pipeline有N个模块M1,M2,M3,M4…MN。首先若直接使用多线程技术,会导致我们在每个模块中都要重复一遍创建线程的操作,从而影响总体性能。其次在这种重复创建线程的情况下也有可能会导致线程进入睡眠状态,而无法快速的利用CPU资源。所以由线程池统一的安排线程创建和调度就显得很有必要。再考虑更复杂点的情况。M1到M5是需要多线程来加速,M6到M10不需要,随后M11到16

2021-07-19 15:25:38 1403 10

原创 【OpenCL】求矩阵所有元素的和——归约算法

任务分析矩阵内求和任务在GPU上实现并不直观。假设每个线程load一个数据并累加到最后的结果标量中,这样的处理过程会使得整个任务退化到串行处理。原因是同一时刻只有一个线程可以操作目的标量,其他线程只能等待。解决此类问题可以套用归约算法。若读者对这个问题感兴趣,请先对归约算法有个大概的了解。下文不会介绍基本概念,主要是讨论实现细节和优化点。归约算法1(reductionInner)归约可以分为两个层次。一个层次是kernel层面的。在下图中需要对一维的数据求和,假设整个数组是在同一个group中,自然

2020-09-19 14:22:03 2109

原创 PC下通用矩阵乘优化(近30倍性能提升)

通用矩阵乘的十种实现(intel平台)前言在intel平台上对矩阵乘进行优化,主要依靠内存排布(for cache friendly)、SIMD(SSE)、多线程等方法。A,B,C矩阵大小分别为MK,KN,MN。性能数据为M=N=K=1024下循环T次下的平均性能。下面给出公式和示意图,可以对照着理解代码。Cm,n=∑n=1KAm,k∗Bk,nC_{m,n}=\sum_{n=1}^KA_{m,k}*B_{k,n}Cm,n​=n=1∑K​Am,k​∗Bk,n​v0.严格按照定义的实现完全按照数学定

2020-06-08 22:20:50 1537

原创 C++框架设计 【2-更优雅的创建对象】

任务上一章中我们是用下面的代码来完成对象的创建的。这段代码并没有什么问题,每次新增一个层的时候在此处添加即可。不过还是可以有更优雅一些的实现。LayerBase *LayerFactory(string classname){ if (classname == "conv") return new LayerConv(); else if (classname == "pooling") return new LayerPooling(); else if (classname == "

2020-05-21 08:36:42 405

原创 C++框架设计 【1-加载CNN模型】

用到的设计模式:1.工厂模式。根据层的类型创建对应的对象。2.策略模式。固化运行网络流程中固定的部分。不用json用用test为了没有依赖库

2020-05-18 23:30:17 834

原创 C++框架设计【0-开篇】

为什么要设计不得不说对程序员来说这是个好时代。即使国内的程序员保质期时间不比国外,且总是绕不过诸如““”996”这样的话题。但是总的来说这确实是个好时代,因为开源已经成为一种潮流。对新人来说,可以用“轮子”来解决自己遇到的问题,还可以单纯的学习大神们的杰作来提升自己的能力。对高阶的程序员来说,参与大型开源软件的设计和开发或者有自己发起的广为人知的开源软件,既可以给自己在业内提升知名度(在这个流量、眼球经济时代似乎没有什么比此更重要的收益了)又能满足程序员们自身对想要做点什么牛逼的东西的渴望。至于各类拥抱

2020-05-18 23:25:26 882

原创 消除图像处理中的光照不均(matlab版)

步骤1.进行最大(最小)值滤波初步得到初步的光照图 2.进行均值(或高斯)滤波得到光照分布图 3.原始图像减去光照图,得到最终结果一个栗子针对matlab中自带的rice.png图。我们希望能够把大米和背景区分开来,直观的做法是用阈值分割来做成二值图,再对联通区域进行标记,这样就能知道每个大米的大小和中心位置。 可是仔细观察大米图会发现摄像时光照不均匀,这样就很难用一个全局阈值去进行分割,如果

2020-04-26 18:12:15 39382 13

原创 voc bbox的xml数据转换成txt格式

代码# -*- coding: utf-8 -*-try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ETimport osdef GetAnnotBoxLoc(AnotPath): tree = ET.ElementTree(...

2020-01-09 08:55:14 434

原创 MACE源码解析【GPU内存排布技巧】

前言在移动端推理引擎中,除了一些计算上技巧外,内存排布对效率的影响也是有一定影响的。本篇来浅析一下MACE的opencl模块在内存上有什么讲究,应用了哪些技巧。若内容有误,或者有自己的思考欢迎留言讨论。权重的排布MACE中权重是是由opencl中的image2D存储的(亦有buffer版的kernel),所以需要把四维的filter参数转换到2维上。一般情况下filter默认排布为OIHW,...

2019-11-16 10:43:00 853

原创 在C/C++项目中合理使用宏

C++项目中常使用宏来做跨平台、功能实现隔离、变量定义的功能,这篇文章来讨论下是否所有情况下都适合用宏小D的故事程序员小D接到一个任务,需要给同事A提供一个复杂公式的实现。输入为一组参数,输出一个计算结果。大致如下:double computeSomeThing(double paramA,double paramB,double paramC);小D很快完成了。过了几天同事A又来找他,...

2019-10-12 18:11:00 1562

原创 【caffe】caffe中transform_param中参数的执行顺序

caffe中transform_param有四个选项:scale,mean,mirror,crop_sizetransform_param { scale: 0.00390625 mean_file_size: "examples/cifar10/mean.binaryproto" mirror: 1 # 1表示开启镜像,0表示关闭,也可用ture和false来表示 ...

2018-11-07 14:17:34 4569

原创 MACE源码解析【ARM卷积篇(二)】1*1卷积实现

前言本文来解析一下MACE中1*1卷积的实现。1*1卷积在CNN中是比较特殊的一种操作,不再强调领域操作,一般用到1*1卷积有以下几种情况(相互之间不独立) 1.单纯的加强非线性映射,不强调领域CNN的特征提取功能 2.bottleneck结构中进行特征图数量的改变 3.depthWise 卷积中组成部分欢迎补充 本文涉及的源代码文件mace/mace/kernels/arm/...

2018-08-29 21:57:13 1557

原创 MACE源码解析【ARM卷积篇(一) 】1*N和N*1卷积实现

MACEMobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台优化的神经网络计算框架,旨在深度神经网络部署在移动端,是一个SoC上的神经网络实现。主要涉及的硬件资源主要包括CPU、GPU、DSP,对应的技术为ARM NEON、OPEN CL、HVX。 项目地址:https://github.com/XiaoMi/mace关于本系列本篇主要解析MA...

2018-08-25 11:59:27 2919

原创 一个基于Memory Pool的图像算法内存池实现

动机在实现图像类工程应用中,往往需要一些临时的中间图。若应用较为简单可以固定一些image buffer,反复利用这些内存来达到避免内存碎片和节省内存申请的时间。但业务流程较为复杂时,还是需要内存池来帮助管理这部分内存。大致搜索了一下现有的内存池,其中boost的四种内存池显然不符合我在这里提到的需求。我希望的是可以存一些图像的中间结果,可能是小图也可能是大图,是不定长的且内存的需求量较多。...

2018-08-12 13:54:49 570

原创 在windows环境下使用tensorflow运行openPose

note:$后为命令1.安装vs2015安装镜像下载:https://msdn.itellyou.cn/2.安装anaconda3 windows版本 & 安装tensorflow在本例中使用的cpu版本,GPU版本应该也没问题,最后的版本参数如下:python 3.5.5 tensorflow,1.9.0tensorflow cpu版本的安装可参考 htt...

2018-08-09 09:32:42 5924 6

原创 用SSE做NEON仿真

想用NEON接口实现SSE,可以使用一套用SSE实现的NEON接口。下载地址: https://software.intel.com/en-us/blogs/2012/12/12/from-arm-neon-to-intel-mmxsse-automatic-porting-solution-tips-and-tricks 在下载NEON_2_SSE后放到VS2013上进行编译。出现两个错误。...

2018-07-10 16:44:22 2229 4

原创 pytorch0.4.0,win10,python3.6,gpu

pytorch的windows-gpu-cuda80版本,需要翻x墙才能下载。这里提供百度网盘链接避免找梯子的麻烦。链接https://pan.baidu.com/s/1o5ztnNu0NsgBYPIsrwC_Gw 密码: bcr4使用pip install torch-0.4.0-cp36-cp36m-win_amd64参考win10安装pytorch:https:/...

2018-06-07 09:23:29 1009

原创 CPU版本、全局内存版本、共享内存版本矩阵乘法的实现和分析

前言矩阵乘法是cuda samples中的一个。所以就从这个较为简单的程序开始熟悉cuda吧。下面的代码有三个部分。CPU版本:使用三层循环进行常规的矩阵乘法运算。cuda global memory 版本:使用多个block进行并行计算,但GPU线程访问都是在global memory中。cuda shared memory 版本:也就是cuda 提供的样例代码。基本思路如下,对矩...

2018-04-13 15:17:31 1393

原创 opencv版跳一跳

问题分析主要问题有三个:1.如何获取游戏信息 2.如果对游戏内容进行解析,提取关键信息 3.如何对游戏进行操作问题1和问题3可以理解为整个程序的输入和输出。安卓系统可以使用adb工具对手机进行简单的操作。问题1我们用截屏命令解决;问题3因为跳一跳的输入也很简单就是长按屏幕,所以用adb工具发出在一个小区域滑动的命令即可模拟长按。那剩下的问题就是对游戏信息进行提取了,属于简单场景的图...

2018-02-10 15:34:07 1426

原创 快速图像旋转算法的c++实现

0 引言在数字图像处理技术中,图像旋转算法是最基本的操作之一。本文实现一种快速的图像旋转算法,并和原始方法以及opencv提供的旋转方案进行速度上的比较。1 基本原理图像旋转有两种计算坐标的思路,分别是前向映射和反向映射。其中后向映射在插值运算时较为方便,前向映射时计算插值则需要先知道全局的映射关系。如下图所示,反向映射是从旋转后图像出发,寻找其在原图中的位置,如果该位置不是整数坐标的

2018-01-10 18:44:56 12897 3

转载 auto_ptr 和 STL容器的冲突与陷阱

上个星期的博客shared_ptr源码剖析里其实遗漏了一个问题:为什么auto_ptr不可以作为STL标准容器的元素,而shared_ptr可以? 我在网上看了好多篇讲shared_ptr的文章里讲到了这个问题,不过大多文章只是简单两笔带过。我研究了一下这个问题,发现还是有挺多有价值的内容,所以把这个问题单独成一篇博客和大家分享。先从表象上看看这个问题,假如有这样的一段代码,是否能够运行?int

2017-09-09 21:48:51 682

原创 c++模板偏特化的应用

动机考虑这样一个需求, 在某项目中需要对动态内存进行限制以避免产生内存碎片这样的问题,需要实现一个内存池。让项目中的一些对象在内存池中拿取数据而不是直接用new在堆中取数据。那么对于一个对象的生成我们需要把内存分配和构造分开,同样的析构和内存收回也需要分开。对于前者,我们可以使用placement new来完成。后者则显式的调用析构函数。讲到这里就有一个问题,自定义的结构体和类是有析构函数的,但是原

2017-09-09 21:09:27 580

原创 C++中如何实现自定义类型的迭代器

我们知道STL实现了很多算法,如果项目是基于STL构建那么能够最大化使用现有代码当然是最好的。在STL中容器和算法之间的桥梁是迭代器。所以在定义好自定义类型的容器后,接下来就是迭代器的实现。STL中的迭代器迭代器模式是一种经典的设计模式,而STL的迭代器实现用到了模板的一些特性和技能,其中的细节可以去参考《STL源码剖析》里面的内容,在这里稍微介绍一下下面是STL中结构体iterator的定义,

2017-08-09 20:05:49 18129

原创 pytorch 若干小坑

caffe灵活性还是比不上torch,想要快速建立新模型,torch是个不错的选择 #batch size 设置略大段错误自己练手写的lenet和官方的lennet[https://github.com/pytorch/examples/blob/master/mnist/main.py]在CPU中运行时,设置稍微大一点的batch size(8以上),就会出现段错误,而且也没错误栈

2017-07-04 20:32:31 4922 7

原创 Harris角点检测原理的理解

基础知识本文不打算从头开始讲一遍harris角点检测的原理,因为网上已经能找到写的很好的资料了。本文主要内容是尝试用另一个角度来解释harris角点检测中特征值和特征向量,最后在回顾一下角点判别算子。基础介绍推荐这篇博客:http://www.cnblogs.com/ronny/p/4009425.html?utm_source=tuicool&utm_medium=referral疑问原文中从下面

2017-05-25 13:36:59 1703 1

原创 opencv中的harris角点检测函数

函数接口//! computes Harris cornerness criteria at each image pixelCV_EXPORTS_W void cornerHarris( InputArray src, OutputArray dst, int blockSize, int ksize, double k,

2017-05-24 19:58:08 1336

原创 C++ RTTI的简单实现(二)

前不久写了个 C++ RTTI的简单实现(一) ,是在查了一些RTTI资料后自己倒腾出来的。近日重看(一两年前看的忘的东西挺多的)《深入浅出MFC》,看到候老师关于MFC六个仿真中的RTTI实现,对比了下自己的设计,下面总结一下。相同点整体的宏定义很类似,一个静态变量,一个虚函数返回真实类型。超级父类的特殊处理。不同点数据结构 MFC中用的是单链表,采用头插法建立链表。结构体内有三个指针:一个静

2017-05-15 14:32:25 835

原创 C++ RTTI的简单实现(一)

动机为了加深对RTTI的理解,尝试实现了一个RTTI系统。不过做的比较简陋,功能如下1.只支持单继承体系2.系统必须有个超级类,作为一切类的最上层父类3.手动添加MY_RTTI和END_SUPER_DECLARE_CLASS宏4.实现了动态造型(dynamic_cast)介绍typeID的识别利用虚函数实现,利用虚函数的性质可以让对象输出真正的类型标志,而不会被其声明的类型所改变。为了安全

2017-04-29 12:38:19 1242

原创 图像处理经典算子理解

测试图sobel算子sobel算子模板为 w1=10−120−210−1w1=\begin{matrix} 1 & 2 & 1\\ 0 & 0 & 0 \\ -1&-2&-1 \end{matrix} w2=1−2−1000121w2=\begin{matrix} 1 & 0 & 1\\ -2 & 0 & 2 \\ -1& 0& 1 \end{matrix} 运

2017-04-29 11:21:25 3286

原创 如何设置和关闭caffe的日志系统(glog)

前言首先我们知道caffe项目用的日志系统是谷歌的开源日志系统glog。如果你自己构建了一个基于caffe的项目,然后如果你也不知道如何去设置日志系统。那么会发生下面这样的事 在一句warnning后,所有caffe源码中的LOG都会输出到控制台上,正如这句wannring所表达的意思一样,你没用InitGoogleLogging初始化,默认日志全部输出到STDERR(默认为控制台)上。

2017-02-10 13:49:49 8057 2

原创 Caffe训练和使用时候的当前路径

前言具体的应该说题目是本人遇到的大坑小坑,遇到的都记录一下吧。 本人运行环境:win7 64位+matlab2015rb+vs2013/2012关于配置文件中(prototxt)相对路径的问题这个件事情是需要分开讲的,完全用c++接口,用原始项目编译出来的caffe.exe来进行训练的话,当前目录就是你运行caffe.exe的目录(我假设你已经把caffe.exe的目录放到环境变量里

2017-01-26 17:01:47 2001

原创 把Caffe集成到c++项目的流程

前言本来用着MatConvNet挺舒服的,奈何集成到c++的项目中实在是痛苦啊,做成DLL没问题,问题是每次运行都要加载MCR,加载一次起码两分钟逼得我在项目里把CNN部分做成mock,测试其他功能的时候禁掉CNN省的加载搞的我烦心。于是我转向了用c++开发的Caffe的怀抱,当然用的是c++的接口和matlab的接口,py的接口没有用过,毕竟从本科开始接触图像处理都是玩的matlab准备工作本人运

2017-01-24 16:31:11 4688 2

原创 c++中仿函数的理解

先考虑一个简单的例子:假设有一个vector<string>,你的任务是统计长度小于5的string的个数,如果使用count_if函数的话,你的代码可能长成这样:1 bool LengthIsLessThanFive(const string& str) {2 return str.length()<5; 3 }4 int res=count_if(vec.begin(),

2016-11-11 17:47:25 4378 3

原创 使用MatConvNet生成一个字符识别的动态链接库(下)

用MCC生成动态链接库虽然标题是说用mcc,但是因为有三个文件,懒得打那么多命令,在matlab命令行下使用deploytool调出工具包,选择编译共享库 添加之前写的三个函数DUCO_LoadNet、DUCO_LoadImgAve、DUCO_OCRNum 点击package开始编译 在一段时间的等待后(编译的真慢),会在当前目录下生成一个新的文件夹,在里面找到生成的DLL、LI

2016-11-05 14:52:07 605

原创 使用MatConvNet生成一个字符识别的动态链接库(上)

简介该文会尽量详尽的描述如何利用MatConvNet生成一个可供其他程序调用的DLL。主要内容有:MatConvNet的安装和配置、MatConvNet的手写体识别demo、编写数字识别函数、用MCC生成动态链接库、VC下的再次封装、使用以及常见错误。此外作者运行环境为:Win7 64位+VS2012+Matlab2005rbMatConvNet的安装和配置在MatConvNet官

2016-11-05 14:20:47 1014

原创 【c++基础】虚函数的使用以及和成员函数的区别

前言一直以来都知道虚函数的经典用法,但是除了本科时刚学c++的时候了解过,后来因为做不同的项目在不同的语言之间跳转(自觉都是浅尝辄止),这些基本的东西都忘记了,现在重拾并记录,权当巩固基础了。经典用法#include<iostream>using namespace std;//几何体类class Geometry{public: virtual void draw(){

2016-11-01 14:11:59 3013 1

转载 MFC中创建多线程 MFC对象指针不能在线程间传输

原文出处注:碰到MFC线程安全的坑,这个前辈说的比较受用。姑且先粘贴过来,等项目进度跟上了,再来总结。对于大多数mfc对象,请不要在线程间传递它们,不管是栈上的还是堆上的!原因如下: 1、 mfc的大多数类不是线程安全的,调用传入对象的成员函数可能不会报错,但是未必能达到程序预定的功能! 2、 mfc与界面有关的类,其大多数成员方法都是通过sendmessage实现的,如果消息处理函数本身不是线

2016-06-15 19:18:05 1134

转载 CC中的坐标系

------------------有段时间没用到onTouchBegan,近来写代码时发现对convertToGL(),getLocation()这些接口都有点陌生了,所以趁这次机会就写个总结到博客里,下次忘了就来博客里看看,当笔记用咯。首先脑补下基础知识吧:1、OpenGL坐标系:该坐标系原点在屏幕左下角,x轴向右,y轴向上。这也就是cocos2dx中用到的坐标系所以没啥好说的

2016-05-20 18:04:10 4073

原创 【深入理解C++11 笔记】——1 保证稳定性和兼容性

静态断言 static_assert关于断言的个人理解先说一下为什么要使用断言。在第一次见到断言时就很疑惑,为什么要使用断言,比如指针为NULL(assert(ptr!=NULL) ),可以先判断是否为NULL然后返回嘛,可以用异常机制包起来嘛。目前的理解是断言就是为了检查源码逻辑而存在的,跟其它检错机制有些目的上的差别。比如在一个类中写了一个mynew()函数,和一个mydele

2016-05-09 21:33:56 888

A*算法解决旅行商问题

估价函数为f(n)=h(n)+g(n)。其中h(n)表示已经走过的实际路程。g(n)表示未走过路程到终点(起点)最短的距离。

2014-05-02

空空如也

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

TA关注的人

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