Univesre

Universe Is Not Univesre


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

桌面系统的虚与实

发表于 2019-08-04 | 更新于 2019-12-13 | 分类于 OS

背景 此篇文章是从之前的计算机纵深这篇文章的独立出来的, 因为发现, 想写的内容实在有点多, 如果放在那篇文章中的话, 会造成不好的文章结构, 这个部分过于详细会像一个人背了很重书包的人一样, 不和谐(应该托运或放行李中才对). 这篇文章中是基于我对现今操作系统(OS)中的的”命令/终端/图形界面“这几个方面的疑惑而展开的, 希望通过结合之前的知识以及写文章整理思路, 解决掉”直觉性/理解上”的疑惑. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

MMM

MMMMMMMMMMMMMMMMMMMMMMMM

阅读全文 »

计算机的底层逻辑

发表于 2019-07-23 | 更新于 2019-11-05 | 分类于 札记

关于底层的一些笔记: 常说要多了解点计算机底层的东西, 那么问题有: 1.要了解多少底层东西(才够用), 2.底层有多少东西要了解? 最近发现底层真是个无底洞: 平常常说CPU/计算机是工作在0/1的基础上的, 但这么说其实没有多少作用: 在用高级编程语言编程时看到的明明就是具体的字符字母, 平常使用电脑时看到的明明就是GUI图形界面, 哪里来的0/1之说?! 而你说CPU使用分页表去多级寻址, 却连一个分页表都看不到, 只能靠想象与抽象去理解, 难怪计算机这么难学(假如果真如此的话): 在一台具象的电脑之下, 隐藏里太多的细节故事, 我看称之为事故也不为过了.

M

思维模式: 不同编程层次中的几种思维模式:

  • 使用高级编程语言(如C++/Python), 脑力主要集中于编程语言的语法, 库的使用, 算法的实现, 程序的设计, 项目环境配置, 等等;

  • 使用底层(并非低级)编程语言(如汇编), 则思维模式需转向到各种寄存器, 各种基本操作之间的顺序, 等;

其实还不止以上所列的两种模式/习惯, 假如把编译器也算进去的话, 那么又多了一种思维模式/习惯(扫描, 编译, …), 还可以有:

  • 计算机硬件的总线: 数据总线, 地址总线和控制总线, 冯诺依曼架构(指令与数据共用内存)和哈佛架构(指令与数据各自有各自的内存);
  • CPU指令流水线: 取值, 解码, 执行, 存储, 写回, 5个阶段, 它们的处理时间最好相等, 要不然最慢的流水线级处理时间将成为系统的时钟周期, 以及流水线处理中的”冒险”(Hazard)概念(导致流水线耽搁不能按时按设计执行);
  • BIOS也是一种软件程序: 完全超越了高级编程语言的概念(更重要, 关乎开机及硬件正常), 比汇编还要更接近硬件(它无法用编译器编译出?!), 确保(开机时)同一个计算机中的芯片(chips), 硬盘(hard drives), 端口(ports)及CPU能一起正常运转;
  • 视窗X Window系统: 超越原先的BIOS单色调简单图形/形状, 转而将更多颜色, 更多形状的界面(GUI)绘制到屏幕上, 由此也引出CPU与GPU的关系: CPU发送某种命令给GPU, GPU负责”计算/生成”屏幕上的具体像素值;

此外, 还有此外, 如GPU中也有BIOS等等, 不一而足. 以上举了这么些不同范畴的概念, 只不过想说明下计算机的”高层/底层”的思维习惯/模式可以有多么得不同(这可能是导致”学不进去”的一个原因), 而在学习/了解的过程中要保持一种”失望/我不懂”的预期, 才能在费脑细胞的计算机学习中”存活下去”.

以下列举一些常识性(HowWorks)的原理, 就这么些原理, 也都是和计算机体系相关的, 不过, 还是将它们当做边角料吧, 对它们有一定的常识性认识就好了:

操作系统原理[REF], 显卡原理[REF], 模拟数字信号转换[REF], 电视(显示器)原理[REF], 触屏原理[REF], Bits与Bytes工作机制[REF], 数字电路门工作原理[REF], 街机改造原理[REF], 微处理器原理[REF], 电脑的构造[REF], C语言基本机制[REF], 电脑需要一粒电池的原因[REF].

另: 查某些资料最好都要去google搜索, 百度搜索的同质化太严重, 而且中文环境的内容质量也是要考虑的要点, 如BIOS的介绍();

PC历史, https://computer.howstuffworks.com/history-of-the-personal-computer.htm

说了这么多,

Reference

1.CPU自制入门;

2.https://computer.howstuffworks.com/bios.htm;

显卡绘图原理: (显卡背景/历史原因) 显卡最初不是单独存在的, 而是作为主板上的某块部件集成于其上的, 但由于对于高质量图形显示的需求的驱动, 显卡的计算量和电路部件都增加了, 显卡就以一个独立于主板的部件存在于电脑中了. 总体来说, 可以把显卡理解成计算机中的另外一个处理器, 它听令于CPU, 专门根据CPU的指令/数据决定如何处理屏幕上的每一个像素.

从硬件上分析, 显卡上的主板连接(显卡插槽), 连接着计算机的总线(Bus), 而通过总线, CPU将绘图”命令/数据”发送至GPU, 而GPU上的内存(即显存), 负责接收这些”命令/数据”, 作为GPU计算的”取指/数据写回”来源, 而显卡上的IO负责把显示数据通过接口(如: VGA/DVI)发送给显示屏, 如下, 是显卡的工作任务描述:

“根据二进制数据生成图像是一个很费力的过程, 为了生成三维图像, 显卡首先要用直线创建一个线框, 然后, 它对图像进行光栅化处理(填充剩余的像素). 此外, 显卡还需添加明暗光线, 纹理和颜色, 对于快节奏的游戏, 电脑每秒钟必须执行此过程约60次. 如果没有显卡来执行必要的计算, 则电脑将无法承担如此大的工作负荷”

