[Pro Git笔记]第三章 分支

实验室有了服务器之后,终于过上了本地开发->推送远程->服务器更新代码的幸福生活,也更加感受到了Git的强大神力。靠Try Git打下的基础就显得有些捉襟见肘了,查资料的时候Google大神给出了开源的Pro Git的中译版,豆瓣评分9.0,算得上相当不错了,见这里.

今天扫了一下第二章,基本上就是Try Git课程的内容。出于近期的需求,详细读了第三章分支,书写得很清楚,除了介绍命令,还介绍了一些底层实现,配合分支变化的插图,很容易理解。
自己也看了5, 6份关于Git的书籍,tutorial, 在线课程等等,推荐新手按照Try Git->Pro Git的学习路线,基本能够满足日常生活的需求。

Try Git的笔记之前已经po过了,点击下面的按钮阅读Pro Git第三章分支的笔记。

Read More

[Notes]Unsupervised Discovery of Mid-Level Discriminative Patches

本期论文的题目是”Unsupervised Discovery of Mid-Level Discriminative Patches”, 发表于ECCV2012,幕后老板是CMU的Efros。
主页代码神马的paper最友好了。

Tomasz Malisiewicz(Exemplar的作者)的CVPR2013感想中提到了计算机视觉研究的三大趋势,其中之一就是“Mid-Level Patches”,其中就提到了这篇文章,觉得mid-level patch这个概念很新鲜,于是找来读了一下。

Overview

“Mid-Level Patches”是一种介于low-level和semantic特征之间的一种特征,具有两大特性: representative and discriminative(有点类似于NLP里的TF-IDF的概念)

  • representative(代表性): 出现频率高
  • discriminative(区分度): 必须和其他的patch不同

用完全非监督式的方法进行学习,不断在“聚类”-“训练判别式的分类器”这两个阶段迭代,最终达到收敛. 将学习结果应用于场景分类(scene classification)问题,AUC超过了之前最好的方法。

  • 我们需要怎样的特征?

    • low-level (bottom-up): 不能提供足够的信息,有可能在图像的任何位置产生响应,泛化能力差
    • semantic (top-down): 把整幅图像当作特征的基本单位,需要大量的训练样本,区分度不够
  • 主要相关工作: Poselet

    • Poselet是一种heavily-supervised算法
  • Intuitive Solutions

    • 说到非监督学习,当然首先会想到像K-means这样的聚类算法了,很遗憾的是,K-means的效果并不好。K-means的分类判据(如欧式距离,L1范数等等)并不一定能够反映visual similarity. 如果想要得到visual similar patch,就必须使用判别式的分类器,比如SVM. 这样就形成了“先有鸡还是先有蛋”的悖论。好的聚类结果依赖于准确的相似性度量准则,而相似性度量准则又依赖于好的聚类结果。虽然这个“鸡蛋”问题可以通过判别式的迭代聚类(iterative discriminative clustering)得到解决,但聚类会产生过多的类别,这个算法不适用于海量真实数据。

    • 本文所采用的方法是用”detection”来替代判别式的聚类,对每个类别训练一个分类器,用于检测与其相似的patch. 这个方法与DPM很类似,但是取消了patch必须和原始模型相差无几的限制条件。

    • SVM的缺点是具有“记忆”,为了增强泛化能力,采用了”cross validation”策略,将训练集分成相同大小无交集的两个子集合,交替进行训练和检测,直到收敛。

Read More

[Notes]Putting Objects in Perspective

本期主题是CVPR2006 Best Paper加身的Putting Objects in Perspective(以下简称POP), 项目主页代码链接. 文章设计了一个同时支持camera viewpoint, object detector和scene 3D geometry的统计推断框架。文章的年代有一点久远,当时还是Dalal和Triggs的HoG+SVM当道的时代,DPM尚未出世,今天红遍大江南北的Deep Learning当时还屡屡遭拒,但POP的推断框架在今天看起来仍然非常elegant.

Overview

心理学及视觉研究证明,context information plays a crucial role in scene understanding. POP提出的框架包括了3个要素

  • low-level object detectors: POP框架具有良好的易扩展性,可选用任意目标检测子
  • 3D scene geometry: 预测目标在图像中可能出现的位置
  • approximate camera position/orientation:预测目标的大小

Read More

HOG不正传

闲话历史

HOG(histogram of oriented gradients)是object detection中非常popular的特征,对于行人检测尤其有效,能够较好地捕捉行人轮廓。最早由 Navneet Dalal和Bill Triggs在2005年的CVPR论文Histograms of Oriented Gradients for Human Detection中提出(这篇神文的应用量已经达到6000+次了)。

