unity小球不动 怎么加ainimation角色就不动了

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
Unity3D实现动态加载游戏资源
下载积分:2000
内容提示:Unity3D实现动态加载游戏资源
文档格式:DOCX|
浏览次数:2|
上传日期: 05:08:25|
文档星级:
全文阅读已结束,如果下载本文需要使用
 2000 积分
下载此文档
该用户还上传了这些文档
Unity3D实现动态加载游戏资源
官方公共微信&p&已经有好长一段时间没有机会静下心来写一篇帖子了,应Stefan之邀,今天打算来聊一聊如何制作GUI。&/p&&p&在使用Matlab的过程中,于我而言,最迷人的一点莫过于GUI的开发,这不同于仿真,不同于图像处理,或是其他,因为仿真的优化是无止尽的,没有人敢断言,老子的模型天下第一,没有人的模型能比我的仿的更准了。这有点像一道语文阅读理解,作者写这句话是什么用意。相比之下,工具开发更像一道数学题,答案是确定的,要么能实现功能,要么就是不能实现功能,而其中唯一的不同是,你是如何解这道题的,你又是如何实现这个功能的。&/p&&p&GUI的制作,只要分为两个部分,第一部分为界面设计,而第二部分为调用函数的定义。根据界面设计方式的不同,在我看来,制作GUI主要分为两种方式,一种是界面设计可视化,而另一种属于纯m脚本定义GUI界面。&/p&&p&先来看一下第一种方式,界面设计可视化。&/p&&img src=&/v2-bacfdc16fc125_b.png& data-rawwidth=&597& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&597& data-original=&/v2-bacfdc16fc125_r.png&&&p&这种方式,在网上比较常见,有兴趣的朋友可以上网参考一下,也可以考虑参考下方的连接:&/p&&p&&a href=&/?target=http%3A///article/e3c78dc4c85f5d1.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&界面设计可视化&i class=&icon-external&&&/i&&/a&&/p&&p&其中每一个步骤都有详细的图文解释,可以一步步进行练习。&/p&&p&其中最主要的步骤大致如下:&/p&&p&1. 左键拖动快捷按钮进行工具界面设计&/p&&p&2. 双击快捷按钮,进行快捷按钮的属性定义&/p&&p&3. 右键选择Editor,定义该快捷按钮的调用函数。这步骤就涉及到脚本编程&/p&&p&4. 再就是点击Run,进行调试&/p&&p&这种方式所制作的GUI,存在两个文件,一个是.fig的界面文件,而另一个是.m的调用函数文件。&/p&&p&对于另一种方式制作GUI,也就是使用纯m脚本,通过一个简单的例子来说明。&/p&&p&曾经我在开发录制视频工具时,碰到一个之前没有接触过的问题,就是如果在GUI中通过一个按钮实现视频录制的暂停或是终止,这个具体的需求进行细化之后,就是如何在GUI中通过一个按钮实现while循环的终止。&/p&&p&于是,我就上网搜了一下,其中有一个帖子十分有意思,评论的朋友也提出了几种比较独特的想法。有兴趣的朋友,可以查看一下这个帖子:&/p&&p&&a href=&/?target=http%3A///thread--1.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何在GUI中通过一个按钮实现while循环的终止&i class=&icon-external&&&/i&&/a&&/p&&p&其中有一个大佬给出了目前最为有效的解法,代码如下,如有侵权,请告知。&/p&&img src=&/v2-2f1f8d3ffef8b8e056a4b8_b.png& data-rawwidth=&772& data-rawheight=&568& class=&origin_image zh-lightbox-thumb& width=&772& data-original=&/v2-2f1f8d3ffef8b8e056a4b8_r.png&&&p&运行之后,整体的界面图如下&/p&&p&&br&&/p&&img src=&/v2-5b11fa638aadac6044f51d_b.png& data-rawwidth=&1027& data-rawheight=&203& class=&origin_image zh-lightbox-thumb& width=&1027& data-original=&/v2-5b11fa638aadac6044f51d_r.png&&&p&代码中关于需求的功能实现,具体我就不展开介绍了,我就介绍下,这种GUI制作方式的m脚本构成是怎样的。&/p&&p&1. 首先,整个是一个function的形式,也就是你们所看到的第1行function及第19行end。&/p&&p&2. 第2、3行的参数定义,是根据功能需求所定义的。这里不再阐述。&/p&&p&3. 第4行是GUI工具界面窗体的定义,其中两个属性分别表示位置信息Position以及设定菜单栏不现实。&/p&&p&4. 第5行是text字符串显示的定义,也就是效果图中“0”所显示的地方。这里使用了uicontrol函数,这个函数在第6、7行的按钮定义中也使用了。除此以外还能定义其他类似于edit输入栏、Listbox列表等插件,可以通过上网搜索了解这个函数的具体使用方法。最全面的介绍,莫过于Matlab的help文档,可以查看下方链接&/p&&p&&a href=&/?target=http%3A///help/matlab/ref/uicontrol.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matlab - Help - uicontrol&i class=&icon-external&&&/i&&/a&&/p&&p&5.第9至15行定义了一个调用函数,所对应的,正是图中start按钮的功能。这个函数的调用,是在第6行的末尾@call1进行关联的。&/p&&p&通过一个简单的小例子,大致介绍了纯m脚本制作GUI工具的流程。而这才是GUI工具制作的开始,最有意思的,莫过于通过Matlab实现自己的想法。&/p&&p&既然学会如何开始制作GUI了,那我就分享几篇我先前所写的比较有意思的几个工具,有兴趣的朋友不妨去复现一下,我敢保证,你一定会有收获的。&/p&&p&1. &a href=&/?target=http%3A//mp./s%3F__biz%3DMzU5NTAyMTIzOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D163fd4c26f6d75ce50b8fd7cef4fca49%26chksm%3Dfe791d9dc90e948b43f671f3dcbddfea1c5a67dcd8d32de3f33b591b%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【一个被毙掉的作品】如何评估一只股票的买点&i class=&icon-external&&&/i&&/a&&/p&&p&2. &a href=&/?target=http%3A//mp./s%3F__biz%3DMzU5NTAyMTIzOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D94de62eca601c%26chksm%3Dfe791fcac90e96dce5a89f0a2a3a40a9cf16ef269d7ebed%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matlab如何实现截屏与屏幕录制&i class=&icon-external&&&/i&&/a&&/p&&p&3. &a href=&/?target=http%3A//mp./s%3F__biz%3DMzU5NTAyMTIzOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3D38bae9ec17aed0d1b2ff4b88%26chksm%3Dfe791ec1c90e97d71c5e30fa43be6d398c663e7f3ec7e03b7bb7cedd9%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matlab如何大规模修改Simulink模型&i class=&icon-external&&&/i&&/a&&/p&&p&4. &a href=&/?target=http%3A//mp./s%3F__biz%3DMzU5NTAyMTIzOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3Ddb223c57aee961cf93cb%26chksm%3Dfe791d20c90efd2d2e3eedca3ed792afd9f9cb96a50e3254%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matlab如何从曲线图中提取原始数据&i class=&icon-external&&&/i&&/a&&/p&&p&5. &a href=&/?target=http%3A//mp./s%3F__biz%3DMzU5NTAyMTIzOQ%3D%3D%26mid%3D%26idx%3D1%26sn%3Dd466cfb0c423%26chksm%3Dfe791d31c90ef850e467cf2a71e55fe9bcb118f3380cac218c1d8fb7f448fa733%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Matlab如何动态呈现计算结果&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&以上&/p&&p&如果你有兴趣,欢迎关注我的微信公众号“打浦桥程序员”,谢谢&/p&
已经有好长一段时间没有机会静下心来写一篇帖子了,应Stefan之邀,今天打算来聊一聊如何制作GUI。在使用Matlab的过程中,于我而言,最迷人的一点莫过于GUI的开发,这不同于仿真,不同于图像处理,或是其他,因为仿真的优化是无止尽的,没有人敢断言,老子的…
参考:&a href=&///?target=http%3A//blog.csdn.net/angel_yj/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&密码学之RSA加密&i class=&icon-external&&&/i&&/a&&br&&br&RSA加密:非对称密钥,公开密钥算法&br&RSA加密利用了单向函数正向求解很简单,反向求解很复杂的特性。&br&具体是利用了:&br&1.对两个质数相乘容易,而将其合数分解很难的这个特点进行的加密算法。 n=p1*p2,已知p1、p2求n简单,已知n求p1、p2困难。&br&2.(m^e) mod n=c,已知m、e、n求c简单,已知e、n、c求m很难。&br&&br&RSA加密,实现了公开密钥,就是A可以给所有人发送锁,其他人把要加密的信息用这把锁加密后发送给A,A用自己的钥匙开锁就可以获得加密的信息了。反过来,A要发送加密信息给B,只要知道B的锁就可以了,而这个锁是公开的。&br&&br&公开密钥n、e的生成:随机选取两个质数p1、p2,n=p1*p2,再随机选取一个整数e,e与φ(n)互质。&br&加密过程:(m^e) mod n=c,其中m为原信息,c为加密信息,n、e为公开密钥。&br&解密过程:(c^d) mod n=m,其中d为解密密钥。&br&解密密钥d的求解:&br&(c^d) mod n=(((m^e) mod n)^d) mod n=((m^e)^d) mod n=(m^ed) mod n=m ①&br&根据费马定理(m^φ(n)) mod n≡1,又1^k≡1,所以(m^k*φ(n)) mod n≡1,两边同乘以m得m*((m^k*φ(n)) mod n)≡1*m,化简(m^(k*φ(n)+1)) mod n≡m ②&br&由①、②得ed=(k*φ(n)+1),解得d=(k*φ(n)+1)/e。&br&费马定理:若p是素数,a与p互素,则a^(p-1)≡1 (mod p)&br&&br&过程如下:&br&A:有一个公钥n、e。例如:3127、3。&br&B:有一个信息m。例如:89。&br&C:偷听者&br&&br&A:&br&第一步:随机找两个质数p1、p2,一个奇数e。例如:53、59、3。&br&第二步:计算n=p1*p2得到n,计算欧拉函数φ(n)=(p1-1)*(p2-1)得到φ(n),计算钥匙d=(k*φ(n)+1)/e得到d。例如:53*59=3127、(53-1)*(59-1)=3016、(k*φ(n)+1)/e=(2*=2011。&br&第三步:发送n、e给大家知道
//n、e就是公钥也做锁,d就是n、e的钥匙。&br&&br&C:获得n、e&br&&br&B:&br&第一步:获得n、e&br&第二步:加密信息m,(m^e) mod n=c,获得加密信息c。例如:(89^3) mod 。&br&第三步:发送c给A&br&&br&C:&br&第一步:截获加密信息c&br&第二步:破解信息c,此时C只有n、e、c,只有把n分解质因数才能破解,而此分解很困难特别是当n很大的时候。&br&&br&A:&br&第一步:收到加密信息c&br&第二步:解密信息c,(c^d) mod n=m,获得信息m。例如:() mod 3127=89。&br&完成
参考: RSA加密:非对称密钥,公开密钥算法 RSA加密利用了单向函数正向求解很简单,反向求解很复杂的特性。 具体是利用了: 1.对两个质数相乘容易,而将其合数分解很难的这个特点进行的加密算法。 n=p1*p2,已知p1、p2求n简单,已知n求p1、p…
&img src=&/50/a45efea9c5_b.jpg& data-rawwidth=&640& data-rawheight=&360& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&/50/a45efea9c5_r.jpg&&&p&本期论文我们来简单讨论一下计算机加密算法的原理与实践。&/p&&p&友情提示:不要看到论文二字就吓跑了,其实读懂一篇高水平的论文是非常简单滴!&/p&&p&经常上网的童鞋肯定都知道,现在电脑和手机的安全实在是太重要了。很久很久以前,就有一个不懂数据安全的小伙,他叫陈冠希,后来的故事大家都知道了。&/p&&p&怎么才能保护好重要的数据呢?有个重要的方法就是加密。经常听说各种加密算法、数字证书啥的,那到底计算机是如何加密的呢?读完这篇论文你就明白了。&/p&&h2&签名算法&/h2&&p&签名算法不是领工资的时候把自己的名字写到“签名”一栏里。这里的签名是对消息内容做个计算,得到一个特征码,用这个特征码作为签名。&/p&&p&搞个签名有啥用?&/p&&p&我们来看发生在教室里的一个真实故事。&/p&&p&小明(性别:男)对女神小红仰慕已久,终于在上课的时候鼓足勇气在数学书背面写了几句话,举起来希望女神能看见。无奈女神坐得离他比较远,于是小明委托死党老王(老王坐在小明和女神中间位置)复制一下自己的消息,这样小明就表白成功了:&/p&&img src=&/d86a1c83dc9d224fb30e_b.jpg& data-rawwidth=&506& data-rawheight=&228& class=&origin_image zh-lightbox-thumb& width=&506& data-original=&/d86a1c83dc9d224fb30e_r.jpg&&&p&然而老王有个特点就是特别不靠谱,加上眼神不好,结果把“xiao ming”抄成了“xiao ning”,让女神误以为是班长小宁对自己表白了:&/p&&img src=&/d4f9feeb72aeffbbc03b215_b.jpg& data-rawwidth=&582& data-rawheight=&230& class=&origin_image zh-lightbox-thumb& width=&582& data-original=&/d4f9feeb72aeffbbc03b215_r.jpg&&&p&经过这次惨痛的教训,小明决定给消息加上一个签名,这样如果老王抄错了,女神核对签名就会发现这个问题:&/p&&img src=&/61b2b54e03d52fff7bf607b8a611de2b_b.jpg& data-rawwidth=&500& data-rawheight=&270& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/61b2b54e03d52fff7bf607b8a611de2b_r.jpg&&&p&可见签名就是用来判断消息是否被修改过。如果消息被修改了,计算出来的签名就和原始签名对不上。&/p&&p&在计算机中,经常用MD5或者SHA1作为签名算法,你看到的一串乱七八糟的数字d41d8cd9...就是MD5签名。经常用迅雷在网上乱下软件的童鞋,可以用专门的软件计算下载文件的MD5签名,再去官网对比,如果一致,说明软件没有被篡改过。&/p&&p&但是签名算法不是加密算法,不能用来加密,它的作用是防篡改。&/p&&h2&对称加密算法&/h2&&p&如果用一个密码把消息加密,解密的时候还用这个密码,这种加密算法就是对称加密算法。&/p&&p&小明自从勾搭上女神后,经常上课的时候给女神传纸条,当然必须通过中介老王。&/p&&p&没想到老王其实对女神也垂涎已久,他偷偷改了小明的纸条,结果一下课女神就要和小明绝交:&/p&&img src=&/152bdee50eb_b.jpg& data-rawwidth=&500& data-rawheight=&203& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/152bdee50eb_r.jpg&&&p&小明用了九牛二虎之力终于向女神解释明白了。不过要继续传纸条,始终绕不开老王,怎么办?小明用手机几番搜索,终于找到了AES加密算法!&/p&&p&AES加密就是用一个密码把消息加密成密文,对方再用同一个密码解密。因为用的密码是同一个,所以称为对称加密。&/p&&p&小明和女神约定用女神的生日做密码:&/p&&img src=&/20bb29f897e72a173dca_b.png& data-rawwidth=&500& data-rawheight=&234& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/20bb29f897e72a173dca_r.png&&&p&然而身经百战的老王很快就猜出了密码。难道要定期更换一个新密码?&/p&&p&如果每次都用一个随机密码,那老王不就猜不到了?小明想到了这个好办法,不禁为自己的机智点赞!&/p&&p&但是,每次传纸条前,随机密码怎么告诉女神?通过老王告诉她?呵呵!&/p&&p&小明又陷入了沉思。&/p&&h2&DH密钥交换算法&/h2&&p&数学课代表提醒小明:你现在面临的问题是,通信双方需要约定一个密码,但是又必须通过一个不安全的信道传递密码,所以你需要DH密钥交换算法喔!&/p&&p&原来学数学这么有用!小明赶快恶补了Diffie-Hellman密钥交换算法,一看非常简单!&/p&&p&首先,小明先选一个素数和一个底数,例如,素数p=23,底数g=5(底数可以任选),再选择一个秘密整数a=6,计算A=g^a mod p=8,然后传纸条给女神:p=23,g=5,A=8;&/p&&p&女神收到纸条后,也选一个秘密整数b=15,然后计算B=g^b mod p=19,并传纸条告诉小明:B=19;&/p&&p&小明自己计算出密码s=B^a mod p=2,女神也自己计算出密码s=A^b mod p=2,因此,小明和女神最终协商的密码s为2。&/p&&p&而这一切都发生在老王的眼皮底下,他却无法计算出小明和女神协商的密码:&/p&&img src=&/fc144cdb309fd93c9a96e_b.jpg& data-rawwidth=&500& data-rawheight=&256& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&/fc144cdb309fd93c9a96e_r.jpg&&&h2&中间人攻击&/h2&&p&既然老王无法获知小明和女神协商的密码,他就换了一个思路:小明要协商密码的时候,老王就假装自己是女神,和女神协商密码的时候,老王假装自己是小明,这样,老王成功地使用了中间人攻击得到了密码!&/p&&h2&非对称加密&/h2&&p&小明再次向数学课代表求助。&/p&&p&“看来对付老王这种高手,你得用RSA非对称加密了。”数学课代表缓缓地说,“你和女神各自生成自己的公钥和私钥,然后把公钥公开,比如写在教室后面的黑板上,如果你要给女神发信息,你就用她的公钥加密,再用你的私钥签个名,她用自己的私钥解密信息,再用你的公钥验证签名。老王没有你俩的私钥,没法解密也没法篡改!”&/p&&p&小明兴奋地和女神生成了各自的RSA公钥和私钥。这下小明再也不用担心老王了,从上课开始,小明就开始用RSA算法对纸条的内容进行加密计算。由于RSA算法计算量非常大,直到下课小明也没有算完。&/p&&p&数学课代表拍了拍小明的肩膀,说:“加密这个事,还得用计算机算。学点JavaScript,你就可以直接写代码让计算机帮你加密了!点&a href=&/?target=http%3A///wiki/867bd51a89c25cc8b43bdbd11d84aeefd792c0da51000& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&i class=&icon-external&&&/i&&/a&,直接学习如何用JavaScript实现加解密!”&/p&
本期论文我们来简单讨论一下计算机加密算法的原理与实践。友情提示:不要看到论文二字就吓跑了,其实读懂一篇高水平的论文是非常简单滴!经常上网的童鞋肯定都知道,现在电脑和手机的安全实在是太重要了。很久很久以前,就有一个不懂数据安全的小伙,他叫陈…
&blockquote&导语:赚钱,赚钱,生活在这个世界上必须面对的一件事。程序员这个行业说是现在最火的行业,其实一点也不为过,赚钱对于程序员来说也有很多方式。我之前分享的几篇关于个人或者独立开发者的文章阅读量不错,看来大家还是比较关心挣钱这件事的。&/blockquote&&p&&br&&/p&&p&其实作为独立的开发者来说,生活在这个国内的大环境中非常的不容易,与国外的独立开发者相比真的是可怜很多。国内的人都喜欢免费,破解版的东西,即使让用户支付 1 分钱去使用,都是一件很困难的事,每次看到国外独立开发者,尤其是做游戏行业的,钱挣的真多。尤其是现在,随着各大应用市场上各种软件鱼龙混杂,可以说各类应用应有尽有,再加上国内应用市场也是很分散,不统一,所以国内的独立开发者真的是可谓「&b&举步维艰&/b&」。&/p&&p&&br&&/p&&p&举个小例子,我之前的一个同事,来公司实习,做了不到一年之后,去了美国留学,前几天在微信朋友圈看到他在晒图,打开一看,自己做了一个小手机软件,在 google play 上收费下载挣钱,哎呦,不错哦,下载量还可以啊!当时我就在想,如果国内的收费了,还会有人下载吗?难。&/p&&p&&br&&/p&&p&虽说艰难,但是「&b&梦想还是要有的,万一实现了呢&/b&」?所以干一件事不仅要有勇气,还需要坚持,有很多新的开发者关注了我,以前分享的关于个人开发者的一些知识,可能都没看过。现在我做了一个总结整理,看完希望大家都能够有所收获。&/p&&p&&br&&/p&&p&&b&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3Db88ff6edce3256e7dee2d788bdscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第一篇:科普技术贴:个人开发者的那些赚钱方式&i class=&icon-external&&&/i&&/a&&/b& &/p&&p&&br&&/p&&p&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3Db88ff6edce3256e7dee2d788bdscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《科普技术贴:个人开发者的那些赚钱方式 》&i class=&icon-external&&&/i&&/a&这篇文章讲的主要事作为一个个人开发者有哪些比较好的赚钱方式。并对每种赚钱方式进行了一些分析和总结。讲的应该说还是很到位。&/p&&p&&br&&/p&&p&&b&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3Db15d90cb22f0bc01ca61%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第二篇:强烈推荐:程序员接私活那点事&i class=&icon-external&&&/i&&/a&&/b&&/p&&p&&br&&/p&&p&在第一篇文章当中,讲了其中的一个赚钱方式,就有接私活。而&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3Db15d90cb22f0bc01ca61%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《强烈推荐:程序员接私活那点事》&i class=&icon-external&&&/i&&/a&这篇文章是对于接私活这件事进行了详细的说明,包括怎样接私活,接私活需要注意哪些事项,看完之后,可以让你们避免很多坑,减少很多上当。&/p&&p&&br&&/p&&blockquote&接下来的第三篇和第四篇讲的就是作为独立的个人开发者自己做一个软件需要的一些知识,其实算是一体的。就是我在第一篇文章中讲的如何自己做一款软件,加广告挣钱,怎么使用一些网上的免费接口和后台等。&/blockquote&&p&&br&&/p&&p&&b&&a href=&///?target=http%3A//mp.weixin.%3C/b%3Eq%3Cb%3Eq.c%3C/b%3Eo%3Cb%3Em/%3C/b%3Es%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D04d1b413c90d0cac4e420%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第三篇:绝对干货:供个人开发者赚钱免费使用的一些好的 API 接口&i class=&icon-external&&&/i&&/a&&/b&&/p&&p&&br&&/p&&p&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D04d1b413c90d0cac4e420%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《绝对干货:供个人开发者赚钱免费使用的一些好的 API 接口》&i class=&icon-external&&&/i&&/a&这篇文章一看题目就知道了怎么回事了,就是提供一些免费的 API 接口。这些接口的提供服务商应该还不错,里面的接口有些我都用过,感觉还不错。大家要想详细了解一下可以仔细阅读一下。&/p&&p&&br&&/p&&p&&b&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D01aecde92dfdcdscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第四篇:超值干货:个人开发者如何使用免费又简单的开发后台&i class=&icon-external&&&/i&&/a&&/b&&/p&&p&&br&&/p&&p&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D01aecde92dfdcdscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《超值干货:个人开发者如何使用免费又简单的开发后台》&i class=&icon-external&&&/i&&/a&这篇文章讲的就是一些免费简单的后台,对于网上提供的一些接口可能并不能满足每个人的需要,所有网上也有一些网站提供了后台,自己去配置就能做开发,使用起来并没有那么难。大家可以去看看。&/p&&p&&br&&/p&&p&&b&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D385edb0aa16a%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&第五篇:夹缝中生存的个人开发者&i class=&icon-external&&&/i&&/a&&/b&&/p&&p&&br&&/p&&p&&a href=&///?target=http%3A//mp./s%3F__biz%3DMjM5NDkxMTgyNw%3D%3D%26mid%3Didx%3D1%26sn%3D385edb0aa16a%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《夹缝中生存的个人开发者》&i class=&icon-external&&&/i&&/a&这篇文章是最近更新的,算是对于目前个人开发者的一些现状的总结吧!跟我在刚开始时写的一样,做好一个独立的开发者确实很不容易。里面讲解了独立开发者开发应用上传各大应用市场时遇到的一些坑,看完这篇文章可能对于大家迈过一些坑很有帮助。&/p&&p&&br&&/p&&p&就这样吧,生活都不容易,「&b&且行且珍惜&/b&」,「&b&且做且努力&/b&」吧!&/p&&p&&b&最后,欢迎大家关注我的微信公众号:非著名程序员 ,每天都会在里面答疑解惑和分享技术文章。&/b&&/p&
导语:赚钱,赚钱,生活在这个世界上必须面对的一件事。程序员这个行业说是现在最火的行业,其实一点也不为过,赚钱对于程序员来说也有很多方式。我之前分享的几篇关于个人或者独立开发者的文章阅读量不错,看来大家还是比较关心挣钱这件事的。 其实作为独…
&p&尝试了一下用C语言来翻译这段代码。首先在这里贴比较完整地贴一下这段求 sin 的代码(来自&a href=&///?target=http%3A///docs/M6502.MAC.txt& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/docs/M650&/span&&span class=&invisible&&2.MAC.txt&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&):&/p&&img src=&/v2-a62cb6fda_b.png& data-rawwidth=&474& data-rawheight=&527& class=&origin_image zh-lightbox-thumb& width=&474& data-original=&/v2-a62cb6fda_r.png&&&p&&br&&/p&&img src=&/v2-fe6937eac0c79c6a3b0d_b.png& data-rawwidth=&280& data-rawheight=&338& class=&content_image& width=&280&&&p&&br&&/p&&img src=&/v2-dba2dcdbc969caf1500c8d_b.png& data-rawwidth=&456& data-rawheight=&601& class=&origin_image zh-lightbox-thumb& width=&456& data-original=&/v2-dba2dcdbc969caf1500c8d_r.png&&&p&注释非常详尽的,虽然不是每一条指令都能看懂,但是通过注释还是能猜出大概意思的。下面是代码(简略版):&/p&&p&(Update :修改为更加接近原版 & 加上注释)&/p&&div class=&highlight&&&pre&&code class=&language-c&&&span class=&cp&&#include &math.h&&/span&
&span class=&c1&&// 多项式求值,c[0] + c[1] * x + c[2] * x^2 + ... + c[n-1] * x^(n-1)&/span&
&span class=&kt&&float&/span& &span class=&nf&&poly&/span&&span class=&p&&(&/span&&span class=&kt&&float&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&k&&const&/span& &span class=&kt&&float&/span&&span class=&o&&*&/span& &span class=&n&&c&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&kt&&float&/span& &span class=&n&&sum&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&n&&n&/span&&span class=&p&&;&/span& &span class=&o&&++&/span&&span class=&n&&i&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&sum&/span& &span class=&o&&*=&/span& &span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&n&&sum&/span& &span class=&o&&+=&/span& &span class=&n&&c&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&];&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&n&&sum&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&c1&&// 多项式求值,c[0] * x + c[1] * x^3 + c[2] * x^5 + ... + c[n-1] * x^(2n-1)&/span&
&span class=&kt&&float&/span& &span class=&nf&&polyx&/span&&span class=&p&&(&/span&&span class=&kt&&float&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&kt&&int&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&k&&const&/span& &span class=&kt&&float&/span&&span class=&o&&*&/span& &span class=&n&&c&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&k&&return&/span& &span class=&n&&poly&/span&&span class=&p&&(&/span&&span class=&n&&x&/span& &span class=&o&&*&/span& &span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&c&/span&&span class=&p&&)&/span& &span class=&o&&*&/span& &span class=&n&&x&/span&&span class=&p&&;&/span& &span class=&p&&}&/span&
&span class=&c1&&// 泰勒展开的系数,(2PI)^n / n! (n = 9, 7, 5, 3, 1) &/span&
&span class=&k&&const&/span& &span class=&kt&&float&/span& &span class=&n&&SIN_TABLE&/span&&span class=&p&&[]&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&mf&&39.710899&/span&&span class=&p&&,&/span& &span class=&o&&-&/span&&span class=&mf&&76.574956&/span&&span class=&p&&,&/span& &span class=&mf&&81.602231&/span&&span class=&p&&,&/span& &span class=&o&&-&/span&&span class=&mf&&41.341677&/span&&span class=&p&&,&/span& &span class=&mf&&6.2831853&/span&&span class=&p&&};&/span&
&span class=&kt&&float&/span& &span class=&nf&&basic_sin&/span&&span class=&p&&(&/span&&span class=&kt&&float&/span& &span class=&n&&x&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 应用三角函数的周期性,变换输入 [0, 2PI) / [0, 1)&/span&
&span class=&n&&x&/span& &span class=&o&&/=&/span& &span class=&mf&&3.1415926&/span& &span class=&o&&*&/span& &span class=&mi&&2&/span&&span class=&p&&;&/span&
&span class=&n&&x&/span& &span class=&o&&-=&/span& &span class=&n&&floor&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&);&/span&
&span class=&c1&&// 将输入进一步变换到 [-PI/2, PI/2] / [-1/4, 1/4]&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&mf&&0.25&/span& &span class=&o&&-&/span& &span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&kt&&int&/span& &span class=&n&&sign&/span& &span class=&o&&=&/span& &span class=&n&&x&/span& &span class=&o&&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&sign&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 第二、三、四象限 &/span&
&span class=&n&&x&/span& &span class=&o&&+=&/span& &span class=&mf&&0.5&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&x&/span& &span class=&o&&&&/span& &span class=&mi&&0&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&c1&&// 第二、三象限&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&o&&-&/span&&span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&c1&&// 第一象限 &/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&o&&-&/span&&span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&n&&x&/span& &span class=&o&&+=&/span& &span class=&mf&&0.25&/span&&span class=&p&&;&/span&
&span class=&k&&if&/span&&span class=&p&&(&/span&&span class=&n&&sign&/span&&span class=&p&&)&/span& &span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&o&&-&/span&&span class=&n&&x&/span&&span class=&p&&;&/span&
&span class=&c1&&// 这一步完成之后:&/span&
&span class=&c1&&// 第一象限 [0, 1/4) -& [0, 1/4):x -& x&/span&
&span class=&c1&&// 第二象限 [1/4, 2/4) -& (0, 1/4]:x -& 0.5 - x&/span&
&span class=&c1&&// 第三象限 [2/4, 3/4) -& (-1/4, 0]:x -& 0.5 - x&/span&
&span class=&c1&&// 第四象限 [3/4, 1) -& [-1/4, 0):x -& x - 1&/span&
&span class=&c1&&// 然后就是泰勒展开 &/span&
&span class=&k&&return&/span& &span class=&n&&polyx&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&n&&SIN_TABLE&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&其实就是用多项式逼近(泰勒展开)啦。试一下把结果画出来:&/p&&img src=&/v2-ec6c8417fac3abf62c024e_b.png& data-rawwidth=&481& data-rawheight=&338& class=&origin_image zh-lightbox-thumb& width=&481& data-original=&/v2-ec6c8417fac3abf62c024e_r.png&&&p&看起来挺好。&/p&&p&不过这样说来,前人用汇编码代码真的很麻烦啊(&/p&&p&&br&&/p&&p&附:公式写出来就是&img src=&///equation?tex=%5Csin+x+%5Capprox+x+-+%5Cfrac1%7B3%21%7D+x%5E3+%2B+%5Cfrac1%7B5%21%7D+x%5E5+-+%5Cfrac1%7B7%21%7D+x%5E7+%2B+%5Cfrac1%7B9%21%7D+x%5E9+%28x+%5Cin+%5B-%5Cfrac%5Cpi2%2C+%5Cfrac%5Cpi2%5D%29& alt=&\sin x \approx x - \frac1{3!} x^3 + \frac1{5!} x^5 - \frac1{7!} x^7 + \frac1{9!} x^9 (x \in [-\frac\pi2, \frac\pi2])& eeimg=&1&&&/p&
尝试了一下用C语言来翻译这段代码。首先在这里贴比较完整地贴一下这段求 sin 的代码(来自): 注释非常详尽的,虽然不是每一条指令都能看懂,但是通过注释还是能猜出大概意思的。下面是代码(简略版):(Update :修改为更…
&img src=&/50/v2-e8dc175bdaaddabc3b7fc_b.jpg& data-rawwidth=&587& data-rawheight=&578& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&/50/v2-e8dc175bdaaddabc3b7fc_r.jpg&&&p&目标检测通俗的来说是为了找到图像或者视频里的所有目标物体。在下面这张图中,两狗一猫的位置,包括它们所属的类(狗/猫),需要被正确的检测到。&/p&&p&&br&&/p&&img src=&/v2-1fec888eab1f04d31f8e1ff66fdb672b_b.png& data-rawwidth=&200& data-rawheight=&209& class=&content_image& width=&200&&&p&所以和图像分类不同的地方在于,目标检测需要找到尽量多的目标物体,而且要准确的定位物体的位置,一般用矩形框来表示。&/p&&p&在接下来的章节里,我们先介绍一个流行的目标检测算法,SSD (Single-Shot MultiBox Object Detection).&/p&&p&&br&&/p&&blockquote&友情提示:本章节特别长,千万不要在蹲坑的时候点开。&br&本文中涉及MXNet 0.11最新的发布的gluon接口,参考&a href=&/p/& class=&internal&&MXNet 0.11发布,加入动态图接口Gluon,还有两位CMU教授的亲笔教程&/a&&/blockquote&&p&&br&&/p&&h2&SSD:
Single Shot MultiBox Detector&/h2&&p&顾名思义,算法的核心是用卷积神经网络一次前向推导求出大量多尺度(几百到几千)的方框来表示目标检测的结果。网络的结构用下图表示。&/p&&p&&br&&/p&&img src=&/v2-31aca271f07cf_b.png& data-rawwidth=&1182& data-rawheight=&616& class=&origin_image zh-lightbox-thumb& width=&1182& data-original=&/v2-31aca271f07cf_r.png&&&p&跟所有的图像相关的网络一样,我们需要一个&b&主干网络&/b&来提取特征,同时也是作为第一个预测特征层。网络在当前层产生大量的&b&预设框&/b&,和与之对应的每个方框的&b&分类概率&/b&(背景,猫,狗等等)以及真正的物体和预设框的&b&偏移量&/b&。在完成当前层的预测后,我们会下采样当前特征层,作为新的预测层,重新产生新的&b&预设框&/b&,&b&分类概率&/b&,&b&偏移量&/b&。这个过程往往会重复好几次,直到预测特征层到达全局尺度( &img src=&/equation?tex=1+%5Ctimes+1& alt=&1 \times 1& eeimg=&1&& )。&/p&&p&接下来我们用例子解释每个细节实现。&/p&&p&&br&&/p&&p&&b&预设框 Default anchor boxes&/b&&/p&&p&预设框的形状和大小可以由参数控制,我们往往设置一堆预设框,以期望任意图像上的物体都能有一个预设框能大致重合,由于每个预设框需要对应的预测网络预测值,所以希望对于每个物体都有100%重合的预设框是不现实的,可能会需要几十万甚至几百万的预设框,但是采样的预设框越多,重合概率越好,用几千到上万个预设框基本能实现略大于70%的最好重合率,同时保证了检测的速度。&/p&&p&为了保证重合覆盖率,对于每个特征层上的像素点,我们用不同的大小和长宽比来采样预设框。 假设在某个特定的特征层( &img src=&/equation?tex=w+%5Ctimes+h& alt=&w \times h& eeimg=&1&& ),每个预设框的中心点就是特征像素点的中心,然后我们用如下的公式采样预设框:&/p&&ul&&li&预设框的中心为特征像素点的中心 &img src=&/equation?tex=x+%3D+%28i+%2B+0.5%29+%2F+w%2C+y+%3D+%28j+%2B+0.5%29+%2F+h%2C+i+%5Cin+%5B0%2C+w%29%2C+j+%5Cin+%5B0%2C+h%29& alt=&x = (i + 0.5) / w, y = (j + 0.5) / h, i \in [0, w), j \in [0, h)& eeimg=&1&&&/li&&li&对于长宽比 &img src=&/equation?tex=r+%3D+1& alt=&r = 1& eeimg=&1&& ,
尺寸&img src=&/equation?tex=s%5Cin+%280%2C1%5D& alt=&s\in (0,1]& eeimg=&1&& , 生成的预设框大小 &img src=&/equation?tex=ws+%5Ctimes+hs& alt=&ws \times hs& eeimg=&1&& 。&/li&&li&对于长宽比 &img src=&/equation?tex=r+%3E+0& alt=&r & 0& eeimg=&1&& 同时 &img src=&/equation?tex=r+%5Cneq+1& alt=&r \neq 1& eeimg=&1&& , 生成的预设框大小 &img src=&/equation?tex=ws%5B0%5D%5Csqrt%7Br%7D+%5Ctimes+%5Cfrac%7Bhs%5B0%5D%7D%7B%5Csqrt%7Br%7D%7D& alt=&ws[0]\sqrt{r} \times \frac{hs[0]}{\sqrt{r}}& eeimg=&1&& , 其中 &img src=&/equation?tex=s%5B0%5D& alt=&s[0]& eeimg=&1&& 是第一个预设的尺寸。&/li&&/ul&&p&这里例子里,我们用事先实现的层&i&MultiBoxPrior&/i&产生预设框,输入 &img src=&/equation?tex=n& alt=&n& eeimg=&1&& 个预设尺寸,和 &img src=&/equation?tex=m& alt=&m& eeimg=&1&& 个预设的长宽比,输出为 &img src=&/equation?tex=n%2Bm-1& alt=&n+m-1& eeimg=&1&& 个方框而不是 &img src=&/equation?tex=n+%5Ctimes+m& alt=&n \times m& eeimg=&1&& 个。 当然我们完全可以使用其他的算法产生不同的预设框,但是实践中我们发现上述的方法覆盖率和相应需要的预设框数量比较合适。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&mxnet&/span& &span class=&kn&&as&/span& &span class=&nn&&mx&/span&
&span class=&kn&&from&/span& &span class=&nn&&mxnet&/span& &span class=&kn&&import&/span& &span class=&n&&nd&/span&
&span class=&kn&&from&/span& &span class=&nn&&mxnet.contrib.ndarray&/span& &span class=&kn&&import&/span& &span class=&n&&MultiBoxPrior&/span&
&span class=&n&&n&/span& &span class=&o&&=&/span& &span class=&mi&&40&/span&
&span class=&c1&&# 输入形状: batch x channel x height x weight&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&random_uniform&/span&&span class=&p&&(&/span&&span class=&n&&shape&/span&&span class=&o&&=&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&))&/span&
&span class=&n&&y&/span& &span class=&o&&=&/span& &span class=&n&&MultiBoxPrior&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&sizes&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&o&&.&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&o&&.&/span&&span class=&mi&&25&/span&&span class=&p&&,&/span& &span class=&o&&.&/span&&span class=&mi&&1&/span&&span class=&p&&],&/span& &span class=&n&&ratios&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&o&&.&/span&&span class=&mi&&5&/span&&span class=&p&&])&/span&
&span class=&c1&&# 取位于 (20,20) 像素点的第一个预设框&/span&
&span class=&c1&&# 格式为 (x_min, y_min, x_max, y_max)&/span&
&span class=&n&&boxes&/span& &span class=&o&&=&/span& &span class=&n&&y&/span&&span class=&o&&.&/span&&span class=&n&&reshape&/span&&span class=&p&&((&/span&&span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'The first anchor box at row 21, column 21:'&/span&&span class=&p&&,&/span& &span class=&n&&boxes&/span&&span class=&p&&[&/span&&span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&p&&:])&/span&
&/code&&/pre&&/div&&blockquote&The first anchor box at row 21, column 21:&br&
[ 0....]&br&
&NDArray 4 @cpu(0)&&/blockquote&&p&看着数字不够直观的话,我们把框框画出来。取最中心像素的所有预设框,画在图上的话,我们看到已经可以覆盖几种尺寸和位置的物体了。把所有位置的组合起来,就是相当可观的预设框集合了。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&matplotlib.pyplot&/span& &span class=&kn&&as&/span& &span class=&nn&&plt&/span&
&span class=&k&&def&/span& &span class=&nf&&box_to_rect&/span&&span class=&p&&(&/span&&span class=&n&&box&/span&&span class=&p&&,&/span& &span class=&n&&color&/span&&span class=&p&&,&/span& &span class=&n&&linewidth&/span&&span class=&o&&=&/span&&span class=&mi&&3&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&convert an anchor box to a matplotlib rectangle&&&&/span&
&span class=&n&&box&/span& &span class=&o&&=&/span& &span class=&n&&box&/span&&span class=&o&&.&/span&&span class=&n&&asnumpy&/span&&span class=&p&&()&/span&
&span class=&k&&return&/span& &span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&Rectangle&/span&&span class=&p&&(&/span&
&span class=&p&&(&/span&&span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span& &span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]),&/span& &span class=&p&&(&/span&&span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&2&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]),&/span& &span class=&p&&(&/span&&span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&3&/span&&span class=&p&&]&/span&&span class=&o&&-&/span&&span class=&n&&box&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]),&/span&
&span class=&n&&fill&/span&&span class=&o&&=&/span&&span class=&bp&&False&/span&&span class=&p&&,&/span& &span class=&n&&edgecolor&/span&&span class=&o&&=&/span&&span class=&n&&color&/span&&span class=&p&&,&/span& &span class=&n&&linewidth&/span&&span class=&o&&=&/span&&span class=&n&&linewidth&/span&&span class=&p&&)&/span&
&span class=&n&&colors&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&s1&&'blue'&/span&&span class=&p&&,&/span& &span class=&s1&&'green'&/span&&span class=&p&&,&/span& &span class=&s1&&'red'&/span&&span class=&p&&,&/span& &span class=&s1&&'black'&/span&&span class=&p&&,&/span& &span class=&s1&&'magenta'&/span&&span class=&p&&]&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&imshow&/span&&span class=&p&&(&/span&&span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&ones&/span&&span class=&p&&((&/span&&span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&))&/span&&span class=&o&&.&/span&&span class=&n&&asnumpy&/span&&span class=&p&&())&/span&
&span class=&n&&anchors&/span& &span class=&o&&=&/span& &span class=&n&&boxes&/span&&span class=&p&&[&/span&&span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&p&&:,&/span& &span class=&p&&:]&/span&
&span class=&k&&for&/span& &span class=&n&&i&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&n&&anchors&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&]):&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&gca&/span&&span class=&p&&()&/span&&span class=&o&&.&/span&&span class=&n&&add_patch&/span&&span class=&p&&(&/span&&span class=&n&&box_to_rect&/span&&span class=&p&&(&/span&&span class=&n&&anchors&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&,:]&/span&&span class=&o&&*&/span&&span class=&n&&n&/span&&span class=&p&&,&/span& &span class=&n&&colors&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]))&/span&
&span class=&n&&plt&/span&&span class=&o&&.&/span&&span class=&n&&show&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&&br&&/p&&img src=&/v2-69d6f7909aadb847a4e94e_b.png& data-rawwidth=&255& data-rawheight=&252& class=&content_image& width=&255&&&p&&br&&/p&&p&&b&分类预测 Predict classes&/b&&/p&&p&这个部分的目标很简单,就是预测每个预设框对应的分类。我们用 &img src=&/equation?tex=3+%5Ctimes+3& alt=&3 \times 3& eeimg=&1&& , Padding (填充)
&img src=&/equation?tex=1+%5Ctimes+1& alt=&1 \times 1& eeimg=&1&& 的卷积来预测分类概率,这样可以做到卷积后空间上的形状不会变化,而且由于卷积的特点,每个卷积核会扫过每个预测特征层的所有像素点,得到 &img src=&/equation?tex=c+%5Ctimes+h+%5Ctimes+w& alt=&c \times h \times w& eeimg=&1&& 个预测值, &img src=&/equation?tex=h+%5Ctimes+w& alt=&h \times w& eeimg=&1&& 对应了空间上所有的像素点,每个通道对应特定的预设框 &img src=&/equation?tex=c+%3D+%28N_%7Bclass%7D+%2B+1%29+%5Ctimes+N_%7Banchors%7D& alt=&c = (N_{class} + 1) \times N_{anchors}& eeimg=&1&& 。假设有10个正类,每个像素5个预设框,那么我们就需要 &img src=&/equation?tex=11+%5Ctimes+5+%3D+55& alt=&11 \times 5 = 55& eeimg=&1&& 个通道。 具体的来说,对于每个像素第 &img src=&/equation?tex=i& alt=&i& eeimg=&1&& 个预设框:&/p&&ul&&li&通道 &img src=&/equation?tex=i+%5Ctimes+%28N_%7Bclass%7D+%2B+1%29& alt=&i \times (N_{class} + 1)& eeimg=&1&& 的值对应背景(非物体)的得分&/li&&li&通道 &img src=&/equation?tex=i+%5Ctimes+%28N_%7Bclass%7D+%2B+1%29+%2B+1+%2B+j& alt=&i \times (N_{class} + 1) + 1 + j& eeimg=&1&& 对应了第 &img src=&/equation?tex=j& alt=&j& eeimg=&1&& 类的得分&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&from&/span& &span class=&nn&&mxnet.gluon&/span& &span class=&kn&&import&/span& &span class=&n&&nn&/span&
&span class=&k&&def&/span& &span class=&nf&&class_predictor&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span&&span class=&p&&,&/span& &span class=&n&&num_classes&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&return a layer to predict classes&&&&/span&
&span class=&k&&return&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Conv2D&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span& &span class=&o&&*&/span& &span class=&p&&(&/span&&span class=&n&&num_classes&/span& &span class=&o&&+&/span& &span class=&mi&&1&/span&&span class=&p&&),&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&n&&padding&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred&/span& &span class=&o&&=&/span& &span class=&n&&class_predictor&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Class prediction'&/span&&span class=&p&&,&/span& &span class=&n&&cls_pred&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&blockquote&Class prediction (2, 55, 20, 20)&/blockquote&&p&&br&&/p&&p&&b&预测预设框偏移 Predict anchor boxes&/b&&/p&&p&为了找到物体准确的位置,光靠预设框本身是不行的,我们还需要预测偏移量以便把真正的物体框出来。&/p&&p&假设
&img src=&/equation?tex=b& alt=&b& eeimg=&1&&
是某个预设框, &img src=&/equation?tex=Y& alt=&Y& eeimg=&1&& 是目标物体的真实矩形框,我们需要预测的偏移为 &img src=&/equation?tex=%5CDelta%28Y%2C+b%29+%3D+%28t_x%2C+t_y%2C+t_%7Bwidth%7D%2C+t_%7Bheight%7D%29& alt=&\Delta(Y, b) = (t_x, t_y, t_{width}, t_{height})& eeimg=&1&& ,全都是长度为4的向量, 我们求得偏移&/p&&ul&&li&&img src=&/equation?tex=t_x+%3D+%28Y_x+-+b_x%29+%2F+b_%7Bwidth%7D& alt=&t_x = (Y_x - b_x) / b_{width}& eeimg=&1&&&/li&&li&&img src=&/equation?tex=t_y+%3D+%28Y_y+-+b_y%29+%2F+b_%7Bheight%7D& alt=&t_y = (Y_y - b_y) / b_{height}& eeimg=&1&&&/li&&li&&img src=&/equation?tex=t_%7Bwidth%7D+%3D+%28Y_%7Bwidth%7D+-+b_%7Bwidth%7D%29+%2F+b_%7Bwidth%7D& alt=&t_{width} = (Y_{width} - b_{width}) / b_{width}& eeimg=&1&&&/li&&li&&img src=&/equation?tex=t_%7Bheight%7D+%3D+%28Y_%7Bheight%7D+-+b_%7Bheight%7D%29+%2F+b_%7Bheight%7D& alt=&t_{height} = (Y_{height} - b_{height}) / b_{height}& eeimg=&1&&&/li&&/ul&&p&所有的偏移量都除以预设框的长或宽是为了更好的收敛。&/p&&p&类似分类概率,我们同样用 &img src=&/equation?tex=3+%5Ctimes+3& alt=&3 \times 3& eeimg=&1&& 填充 &img src=&/equation?tex=1+%5Ctimes+1& alt=&1 \times 1& eeimg=&1&& 的卷积来预测偏移。这次不同的是,对于每个预设框,我们只需要 &img src=&/equation?tex=4& alt=&4& eeimg=&1&& 个通道来预测偏移量, 一共需要 &img src=&/equation?tex=N_%7Banchors%7D+%5Ctimes+4& alt=&N_{anchors} \times 4& eeimg=&1&& 个通道,第
&img src=&/equation?tex=i& alt=&i& eeimg=&1&&
个预设框对应的偏移量存在通道 &img src=&/equation?tex=i+%5Ctimes+4& alt=&i \times 4& eeimg=&1&& 到通道
&img src=&/equation?tex=i+%5Ctimes+4+%2B+3& alt=&i \times 4 + 3& eeimg=&1&&
之间。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&box_predictor&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&return a layer to predict delta locations&&&&/span&
&span class=&k&&return&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Conv2D&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span& &span class=&o&&*&/span& &span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&n&&padding&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&n&&box_pred&/span& &span class=&o&&=&/span& &span class=&n&&box_predictor&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&box_pred&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Box prediction'&/span&&span class=&p&&,&/span& &span class=&n&&box_pred&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&blockquote&Box prediction (2, 40, 20, 20)&/blockquote&&p&&br&&/p&&p&&b&下采样特征层 Down-sample features&/b&&/p&&p&每次我们下采样特征层到一半的长宽,用Pooling(池化)操作就可以轻松的做到,当然也可以用stride(步长)为2的卷积直接得到。在下采样之前,我们会希望增加几层卷积层作为缓冲,防止特征值对应多尺度带来的混乱,同时又能增加网络的深度,得到更好的抽象。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&down_sample&/span&&span class=&p&&(&/span&&span class=&n&&num_filters&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&stack two Conv-BatchNorm-Relu blocks and then a pooling layer&/span&
&span class=&sd&&
to halve the feature size&&&&/span&
&span class=&n&&out&/span& &span class=&o&&=&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&HybridSequential&/span&&span class=&p&&()&/span&
&span class=&k&&for&/span& &span class=&n&&_&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&):&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Conv2D&/span&&span class=&p&&(&/span&&span class=&n&&num_filters&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&n&&strides&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&n&&padding&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&))&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&BatchNorm&/span&&span class=&p&&(&/span&&span class=&n&&in_channels&/span&&span class=&o&&=&/span&&span class=&n&&num_filters&/span&&span class=&p&&))&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Activation&/span&&span class=&p&&(&/span&&span class=&s1&&'relu'&/span&&span class=&p&&))&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&MaxPool2D&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&n&&out&/span&
&span class=&n&&blk&/span& &span class=&o&&=&/span& &span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&blk&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Before'&/span&&span class=&p&&,&/span& &span class=&n&&x&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&,&/span& &span class=&s1&&'after'&/span&&span class=&p&&,&/span& &span class=&n&&blk&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&blockquote&Before (2, 3, 20, 20) after (2, 10, 10, 10)&/blockquote&&p&&br&&/p&&p&&b&整合多个特征层预测值 Manage predictions from multiple layers&/b&&/p&&p&SSD算法的一个关键点在于它用到了多尺度的特征层来预测不同大小的物体。相对来说,浅层的特征层的空间尺度更大,越到网络的深层,空间尺度越小,最后我们往往下采样直到 &img src=&/equation?tex=1+%5Ctimes+1& alt=&1 \times 1& eeimg=&1&& ,用来预测全图大小的物体。所以每个特征层产生的&b&预设框,&/b& &b&分类概率,框偏移量&/b&需要被整合起来统一在全图与真实的物体比较。 为了做到一一对应,我们统一把所有的预设框, 分类概率,框偏移量 平铺再连接。得到的是按顺序排列但是摊平的所有预测值和预设框。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&c1&&# 随便创建一个大小为 20x20的预测层&/span&
&span class=&n&&feat1&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&8&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&,&/span& &span class=&mi&&20&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Feature map 1'&/span&&span class=&p&&,&/span& &span class=&n&&feat1&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred1&/span& &span class=&o&&=&/span& &span class=&n&&class_predictor&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred1&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&y1&/span& &span class=&o&&=&/span& &span class=&n&&cls_pred1&/span&&span class=&p&&(&/span&&span class=&n&&feat1&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Class prediction for feature map 1'&/span&&span class=&p&&,&/span& &span class=&n&&y1&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&c1&&# 下采样&/span&
&span class=&n&&ds&/span& &span class=&o&&=&/span& &span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&mi&&16&/span&&span class=&p&&)&/span&
&span class=&n&&ds&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&feat2&/span& &span class=&o&&=&/span& &span class=&n&&ds&/span&&span class=&p&&(&/span&&span class=&n&&feat1&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Feature map 2'&/span&&span class=&p&&,&/span& &span class=&n&&feat2&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred2&/span& &span class=&o&&=&/span& &span class=&n&&class_predictor&/span&&span class=&p&&(&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&cls_pred2&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&y2&/span& &span class=&o&&=&/span& &span class=&n&&cls_pred2&/span&&span class=&p&&(&/span&&span class=&n&&feat2&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Class prediction for feature map 2'&/span&&span class=&p&&,&/span& &span class=&n&&y2&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&blockquote&Feature map 1 (2, 8, 20, 20)&br&
Class prediction for feature map 1 (2, 55, 20, 20)&br&
Feature map 2 (2, 16, 10, 10)&br&
Class prediction for feature map 2 (2, 33, 10, 10)&/blockquote&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&flatten_prediction&/span&&span class=&p&&(&/span&&span class=&n&&pred&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&flatten&/span&&span class=&p&&(&/span&&span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&transpose&/span&&span class=&p&&(&/span&&span class=&n&&pred&/span&&span class=&p&&,&/span& &span class=&n&&axes&/span&&span class=&o&&=&/span&&span class=&p&&(&/span&&span class=&mi&&0&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&)))&/span&
&span class=&k&&def&/span& &span class=&nf&&concat_predictions&/span&&span class=&p&&(&/span&&span class=&n&&preds&/span&&span class=&p&&):&/span&
&span class=&k&&return&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&concat&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&preds&/span&&span class=&p&&,&/span& &span class=&n&&dim&/span&&span class=&o&&=&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&
&span class=&n&&flat_y1&/span& &span class=&o&&=&/span& &span class=&n&&flatten_prediction&/span&&span class=&p&&(&/span&&span class=&n&&y1&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Flatten class prediction 1'&/span&&span class=&p&&,&/span& &span class=&n&&flat_y1&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&n&&flat_y2&/span& &span class=&o&&=&/span& &span class=&n&&flatten_prediction&/span&&span class=&p&&(&/span&&span class=&n&&y2&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Flatten class prediction 2'&/span&&span class=&p&&,&/span& &span class=&n&&flat_y2&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Concat class predictions'&/span&&span class=&p&&,&/span& &span class=&n&&concat_predictions&/span&&span class=&p&&([&/span&&span class=&n&&flat_y1&/span&&span class=&p&&,&/span& &span class=&n&&flat_y2&/span&&span class=&p&&])&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&blockquote&Flatten class prediction 1 (2, 22000)&br&
Flatten class prediction 2 (2, 3300)&br&
Concat class predictions (2, 25300)&/blockquote&&p&我们总是确保在 &img src=&/equation?tex=dim+%3D+1& alt=&dim = 1& eeimg=&1&& 上连接,以免打乱一一对应的关系。&/p&&p&&br&&/p&&p&&b&主干网络 Body network&/b&&/p&&p&主干网络用来从原始图像输入提取特征。 一般来说我们会用预先训练好的用于分类的高性能网络(VGG, ResNet等)来提取特征。&/p&&p&在这里我们就简单地堆叠几层卷积和下采样层作为主干网络的演示。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&from&/span& &span class=&nn&&mxnet&/span& &span class=&kn&&import&/span& &span class=&n&&gluon&/span&
&span class=&k&&def&/span& &span class=&nf&&body&/span&&span class=&p&&():&/span&
&span class=&sd&&&&&return the body network&&&&/span&
&span class=&n&&out&/span& &span class=&o&&=&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&HybridSequential&/span&&span class=&p&&()&/span&
&span class=&k&&for&/span& &span class=&n&&nfilters&/span& &span class=&ow&&in&/span& &span class=&p&&[&/span&&span class=&mi&&16&/span&&span class=&p&&,&/span& &span class=&mi&&32&/span&&span class=&p&&,&/span& &span class=&mi&&64&/span&&span class=&p&&]:&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&n&&nfilters&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&n&&out&/span&
&span class=&n&&bnet&/span& &span class=&o&&=&/span& &span class=&n&&body&/span&&span class=&p&&()&/span&
&span class=&n&&bnet&/span&&span class=&o&&.&/span&&span class=&n&&initialize&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&nd&/span&&span class=&o&&.&/span&&span class=&n&&zeros&/span&&span class=&p&&((&/span&&span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&256&/span&&span class=&p&&,&/span& &span class=&mi&&256&/span&&span class=&p&&))&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&s1&&'Body network'&/span&&span class=&p&&,&/span& &span class=&p&&[&/span&&span class=&n&&y&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span& &span class=&k&&for&/span& &span class=&n&&y&/span& &span class=&ow&&in&/span& &span class=&n&&bnet&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)])&/span&
&/code&&/pre&&/div&&blockquote&Body network [(64, 32, 32), (64, 32, 32)]&/blockquote&&p&&br&&/p&&p&&b&设计一个简单的SSD示意网络 Create a toy SSD model&/b&&/p&&p&我们这里介绍一个示意用的简单SSD网络,出于速度的考量,输入图像尺寸定为 &img src=&/equation?tex=256+%5Ctimes+256& alt=&256 \times 256& eeimg=&1&& 。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&toy_ssd_model&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span&&span class=&p&&,&/span& &span class=&n&&num_classes&/span&&span class=&p&&):&/span&
&span class=&sd&&&&&return SSD modules&&&&/span&
&span class=&n&&downsamples&/span& &span class=&o&&=&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Sequential&/span&&span class=&p&&()&/span&
&span class=&n&&class_preds&/span& &span class=&o&&=&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Sequential&/span&&span class=&p&&()&/span&
&span class=&n&&box_preds&/span& &span class=&o&&=&/span& &span class=&n&&nn&/span&&span class=&o&&.&/span&&span class=&n&&Sequential&/span&&span class=&p&&()&/span&
&span class=&n&&downsamples&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&mi&&128&/span&&span class=&p&&))&/span&
&span class=&n&&downsamples&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&mi&&128&/span&&span class=&p&&))&/span&
&span class=&n&&downsamples&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&down_sample&/span&&span class=&p&&(&/span&&span class=&mi&&128&/span&&span class=&p&&))&/span&
&span class=&k&&for&/span& &span class=&n&&scale&/span& &span class=&ow&&in&/span& &span class=&nb&&range&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&):&/span&
&span class=&n&&class_preds&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&class_predictor&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span&&span class=&p&&,&/span& &span class=&n&&num_classes&/span&&span class=&p&&))&/span&
&span class=&n&&box_preds&/span&&span class=&o&&.&/span&&span class=&n&&add&/span&&span class=&p&&(&/span&&span class=&n&&box_predictor&/span&&span class=&p&&(&/span&&span class=&n&&num_anchors&/span&&span class=&p&&))&/span&
&span class=&k&&return&/span& &span class=&n&&body&/span&&span class=&p&&(),&/span& &span class=&n&&downsamples&/span&&span class=&p&&,&/span& &span class=&n&&class_preds&/span&&span class=&p&&,&/span& &span class=&n&&box_preds&/span&
&span class=&k&&print&/span&&span class=&p&&(&/span&&span class=&n&&toy_ssd_model&/span&&span class=&p&&(&/span&&span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&))&/span&
&/code&&/pre&&/div&&blockquote&(HybridSequential(&br&
(0): HybridSequential(&br&
(0): Conv2D(16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=16)&br&
(2): Activation(relu)&br&
(3): Conv2D(16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=16)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
(1): HybridSequential(&br&
(0): Conv2D(32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=32)&br&
(2): Activation(relu)&br&
(3): Conv2D(32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=32)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
(2): HybridSequential(&br&
(0): Conv2D(64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=64)&br&
(2): Activation(relu)&br&
(3): Conv2D(64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=64)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
), Sequential(&br&
(0): HybridSequential(&br&
(0): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(2): Activation(relu)&br&
(3): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
(1): HybridSequential(&br&
(0): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(2): Activation(relu)&br&
(3): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
(2): HybridSequential(&br&
(0): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(2): Activation(relu)&br&
(3): Conv2D(128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): BatchNorm(fix_gamma=False, axis=1, momentum=0.9, eps=1e-05, in_channels=128)&br&
(5): Activation(relu)&br&
(6): MaxPool2D(size=(2, 2), stride=(2, 2), padding=(0, 0), ceil_mode=False)&br&
), Sequential(&br&
(0): Conv2D(15, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): Conv2D(15, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(2): Conv2D(15, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(3): Conv2D(15, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): Conv2D(15, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
), Sequential(&br&
(0): Conv2D(20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(1): Conv2D(20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(2): Conv2D(20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(3): Conv2D(20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
(4): Conv2D(20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))&br&
))&/blockquote&&p&&br&&/p&&p&&b&网络前向推导 Forward&/b&&/p&&p&既然我们已经设计完网络结构了,接下来可以定义网络前向推导的步骤。&/p&&p&首先得到主干网络的输出,然后对于每一个特征预测层,推导当前层的预设框,分类概率和偏移量。最后我们把这些输入摊平,连接,作为网络的输出。&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&k&&def&/span& &span class=&nf&&toy_ssd_forward&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&,&/span& &span class=&n&&body&/span&&span class=&p&&,&/span& &span class=&n&&downsamples&/span&&span class=&p&&,&/span& &span class=&n&&class_preds&/span&&span class=&p&&,&/span& &span class=&n&&box_preds&/span&&span class=&p&&,&/span& &span class=&n&&sizes&/span&&span class=&p&&,&/span& &span class=&n&&ratios&/span&&span class=&p&&):&/span&
&span class=&c1&&# 计算主干网络的输出
&span class=&n&&x&/span& &span class=&o&&=&/span& &span class=&n&&body&/span&&span class=&p&&(&/span&&span class=&n&&x&/span&&span class=&p&&)&/span&
&span class=&c1&&# 在每个预测层, 计算预设框,分类概率,偏移量&/span&
&span class=&c1&&# 然后在下采样到下一层预测层,重复&/span&
&span class=&n&&default_anchors&/span& &span class=&o&&=&/span& &span class=&p&&[]&/span&
&span class=&n&&predicted_boxes&/span& &span class=&o&&=&/span& &span class=&p&&[]&}

我要回帖

更多关于 unity右键拖不动视角 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信