以上关于显卡原理的描述和分析的详细信息, 可以参考索引2的网页.

DirectX/OpenGL, 驱动程序 DirectX和OpenGL是在OS之下的API(应用程序编程接口), 它提供用于复杂任务(如: 三维渲染)的指令, 用于软硬件间的高效通信, 尤其是使用大量图形计算的游戏软件. 驱动程序, 则是OS与硬件间通信的程序, 可以理解成OS操作硬件的一个API(侧重Interface).

以鼠标为例, 理解它与屏幕, CPU之间的关系和工作机制;

Reference:

  1. Sohu, 显卡绘图原理, ref;
  2. Cnblogs, 计算机底层访问显卡, ref;

  3. PcOnline, 显卡工作原理浅析, ref;

关于X Window

一直以来, 都以为X Window是计算机OS中的一套图形化标准, 还以为它掌管着屏幕上的一切可视化(没错, 就是现在显示这篇文章的屏幕), 其实, 它只不过是一些显示系统中的一个, 在它之前, 已经有如下几个位图式软件显示系统的存在:

施乐公司提出的Alto(1973年)和Star(1981年), 阿波罗电脑公司提出的Display Manager(1981), 苹果计算机提出的Lisa(1983年)和麦金塔(1984年), 在UNIX世界也有雅典娜工程(1982年)和Rob Pike的Blit终端机(1984年).

故X Window并无特别之处, 它是和其它类似系统并列的一个显示系统, 但它工作在Unix/Linux之下, 它的组成可分为: 1.XServer, 2.XClient, 3.XProtocol. 而根据引用[6]的总结, X Window的运行过程如下:

1
2
3
4
5
(1) 用户通过鼠标键盘对XServer下达操作命令
(2) XServer利用Event传递用户操作信息给X client
(3) XClient进行程序运算
(4) XClient利用Request传回所要显示的结果
(5) XServer将结果显示在屏幕上

维基百科对XWindow管理器的运作原理描述如下[Ref]:

当视窗管理器开始运作时,X服务器和客户端之间的交互,会重定向到视窗管理器。每当要显示一个新视窗时,这个请求便会被重定向到视窗管理器,它会决定视窗的初始位置。此外,大部分较新的视窗管理器会改变视窗的亲属关系,通常会在视窗顶部加上标题栏,并在视窗周围加上装饰性的框架。这两个部分皆由视窗管理器来控制,而不是其它程序。因此,当用户点击或拖曳那些组件时,视窗管理器会进行适当的动作(如移动或改变视窗的大小).

上述引用段说了两件事情: 1.视窗和顶部标题栏及框架的关系, 2.绘制视窗的是XServer, 但改变其大小的是视窗管理器(即视窗管理器叫XServer重新绘制另一个size的视窗).

视窗管理器也负责处理图标,图标并不存在于X Window核心协议的层次中。当用户将视窗最小化时,视窗管理器会取消视窗的映射(使其不可见),并完成适当的动作,将视窗改显示成图标。某些视窗管理器并不支持图标功能。

根据上述描述, 推测: 在最小化图标时, 同样的操作是, 视窗管理器让XServer重新绘制视窗的大小为0(?!)使其不可见.

视窗管理器主要的目标,就如同其名,是用来管理视窗的。许多视窗管理器提供附加的功能,如处理鼠标在根视窗上的点击,呈现出窗格以及其它的可视化组件,处理按键(例如 Alt-F4 可关闭视窗),判定哪一个应用程序在引导时运行等等。

关于图形界面的几点总结(个人直觉性思考):

  • 无论是旧式终端单色调文本界面还是现在多重颜色的图形界面, 计算机中都得有处理输出显示结果到屏幕的部分, 旧式的界面简单, 不需要单独显卡, 现在的界面图形丰富计算量大, 故显卡应运而生;

  • 有了上一步的推断, 我们继续推: 在启动计算机时, CPU和GPU等硬件在BIOS的检查之后都一起启动了, 此时计算机就有了显示功能(屏幕就能用了), 此时我们的桌面还没看到, 但不代表OS对GPU的”驱动/使用”功能还没建立起来, 当然, 相比桌面丰富多彩的颜色(往往是我们的壁纸), 终端或BIOS的界面是简陋的, 让我们以为此时GPU还没进入工作状态(或电脑还没正式开启);

  • OS之下的桌面显示模块(某个程序), 负责将桌面渲染出来(如: 窗口, 或一些桌面上的文件), 在计算机开机OS启动时, OS的早期Loader就把负责渲染桌面的显示程序启动了(此处不是双击鼠标:)), 当这一步完成后(以及其它相关步骤), 我们就进入了桌面的世界;

  • 需要注意的是, 没有这个桌面, 计算机一样进行计算(计算发生在主板上, 而不是屏幕里), 而平常印象中的桌面的图形操作, 只不过是OS在后台将图形界面中的”事件/焦点框/数据”进行了一番计算并输出显示到屏幕上(如Excel表格, 或网页):

    一切发生在屏幕上的眼睛看到的表象, 都是计算机后台发生事情的一个子集而已(计算机是个狠人, 它启动程序是将可执行的ELF文件加载进内存的, 而不是靠双击图标的:D), 另外, 即便用户在屏幕上啥也不动, 计算机后台的时钟可是马不停蹄地在GHz震荡, 这不是人体心脏或是手臂的抖动, 而是电子世界的震荡, 无法感同身受, 不能试着理解;

  • 打个比喻, 旧式终端界面好像计算器一样(进行简单计算, 以及黑白像素液晶显示器), 而现在的桌面电脑, 则高大上很多, 好像计算器升级了一番, 换上了彩色显示屏, 除了进行加减乘除, 还能显示图形(计算像素);

  • 以上这一切的便利, 都在C编译器(以及其服务对象UNIX)出现后变得大大加速(读高级语言的英文单词总比读汇编逻辑方便)及不可理解了(程序员都转向高级编程语言的学习了(商业/社会发展驱动), 底层黑盒触碰得愈发少了):

    有了C和UNIX, 啥硬件开发都用C了(驱动程序), 啥语言开发也用C了(因为C有最基础的将代码转换到汇编/机器码的编译”模块/程序”), 但可以说, C没什么能摆脱CPU架构的特点(其它语言也不会有, 包括汇编和BIOS), 但是符合社会生产规律的: 有一个好用的工具(即C), 难道还会去用效率更低/更反直觉的工具吗(汇编, 指开发效率上), 随着C这座大厦越筑越高, 想要重新来的概率, 是如下极限了: $\displaystyle \lim_{x \to 0}x$;