所谓“长江后浪推前浪,一代更比一代(强)!”. Brown University的pff使用HOG特征加上DPM模型和latent SVM学习,多次在VOC challenge中夺魁 (btw, DPM是他在University of Chicago的工作) ,最终获得lifetime achievement的title(新闻见这里).

又所谓“不开源代码的工作都是耍流氓”,作为一代神作,pff和他的合作者们孜孜不倦地迭代了5个版本的DPM software package,引用另一个我很欣赏的计算机视觉研究者Tomasz Malisiewicz (顺便推荐一下此人的blog, 有很多干货)的话来说,”A key ingredient to successful object recognition research is a powerful codebase, which you will hopefully one day outgrow and/or extend. “(原文见Tomasz的日志

DPM software package如此流行,所以本文结合DPM PAMI论文中的理论及软件包中features.cc的代码介绍HOG特征的计算。关于OpenCV的HOG源码分析也有不少资源,供使用OpenCV的研究者参考。

Why is HOG effective?

为啥HOG特征这么有效呢? 手工设计一个特征,比如DOG, HOG, LBP等等(感兴趣的童鞋可以戳Zhu Songchun主页上关于CV研究的漫画),在我看来HOG特征的设计如同飞来神笔,仍然是一件非常神秘的事情。对着这个问题的解释主要参考了HOG的wiki页面

HOG的基本思想是,图像中局部物体的轮廓和形状可以用灰度值梯度强度和方向的分布描述。将图像划分成小块的连通区域(称作cell, 这是一种“sliding window”的方法), 计算cell内像素点的梯度方向的直方图(histogram of gradient directions). 为了使特征对光照和阴影保持不变性,将几个cell聚合成一个block, 对直方图进行contrast-normalization.
相对于其他特征,HOG有以下两点优势

  • 对局部区域进行操作,对geometric and photometric transformation保持不变性
  • 对于行人,只要目标保持直立姿态(upright), HOG特征不受身体运动的影响,因此HOG特征对行人检测效果特别好

题外话 关于如何学出一个特征这个一度像黑匣子一样神秘的问题,Deep Learning研究在该问题上取得了一定进展,不过我对此方向不太了解,且这不是本文的话题,保持持续关注,暂且按下不表。pluskid大神关于deep learning发表了一篇blog, 不明觉厉,值得一看。

灌了好些水,也该上点干货了,请猛烈点击下方的Read on按钮继续阅读 XD.

Read More

Markdown Cheatsheet

最近在转向使用markdown进行日常笔记的工作,编辑器目前使用chrome app stackedit, 支持markdown基本语法和latex公式输入,能够以html页面发布,同步到google drive和dropbox,或者发布到blogger, wordpress, github, 基本能够满足工科僧的需求。Markdown支持html标签内嵌,如果你懂得少量的html语言,就能够制作出更美观的文本。PC端刚刚开始试用Sublime Text 2,尚在熟悉中。

入门教程主要是以下两项:

在Google上发现了一个更加实用的cheatsheet,在这里做一下翻译(内联HTML和Youtube部分未译),顺便巩固一下语法。个人比较推荐列表表格部分,比其他教程详细一些。

Headers

#表示标题

1
2
3
4
5
6
# H1
## H2
### H3
#### H4
##### H5
###### H6

效果如下

H1

H2

H3

H4

H5
H6

强调

基本上每个Markdown教程都会有的内容,将你的双手从鼠标中解放出来,可以用比latex更简洁的方式完成粗体斜体又是加粗又是斜体的操作。

1
2
3
4
5
6
7
使用*asterisks*(星号)或者_underscores_(下划线)表示斜体.

使用双份的星号或者下划线**asterisks**, __underscores__表示粗体.

星号和下划线一起上就是加粗+斜体了 **asterisks and _underscores_**.

使用波浪线表示删除线 ~~Scratch this.~~

使用asterisks(星号)或者underscores(下划线)表示斜体.

使用双份的星号或者下划线asterisks, underscores表示粗体.

星号和下划线一起上就是加粗+斜体了 asterisks and underscores.

使用波浪线表示删除线 Scratch this.

删除线似乎是增强版Markdown的功能,StackEdit不支持

列表

在codebox中,空格用‘.’来占位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1. 有序列表的第一项条目
2. 再加一条
..* 无序子列表
1. 标号并不重要,Markdown会自动更新序号
..1. 有序子列表
4. 第四项条目

...注意上面的空行,和本段开头的空格(至少需要一个空格,在这里用了三个方便对齐:P)

...如果想要回车又不想新起一个段落,在断尾加两个空格??
...本行单独成行,但是没有产生新的段落??
...在GFM风格的段落中,行尾不需要空格

* 用asterisk表示无序列表
- 减号也可以
+ 加号也可以
  1. 有序列表的第一项条目
  2. 再加一条
    • 无序子列表
  3. 标号并不重要,Markdown会自动更新序号
    1. 有序子列表
  4. 第四项条目

    注意上面的空行,和本段开头的空格(至少需要一个空格,在这里用了三个方便对齐:P)

    如果想要回车又不想新起一个段落,在断尾加两个空格
    本行单独成行,但是没有产生新的段落
    在GFM风格的段落中,行尾不需要空格

  • 用asterisk表示无序列表
  • 减号也可以
  • 加号也可以

链接

也读作传送门:P
有两种生成链接的方法,行内式或者参考式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[行内式链接](https://www.google.com)

[带标题的行内式链接](https://www.google.com "Google's Homepage")

[参考式链接][Arbitrary case-insensitive reference text]

[指向代码仓库文件的相对路径](../blob/master/LICENSE)

[参考式链接可以使用数字序号][1]

或者使参考文字为空 [链接文字][]

参考式链接的地址可以出现在后面

[arbitrary case-insensitive reference text]: https://www.mozilla.org
[1]: http://slashdot.org
[链接文字]: http://www.reddit.com

行内式链接

带标题的行内式链接

参考式链接

指向代码仓库文件的相对路径

参考式链接可以使用数字序号

或者使参考文字为空 链接文字

参考式链接的地址可以出现在后面

插入图片

插入图片和插入链接的语法很像,只是前面多了一个!

1
2
3
4
5
6
7
8
9
以Markdown Here的logo为例:

行内式插入:
![alt text](https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 1")

参考式插入:
![alt text][logo]

[logo]: https://github.com/adam-p/markdown-here/raw/master/src/common/images/icon48.png "Logo Title Text 2"

以Markdown Here的logo为例:

行内式插入:
alt text

参考式插入:
alt text

代码与语法高亮

程序猿同行看这里了喂$\rightarrow$

代码块是Markdown的特性之一,但语法高亮并不是。部分渲染器支持语法高亮,比如Github和Markdown Here(很遗憾StackEdit不支持语法高亮的特性). 可以戳这里查看highlight.js支持的语言和高亮效果。

1
对于行内`代`,只需要用`\`\``把它们框起来就可以了

对于行内代码,只需要用`` 把它们框起来就可以了

1
对于大段的代码块,用` ``` `把他们框起来,或者在段首留4个空格的缩进也可以。

对于大段的代码块,用`

1


1
2
var s = "JavaScript syntax highlighting";
alert(s);
1
2
s = "Python syntax highlighting"
print s
1
2
No language indicated, so no syntax highlighting. 
But let's throw in a <b>tag</b>.
1
2
3
4
5
6

上面的那段代码看起来就像这样

```javascript
var s = "JavaScript syntax highlighting";
alert(s);
1
2
s = "Python syntax highlighting"
print s
1
2
No language indicated, so no syntax highlighting. 
But let's throw in a <b>tag</b>.

表格

表格也不是Markdown的核心功能(没办法,Markdown的设计思想就是轻量简洁),但是对于时常需要记录实验数据的po主,表格是不可或缺的功能。好在GFM, Markdown Here, StackEdit都支持了表格功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
冒号用于对齐

| Tables | Are | Cool |
| ------------- |:-------------:| -----:|
| col 3 is | right-aligned | \$1600 |
| col 2 is | centered | \$12 |
| zebra stripes | are neat | \$1 |

外侧的'|'可以被省略,就像下面的表格这样。

Markdown | Less | Pretty
--- | --- | ---
*Still* | `renders` | **nicely**
1 | 2 | 3

冒号用于对齐

Tables Are Cool
col 3 is right-aligned \$1600
col 2 is centered \$12
zebra stripes are neat \$1

外侧的’|’可以被省略,就像下面的表格这样。

Markdown Less Pretty
Still renders nicely
1 2 3

引用

1
2
3
4
5
6
> 引用在email中是很常见的功能。
> 这行也是同一引用块的内容

引用完毕。

> 让我们来看看引用一大段文字会怎样。我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的。占位完毕!引用区块*内部*也支持**Markdown**语法

引用在email中是很常见的功能。
这行也是同一引用块的内容

引用完毕。

让我们来看看引用一大段文字会怎样。我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的我是只是来占位的。占位完毕!引用区块内部也支持Markdown语法

喜闻乐见的分割线

1
2
3
4
5
6
7
8
9
10
11
12
13
连续三个或更多的链接符,星号和下划线将产生分割线

---

链接符

***

星号

___

下划线

连续三个或更多的链接符,星号和下划线将产生分割线


链接符


星号


下划线

空行

作者关于空行的建议是——多试几次。那就一起试试看吧~

1
2
3
4
5
6
起始行。

敲击两下回车,产生一个新的段落

再起一段...
这是单独的一行但不是与上一行同属一个*段落*

起始行。

敲击两下回车,产生一个新的段落

再起一段…
这是单独的一行但不是与上一行同属一个段落


教程的部分告一段落,突然发现要整理出一份好用的tutorial也是挺费功夫的一项工作,向精心撰写文档的原作者和孜孜不倦地进行技术翻译工作的Geek们致敬!

在octopress中输入数学公式

喜欢上markdown这门语言就是因为它能够方便地支持Latex语法的数学公式输入,照着教程安装配置kramdown,试试看输入数学公式的效果

试验样本当然是搞机器学习的最爱:正太分布

写(故)错(意)了(的),应该是正态分布. XD

\begin{equation}
f(x; \mu, \sigma^2) = \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{1}{2}(\frac{x-\mu}{\sigma})^2}
\end{equation}

codeschool ‘Try Git’课程试用感想

之前在微博上看到有人介绍code school, 评价课程体验非常好。“要想知道梨子的滋味,还得自己尝一尝。”作为公开课爱好者(作者正在努力克服enroll里以后没办法坚持到底的问题…),自然不能放过这样的机会,注册了一个帐号玩了一把,感想是——

非常赞!强力推荐!

之前也读过一些git教程,比如Github自带的入门文档和我最喜欢的入门教程git-简易指南,但这些文档似乎太过简略了一些,注解也少了一些,操作了一遍还是感觉云雾缭绕。而图书馆里的《Git权威指南》之类的大部头又没耐心看下去。code school的Try Git在难易繁简的平衡中可谓恰到好处,所介绍的git命令足以应付初级使用者的需求,关于命令的注释和使用tip又很贴心,交互式的环境能够给出实时的feedback(主要功能还是通过“逼迫”学习者亲手敲一遍命令来巩固记忆)

以下内容是Try Git课程中提到的git命令,给还没有上过这门课程的童鞋一个预览,也是自己的Git命令速查手册。

在当前目录下创建git目录,生成/.git的隐藏目录

git init

查看当前repo的状态

git status

加入文件到staging area

git add [filename]

[注] 若要加入当前目录下的所有文件

git add .

若要加入git目录下(包括子目录)所有以suffix为后缀的文件,此处若没有’’,则shell将解析正则表达式,将当前路径下(不包括子目录)的文件加入staging area

git add '*.suffix'

将文件从staging area删除

git remove [filename]

查看git commit历史

git log

设定remote repo的URL地址,为将本地代码仓库push到远程服务器做准备

git remote add [repo name]

Git doesn’t care what you name your remotes, but it’s typical to name your main one origin.

将local repo push到服务器端。-u 参数可以记忆设置,下次push时只需使用git push命令即可

git push -u origin master

origin是remote git repo的名字, master是local repo的默认branch name

隐藏更改

git stash

将remote repo下载到本地

git pull origin master

查看更改

git diff

如果想查看最近一次的更改,使用git diff HEAD命令, HEAD指针指向最近一次的更改.

从staging area中删除file

git reset [filename]

恢复到上次commit的状态

git checkout -- [filename] 

创建新分支

git branch [branch_name]

查看当前分支情况

git branch

切换当前分支

git checkout [branch_name] 

创建并切换到名为branch_name的分支

git checkout -b [branch_name]

同时从物理目录和git staging area中删除文件

git rm [filename]

删除文件夹及其子目录中的内容

git rm -r [folder_name]

将branch_name分支下的内容和当前分支合并

git merge [branch_name]

[注] 有时会出现conflict, 解决的思路是“确定究竟哪部分代码是要保留的”,似乎属于比较高级的议题,参见pro git

删除分支

git branch -d [branch_name] 

[注]未经merge操作的分支不能通过上述命令删除,使用git branch -D/--force/-f [branch_name]强制删除

开篇镇魂

最近在跟Coursera上的algorithm课程,slides上的一句话“如同闪电一样”击中了我。就以此为这个blog的镇魂石吧。

这段话绝对值得每天默念 100 遍!

Perhaps the most important principle for the good algorithm designer is to refuse to be content.

Can we do better?

彩蛋时间!

补充说明: Tim老师本尊还是很帅的,图截成这样完全是我的技术问题……