解决数据集导致的大内存占用和磁盘IO问题

看到Ubuntu上的磁盘IO和内存占用出奇的高,忍无可忍,决定必须解决一下了。

内存占用最高的是chrome和gvfsd-metadata,前者1.6G没办法,后者竟然有1.8G。查了一下维基百科

gvfsd-metadata is a daemon acting as a write serialiser to the internal gvfs metadata storage. It is autostarted by GIO clients when they make metadata changes. Read operations are done by client-side GIO code directly, and don’t require the daemon to be running. The gvfs metadata capabilities are used by the GNOME Files file manager, for example.

虽然仍然没搞懂它是个什么东西,但是罪魁祸首就是它没跑了,形成的原因大概是我打开过很多大的数据集的文件夹,比如pascal voc、shapenet、pascal3d,要是还有imagenet就更恐怖了。从这个帖子来看,它还导致了100%的CPU占用。后面给出了临时的解决办法:

rm -rf ~/.local/share/gvfs-metadata
pkill gvfsd-metadata

如果这种情况继续出现,那么直接按照这里所说取消gvfsd-metadata的执行权限即可:sudo chmod -x /usr/lib/gvfs/gvfsd-metadata

另外,iowait也达到了27%左右,我只不过开了个sublime-text而已。原因仍然是数据集,有好几个sublime_text --crawl的进程在不停地读磁盘,给文件做索引。这些数据集的文件格式大多是图片,所以只要按照这个帖子给sublime-text的配置加上:

"folder_exclude_patterns": [".svn", ".git", ".hg", "CVS", "node_modules/*"],
"binary_file_patterns": ["*.mat","*.jpg", "*.jpeg", "*.png", "*.gif", "*.ttf", "*.tga", "*.dds", "*.ico", "*.eot", "*.pdf", "*.swf", "*.jar", "*.zip"],

问题就解决了。

不过对于ShapeNet这样的仍然没有办法==,所以最好还是避免用sublime-text打开带有数据集的文件夹(这种需要却并不少见,因为用软链接方便)。

How to make linemod and KinectV2 work with ROS Indigo?

I’m using Ubuntu 14.04.5 with ROS Indigo, and I want to make ork work with linemod, a fairly simple need. But sometimes if some packages are not maintained well (especially in ROS), you have to investigate the problem and even to contribute code to the project…

Following the installation guide to install ork is very simple, don’t forget to install couchdb. Building from source is the only choice now, you have to modify the code to make it work as you wish.

In my case, tabletop method works well with KinectV1, even with KinectV2(but only the hd resolution config worked). However, linemod caused a huge memory leak, nearly 1GB/s, and it didn’t publish /recognized_object_array topic. At the beginning I thought it is the problem is in linemod, but it turned out to be in ork_renderer. A thread in ORK Google Group said,

Currently LINEMOD uses ork_renderer for its training phase. ork_renderer uses either GLUT or osmesa to generate synthetic images of the training data. It seems that the ork_renderer in your computer is linked to osmesa.

Fortunately now we just can change CMakeLists.txt to use GLUT. Just change option(USE_GLUT "Use GLUT instead of OSMesa" OFF) to option(USE_GLUT "Use GLUT instead of OSMesa" ON).

Update: Now I just use the version from JimmyDaSilva but not the official wg-perception.

But the current linemod version still have some problem related to assimp_devel, it seems the developer is working on it, you have to revert linemod to the previous version(35aebd).

So I just created a repo here to make the whole thing work. When linemod is training it will show a assimp window, but it do not contain anything in my case, not a serious problem, linemod works anyway with KinectV1, but not with KinectV2, because KinectV2 has a special resolution, causing an OpenCV error in linearMemoryPyramid. Fortunately again an awesome guy has worked it out, and he also fixed many other issues. I need to use KinectV2 in my work, so I followed this guy’s modification and successfully made it work on KinectV2 with QHD resolution. If you want to use SD resolution, you can set T={2,4} in linemod_detect.cpp and renderer_width: 512 renderer_height: 424 in training.ork as JimmyDaSilva said.

This ork repo integrated all of them, just to make it easier to work on ork, maybe for myself in the future.

Tips:

  • If you used linemod to train, you’d better delete the whole object_recognition database in CouchDB.
  • Using coke.stl is simpler, using coke.obj with texture will get a better result.
  • When training linemod, make sure you are in the folder which contains the obj, mtl and image files.

多系统多头单尾的工作环境

我总会有一些 奇怪 的工作环境需求。比如因为很多软件只有Windows能用,我需要一台Windows,然而工作上的软件又运行在Ubuntu下,可能出于其它原因你甚至还需要一台Mac。除此以外,单个屏幕显然是不够用的,双显示器是必须的,其实三台显示器或许才够用,不过加上一台笔记本我的桌面几乎放不下了。实验室也不会给我辣么多显示器。。。