OS中的虚与实:

文件是实, 桌面是虚

内存中的光标位置是实, 显示屏上的光标是虚

提问: 一个OS系统有了桌面界面如何理解终端的存在?! 答: 这个问题貌似很有挑战, 其实则是一个坑.

Reference:

  1. 百度百科, X Window, ref;

  2. Cnblogs, X Window的奥秘, ref;

  3. Csdn, X Window的理解, ref;

  4. Csdn, 正确理解 X Window, ref;

  5. Csdn, X Window实现原理, ref;

  6. Csdn, 技术扫盲: X窗口系统, ref;

  7. Csdn, Linux图形窗口这家子, Ref;

  8. Csdn, X Window系统窗口显示原理, Ref1, Ref2;

  9. Csdn, 认识X Window窗口管理器, Ref;

  10. Csdn, startx及xinit介绍, Ref;

开学报到:

程序: 高级编程, CPU, 汇编.

Hexo_mathjax:

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=mathjax%20hexo&oq=mathjax&rsv_pq=e805b1a70005b287&rsv_t=3b23b0VzemdKtU7Laq6fJcv5F0PYXcSN7ZctD5EqR0Se1wWI5cd3xagfyHQ&rqlang=cn&rsv_enter=1&rsv_sug3=3&rsv_sug1=3&rsv_sug7=000&bs=mathjax

https://blog.csdn.net/u014630987/article/details/78670258

https://www.google.com/search?q=hexo+mathjax%E9%85%8D%E7%BD%AE&sa=X&ved=2ahUKEwjxn8yB77jjAhVUE4gKHfFYBOIQ1QIoAHoECAoQAQ&biw=1680&bih=939

https://i-m.dev/tools/

numpy与scipy:

https://docs.scipy.org/doc/

https://blog.csdn.net/tymatlab/article/details/79009618

https://www.baidu.com/s?ie=UTF-8&wd=TypeError%3A%20Cannot%20read%20property%20%27utcOffset%27%20of%20null

https://blog.csdn.net/buppt/article/details/78016407

Unix - Shell

首先, 要讲一下关于Shell的命名问题: Shell为什么叫壳(Shell)?! 简单说来就是, shell这层壳就是套在操作系统外面的一个机制, 有了shell, 操作系统的内核就可以将自己与外部使用环境隔离开来, 保证了内核的安全, 故取名这么一个东西叫shell也是很正确了(维基百科: “普通意义上的shell就是可以接受用户输入命令的程序“, Ref).

在使用中, shell的工作机理也是这样的: 用户输入命令行语句(shell脚本语句)或者执行一个shell脚本, 由终端(在Mac中是Terminal)这个软件将命令行语句传递给相应执行程序, 从而达到运行某个程序的目的. 当然, 我们可以双击某个执行程序运行该程序, 但这是图形界面的运行方式, 在1970或者1980图形界面还不像现在这么流行的年代, 启动程序的方式是通过终端来进行的, 而且, 双击打开某个程序的话, 怎么传递参数给这个程序?! 此外, 使用鼠标操作程序的方式在现在看来应该是打开”应用/软件”吧(不应该叫程序: 程序和程序猿不是很搭吗:D).

尽管有很多shell的存在(如: ash, bash, dash, ksh, zsh), 但上述shell的机理不应有区别, 不同shell的区别应当是语言(shell script)风格方面的, 而不是shell功能定位和主旨上的.

要命的配置文件 在使用高级编程语言进行编程活动时, 时常会遇到引用库不存在的问题, 这类问题的原因也时常和包含路径有关($PATH):

Shells read configuration files in various circumstances. These files usually contain commands for the shell and are executed when loaded; they are usually used to set important variables used to find executables, like $PATH, and others that control the behavior and appearance of the shell. The table in this section shows the configuration files for popular shells.

上述引用讲了几个要点: 1.shell会读取配置文件(如: ~./.bash_profile), 2.这些配置文件中包含的是shell可执行的脚本命令(当它启动时), 3.通常会在这些配置文件中设置诸如$PATH这样的重要变量(以及其它用于控制shell行为和外观的变量), 4.如下表格(此处未引用)显示了一些常用shell的相关配置文件.

可知, shell去读取某个配置文件是一种固定模式, 当一个系统中的shell终端确定时, 这个将要读取的配置文件就确定了, 不需要认为地再去设定. 联想到Mac(或类Unix系统)中根目录下的一些文件, 如: usr, bin, sbin, opt, etc, 这些文件夹也是固定命名的(由于历史原因! 历史是没法改变的! 时光是无法倒流的!), 无论Mac的图形界面设计如何迭代, 这些隐藏的文件的命名是永远变不了了(好丑的命名:D), 谁叫Mac是类Unix且是”私有”的系统呢.

下面, 附”Unix shell”图几张, 都还蛮有意思的:

01_Unix命令_1.png

图1. Unix命令_1, Reference#3

02_Unix命令_2.png

