首页 文章 精选 留言 我的

精选列表

搜索[聚类],共10000篇文章
优秀的个人博客,低调大师

VR\AR迎来技术突破:高精度识别人类手势的类脑架构来了

云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 仿生体感-视觉关联学习框架。 可伸缩应变传感器。 techxplore.com网站7月14日报道,新加坡南洋理工大学和悉尼科技大学的研究人员最近在《自然·电子学》杂志发文公布了一种机器学习架构,可通过分析可伸缩应变传感器捕捉到的图像识别人类手势。 项目研究人员Xiaodong Chen在接受TechXplore采访时说:“人脑如何处理信息?我们对此很感兴趣。在人脑中,思维、规划和灵感等高级感知活动,不仅依赖特定的感官信息,还与不同传感器的多感官信息综合整合有关。这为我们结合视觉信息和躯体感觉信息,实现高精度手势识别提供了启示。” 人类在解决实际任务时,通常会整合从周围环境收集到的视觉和体感信息。两种类型的信息是互补的,当它们结合在一起时,能够为解决问题提供更好的方案。因此,在开发人类手势识别技术时,Chen等需要确保该技术能够整合多个传感器收集到的不同类型的感知信息。Chen解释:“为了实现目标,我们对传感器进行了改进。与目前使用的可穿戴传感器相比,新设计的可伸缩、高适应性传感器可以更准确地收集肢体感觉数据。我们还开发了一种仿生体感-视觉(BSV)学习框架,它可以合理地融合视觉信息与体感信息。” Chen等开发的BSV学习框架以多种方式复制了人类大脑的体感-视觉信息融合途径,表现出三大特点:首先,它的多层、层级结构以人工神经网络模仿大脑。其次,系统中的部分分段网络处理模式与大脑中的神经网络处理模态大致相同。最后,BSV架构具备新开发的稀疏神经网络融合特征。 在初步评估实验中,Chen等设计的BSV学习架构的表现优于单式识别方法(只处理视觉或体感数据的方法)。值得注意的是,它能比此前开发的三种多模态识别技术(加权平均融合SV-V,加权强调融合SV-T和加权倍增融合SV-M)更准确地识别人类手势。 Chen说:“与单式识别和常见多模态识别相比,我们开发的仿生学习架构具有更高的识别精度。而在图像有噪声、曝光不足或曝光过度等非理想条件下,它的识别精度也相对更高。” BSV学习架构可用于制造医疗机器人,或者开发更先进的虚拟现实、增强现实和娱乐技术。Chen说:“BSV独特的仿生特性使其优于多数现有技术。这已经被实验结果证实。下一步,我们将尝试构建基于仿生融合的虚拟现实和增强现实系统。” 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/live 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK 原文发布时间:2020-07-16本文作者:科技工作者本文来自:“51CTO”,了解相关信息可以关注“51CTO”

优秀的个人博客,低调大师

美联储为你提供了一份针对合成身份类的防诈骗指南

合成身份式网络诈骗是什么? 近日,美联储发布了一项新的“防诈骗”指南,以帮助民众和信贷机构识别免“合成身份类型”的支付诈骗。在这份白皮书之前,美联储已经发布了两篇有关定义和检测此类支付诈骗的白皮书。 创建合成身份的方法,主要是通过将真实信息(例如身份证号)和假信息(姓名,出生日期和地址)结合在一起。这样一来,犯罪者就可以借此创建一个新帐户,并使其保持良好的信誉状态。 美联储解释说,这种方法为犯罪者提供了充足的时间来建立身份和信用史。这就能让他在“破产”之前有足够的借贷或支出能力。 “与传统的身份诈骗相比,使用合成身份账户进行诈骗时,犯罪者会伪装得更像普通客户,因为他们会在前期积累一定的信用值。”美联储表示。 近年来,合成身份式支付诈骗是美国增长最快的金融犯罪类型,许多信贷企业损失惨重。 Auriemma Group的一项分析显示,在所有已注销的信用卡账户中,可能有5%与合成身份欺诈有关。2016年,美国的借贷机构共因此损失了60亿美元,平均每个帐户有15,000美元的债务,占2016年信贷损失的20%。 据ID Analytics的研究估计,传统的反诈骗模型仅能有效检测5%至15%的合成身份。正是传统的欺诈检测模型对合成身份的检测成功率很低,使得诈骗犯更加猖狂。 然而,由于合成身份欺诈的影响将遍及美国的金融体系、医疗保健行业、汽车和保险等私营行业,单独的某个行业或组织也不能独立解决这个问题。 对此,波士顿联邦储备银行高级副总裁兼安全支付策略负责人吉姆•库尼亚(Jim Cunha)认为,如果组织采用分层识别,再结合大数据分析,就很可能成功识别这种合成性身份。此外,所有支付行业之间共享信息也是一种可行的选择。 合成身份支付诈骗如何预防? 采用包括手动和自动两种数据分析方法,进行身份的分层识别。 将基本的个人信息(例如姓名,SSN,出生日期和地址)和其他数据源结合,来确认申请人的身份。 使用“强连接”式的分析过程,包括检查借贷帐户,支票帐户和其他金融工具。 筛选源自同一IP地址或设备的多个帐户应用程序,并检测在多个帐户中显示为授权用户的身份信息。 对跨行用户的服务提供商进行合成身份链接分析。 建议金融机构跨产品线共享信息,以便发现合成身份欺诈者的身份。因为一般犯罪分子会在同一组织中开设多个帐户:包括信用卡,直接存款帐户,信贷额度和汽车贷款或抵押贷款等。 总结 总之,整合各类信息,加强筛选都是有效避免合成身份欺诈的有效方法。而这些方法应包括不仅需要技术创新,还要有足够的数据信息——这就涉及私营企业与政府机构的一些谈判问题了。 【责任编辑: 赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

