“人造太阳”计划

convert bitset descriptor -> cv::Mat

百般思念 提交于 2020-03-06 05:12:45
参考https://blog.csdn.net/magicyang87/article/details/7246771 1.bitset转opencv cv::Mat 注意 (1)Mat 的列为32列,类型为uchar (2)BRIEF::bitset 的长度为256 (3)每8个构成一个uchar 这个测试ok vector < BRIEF :: bitset > temp_brief_descriptors ; extractor ( image , keypoints , temp_brief_descriptors ) ; brief_descriptors_mat = Mat :: zeros ( brief_descriptors . size ( ) , 32 , CV_8UC1 ) ; int row = 0 ; for ( iter = temp_brief_descriptors . begin ( ) ; iter != temp_brief_descriptors . end ( ) ; iter ++ ) { BRIEF :: bitset bits = * iter ; for ( int i = 0 ; i < 32 ; i + = 8 ) { char ch ; for ( int j = 0 ; j < 8 ; ++ j ) { if ( bits

python迭代器与iter()函数实例教程

我与影子孤独终老i 提交于 2020-03-05 14:24:07
python迭代器与iter()函数实例教程 发布时间:2014-07-16编辑: 脚本学堂 本文介绍了python迭代器与iter()函数的用法,Python 的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。 迭代器是在版本 2.2 被加入 Python 的,它为类序列对象提供了一个类序列的接口。 序列是一组数据结构,你可以利用它们的索引从0 开始一直“迭代“ 到序列的最后一个条目。 用“计数“的方法迭代序列是很简单的。 Python 的迭代无缝地支持序列对象,而且它还允许程序员迭代非序列类型,包括用户定义的对象。 迭代器用起来很灵巧,可以迭代不是序列但表现出序列行为的对象,例如字典的 key,一个文件的行等。 当使用循环迭代一个对象条目时,几乎不可能分辨出它是迭代器还是序列。不必去关注这些,因为 Python 让它象一个序列那样操作。 如何迭代? 迭代器就是有一个 next() 方法的对象,而不是通过索引来计数。当你或是一个循环机制(例如 for 语句)需要下一个项时,调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个 StopIteration 异常,这并不表示错误发生,只是告诉外部调用者,迭代完成. 不过,迭代器也有一些限制。例如你不能向后移动,不能回到开始,也不能复制一个迭代器.如果你要再次(或者是同时)迭代同个对象

【python】生成器和yield

时光怂恿深爱的人放手 提交于 2020-03-04 19:57:01
python生成器和yield 再一次遇到yield表达,复习了一下生成器,顺手记录一下。 iterable:可迭代对象,只要内部实现了 __iter__ 或 __getitem__ 方法的对象就是可迭代的,如list, dict, tuple, set, str等; iterator:迭代器,内部实现了 __iter__ 和 next() 方法的对象;iterable不一定是iterator,但可以进行转化。 l = [ 1 , 2 , 3 ] iterator_l = iter ( l ) generator:生成器是一种特殊的迭代器,它通过生成函数迭代形成。generator的生成方式一般有两种: yield 和 () generator_ = ( x for x in range ( 5 ) ) def generator_ ( ) : for i in range ( 5 ) : yield i 生成器的特点 惰性求值(lazy evaluation),每次调用next()才会计算下一个值。节省内存空间 一次性,生成器中的元素一次性使用,用完就没了不能重复用。 因此,若涉及到要用到全部元素或排序等操作,相比之下用list会更合适 来源: CSDN 作者: Sarah Huang 链接: https://blog.csdn.net/weixin_44794704

论文阅读-Cross-Iteration Batch Normalization

你。 提交于 2020-03-03 19:35:24
对msra的工作都比较关注,最近刚好看到了这篇对传统bn进行改进的论文。 论文地址: https://arxiv.org/abs/2002.05712 github地址: https://github.com/Howal/Cross-iterationBatchNorm openreview: https://openreview.net/forum?id=BylJUTEKvB 作者应该是投ICLR杯具了,不过个人觉得比较值得少花些时间读一读。 论文开门见山的指出 batchsize的大小直接影响了BN的效果,见图1中的绿色线,batchsize在小于16后的分类准确率急剧下降 。作者在本文提出了一种叫做cross-iteration BN的方法,通过泰勒多项式去估计几个连续batch的统计参数,可以很大程度缓解此问题,如图1中的蓝色线,在batchsize逐渐变小时,效果依然稳定,并且accuracy始终高于GN的效果。 (论文必备图,一图告诉你我有多nb) 1. Revisiting Batch Normalization 从实现的角度来说,BN对特征进行了一种白化操作,可以减少internal covariate shift,具体的可以查看原文。 这里作为对比可以回忆下几种比较常见的归一化方法 BatchNormalization,LayerNormization

Redis5源码阅读【7-quicklist】

核能气质少年 提交于 2020-03-01 20:14:48
文章目录 1、介绍 2、quicklist 2.1、List 2.2、quicklist 2.2.1、quicklistNode 2.2.2、quicklistLZF 2.2.2、quicklistEntry 2.2.3、quicklistIter 3、数据压缩 3.1、压缩 3.2、解压缩 4、基本操作 4.1、初始化 4.2、添加元素 4.3、删除元素 4.4、更改元素 4.5、查找元素 5、常用API 1、介绍 quicklist是Redis底层最重要的数据结构之一,它是Redis对外提供的6种基本数据结构中List的底层实现。在quicklist之前,Redis采用压缩链表(ziplist)和双向链表(adlist)作为List的底层实现。当元素个数较少并且元素长度比较小时,Redis采用ziplist作为其底层存储,当元素长度较多时候,Redis采用adlist作为底层存储结构,因为修改元素的时候ziplist需要重新分配空间,这会导致效率降低。 2、quicklist quicklist由List 和 ziplist 组合而成,ziplist在前面的文章种已经介绍了。本章将会基于ziplist继续介绍quicklist。 2.1、List 链表是一种线性结构,其中各对象按线性顺序排列。链表与数组不同点在于,数组的顺序由下标决定,链表的顺序由对象的指针决定