图2. Unix命令_2, Reference#3

03_Vi命令.jpg

图3. Vi命令, Reference#3

(后记: 搜索时尽量用Google, 百度也可以结合使用, 不过光百度的话, 会让我失望的(或者反之亦然?! 不过就这几次的经验来看, Google的惊喜还是不错的))

Reference

  1. 维基百科, Unix shell, Ref_中文 => Shell_Book, Ref_英文;
  2. 维基百科, PATH(variable), Ref);
  3. Reddit, Unix Shell Posters Re-made, Ref;

其它参考

  1. 关于Terminal, Console, Shell和Command Line的区别释疑, 可参考: Ref, 含图片示例, 或另一个类似提问[Ref];
  2. 萨里大学(University of Surrey)关于Unix的介绍(UNIX Introduction), Ref;
  3. Mally.stanford.edu关于基本Unix命令的讲解, Ref;

CV_札记

发表于 2019-07-23 | 更新于 2019-07-31 | 分类于 札记

关于CS231n课的一些笔记

$L_i=-log(\frac{e^{f_y{_i}}}{\sum_je^{f_j}})$

$L=\frac{1}{N} \displaystyle \sum_i L_i + \frac{1}{2} \lambda \displaystyle\sum_k \displaystyle\sum_l W^{2}_{k,l}$

$\frac{\partial L_i}{\partial f_k} = p_k - \mathbb{ONE}(y_i=k)$

关于Hidden层的直觉性思考

直觉性的理解: 对于输入空间中$x1$和$x2$不同取值, 隐藏层将它们原先的一次组合(即: 没有隐藏层的线性(vanilla)模型)进行”二次加工”, 比如: 输入数据点在第一层模型分类的基础上, 再次进行调整, 使得图1中的三条直线段在不同的取值区间(小范围内)内呈现不同的位移/扭曲(直线变曲线), 完成此例中的螺旋分类.

激活函数的加入, 使得原先的”线段式”曲线变得更平滑(消除了不同线段连接间的折角特征), 原先的”线段式”曲线变成真正的曲线(平滑的), 这像是一个消除图像马赛克的过程/模拟.

todo: 贴网络传导图

隐藏层对原线性模型的干预

好记性不如烂笔头(要理论, 也要工程):

1.jupyter notebook平常使用三步走: ;

matplotlib.plot三步走: ;

文字的先天不足: 文字就是文字, 在解释/描述程序世界时总是外界事物, 能用例子看懂了, 你还想要文字来描述吗: 编程语言的API再详细, 那也不是程序设计时的内在逻辑, 如https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html?highlight=scatter#matplotlib.pyplot.scatter这个API的描述;


Matplotlib的API简记

首先, Matplotlib是因其作者想要在Python中使用像Matlab一样的画图(便利)方式而写出来的一个Python的画图库(主要是数据图的绘制而不是图像的显示/绘制, 图像的显示/绘制应该用OpenCV, 即cv2模块(但安装的时候是’pip install opencv-python’(或者python-opencv, 哪个对用哪个))), 此库的前三个字母就是Matlab的前三个字母, 接着是两个单词: plot(绘制)和lib(库). Matplotlib的pyplot模块最为常用: 体现为代码语句import matplotlib.pyplot as plt的使用频率.

在做cs231n中模型的总结时, 调用到其一些函数, 做个总结, 加深印象(第一个api我会写得详细一些, 其它的话都是一样的套路就不那么详细, 除非有新的要点出现):

plt.contourf()[REF]: 调用格式(Call signatures): contour([X, Y,] Z, [levels], **kwargs):

X和Y参数是数组(np.array())形式的变量(如: np.arange(9)), 代表的是平面坐标系中的两个维度上的坐标X和Y$^{[注1]}$, 调用时可以省略不给(它们在中括号([])中), 不给的话, 在函数内有默认的值(整数索引, “integer indices”)会被填充进去: X=range(M), Y=range(N), 即X从0到M-1, 以及Y从0到N.

X和Y是Z中元素值的坐标, 它们的维度要么是2D的, 或者要么是1D的(详见下图关于X,Y的说明).

Z参数是必须给的, 它的shape是(N,M), 对应len(Y)/Z的行数和len(X)/Z的列数, 即把X和Y相应位置的索引对应到相应的Z值(等高图中的高度).

注1: 经常弄错的是, 我把(x1,y1)当做参数X, 把(x2,y2)当做参数Y传给numpy函数, 但numpy中把所有X维度和Y维度上的一系列坐标分开处理, 只不过用相同的索引i将两个数组中的坐标对应起来(如X[1]对应Y[1]): 就是这样的, 轮子就是这样的.

说了这么多, 上图吧(一图胜千字):

01_CONTOURF参数API.png

图1: 参数说明

02_等高图.png
图2: 等高图例

contourf()函数在matplotlib库中的原代码为[REF]:

1
2
3
4
5
6
7
8
> @docstring.copy(Axes.contourf)
> def contourf(*args, data=None, **kwargs):
> __ret = gca().contourf(
> *args, **({"data": data} if data is not None else {}),
> **kwargs)
> if __ret._A is not None: sci(__ret) # noqa
> return __ret
>

在这个函数内部, 它调用的是gca().contourf(), 而gca()又return gcf().gca(**kwargs), 而gcf()$^{[注]}$的定义返回的是figManager.canvas.figure或者figure(), 至此, 终于好像看到了绘图的一线曙光了.

而figure()返回的是figManager.canvas.figure, 这就明白了: 如果在gcf()调用中, 有figManager.canvas.figure对象的存在, 则直接返回它, 如果没有此对象, 则调用figure(), 生成一个figManager.canvas.figure对象后返回它.

注: gcf()的意涵是: Get Current Figure, gca()的意涵是: Get the Current :class:~matplotlib.axes.Axes (instance on the
current figure matching the given keyword args, or create one)