干货必读 | Java类初始化死锁——记一次Cassandra死锁问题排查

背景 最近压测Cassandra的时候,发现一个Cassandra进程一直没有完成初始化。经过排查后发现是死锁问题,这篇文章将会带领大家回顾整个排查过程,学习如何排查Java死锁问题,是一个非常值得学习的经验。 调查过程 1.问题发现 首先是启动后,通过Cassandra命令nodetool netstats观察何时进入NORMAL状态。如下图所示: 但是过了很久都没有进入NORMAL,一直处于STARTING状态。 2.jstack排查 想要知道为啥一直处于STARTING状态,当然是用Jstack去观察进程到底在做什么。 jstack显示主线程处于WAITING状态。这符合我们观察到的现象,因为确实一直卡在STARTING状态没有走下去。使主线程卡住的地方是AbstractCommitLogSegmentManager.awaitAvaila

优秀的个人博客,低调大师

使用nginx image filter实现类OSS对象存储中对图片的实时处理

使用Nginx image_filter实现类似OSS图片处理 在家使用自己的电脑做了一个小应用,可查看照片,按以前的方式,需要在用户上传图片后对进行裁剪压缩,然后给前端一个缩略图地址与原图地址。这种方式有两个弊端磁盘空间的浪费、缩略图尺寸调整不便捷。是否有其他不使用云OSS存储的情况下自己实现一套类似OSS的图片处理? 后来搜索资料,发现使用nginx的image_filter可以实现。根据网上其他人的实例使用没有成功。 安装nginx与imageFilter不在复述,自己从网上看文章就可以了。我使用的版本是nginx 1.13.12 直接自带该插件。 自己调整后可以使用,下面贴出完整配置。 server { listen 80; server_name 127.0.0.1; charset utf-8; root /www/uploadfile; #拦截所有带“!”号的图片请求 location ~* ^(.*\.(?:jpg|gif|png|jpeg|bmp))!(.*){ #rewrite ^(.*\.(?:jpg|gif|png))! $1; #图片访问路径 set $filename $1; #图片压缩尺寸 set $img_arg $2; #拆解处理尺寸参数,参数性质如200x400样式 if ($img_arg ~ "^(\d+)x(\d+)") { set $img_width $1; set $img_height $2; } if ($img_arg ~ "^(\d+)$") { set $img_width $1; set $img_height "-"; } if ($img_arg ~ "^x(\d+)") { set $img_width "-"; set $img_height $1; } if ( $img_width = "" ){ set $img_width 100; } if ( $img_height = ""){ set $img_height 100; } #使用内部跳转,将尺寸参数传递 echo_exec /_imgFilt; } #图片处理 location /_imgFilt { alias /www/uploadfile$filename; image_filter resize $img_width $img_height; image_filter_buffer 10M; } location ~ .*\.(swf|docx|doc|xls|xlsx|txt|pdf|ppt|pptx|mp3|zip|rar|tar|gz|mp4|ttf|ttc|fmap|fmi|theme)$ { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Headers' 'X-Requested-With'; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'; expires 30d; } } 图片访问请求地址: http://127.0.0.1/upload/20181120/1542720637600.jpg!500x400 使用以上请求,就可以实现使用nginx image filter实施图片处理。 因是自己的小应用在使用,所以性能与访问速度方面还可以。 非常耗费CPU资源,如果是公司业务,该方式请谨慎使用!!!

优秀的个人博客,低调大师

【Java入门提高篇】Day23 Java容器类详解(六)HashMap源码分析(中)

上一篇中对HashMap中的基本内容做了详细的介绍,解析了其中的get和put方法,想必大家对于HashMap也有了更好的认识,本篇将从了算法的角度,来分析HashMap中的那些函数。 HashCode 先来说说HashMap中HashCode的算法,在上一篇里,我们看到了HashMap中的put方法是这样的: public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } 那这个hash函数又是什么呢?让我们来看看它的真面目: /** * 将高位与低位进行与运算来计算哈希值。因为在hashmap中使用2的整数幂来作为掩码,所以只在当前掩码之上的位上发生 * 变化的散列总是会发生冲突。(在已知的例子中,Float键的集合在小表中保持连续的整数)因此,我们应用一个位运算 * 来向下转移高位的影响。 这是在综合考虑了运算速度,效用和质量之后的权衡。因为许多常见的散列集合已经合理分布 * (所以不能从扩散中受益),并且因为我们使用树来处理bin中发生的大量碰撞的情况,所以我们尽可能以代价最低的方式 * 对一些位移进行异或运算以减少系统损失, 以及合并由于hashmap容量边界而不会被用于散列运算的最高位的影响。 * * todo 扰动函数 */ static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } 可以看出,这里并不是简单的使用了key的hashCode,而是将它的高16位与低16位做了一个异或操作。(“>>>”是无符号右移的意思,即右移的时候左边空出的部分用0填充)这是一个扰动函数,具体效果后面会说明。接下来再看看之前的putval方法: 1 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 2 boolean evict) { 3 Node<K,V>[] tab; Node<K,V> p; int n, i; 4 //如果当前table未初始化,则先重新调整大小至初始容量 5 if ((tab = table) == null || (n = tab.length) == 0) 6 n = (tab = resize()).length; 7 //(n-1)& hash 这个地方即根据hash求序号,想了解更多散列相关内容可以查看下一篇 8 if ((p = tab[i = (n - 1) & hash]) == null) 9 //不存在,则新建节点 10 tab[i] = newNode(hash, key, value, null); 11 else { 12 Node<K,V> e; K k; 13 //先找到对应的node 14 if (p.hash == hash && 15 ((k = p.key) == key || (key != null && key.equals(k)))) 16 e = p; 17 else if (p instanceof TreeNode) 18 //如果是树节点,则调用相应的putVal方法,这部分放在第三篇内容里 19 //todo putTreeVal 20 e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); 21 else { 22 //如果是链表则之间遍历查找 23 for (int binCount = 0; ; ++binCount) { 24 if ((e = p.next) == null) { 25 //如果没有找到则在该链表新建一个节点挂在最后 26 p.next = newNode(hash, key, value, null); 27 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st 28 //如果链表长度达到树化的最大长度,则进行树化,该函数内容也放在第三篇 29 //todo treeifyBin 30 treeifyBin(tab, hash); 31 break; 32 } 33 if (e.hash == hash && 34 ((k = e.key) == key || (key != null && key.equals(k)))) 35 break; 36 p = e; 37 } 38 } 39 //如果已存在该key的映射,则将值进行替换 40 if (e != null) { // existing mapping for key 41 V oldValue = e.value; 42 if (!onlyIfAbsent || oldValue == null) 43 e.value = value; 44 afterNodeAccess(e); 45 return oldValue; 46 } 47 } 48 //修改次数加一 49 ++modCount; 50 if (++size > threshold) 51 resize(); 52 afterNodeInsertion(evict); 53 return null; 54 } 注意看第八行的代码: tab[i = (n - 1) & hash] (n - 1) & hash即通过key的hash值来取对应的数组下标,并非是对table的size进行取余操作。 那么,为什么要这样做呢?首先,扰动函数的目的就是为了扩大高位的影响,使得计算出来的数值包含了高 16 位和第 16 位的特性,让 hash 值更加深不可测来降低碰撞的概率。从hash方法的注释中,我们也可以找到答案,一般的散列,其实都是做取余处理,但是HashMap中的table大小是2的整数次幂,也就是说,肯定不是质数,那么在取余的时候,偶数的映射范围势必就要小了一半,这样效果显然就差很多,而且,除法和取余其实是很慢的操作,所以在JDK8中,使用了一种很巧妙的方式来进行散列。首先,table的大小size设置成了2的整数次幂,这样使用size-1就变成了掩码,下面是我找的一张图,能很好的解释这个过程: n是table的大小,默认是16,二进制即为10000,n - 1对应的二进制则为1111,这样再与hash值做“与”操作时,就变成了掩码,除了最后四位全部被置为0,而最后四位的范围肯定会落在(0~n-1)之间,正好是数组的大小范围,散列函数的妙处就在于此了。简直不能更稳,一波操作猛如虎。 那么我们继续上一篇的栗子,我们来一步一步分析一下,小明和小李的hash值的映射过程: 小明的hash值是756692,转换为二进制为10111000101111010100,table的大小是32,n-1=31,对应的二进制为:11111,做“与”运算之后,得到的结果是10100,即为20。 小李的hash值是757012,转换为二进制为10111000110100010100,与11111做与运算后,得到的结果也是10100,即20,于是就与小明发生了冲突,但还是要先来后到,于是小李就挂在了小明后面。 散列函数看完了,我们接下来再看看扩容函数。 扩容函数 扩容函数其实之前也已经见过了,就在上面的putVal方法里,往上面翻一翻,第六行可以看到resize函数,这就是扩容函数,让我们来看看它的庐山真面目: 1 /** 2 * 初始化或将table的大小进行扩容。 如果table为null,则按照字段threshold中的初始容量目标进行分配。 3 * 否则,因为我们使用2次幂进行扩容,所以在新表中,来自每个bin中的元素必须保持在相同的索引处,或者以原偏移量的2次幂进行移动。 4 */ 5 final Node<K,V>[] resize() { 6 Node<K,V>[] oldTab = table; 7 int oldCap = (oldTab == null) ? 0 : oldTab.length; 8 int oldThr = threshold; 9 int newCap, newThr = 0; 10 if (oldCap > 0) { 11 if (oldCap >= MAXIMUM_CAPACITY) { 12 threshold = Integer.MAX_VALUE; 13 return oldTab; 14 } 15 //新的容量扩展成原来的两倍 16 else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && 17 oldCap >= DEFAULT_INITIAL_CAPACITY) 18 //阈值也调整为原来的两倍 19 newThr = oldThr << 1; // double threshold 20 } 21 else if (oldThr > 0) // initial capacity was placed in threshold 22 newCap = oldThr; 23 else { // zero initial threshold signifies using defaults 24 newCap = DEFAULT_INITIAL_CAPACITY; 25 newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); 26 } 27 if (newThr == 0) { 28 float ft = (float)newCap * loadFactor; 29 newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? 30 (int)ft : Integer.MAX_VALUE); 31 } 32 threshold = newThr; 33 @SuppressWarnings({"rawtypes","unchecked"}) 34 Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap]; 35 table = newTab; 36 //将旧数组中的node重新散列到新数组中 37 if (oldTab != null) { 38 for (int j = 0; j < oldCap; ++j) { 39 Node<K,V> e; 40 if ((e = oldTab[j]) != null) { 41 oldTab[j] = null; 42 if (e.next == null) 43 newTab[e.hash & (newCap - 1)] = e; 44 else if (e instanceof TreeNode) 45 ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); 46 else { // preserve order 47 Node<K,V> loHead = null, loTail = null; 48 Node<K,V> hiHead = null, hiTail = null; 49 Node<K,V> next; 50 do { 51 next = e.next; 52 if ((e.hash & oldCap) == 0) { 53 if (loTail == null) 54 loHead = e; 55 else 56 loTail.next = e; 57 loTail = e; 58 } 59 else { 60 if (hiTail == null) 61 hiHead = e; 62 else 63 hiTail.next = e; 64 hiTail = e; 65 } 66 } while ((e = next) != null); 67 if (loTail != null) { 68 loTail.next = null; 69 newTab[j] = loHead; 70 } 71 if (hiTail != null) { 72 hiTail.next = null; 73 newTab[j + oldCap] = hiHead; 74 } 75 } 76 } 77 } 78 } 79 return newTab; 80 } 这里可以看到,如果原来的table还未被初始化的话,调用该函数后就会被扩容到默认大小(16),上一篇中也已经说过,HashMap也是使用了懒加载的方式,在构造函数中并没有初始化table,而是在延迟到了第一次插入元素之后。 当使用put插入元素的时候,如果发现目前的bins占用程度已经超过了Load Factor所设置的比例,那么就会发生resize,简单来说就是把原来的容量和阈值都调整为原来的2倍,之后重新计算index,把节点再放到新的bin中。因为index值的计算与table数组的大小有关,所以扩容后,元素的位置有可能会调整: 以上图为例,如果对应的hash值第五位是0,那么做与操作后,得到的序号不会变,那么它的位置就不会改变,相反,如果是1,那么它的新序号就会变成原来的序号+16,。 好像也不是很多嘛,嗯,算法部分就先介绍到这里了,之后的一篇再来说说HashMap中的EntrySet,KeySet和values(如果时间够的话顺便把迭代器也说一说)。 好了,本篇就此愉快的结束了,最后祝大家端午节快乐!如果觉得内容还不错的话记得动动小手点关注哦,你的支持就是我最大的动力! 真正重要的东西,用眼睛是看不见的。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册