而且,我还要在所有屏幕所有主机上共享一套鼠标和键盘!还要共享剪贴板,让文本可以直接从一个系统复制粘贴到另一个系统!

由于我有时用到自带屏幕的笔记本,我还需要有时台式机接双显示器,有时笔记本自带屏幕加一台显示器做双屏!

经过一番折腾,上述奇怪的需求全都实现了。这可以叫做多系统、多头、单尾的工作环境。5年前B哥的这篇文章第一次让我知道了计算机的

Synergy是一个通过局域网实现的鼠标键盘共享软件。然而作为一个开源软件,它的下载竟然是收费的!虽然开源软件收费并不是什么坏事,然而开源软件本身是开源的,只要自己能编译出来或者使用别人编译的程序似乎也不违规?我对它的盈利模式深表怀疑。。。而且,Synergy也有Nightly Build是可以搜到的,也就是说你·根·本·就·可·以·免·费·下载到最新的版本(不过可能不够稳定)。

我尝试了Synergy的很多个版本,发现并不是很稳定,而且如果服务器和客户端是不同的版本会有不兼容的问题。最后找了一个老的版本以Daemon/Windows服务的形式运行,大概图形界面就是罪魁祸首吧,我也懒得去确定最新版本用这种方式能否稳定工作了。

Read More

SIFT算法的Matlab实现

这是一次作业,内容是给出两张图像,检测特征点和匹配特征点。要求不能用诸如OpenCV的现成特征点检测函数。于是就只能造轮子了,写了这个Matlab版的sift。(其实就是把c语言的opensift翻译成了matlab

以下是算法流程,其实网上的类似博文已经很多了,只不过我看的过程中也看得不很明白,只能对照着好几个看,所以干脆自己又写了一遍。下面的图均来自于参考资料中,然而参考资料的图也是来自于参考资料的参考资料中。

1. 构建尺度空间

定理1 对图像做 的高斯平滑,再做一次 的高斯平滑,等效于对原图像做一次 的高斯平滑。

1.1 构建高斯金字塔

高斯卷积核是实现尺度变换的唯一线性核(Koenderink, 1984; Lindeberg, 1994)。

一幅图像的尺度空间被定义为对其做可变尺度的高斯卷积:

对于给定的彩色图像,转化为灰度图像,用不同大小的做高斯平滑(按照 3 准则,高斯核矩阵的大小设为 ,并保证行和列为奇数),再此基础上将图像降采样得到不同大小的组(octave),每组若干图像(interval)。详细描述如下:

为了得到更多的特征点,将图像扩大为原来的两倍。假设原图像已有 的高斯平滑,而我们需要第一个octave的第一张图像的 ,按照定理1,我们要对扩大两倍的图像做一次高斯平滑,

上一个octave的图像的长度和宽度分别是下一个octave的图像的两倍。因此图像组数(octaves)可由图像大小决定,将其设为 ,这样将使顶层octave图像的长度和宽度最小值在8像素左右。

设第m个octave的第n张图像相对于原始图像的参数,则。每个octave有s+1张图像(即intervals),这样得到的高斯差分金字塔(DoG)每个octave将有s张图像,我们设s为3。为了满足在不同octave间尺度的连续性,并使 ,按照定理1,则:

Parameter Sigma

Read More

Ubuntu14.04 安装 Caffe+CUDA 7.5

Caffe官网的 安装说明 实在太简单了点,主要是参考的 Caffe + Ubuntu 14.04 64bit + CUDA 6.5 配置说明Ubuntu14.04下安装Caffe总结 。系统是Ubuntu 14.04 64bit,显卡是GTX 950M。

1. Caffe依赖包

1
2
sudo apt-get install build-essential  # basic requirement
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler #required by caffe

2. 安装CUDA 7.5

2.1 禁用nouveau驱动

我作死地相信了上述第二篇文章的话,没有禁用nouveau驱动,结果第一次重启神奇地成功了,第二次重启就无法登陆。。。后来用recovery mode禁用了nouveau。所以一定要禁用nouveau:

创建文件/etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0

2.2 安装CUDA

在NVIDIA开发者官网下载CUDA 7.5,我直接用的deb包,因为觉得比较方便。可以直接双击打开安装,也可以用命令行:

1
2
3
sudo dpkg -i cuda-repo-<distro>_<version>_<architecture>.deb
sudo apt-get update
sudo apt-get install cuda

都说要禁用lightdm安装cuda,但是用deb包安装的话没有关掉lightdm也没有遇到什么问题。安装完CUDA以后使用的就是nvidia闭源驱动了。

Read More