函数返回的是: c(contour), 一个QuadContourSet对象, 详见[REF].

最后, contourf()的**kwargs参数在此函数页面的Other Parameters中被说明, 包含: corner_mask, colors, alpha, cmap, norm, vmin/vmax, origin, extent, locator, extend, xunits/yunits, antialiased, Nchunk, linewidths, linestyles, hatches.

作为contourf()API的总结结尾, 引用一个它的使用用例[REF]:

03_Irregularly_Contour.png

图3: Irregularly_Contour

Concise Pyplot Toturial - 简要Pyplot说明[REF]

An introduction to the pyplot interface.

04_Part_Of_A_Figure.png
图: Part Of A Figure

首先, 我们常见的是: import matplotlib.pyplot as plt, 通过上述语句, 我们

MMM

快点来报道:

程序: 高级编程, CPU, 汇编.

PAPER_YOLO

发表于 2019-07-18 | 更新于 2019-08-02 | 分类于 以读攻毒

You Only Look Once: Unified, Real-Time Object Detection

从标题中可知, YOLO模型最大的特点应是”统一/实时”, 其实这是相对于R-CNN系列区域候选方法来说的. 区域候选(或者滑动窗口)方法的模型由几个不同的流程模块构成, 这就不是统一的了(一体性, unified), 由于整个模型由不同模块构成, 这又使得整个模型的耗时增加, 所以就又很难实时了(real-time).

阅读全文 »

斜率与梯度

发表于 2019-07-15 | 更新于 2019-08-02 | 分类于 Math

斜率与梯度 关键词: 偏导数, 斜率, 多维空间的斜率, 梯度. 例子讲解: 我们有函数$Z=f(X,Y)$(如下图1), 通过此函数我们讲解斜率(偏导数)与梯度的具体异同. 此处, 个人觉得斜率的称谓适合在我们平常用的平面坐标系中(二维)中使用, 而在三维及以上的空间中, 就是偏导数了, 故也可以将偏导数理解成多维空间中的斜率.

阅读全文 »

PAPER_MTCCN

发表于 2019-07-12 | 更新于 2019-07-13 | 分类于 码码码上

MTCCN: Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks (2016)

0.摘要解读 Abstract - Face detection and alignment in unconstrained environment are challenging due to various poses, illuminations and occlusions. Recent studies show that deep learning approaches can achieve impressive performance on these two tasks. 文意转义: 人脸检测与对齐(找到几个关键点: 嘴, 鼻子, 眼睛)在开放环境(unconstrained)是一件挑战性的事情. (如果你在阅读时发现公式没有被渲染, 请用Chrome浏览器并安装使用插件:”Math Anywhere”[REF], 这是一个暂时不完美解决方法)

阅读全文 »

post

发表于 2019-07-05 | 更新于 2019-07-10 | 分类于 码码码上

SSD: Single Shot MultiBox Detector (2016)

摘要解读

Default Box是SSD中的重要概念, 它代表了在每个(per) feature map location中: 1.不同的高宽比(aspect ratio), 2.不同scales的一组boxes(论文中的值为4), 即: feature map中不同位置的值代表: 不同aspect ratio及scales的4个default boxes.

PAPER_RCNN

发表于 2019-07-03 | 更新于 2019-08-02 | 分类于 码码码上

RCNN: Rich Feature Hierarchies For Accurate Object Detection And Semantic Segmentation

0.背景

<<精准目标检测和语义分割中的丰富特征层级>> 这篇论文的主要意义可以说是利用深度学习(CNN)进行目标检测的开山之作. 现在的目标检测算法主要有两类: 1.基于候选区域(RegionCNN), 2.基于端到端(YOLO, SSD).

下面, 我将认为重要的要点总结出来, 以巩固熟悉算法, 但总结的要点并不代表论文的全部.

1.鸟瞰模型整体

01_模型鸟瞰.png

图1: 模型鸟瞰

首先, 贴出上图, 给出模型中区域特征提取的流程, 后续理解与解释则围绕图片展开. 我们有如下步骤:

  1. Input image: 这是RCNN模型的输入数据, 我们要识别此输入图片中的物体与其在图片中的位置(坐标);

  2. 候选区域的抽选: 通过Selective Search算法, 在图片中抽取出约2000个候选区域(图片的子图, 大小不一);

  3. 计算出特征: 此特征是CNN网络(论文中用了AlexNet)的输出特征(pool5), 上一步骤的大小不一的候选区域, 在这一步的卷积前, 需要变形(warp)到AlexNet的(227*227)的输入尺寸;

  4. SVM分类: 在上一步得到AlexNet输出的抽象特征后, 用SVM将这些特征进行类别分类, 如果RCNN模型要分类20种的对象, 则需要21(20种物体+1个背景)个SVM进行分类, 至于为什么不用AlexNet后面的3个全连接层, 论文也有讨论.

对图片中任意位置对象的分类完成后, 我们还需要定位对象在图中的位置, 论文中也有讲述Bounding box的回归训练, 这在论文的附录C中详细叙述.

2.论文第二节: Object detection with R-CNN

论文将它的对象检测系统(object detection system)分为3个部分:

  • 类别无关(category-independent)的候选区域生成;
  • 为每个候选区域生成固定长度(fixed-length)的特征向量;
  • 一组用于分类的(线性)SVM.

模型设计1: 候选区域(Region Proposals)

论文中提到了一系列用于生成(不关类别)候选区域的方法(罗列如下), 其中, 论文使用的是selective search方法:

  • objectness
  • selective search(论文选用)
  • category-independent object proposals
  • constrained parametric min-cuts(CPMC)
  • multi-scale combinatorial grouping
  • Ciresan et al.

而, 至于候选区域生成方法具体是如何工作的, 论文中并没有说明.

模型设计2: 特征抽取(Feature Extraction)