Python开发【第五篇】:Python基础之迭代器、生成器

橙三吉。 提交于 2020-02-29 22:48:40
迭代器 一、迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 优点: 提供一种统一的、不依赖于索引的迭代方式 惰性计算,节省内存 缺点: 无法获取长度(只有在next完毕才知道到底有几个值) 一次性的,只能往后走,不能往前退 1、为何要有迭代器? 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器 2、什么是可迭代对象? 可迭代对象指的是内置有 iter 方法的对象,即obj. iter ,如下 'hello'.__iter__ (1,2,3).__iter__ [1,2,3].__iter__ {'a':1}.__iter__ {'a','b'}.__iter__ open('a.txt').__iter__ 3、什么是迭代器对象? 可迭代对象执行obj. iter ()得到的结果就是迭代器对象 而迭代器对象指的是即内置有 iter 又内置有 next 方法的对象 文件类型是迭代器对象 open('a.txt').__iter__() open('a.txt').__next__() 二、迭代器对象的使用 dic={'a':1,'b':2,'c':3}

正确使用stl map的erase方法

自古美人都是妖i 提交于 2020-02-29 13:22:26
先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.erase有3个重载: void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( iterator first, iterator last ); 所以下面的代码中的最后一个例子仅仅可以在windows下的map下运行。 STL的map表里有一个erase方法用来从一个map中删除掉指令的节点 eg1: map<string,string> mapTest; typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key); mapTest.erase(iter); 像上面这样只是删除单个节点,map的形为不会出现任务问题, 但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念. 像下面这样的一个例子就是错误的写法, eg2: for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter) { cout<<iter-

你的颜值能打多少分?让飞桨来告诉你

穿精又带淫゛_ 提交于 2020-02-28 19:32:02
【飞桨开发者说】钟山,中科院信工所工程师,主要研究计算机视觉、深度学习。 想必很多人都对自己的颜值到底怎样充满好奇,也有很多软件为大家提供了颜值打分的趣味功能。其实,颜值打分也可以视为一个图像分类问题,今天就向大家介绍如何利用飞桨搭建一个VGG网络,实现一个简单的颜值打分demo。 ​ 01 VGGNet介绍 VGGNet 由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind 公司提出,是 ILSVRC-2014 中定位任务第一名和分类任务第二名。提出 VGGNet 的主要目的是为了探究在大规模图像识别任务中,卷积网络深度对模型精确度的影响。通过VGGNet,研究人员证明了基于尺寸较小的的卷积核,增加网络深度可以有效提升模型的效果。VGGNet结构简单,模型的泛化能力好,因此受到研究人员青睐而广泛使用,到现在依然经常被用作图像特征提取。 VGGNet引入“模块化”的设计思想,将不同的层进行简单的组合构成网络模块,再用模块来组装完整网络,而不再是以“层”为单元组装网络。VGGNet有5种不同的VGGNet 配置,如上表所示。其中每一列代表一种网络配置,分别用 A~E 来表示。从表格中可以看出所有VGG配置都有五个卷积模块,模块中所有卷积都是3×3卷积核(conv3),因此特征图的尺寸在模块内不是变的,每个模块卷积之后紧接着最大池化层

vector容器

岁酱吖の 提交于 2020-02-28 13:47:30
1 /* 2 vec.begin() //指向迭代器中第一个元素。 3 vec.end() //指向迭代器中末端元素的下一个,指向一个不存在元素。 4 vec.push_back(elem) //在尾部加入一个数据。 5 vec.pop_back() //删除最后一个数据。 6 vec.capacity() //vector可用空间的大小。 7 vec.size() //返回容器中数据个数。 8 vec.empty() //判断容器是否为空。 9 vec.front() //传回第一个数据。 10 vec.back() //传回最后一个数据,不检查这个数据是否存在。 11 vec.at(index) //传回索引idx所指的数据,如果idx越界,抛出out_of_range。 12 vec.clear() //移除容器中所有数据。 13 vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。 14 vec.erase(begin,end) //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator 15 vec.insert(position,elem) //在pos位置插入一个elem拷贝,传回新数据位置。 16 vec.insert(position,n,elem) /

C++迭代器删除、插入元素

强颜欢笑 提交于 2020-02-28 09:01:40
迭代器是容器五大组件中十分重要的一种,为我们提供了一种与容器种类、元素类型无关的访问容器的方法。 按照是否提供修改容器元素内容、遍历方法等、迭代器可分为五大类,如下图所示: 有关五种迭代器的具体使用,可参考CPPreference等权威资料。 首先贴一篇博客: http://m.blog.csdn.net/zhongjiekangping/article/details/5624922 这篇博客很好地解答了我的部分疑惑。 现在考虑一个最简单的需求,如何删除vector的指定元素?如何在vector每个元素后追加一个元素?(实际上,对vector插入元素有可能很影响效率,如果频繁插入元素,可以考虑list等) 删除元素 std::vector< int> Vec; std::vector< int>::iterator itVec; for( itVec = Vec.begin(); itVec != Vec.end(); ) { if( WillDelete( *itVec) ) { itVec = Vec.erase( itVec); } else itList++; } 对vector、queue等,每次erase操作,函数会删除指定迭代器位置的元素,然后将后面的元素前移一位,erase返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器