- 博客(167)
- 收藏
- 关注
原创 c++何时使用值传递、指针传递、引用传递
形参使用引用时最好加入const,防止实参类型没有对齐,const &可以生成临时变量,不会造成编译不通过。
2022-01-25 16:37:23
536
原创 ThreadPoolExecutor as_complete和done的区别(python)
1.之前把as_complete条件判断submit任务是否做完,这时候会导致主线程阻塞,一直在等task任务执行完才会往下走,获得task的result。2.用done条件判断submit任务是否做完,没有就pass,主线程继续运行。...
2022-01-17 12:11:06
726
原创 git rebase操作
项目背景是:自己从dev分支拉出了一条新的分支作为开发分支,组内同事也拉出了一条作为开发分支,他已经将dev分支进行了更新,自己的分支需要rebase到新的dev分支。1、拉取dev分支最新代码。git checkout devgit pull2.切换到自己的分支,进行git rebase。git checkout dev-xxxxgit rebase origin/dev-fastbert -i把没有用的commit设置为d(drop),把有用的分支设置为pick,最后一笔分支设置为s
2022-01-05 17:20:07
412
原创 g++编译mkl tanh(简述编译流程)
mkl的tanh函数接口我这里使用了第一个,要严格对齐下面的Type,不然会出错。-I(大写的i)是头文件的路径-L是动态链接库的地址-l(小写的L)是动态链接库的名字g++ -I /opt/intel/mkl/include/ -L /opt/intel/mkl/lib/intel64 -l mkl_rt test_tanh.cpp 上述是编译时候需要的静态库,动态库以及一些头文件路径。运行时需要export library这些链接库。export LD_LIBRARY_PATH=/o
2021-12-30 11:30:35
898
原创 bert保存模型(输入不能分开IteratorV2)
今天下载google官方bert代码,发现使用estimator训练成ckpt格式,转成pb以后,发现输入融合到了一起。使用pb推理的时候,用see.run出现错误。inputs = graph.get_tensor_by_name(prex + "IteratorV2:0")# input_mask = graph.get_tensor_by_name(prex + "input_mask:0")# token_type_ids = graph.get_tensor_by_name(prex +
2021-12-24 17:20:31
829
原创 crnn-pth转换成onnx(pth输入输出变长转换)
注意事项1.首先torch1.1.0是没有dynamic_axes这个开关的,所以我升级到了1.14.0。2.其次如果是变长的话,pth模型找不到input和output的node-name,可以自己随意定义。3.weights和data必须同样的dtype,可以是cpu也可以是gpu,如果多gpu训练的model,去掉module即可。4.dynamic_axes找到当前变长的维度,用list或者dict表示,list自动分配名字,很方便。import torchimport torchvis
2021-11-23 16:29:48
1296
原创 源码编译onnxruntime(打开onednn/oneapi)
本文使用源码编译ort框架原因是需要打开某些开关(比如one-api),0.4.0版本有–openmp,–use_mkl,–use_mkldnn,–use_openvino等等开关,现在编译1.9.1版本的ort,openmp作者不建议打卡,当然可以自己调用线程数来加速,重要的是use_dnnl(mkldnn,mkl)这个开关,现在已经讲mkl,mkldnn合并。下面有一些注意事项,一切还是以官方文档为准。官方编译文档https://onnxruntime.ai/docs/build/inferenc
2021-11-19 18:45:50
2577
5
原创 openvino配置与使用
首先在下面链接下载openvino,看到网上大家都是使用源码进行编译,现在有了使用pip安装https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit-download.htmlpip install openvino (推理时候的安装包)pip install openvino-dev (转换模型,优化、测试时候的安装包)目前只尝试转换pb模型,当使用框架是tf的时候,如果按照–input_shape =
2021-11-18 10:37:38
585
原创 tensorflow savemodel与pb(ckpt)互相转换
ckpt ------> save_modelimport tensorflow as tfimport sys trained_checkpoint_prefix = sys.argv[1]export_dir = sys.argv[2]graph = tf.Graph()config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)with tf.compat.v1.Session(gra
2021-11-02 11:21:16
4653
原创 C++中virtual(虚函数),动态联编,静态联编。
https://www.cnblogs.com/weiyouqing/p/7544988.htmlhttps://www.cnblogs.com/schips/p/12309999.html
2021-10-27 14:24:12
129
原创 BERT encoder-attention计算逻辑
encoder中最重要的莫过于attention的计算了,本章对照代码讲解一下计算逻辑,主要是python改成c++时候要注意一些shape,并且减少tanspose的使用,使用Intel mkl中的矩阵计算API,例如cblas,cblas_batch等等。1.qkv合并------>Dense(input * qkv_weight + qkv_bias)------->split分开分开后q=k=v shape为(batch_size, seq_len, number_of_head,
2021-09-29 13:55:40
585
原创 pytorch加载bert权重与转换成onnx
由于bert是google创造的模型,所以大部分都是用tensorflow编写。自从有了transformer库,pytorch版本的模型加载也简单了许多。权重文件,如图所示:config.json是bert的配置,包括hidden_size,drop此类超参,如下所示:{ "attention_probs_dropout_prob": 0.1, "directionality": "bidi", "hidden_act": "gelu", "hidden_dropout_pr
2021-09-28 15:54:55
3241
10
原创 vscode使用gdb调试c++代码
在工程项目中有一个名字为.vscode的文件夹,文件夹内部有一个launch.json的文件。{ "envFile": "${workspaceFolder}/.env", "name": "g++ - debug custom xxx(.cpp后缀不用写)", "type": "cppdbg", "request": "launch", "program": "${workspaceF
2021-09-28 15:19:04
793
原创 目标检测中图像增加手段
处理不清晰的扫描件进行内部红章等检测时,往往需要增强图片进行检测,可以有效地提高得到地准确率和confidence。from PIL import Imagefrom PIL import ImageEnhanceimport numpy as npimport ospath = 'xxx'for i in os.listdir(path): p_ = path + i img = Image.open(p_).convert('RGB') img_gray = Ima
2021-09-23 15:25:25
270
1
原创 c++ 多线程加速OPM库的使用
c++中往往需要使用for循环,嵌套for循环得速度就更加慢了。需要使用Openmp多线程进行加速。https://blog.csdn.net/weixin_39568744/article/details/88576576这个博客讲的非常仔细,本文主要是记录一下工作上的一些使用1.告诉编辑器下面使用for循环#pragma omp parallel for2.在OpenMP 3.0中,可以利用collapse指令来解决循环嵌套问题,#pragma omp parallel for co
2021-09-17 17:28:59
1012
原创 BERT embeddings计算逻辑
1.获得输入中文对应的词库的id。重要的是这句话output = tf.gather(embedding_table, flat_input_ids)def embedding_lookup(input_ids, vocab_size, embedding_size=128, initializer_range=0.02, word_em
2021-09-17 16:16:36
559
原创 TensorFlow Identity讲解
https://blog.csdn.net/qq_23981335/article/details/81361748?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommend
2021-09-09 23:20:27
162
原创 Tensorflow 静态图PB模型修改(OP修改)
def load_pb_graph(path): with tf.gfile.GFile(path, "rb") as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) with tf.Graph().as_default() as g: tf.import_graph_def(graph_def, name=None) return gmodel_f
2021-09-09 21:35:14
1327
原创 STL的vector底层原理(通俗易懂)
首先创造一个容器vector <int > a;,会生成三个指针,first,last,end。(last是不断移动的),初始化一个空的容器,三个指针均为空,因此capacity(end-first)和size(last-first)都为0。(size是当前vector容器真实占用的大小,也就是容器当前拥有多少个元素。capacity是指预分配的内存空间。)capacity==size,容器此时已满,若再要加入新的元素时,就要重新进行内存分配,进行内存扩充。vector 容器扩容的过程需要
2020-09-07 20:45:45
1145
原创 mAP的计算代码
1.计算mapAP的计算需要针对具体类别的,通常我们表示的是AP50(IOU大于0.5就是tp,反之就是fp。)precision=TP/(TP+FP)分母表示所有的预测框recall = TP/(TP+FN) 分母表示gt的个数参考:https://blog.csdn.net/qq_35916487/article/details/89076570画出PR曲线,横坐标是recall,纵坐标是precision,求面积就是precision,但是积分很难求,于是用了插值法。参考https://
2020-08-17 11:53:17
1458
原创 手写Maxpooling,无padding(python)
import numpy as npdef max_pooling(feature_map, size=2, stride=2): """max_pooling""" #feature_map (h,w) height = feature_map.shape[0] width = feature_map.shape[1] # 确定最后的输出形状 out_height = np.uint16((height - size) // stride + 1)
2020-08-14 11:39:29
695
原创 手写卷积前向过程(无反向)
import numpy as npdef convv(feature, conv, stride): # (x+2p - kernel)//2 + 1 conv_l = conv.shape[0] rows = feature.shape[0] cols = rows out_size = (rows - conv_l) // stride + 1 outcome = np.zeros((out_size,out_size)) i = j = 0
2020-08-14 11:17:18
175
2
原创 手写NMS
def NMS(dects,threshhold): """ detcs:二维数组(n_samples,5) 5列:x1,y1,x2,y2,score threshhold: IOU阈值 """ x1=dects[:,0] y1=dects[:,1] x2=dects[:,2] y2=dects[:,3] score=dects[:,4] ndects=dects.shape[0]#box的数量 area=(x2
2020-08-12 17:50:00
498
原创 YOLOV1与V3的(模型,loss要点详述)
正样本的选择:目标中心点落在哪个grid上,然后计算这个grid的9个先验框(anchor)和目标真实位置的IOU值(直接计算,不考虑二者的中心位置),取IOU值最大的先验框和目标匹配。于是,找到的该grid中的 该anchor 负责预测这个目标,其余的网格、anchor都不负责。负样本的选择:计算各个先验框和所有的目标ground truth之间的IOU,如果某先验框和图像中所有物体最大的IOU都小于阈值(一般0.5),那么就认为该先验框不含目标,记作负样本,其置信度应当为0不参与计算部分这部分
2020-08-09 17:01:40
472
原创 Faster-RCNN的要点详述
1.RPN输出有两个分支,一个regression layer(回归),一个是cls layer(二分类,是不是object)。一个像素点输出的9个anchor,3个scale,3个ratio。最后输出的维度是(特征图的长x特征图的宽x9x(2(is or not object)+4(x,y,w,h)))2.RPN的loss**正负样本的选择非常重要**positive标准:1.anchor与gt的IOU最大。2.anchor与gt的IOU大于0.7通常第二点基本就能全部满足,但是有特殊情况
2020-08-07 14:53:06
461
原创 左成云算法进阶班(1)-KMP (python)
问题:给定一下两个字符串str(n位)与ptr(m位),求ptr在srt中出现的次数或者其出现的位置str = “ababacababadababadadda”;ptr = “ababad”;暴力破解的时间复杂度是O(n*m),可以用KMP算法去简化。下面简述一下KMP算法的思路。1.next数组是怎么产生的?next第一位是-1,第二位是0,长度和子串长度一致。假设i-1前面已经产生了最大的子串的长度cn,那么首先比较cn后面的字符(其实就是str2[cn])是否等于第i-1位置的字符(因为从0
2020-07-16 22:00:56
340
原创 数组中的和累加是否等于aim (python)
给你一个数组arr,和一个整数aim。如果可以任意选择arr中的 数字,能不能累加得到aim,返回true或者false思路:每个数字可以选择选或者不选,f(0,0)是起始位置,f(1,0)表示当前是第一个位置,但是第0个数我没选def dfs(arra,i,sum_,target): if i==len(arra): return sum_==target else: return dfs(arra,i+1,sum_,target) or dfs(arra,i+1,sum_+arra[i,
2020-07-12 19:53:30
202
原创 矩阵最短路径
问题:给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径和中最小的路径和。import numpy as npdef f(matrix, i, j): #到达最右下角 if i == len(matrix)-1 and j == len(matrix[0])-1: return matrix[i][j] if i == len(matrix)-1: return f(matrix,
2020-07-12 10:13:53
429
原创 1353. 最多可以参加的会议数目 python
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。思路:按照结束时间进行排序,对于第 ii 天,如果有若干的会议都可以在这一天开,那么我们肯定是让 endDayendDay 小的会议先在这一天开才会使答
2020-07-11 14:10:29
383
原创 项目的最大收益(python)
贪心思路:其实建堆是比较好的,但是python的堆有点鸡肋,所以用list去代替了,主要就是构建一个项目,将benjin与zhuanqian去捆绑,健在一个cost按照benjin排序,一个profit按照利润最大排序,然后就好了。链接里有伪代码https://blog.csdn.net/weixin_41362649/article/details/94637472benjin = [20,10,30]zhuanqian = [21,15,33]#这道题如果用python的话,建议还是用比较器和
2020-07-11 13:28:04
936
原创 切金条最省铜板问题(python)
题目是:一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 板。一群人想整分整块金 条,怎么分最省铜板?思路比较简单:建造一个最小堆(用数组也能实现,主要就是为了取出最小的两个数),然后把这两个数求和放在原数组在取出最小的两个数,直到只剩下最后一个数。from heapq import *res = []for i in k: heappush(res, i)out = 0while len(res) > 1:
2020-07-11 12:17:21
243
原创 前缀树Trie (python版本)(leetcode 208题)
class TrieNode(object): def __init__(self): self.path=0 self.end=0 self.map=[None for i in range(26)]class Trie: def __init__(self): """ Initialize your data structure here. """ self.root=Tr.
2020-07-08 20:16:59
170
原创 计算完全二叉树的节点个数(python)
用O(n)的时间复杂度就不说了,这里说用小于O(n)的时间复杂度。def nums_node(root): if not root: return None return bs(root,1,max_height(root,1))def bs(node,level,height): #开始level=1 #height是一个不变的值,可以看做是一个全局变量,代表树的最大深度。 if level==height: return 1 #如果右边子树的最左节点到底了 #说明左边子树是满
2020-06-30 22:08:44
666
原创 判断一棵树是否是完全二叉树(python)
核心思路:1.如果有右节点,没有左节点,直接返回False2.如果左右节点都没有,或者只有左节点,就看看后面的节点,必须是叶节点,不能有子节点。(就是看看这是不是最后一排。)res=[root]flag=0while res: tmp=res.pop(0) if tmp.left: res.append(tmp.left) if tmp.right: res.append(tmp.right) if tmp.right and not tmp.left: return Fals
2020-06-30 21:35:41
2671
原创 Training Region-based Object Detectors with Online Hard Example Mining论文精读
核心思想直接上图:前面和fast RCNN一致,包括提取ROIs也是用的selective search方法(一张图片有上千个ROIs),然后每个ROI都得到一个loss的值,这时候使用NMS去掉一部分高度重叠的ROI,防止计算多次,对剩下的小片按损失值从大到小进行排序,loss越大肯定是没有训好的,也就是hard negative examples,取一部分放入下面的head部分。读下来查询博客有两个问题觉得很容易被忽略:1.NMS怎么理解呢?首先计算所有RoIs的损失,把损失从高到低排序,然后
2020-06-29 14:58:40
225
转载 左程云基础班python(第一第二节)
https://blog.csdn.net/zhanzi1538/article/details/106461881
2020-06-28 21:53:53
1534
原创 Unsupervised Hard Example Mining from Videos for Improved Object Detection论文精读
解释一下什么叫HEM(Hard Example Mining困难样本挖掘):我们以2D检测为例,有些样本很容易学习,有些样本则很困难被网络学习,那么如果我们的模型只学习会了简单的目标,那精度也总会受到限制。因此,对于finetune阶段来说,困难样本有助于我们的模型去’突破‘,让他见识更广阔的世界。优点:In the context of class imbalance in training object detectors, online hard example mining (OHEM) [46
2020-06-28 19:16:58
275
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人