模型中SVM使用的特征是一个4096维的feature vector, 它是每个候选区域通过AlexNet的前向传播(forward propagating)得到的结果(你看, 此篇论文将目标检测和深度网络结合了). 由于候选区域是不管你AlexNet要227*227尺寸的输入的, 它只产生它认为有意义的区域作为候选(Proposal), 所以, 我们需要对这些候选区域做一个图片的变形(warp, 即拉伸), 原文和我理解的拉伸方式如下(理解了很久, 烧了不少脑细胞):

Regardless of the size or aspect ratio of the candidate region, we warp all pixels in a tight bounding box around it to the required size. Prior to warping, we dilate the tight bounding box so that at the warped size there are exactly p pixels of warped image context around the original box (we use p = 16).

估计即便将以上论文片段翻译成中文, 如果仅凭中文字面意思去理解, 也无解, 所以还是画图吧(如果论文中有配图就好了):

边框示意

图2: 边框示意

在上图中, 我们有里面的小框, 即我们的tight bounding box(也即候选区域). 由于候选区域是原图的一部分, 如果我们要在使around the original box的pixel为16的话, 则向外扩张(dilate)数标1中的原框(Original T. B. Box)16个像素值, 得到数标2中的Dilated T. B. Box, 而这个有原图的context填充(padding)了的Boundxing Box, 就是我们要resize(即warp)到227*227的”候选区域”(而不是里面的那个了). 如果候选区域图中上下左右方向不够Padding的话, 则用灰度像素替代吧, 具体细节可参考论文中的Figure 7. (再次的, 觉得这是论文的小瑕疵: 没有图呀)

Appendix C- Bounding-box Regression

下面, 讲讲论文中边界框的回归(即定位). 我估计论文之所以没有在正文中讲边界框的回归定位而是在附录中讲, 是因为之前的候选区域抓取的时候已经有了该候选区域的坐标值了, 而这一步, 只是提升用的:

原文: We use a simple bounding-box regression stage to improve localization performance.

回归与数据: 论文在使用了SVM进行区域内内容的class-specific detection后, 开始使用class-specific bounding-box regressor来预测边界框(bounding box)了, 并提及, 此边界框回归和DPM(Deformable Part Models)模型中的边界框回归思想类似. 然而, 它们的不同之处是两者使用的数据来源, 论文中边界框回归使用的数据是CNN输出的特征(向量), 而DPM使用的数据是geometric features computed on the inferred DPM part locations.

公式符号设置:

$\{(P^i,G^i)\}_{i=1,…,N}$: 表示N组训练数据对, 其中, $P^i=(P^i_x,P^i_y,P^i_w,P^i_h)$代表第i个候选区域在整张原图的中心点坐标(x,y)以及它的宽和高(w,h). 同理, G符号代表的则是真实框(Ground Truth)对应的四个像素位置坐标值: $G=(G_x,G_y,G_w,G_h)$(此处省略上标 i).

Transformation:

  • $d_x(P)$, $d_y(P)$: 边界框中心的位移(高宽比不变, scale-invariant);
  • $d_w(P)$, $d_h(P)$: 边界框高宽变化的转换(log-space translation);
  • $\hat G$: 转换后的predicted ground-truth box.

$\hat G$具体公式:

  • $\hat G_x=P_wd_x(P)+P_x$

  • $\hat G_y=P_hd_y(P)+P_y$

  • $\hat G_w=P_wexp(d_w(P))$

  • $\hat G_h=P_hexp(d_h(P))$

通过以上计算, 则有了我们在(x,y,w,h)四个维度上对真实值的预测了, 下面, 我们要计算这个预测G值与真实G值. 我们有一个参数向量$W_*$, 它是用于学习的的可调参数, 有:

$d_(P)=W^T_\phi_5(P)$, 其中$\phi_5(P)$是pool5层产生的特征向量

则关于最优$W_*$的公式为如下公式, 其中加号后面的一项是L2正则项(least squares objective), 故此回归也是岭回归(ridge regression):

$W_ = argmin_{\hat W_} \displaystyle \sum^{N}_{i}(t^i_-\hat W^T_\phi_5(P^i))^{2}+\lambda||\hat W_*||^2$

另外, 还有对关于训练数据(P, G)的回归目标$t_*$的定义:

  • $t_x=(G_x-P_x)/P_w$
  • $t_y=(G_y-P_y)/P_h$
  • $t_w=log(G_w/P_w)$
  • $t_h=log(G_h/P_h)$

直觉地理解上面的目标项, 就是让训练参数$W$尽量去拟合pool5层特征值和G数据与P数据在(x,y)上的位移值和在(w,h)上的缩放值, 这样, CNN的特征值与位移/缩放就关联上了, 目标检测中的定位问题也就完成了.

在此附录C末尾, 作者提到两点细微的问题:

  1. 正则化在此处对模型是重要的: 论文设置了$\lambda=1000$, 在评估数据中(validation set);
  2. 选择(P, G)数据对时需选择两者相距不远的(not far from), 否则这个转换就没什么意义了(transform P to G does not make sense), 个人觉得, 这是因为如果一个P相距所有的G都太远, 则说明这个候选区域P本身就是没有选对的(selective search这一步只是把所有候选区域选出来, 当然会选出不含目标的区域), 故不应将P和G关联. 以上只是我的一个猜想推理.

以上, 论文的部分讲解与理解.

行内与独行

  1. 行内公式:将公式插入到本行内,符号:,如:$xyz$
  2. 独行公式:将公式插入到新的一行内,并且居中,符号:xyz$$

上标、下标与组合

  1. 上标符号,符号:^,如:$x^4$
  2. 下标符号,符号:_,如:$x_1$
  3. 组合符号,符号:{},如:${16}_{8}O{2+}_{2}$

汉字、字体与格式

  1. 汉字形式,符号:\mbox{},如:$V_{\mbox{初始}}$
  2. 字体控制,符号:\displaystyle,如:$\displaystyle \frac{x+y}{y+z}$
  3. 下划线符号,符号:\underline,如:$\underline{x+y}$
  4. 标签,符号\tag{数字},如:$\tag{11}$
  5. 上大括号,符号:\overbrace{算式},如:$\overbrace{a+b+c+d}^{2.0}$
  6. 下大括号,符号:\underbrace{算式},如:$a+\underbrace{b+c}_{1.0}+d$
  7. 上位符号,符号:\stacrel{上位符号}{基位符号},如:$\vec{x}\stackrel{\mathrm{def}}{=}{x_1,\dots,x_n}$

占位符

  1. 两个quad空格,符号:\qquad,如:$x \qquad y$
  2. quad空格,符号:\quad,如:$x \quad y$
  3. 大空格,符号\,如:$x \ y$
  4. 中空格,符号\:,如:$x : y$
  5. 小空格,符号\,,如:$x , y$
  6. 没有空格,符号``,如:$xy$
  7. 紧贴,符号\!,如:$x ! y$

定界符与组合

  1. 括号,符号:()\big(\big) \Big(\Big) \bigg(\bigg) \Bigg(\Bigg),如:$()\big(\big) \Big(\Big) \bigg(\bigg) \Bigg(\Bigg)$
  2. 中括号,符号:[],如:$[x+y]$
  3. 大括号,符号:\{ \},如:${x+y}$
  4. 自适应括号,符号:\left \right,如:$\left(x\right)$,$\left(x{yz}\right)$
  5. 组合公式,符号:{上位公式 \choose 下位公式},如:${n+1 \choose k}={n \choose k}+{n \choose k-1}$
  6. 组合公式,符号:{上位公式 \atop 下位公式},如:$\sum_{k_0,k_1,\ldots>0 \atop k_0+k_1+\cdots=n}A_{k_0}A_{k_1}\cdots$

四则运算

  1. 加法运算,符号:+,如:$x+y=z$
  2. 减法运算,符号:-,如:$x-y=z$
  3. 加减运算,符号:\pm,如:$x \pm y=z$
  4. 减甲运算,符号:\mp,如:$x \mp y=z$
  5. 乘法运算,符号:\times,如:$x \times y=z$
  6. 点乘运算,符号:\cdot,如:$x \cdot y=z$
  7. 星乘运算,符号:\ast,如:$x \ast y=z$
  8. 除法运算,符号:\div,如:$x \div y=z$
  9. 斜法运算,符号:/,如:$x/y=z$
  10. 分式表示,符号:\frac{分子}{分母},如:$\frac{x+y}{y+z}$
  11. 分式表示,符号:{分子} \voer {分母},如:${x+y} \over {y+z}$
  12. 绝对值表示,符号:||,如:$|x+y|$

高级运算

  1. 平均数运算,符号:\overline{算式},如:$\overline{xyz}$
  2. 开二次方运算,符号:\sqrt,如:$\sqrt x$
  3. 开方运算,符号:\sqrt[开方数]{被开方数},如:$\sqrt[3]{x+y}$
  4. 对数运算,符号:\log,如:$\log(x)$
  5. 极限运算,符号:\lim,如:$\lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  6. 极限运算,符号:\displaystyle \lim,如:$\displaystyle \lim^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  7. 求和运算,符号:\sum,如:$\sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  8. 求和运算,符号:\displaystyle \sum,如:$\displaystyle \sum^{x \to \infty}_{y \to 0}{\frac{x}{y}}$
  9. 积分运算,符号:\int,如:$\int^{\infty}_{0}{xdx}$
  10. 积分运算,符号:\displaystyle \int,如:$\displaystyle \int^{\infty}_{0}{xdx}$
  11. 微分运算,符号:\partial,如:$\frac{\partial x}{\partial y}$
  12. 矩阵表示,符号:\begin{matrix} \end{matrix},如:$\left[ \begin{matrix} 1 &2 &\cdots &4\5 &6 &\cdots &8\\vdots &\vdots &\ddots &\vdots\13 &14 &\cdots &16\end{matrix} \right]$

逻辑运算

  1. 等于运算,符号:=,如:$x+y=z$
  2. 大于运算,符号:>,如:$x+y>z$
  3. 小于运算,符号:<,如:$x+y<z$
  4. 大于等于运算,符号:\geq,如:$x+y \geq z$
  5. 小于等于运算,符号:\leq,如:$x+y \leq z$
  6. 不等于运算,符号:\neq,如:$x+y \neq z$
  7. 不大于等于运算,符号:\ngeq,如:$x+y \ngeq z$
  8. 不大于等于运算,符号:\not\geq,如:$x+y \not\geq z$
  9. 不小于等于运算,符号:\nleq,如:$x+y \nleq z$
  10. 不小于等于运算,符号:\not\leq,如:$x+y \not\leq z$
  11. 约等于运算,符号:\approx,如:$x+y \approx z$
  12. 恒定等于运算,符号:\equiv,如:$x+y \equiv z$

集合运算

  1. 属于运算,符号:\in,如:$x \in y$
  2. 不属于运算,符号:\notin,如:$x \notin y$
  3. 不属于运算,符号:\not\in,如:$x \not\in y$
  4. 子集运算,符号:\subset,如:$x \subset y$
  5. 子集运算,符号:\supset,如:$x \supset y$
  6. 真子集运算,符号:\subseteq,如:$x \subseteq y$
  7. 非真子集运算,符号:\subsetneq,如:$x \subsetneq y$
  8. 真子集运算,符号:\supseteq,如:$x \supseteq y$
  9. 非真子集运算,符号:\supsetneq,如:$x \supsetneq y$
  10. 非子集运算,符号:\not\subset,如:$x \not\subset y$
  11. 非子集运算,符号:\not\supset,如:$x \not\supset y$
  12. 并集运算,符号:\cup,如:$x \cup y$
  13. 交集运算,符号:\cap,如:$x \cap y$
  14. 差集运算,符号:\setminus,如:$x \setminus y$
  15. 同或运算,符号:\bigodot,如:$x \bigodot y$
  16. 同与运算,符号:\bigotimes,如:$x \bigotimes y$
  17. 实数集合,符号:\mathbb{R},如:$\mathbb{R}$
  18. 自然数集合,符号:\mathbb{Z},如:$\mathbb{Z}$
  19. 空集,符号:\emptyset,如:$\emptyset$

数学符号

  1. 无穷,符号:\infty,如:$\infty$
  2. 虚数,符号:\imath,如:$\imath$
  3. 虚数,符号:\jmath,如:$\jmath$
  4. 数学符号,符号\hat{a},如:$\hat{a}$
  5. 数学符号,符号\check{a},如:$\check{a}$
  6. 数学符号,符号\breve{a},如:$\breve{a}$
  7. 数学符号,符号\tilde{a},如:$\tilde{a}$
  8. 数学符号,符号\bar{a},如:$\bar{a}$
  9. 矢量符号,符号\vec{a},如:$\vec{a}$
  10. 数学符号,符号\acute{a},如:$\acute{a}$
  11. 数学符号,符号\grave{a},如:$\grave{a}$
  12. 数学符号,符号\mathring{a},如:$\mathring{a}$
  13. 一阶导数符号,符号\dot{a},如:$\dot{a}$
  14. 二阶导数符号,符号\ddot{a},如:$\ddot{a}$
  15. 上箭头,符号:\uparrow,如:$\uparrow$
  16. 上箭头,符号:\Uparrow,如:$\Uparrow$
  17. 下箭头,符号:\downarrow,如:$\downarrow$
  18. 下箭头,符号:\Downarrow,如:$\Downarrow$
  19. 左箭头,符号:\leftarrow,如:$\leftarrow$
  20. 左箭头,符号:\Leftarrow,如:$\Leftarrow$
  21. 右箭头,符号:\rightarrow,如:$\rightarrow$
  22. 右箭头,符号:\Rightarrow,如:$\Rightarrow$
  23. 底端对齐的省略号,符号:\ldots,如:$1,2,\ldots,n$
  24. 中线对齐的省略号,符号:\cdots,如:$x_1^2 + x_2^2 + \cdots + x_n^2$
  25. 竖直对齐的省略号,符号:\vdots,如:$\vdots$
  26. 斜对齐的省略号,符号:\ddots,如:$\ddots$

https://www.cnblogs.com/peaceWang/p/Markdown-tian-jia-Latex-shu-xue-gong-shi.html

TF_BASIS_低阶API

发表于 2019-07-02 | 更新于 2019-07-03 | 分类于 码码码上

前言: 这篇原文是英文的中文翻译文档我给了三星(第一次)和二星(第二次), 但其中的内容, 还是靠谱的(比博文强), 毕竟这是官方的东西了. 下面, 我将个人觉得很释义的几处要点罗列了, 看能否说的明白.

阅读全文 »

ERROR_LOG

发表于 2019-07-02 | 更新于 2019-07-13

错误: setuptools

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=baidu&wd=setuptools-27.2.0&oq=No%2520such%2520file%2520or%2520directory%253A%2520setuptools-27.2.0&rsv_pq=ed81072e0008b4fa&rsv_t=95d1k1oKTFVKLAuEUYyFrDmnVAP1gW%2FphgT%2Fg4KLiI3I0kyblnGVPTWfF6Y&rqlang=cn&rsv_enter=1&inputT=6524&rsv_sug3=27&rsv_sug2=0&rsv_sug4=6524

https://pypi.org/project/setuptools/27.2.0/

0703:

PyCharm怪事: 在PyCharm中设置某个项目的解释器(电脑上有同时安装anaconda和miniconda3, 以及系统自带的Python和后来单独安装的Python3.5), 然而, 在选择项目解释器时, 如果选中miniconda(平时用的多)中的python3.6则会报错: “Invalid Python SDK”, 只好选择anaconda中的python3.6, 原因不知, 只知道是这个结果.

01.png

02_B.jpg

03.png

有趣的博客: http://www.yueye.org/2018/convert-your-own-custom-dataset-to-pascal-voc.html

https://www.yueye.org/2016/entry-for-new-life.html/comment-page-1#comment-35279

PyCharm 配置远程python解释器和在本地修改服务器代码: https://www.cnblogs.com/xiongmao-cpp/p/7856596.html

0713: 辛辛苦苦写的公式, 居然不能在github上渲染出来, 怎么破?! 解决方案在哪里.

采用方案(临时): 插件:”Math Anywhere”[REF], 以及Hexo的改造(安装kramed渲染引擎):

如果没有在Chrome中安装上述插件, 则我本地使用kramed引擎渲染的markdown文档上传到github.io上一样还是显示未经渲染的原公式(raw): 如”$\sum_{i=0}^N\int_{a}^{b}g(t,i)\text{d}t$“

参考MatcJax渲染[REF], 此步骤中, 发现有在线将公式生成图片的网站: [SciWeavers], [CodeCogs],

按照此篇博文01[REF]逻辑(说得通), 但并没有解决情况, 此篇02[REF]就更加了, 逻辑也通, 但很多细节没有, 没法复现, 此篇简书博文03[REF], 和博文01的说法类似, 就是不管用, 这篇04[REF]更不靠谱了, 内容类似, 第四步打开什么也没说(应该转的).

问题没解决, 却搜集了一篇MathJax的[语法]和[Tutorial].

123

Haoran Ye

Computer Fake Science
21 日志
8 分类
23 标签
GitHub
© 2019 Haoran Ye
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Muse v7.1.2