GLog & GFlags 的安装

0、系统环境
Ubuntu 16.04
GCC 5.4

1、安装步骤
1)安装 GFlags
运行如下指令:

2)安装 GLog:
安装编译工具:

运行如下指令安装:

常见问题
1、使用 GLog 报错:libglog.a: error adding symbols: Bad value
在使用 GLog 的工程中遇到了如下错误:

产生该问题的可能原因是在 64位系统中,不能链接 GLog 生成动态库。修改方法是 GLog 需要使用如下方式编译,加入 -fPIC 编译选项:

代替:

2、错误:undefined reference to `google::FlagRegisterer::FlagRegisterer
如果你在编译 GLog 时遇到如下错误:

可以尝试先卸载 GFlags:

另一种可能的解决方案是,在编译 GLog 时请使用:

代替:

3、错误:Make error: failed to link with libgflags.a
产生该问题的原因有可能是需要使用动态库方式编译 GFlags
将 GFlags 编译时选项改成动态库:

并重新编译 GFlags 和 GLog。

4、错误:something wrong with flag ‘flagfile’ in file ‘XXX.cc’
请参照 3 中的解决方案重新编译 GFlags 和 GLog。

Posted in 其他工具 | Leave a comment

VI ORB SLAM2 与 VINS 对比实验

一、实验说明

之前做了一些 VI ORB SLAM2 与 VINS Mono 性能的对比试验,由于 VI ORB SLAM2 并没有官方的版本,我们主要使用王京实现的一个版本(https://github.com/jingpang/LearnVIORB)来做测试(我们加入了双目 VIO 部分,但不论单目还是双目该版本实现与官方版本性能有较大差距)。VINS Mono (https://github.com/HKUST-Aerial-Robotics/VINS-Mono)是港科大开源的一个单目 VIO 算法,速度快而且性能不错,同样受到很大关注。本篇博客我们对二者进行了一些粗浅的实验对比。

说明如下:
1、实验主要指标为 RMSE:
\(RMSE = \sqrt{\frac{1}{n}\Sigma_{i=1}^{n}{\Big(\frac{d_i -f_i}{\sigma_i}\Big)^2}}\)

2、实验采用 EuRoC 测试集(https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets)。以下是一些初步的实验结果,做一记录。因为没有深入研究和调试,试验次数也比较有限,不一定具有代表性。如大家有任何改进建议或者疑问欢迎留言。

二、实验结果

1、ORB 与 VI ORB 对比
以下表格是 ORB 与 VI ORB 两个实验对比结果:

EuRoC ORB Mono ORB Stereo VIORB Mono VIORB Stereo VIORB Mono Paper
RMSE RMSE RMSE RMSE RMSE
MH_01_easy 0.015 0.038 0.092 0.072 0.023
MH_02_easy 0.020 0.048 0.089 0.054 0.027
MH_03_medium x 0.038 0.091 0.053 x
MH_04_difficult 0.015 0.103 0.773 0.15 0.018
MH_05_difficult 0.017 0.056 0.286 0.099 0.024
V1_01_easy x 0.087 0.094 0.09 0.047
V1_02_medium 0.070 0.065 0.118 0.067 0.068
V1_03_difficult 0.066 0.085 x 0.075 0.073
V2_01_easy 0.071 0.064 0.242 0.07 0.071
V2_02_medium 0.081 0.06 0.104 0.118 0.087
V2_03_difficult 0.060 x x x 0.060

在以上表格中,均使用 RMSE 均方根误差作为评测指标,其中 ORB Mono 和 ORB Stereo 是原始 VO 版本的单目和双目 SLAM 算法;VIORB Mono 和 VIORB Stereo 是王京和我们修改后的 VIO 版本的单目和双目 SLAM 算法;最后 VI ORB Mono Paper 是作者论文中的算法。

从中可以看出,相对于作者论文中的算法效果,在我们所使用的开源版本中并没有完全达到。而王京的代码是基本实现了作者论文中的主要思想的,因此猜测差距主要来自于调参和一些论文中没有公布的细节。

双目 VIO 比单目 VIO 效果要更好也更稳定,不过加入 IMU 的版本均不如原始双目版本的精度。应该是原始 VO 的优化已经比较彻底,IMU 误差项的加入给优化结果造成了更多的不稳定性。这一点在作者论文中也能看到,加入 IMU 的版本并没有比原始单目精度更高。

2、VI ORB 与 VINS Mono 对比(开启闭环)
以下表格是 VI ORB 与 VINS Mono 两个实验对比结果:

EuRoC VIORB Mono VIORB Stereo VIORB Mono Paper VINS Mono
RMSE RMSE RMSE RMSE
MH_01_easy 0.092 0.072 0.023 0.06
MH_02_easy 0.089 0.054 0.027 0.066
MH_03_medium 0.091 0.053 x 0.135
MH_04_difficult 0.773 0.15 0.018 0.056
MH_05_difficult 0.286 0.099 0.024 0.058
V1_01_easy 0.094 0.09 0.047 0.098
V1_02_medium 0.118 0.067 0.068 0.061
V1_03_difficult x 0.075 0.073 0.064
V2_01_easy 0.242 0.07 0.071 0.052
V2_02_medium 0.104 0.118 0.087 0.174
V2_03_difficult x x 0.060 0.140

从中可以看出 VINS Mono 精度与 ORB 作者论文中的单目精度比是明显不如的,但是与开源版本比精度要高一些,比我们修改的双目版本略低。

VI ORB 是不能完全跑过全部测试集的,特别是快速运动的 V2_03_difficult 测试集结尾阶段会跟丢(原作者不丢),这一点不难理解,因为光流是比较简单的像素级别跟踪,是不容易丢失的,而 ORB 虽然是很弱的描述子依然比类似光流、模板匹配要严格很多,相对来说光流还是很易丢失的(我们简单地用二者的纯前端来实验了下,VINS的光流跟踪在所有测试集未发生跟丢的情况,ORB有跟丢)。

3、VI ORB 与 VINS Mono 对比(关闭闭环)
以上 2 小节中的测试均开启了闭环。虽然 VINS Mono 看起来也实现了比较好的精度,但是其本身对于闭环依赖较大,在关闭闭环后,VINS Mono 的性能是下降较多的:

EuRoC VIORB Mono Paper VIORB Stereo VINS Mono
No Loop Loop No Loop Loop No Loop Loop
RMSE RMSE RMSE RMSE RMSE RMSE
V1_02_medium 0.028 0.027 0.07 0.065 0.105 0.066
V2_02_medium 0.041 0.024 0.092 0.102 0.103 0.058
MH_04_difficult 0.217 0.087 0.288 0.243 0.300 0.174

三、实验小结

由于水平精力所限并未对实验结果进行详细分析,初步小结如下:

1、在没有闭环情况下,VINS Mono 精度应该略低于 VIORB,而在有闭环情况下,二者精度差距并不大。

2、由于开源 VIORB 版本并非官方实现,与作者版本肯定有很多不同之处,因此没有办法测试真实官方 VIORB 的性能,但基本可以看出对于 ORB SLAM2 这一框架来说,IMU 的引入主要是在快速运动时能够减少一些丢失,而精度上与 VO 相近或略有下降;

3、以光流做为前端的 VINS Mono 比描述子作为前端的 VIORB 具有更好的鲁棒性,在快速运动时更不容易丢失。因此在类似于无人机这样的场景,VINS 应该是比 VIORB 更好的选择;而对于精度要求较高、场景更大而运动较慢的场景,VIORB 仍然更合适;

4、不论是否引入 IMU,双目对于精度和鲁棒性都会有一定的提升,但目前 VINS 并没有提供双目的版本,精力所限也没有进行实现,相信如有同学用双目改造下 VINS 会有不错的效果;

5、除前端差别较大外(比如光流与ORB、滑窗与局部地图),虽然都是预积分二者后端算法与实现亦有较大不同(李代数与四元数参数化不同、积分方式不同、g2o与ceres实现差别等),因此造成性能差异的原因很复杂,水平所限无法进行更深入分析。如有大神进行过研究,还望批评指教。

Posted in SLAM | 2 Comments

Tmux 虚拟终端使用

在我们进行深度学习训练时,经常需要好几天,这时肯定是不能随便关闭窗口就让会话挂了的。我们可以采用很多方法来让会话后台运行,同样 Tumx 也是一个很方便的会话后台运行工具,我们可以在 Tmux 中更好地实现类似的效果。

screenshot-from-2017-12-27-11-06-14

一、什么是Tmux?
Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话。不仅如此,你还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话。

二、安装 Tmux
在 Ubuntu 上安装使用如下命令:

在 Mac 上安装使用如下命令:

或者下载源码编译安装:https://tmux.github.io/

三、使用 Tmux
1、新建会话
执行如下命令:

2、管理会话
1)查看会话列表
执行如下命令:

2)恢复会话
执行如下命令:

3)关闭会话
执行如下命令:

4)关闭全部会话
执行如下命令:

四、常用快捷键
使用如下快捷键时先按组合键 Ctrl + b,再松开按如下按键即可。这里仅列出常用的一些快捷键:

功能 快捷键 备注
切换会话 s
帮助列表 ? 按 q 退出
创建新窗口 c
列出所有窗口 w 按 q 退出
上一窗口 p
下一窗口 n
切换窗口 l
查找窗口 f
关闭窗口 &
水平分割窗格
垂直分割窗格 %
切换窗格 方向键
关闭窗格 x

参考文献
[1] http://blog.jobbole.com/87584/
[2] https://gist.github.com/ryerh/14b7c24dfd623ef8edc7
[3] https://linux.cn/article-3952-1.html
[4] http://cenalulu.github.io/linux/tmux/

Posted in 其他工具 | Leave a comment

[ROS] 在 Ubuntu 16.04 系统上安装 ROS Kinetic

ROS 的发行版很多,之前的文章中我们介绍过在 Ubuntu 14.04 上安装 indigo
时光荏苒,Ubuntu 和 ROS 的长期支持版本都已经更新了,对于最新的 Ubuntu 16.04 通常情况下我们更多地使用其稳定版本 Kinetic。这篇文章就讲下 Kinetic 版本在 Ubuntu 下的安装。

0、安装环境:
Ubuntu 16.04 LTS

1、配置源:

使用 ROS 官方源:

使用国内镜像源:

设置Key:

PS:如果上述地址有问题,可以换成 hkp://pgp.mit.edu:80 或者 hkp://keyserver.ubuntu.com:80 重试。

更新安装包:

升级安装包(通常情况下不需要这一步):

2、安装 ROS:
推荐新手安装 Desktop-Full 版本,其他版本都有一些东西不全。安装命令如下:

或者直接点击:
点击这里

其他版本安装方式参见 [1]

3、初始化 rosdep:
使用以下命令初始化 rosdep:

4、环境配置:
为了方便每次系统重启时可以自动配置好 ros 相关环境,在 ~/.bashrc 文件末尾增加如下代码:

或者直接运行以下命令:

运行如下命令使配置生效:

这样以后每次重启都可以自动配置好环境了。

5、安装开发工具:
很多常见包都使用 rosinstall 等工具,使用如下命令安装:

到此安装结束,开始你的 ROS 之旅吧!

常见问题:
1、64位系统下:Some packages could not be installed. 错误
在很多64位机器上如果安装 ros-kinetic-desktop-full 会出现如下错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
ros-kinetic-desktop-full : Depends: ros-kinetic-desktop but it is not going to be installed
Depends: ros-kinetic-simulators but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

解决这一问题的方法一个是只安装核心库 ros-kinetic-desktop 或者可以尝试先卸载下面的组件:

2、错误:default sources list file already exists
在运行 sudo rosdep init 时可能出现如下错误:
ERROR: default sources list file already exists:
/etc/ros/rosdep/sources.list.d/20-default.list
Please delete if you wish to re-initialize

通常这是因为你之前曾经安装过 ROS 系统的某个版本,只需按照提示删除已经存在的初始化文件即可:

然后再重新运行 sudo rosdep init 就没有问题了。

3、错误:cannot download default sources list
在运行 sudo rosdep init 是可能出现如下错误:
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

有可能是没有安装证书库所致,可以尝试如下命令:

其实这个文件也比较简单,这一行所做的命令只是下载这个文件放到 /etc/ros/rosdep/sources.list.d/20-default.list 下面,因此你也可以自行保存下面的内容:

然后你可以运行:

参考文献:
[1] http://wiki.ros.org/kinetic/Installation/Ubuntu

Posted in ROS | Leave a comment

使用 evo 工具评测 VI ORB SLAM2 在 EuRoC 上的结果

screen-shot-2017-11-02-at-16-56-19
最近把 ORB SLAM2 作者融合 IMU 版本的算法 《Visual-Inertial Monocular SLAM with Map Reuse》 论文读了一遍,作者没有开放源代码,所以我是使用王京实现的一版开源代码(https://github.com/jingpang/LearnVIORB)进行了一些实验。LearnVIORB 代码有一些崩溃的 bug,在 Mac 上面编译有问题,不过实现了作者文中的基本思想,是非常好的一份实现。

由于只有 EuRoC 测试集有 VIO 的数据,我使用了 EuRoC 测试集进行测试,不过在实际运行中遇到了几个问题。

0、系统环境
macOS Sierra v10.12.6

1、evo 安装
以下 1) 或 2)任选一种方式即可:

1)使用 pip3 安装
执行如下命令:

2)使用源代码安装:
执行如下命令:

2、修改 System 保存 TUM 观测值
由于 ORB SLAM2 并没有提供单目相机或者 VIO 保存 EuRoC 形式数据的方式,这里我们仍然使用 SaveTrajectoryTUM 方法保存观测值。
不过需要注意的是,由于 SaveTrajectoryTUM 不允许保存单目相机数据,我们修改一下创建一个新的函数 SaveTrajectory 用来保存单目 VIO 数据。

1)在 System.h 中添加函数头:

2)在 System.cc 中添加函数体:

3、修改 VIO 测试代码 EuRoC 时间戳 (可选)
在我们运行时由于 EuRoC 时间戳超过了 int64 的位数,所以如果你不是 ROS 环境而是使用自己写的 main 函数来读取 imu 时间戳会有问题。
这里面我的处理方式是将时间戳的前五位舍弃,保留后面的内容,然后再乘以 \(1e-9\) 转换成以s为单位的数据。相关代码参考:

以及:

最后在 VIO 运行完毕后使用这一函数保存数据到 Data/EuRoC/CameraTrajectory.txt。

4、修改 EuRoC 真值的时间戳(可选)
如果你像我一样为了防止数据溢出范围做了步骤3中的操作,则你同样需要对 EuRoC 的真值进行相应的修改,我这里提供了一个简单的代码进行这一操作。
下载地址:convert_euroc_csv-py

代码如下:

然后只要运行这一转换脚本即可:

5、使用 evo 进行评估
按照步骤3 中操作,我们得到了运行的结果 Data/EuRoC/CameraTrajectory.txt,按照步骤4 中操作,我们得到了转换时间戳后的真值 Data/EuRoC/V1_01_easy/state_groundtruth_estimate0/data2.csv。

使用以下命令来运行 evo_ape 评估 Average Pose Error:

其中 evo_ape 是评估工具,euroc 表示后面输入参数是 euroc 的真值格式。我们输入的就是类似 TUM 的形式即可。
更详细的使用说明可以参见 evo 的官方说明:
https://github.com/MichaelGrupp/evo

运行后得到如下结果:
screen-shot-2017-11-02-at-16-44-28

并且生成了如下两幅图:
wechatimg431
wechatimg432

可以看出我们的 VIO 曲线拟合基本正确,但是最大误差大约在 0.3m 左右,平均误差 0.14m 左右。这一误差还是不小的,与作者论文中的结论还有一些差距,应该还需要一些细致的优化工作。

可能有同学会疑惑,EuRoC 数据集不是坐标系为 IMU/Body 坐标系嘛?为什么我们没有输入 \(T_{CB}\) 的标定参数呢?原来,在 evo 框架中,并不关心标定问题,它使用了 Umeyama 算法对两个轨迹做拟合,用拟合的结果来进行评估。

好了,evo 评估 VI ORB SLAM 的真值方法就到这里,总体感觉这一工具还是非常实用的,对于做 VSLAM 研究的人来说会有很大帮助。

参考文献:
https://michaelgrupp.github.io/evo/

Posted in SLAM | 1 Comment

[Git] Git 使用技巧整理

1、批量删除指定文件名的所有文件
可以执行如下文件,其中 ‘*.c’ 是要删除文件的通配符,请自行修改:

2、使用多个 SSH Key
1)生成一个公司用的SSH-Key
运行如下命令,使用默认设置:

在~/.ssh/目录会生成id-rsa和id-rsa.pub私钥和公钥。 我们将id-rsa.pub中的内容粘帖到公司gitlab服务器的SSH-key的配置中。

2)生成一个github用的SSH-Key
运行如下命令,注意这次保存到 ~/.ssh/github

在~/.ssh/目录会生成github-rsa和github-rsa.pub私钥和公钥。 我们将github-rsa.pub中的内容粘帖到github服务器的SSH-key的配置中。

3)添加私钥
运行如下命令:

如果执行ssh-add时提示”Could not open a connection to your authentication agent”,可以现执行命令:

然后再运行ssh-add命令。

# 可以通过 ssh-add -l 来确私钥列表

# 可以通过 ssh-add -D 来清空私钥列表

4)修改配置文件
在 ~/.ssh 目录下新建一个config文件

添加内容:

5)目录结构
screen-shot-2017-10-12-at-14-55-37

6)测试
运行如下命令:

输出
Hi skylook! You've successfully authenticated, but GitHub does not provide shell access.

就表示成功的连上github了.也可以试试链接公司的gitlab.

参考文献:
https://my.oschina.net/stefanzhlg/blog/529403

Posted in Git | Leave a comment

[Git] Git 使用常见问题

1、错误:Write failed: Broken pipe
有时在执行 pull 或者 push 操作时,会出现如下错误:
packet_write_wait: Connection to 192.30.255.113 port 22: Broken pipe
如果出现这一问题,请编辑 /etc/ssh/ssh_config 文件:

在文件中添加如下配置:

参考:
http://www.voidcn.com/article/p-bvmncksl-oe.html

2、错误:The remote end hung up unexpectedly
在执行 git clone 时如果出现如下错误:
Cloning into 'ORB_SLAM2'...
The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.112' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.

很可能是因为你没有加入本地的 publickey 到 Github 上面(使用客户端的朋友可能客户端会自动添加,不过命令行的不一定)。
操作步骤如下:
1)执行如下命令:

2)生成本地的publickey文件,然后拷贝文件内容到:
https://github.com/settings/keys
点击 [New SSH Key] 进行添加。

3)如果你不是使用默认的 ~/.ssh/id_rsa.pub 保存的话,需要如下操作将秘钥加入 ssh 端。例如你保存的文件是 skylook.pub 则运行如下命令:

注意这里是 skylook 而不是 skylook.pub。

如果此步骤运行提示如下错误:
WARNING: UNPROTECTED PRIVATE KEY FILE!
可以执行如下命令设置权限:

4)测试可用性:
执行如下命令:

如果看到:
Hi skylook! You've successfully authenticated, but GitHub does not provide shell access.
则表示添加成功了。

3、错误:pack-objects died of signal 13
如果此步骤运行提示如下错误:
Counting objects: 78431, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (60772/60772), done.
remote: fatal: pack exceeds maximum allowed size
fatal: The remote end hung up unexpectedly
error: pack-objects died of signal 13
error: failed to push some refs to 'git@github.com:skylook/QAR.git'

可以尝试如下命令加大 http.postBuffer 的值:

Posted in Git | Leave a comment

[Git] Git 仓库迁移

操作步骤
1) 从原地址克隆一份裸版本库,比如原本托管于 GitHub。

–bare 创建的克隆版本库都不包含工作区,直接就是版本库的内容,这样的版本库称为裸版本库。

2) 然后到新的 Git 服务器上创建一个新项目,比如 GitCafe。

3) 以镜像推送的方式上传代码到 GitCafe 服务器上。

— mirror 克隆出来的裸版本对上游版本库进行了注册,这样可以在裸版本库中使用git fetch命令和上游版本库进行持续同步。

4) 删除本地代码

5) 到新服务器 GitCafe 上找到 Clone 地址,直接 Clone 到本地就可以了。

这种方式可以保留原版本库中的所有内容。

附注:如果你已经有一个本地的版本库,只需进入版本库地址,然后运行步骤 3)即可。

常见错误
1、Error:Permission denied (publickey).
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

如果出现如下错误,并且确定在新的版本库地址有权限,可以将上面 git@gitcafe.com/username/newproject.git 换成 https://gitcafe.com/username/newproject.git 再试下。

参考文献
[1] 转载自:https://my.oschina.net/kind790/blog/510601

Posted in Git | Leave a comment

[Tensorflow] Mac OS 上 Tensorflow 1.0 安装(支持 CUDA)

maxresdefault

Tensorflow 深度学习工具包已经出 1.0 正式版了,本文就是介绍如何在 Mac 上如何安装 GPU 版本。

0、运行环境:
软件环境:
Mac OSX 10.12
Xcode 8.1
Python 3.5
CUDA Toolkit 8.0
cuDNN 5.1
Homebrew

硬件环境:
CPU:3.5 GHz Intel Core i7
Memory:16 GB 1600 MHz DDR3
GPU:NVIDIA GeForce GTX 775M 2048 MB
8882d66f-d8f5-4929-b309-b82411c70fa3

1、安装依赖:
1)安装 CUDA Driver 8.0.63:
请到如下地址安装最新版 CUDA Driver for Mac:
http://www.nvidia.com/object/mac-driver-archive.html

我这里安装的版本是 8.0.63。你也可以到我的网盘下载安装:
https://pan.baidu.com/s/1slliX3J

如果您已经安装,可以在 Apple -> System Preferences -> CUDA 选项里面点击按钮升级:
1e82c3d4-9777-4b5e-8c45-096906b17cfa

2)安装 CUDA Toolkit 8.0:
建议在线下载 dmg 安装包安装 CUDA Toolkit 8.0,下载地址如下(下载后需要更名为.dmg安装):
https://developer.nvidia.com/compute/cuda/8.0/Prod/local_installers/cuda_8.0.55_mac-dmg

或者到我的网盘下载:
https://pan.baidu.com/s/1geBBDuj

下载后双击安装,均使用默认配置即可。看到如下画面后表示安装成功:
screen-shot-2017-02-15-at-5-11-37-pm

配置 CUDA 环境,编辑 ~/.bash_profile 文件,在后面加入:

执行以下命令重启 bash_profile:

在以后打开的新建窗口中,这一环境变量都会生效。

PS:检查 CUDA 是否正常运行:
在安装好 CUDA Toolkit 和 Driver 以及 Samples 后,可以编译使用 CUDA 的 deviceQuery:

如果结尾显示:
Result = PASS

就表示安装成功了。

3)安装 cuDNN 5.1:
下载地址如下:
https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod_20161129/8.0/cudnn-8.0-osx-x64-v5.1-tgz

或者到我的网盘下载:
https://pan.baidu.com/s/1nuZfOTV

然后解压并进入该目录,执行如下操作:

4)安装 pip:
我们这里使用 Homebrew 作为安装工具

2、安装 Tensorflow:
首先添加环境变量,使用 GPU 版本请使用下面的源:

然后使用如下命令安装 Tensorflow:

在 Mac 上 Tenforflow 的安装路径为:
/usr/local/lib/python3.5/site-packages/tensorflow

3、测试安装:
1)运行命令进入 Python 3.5 环境:

2)执行如下测试脚本:

如果显示出:

则表示运行成功。

4、运行一个示例 Demo(MNIST):
进入 demo 源码目录:

执行 MNIST 用例:

正常情况下运行是很快的,并且会显示下面的内容表示 CUDA 成功跑起来了:
I tensorflow/core/common_runtime/gpu/gpu_device.cc:975] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 775M, pci bus id: 0000:01:00.0)
WARNING:tensorflow:From models/image/mnist/convolutional.py:289 in main.: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.
Instructions for updating:
Use tf.global_variables_initializer instead.
Initialized!

在误差收敛到一定程度后,训练过程结束。如果没有问题,则表示你已经成功地在 Mac 系统上跑起 tensorflow 的 GPU 版本了!

版本升级:
如果您已经安装了之前的 GPU 版本,想要升级到 1.0 正式版,可以运行如下命令:

常见问题:
1、错误:The directory or its parent directory is not owned by the current user
在安装 Virtualenv 的时候可能会遇到如下错误:
The directory '/Users/valiantliu/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
其原因是使用了 sudo 指令来进行 virtualenv 的安装。请使用如下指令安装 Virtualenv:

2、警告:You are using pip version 7.1.2, however version 8.1.2 is available.
在安装 pip 的时候可能出现如下错误:
You are using pip version 7.1.2, however version 8.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

只需按照提示升级 pip 组件即可,但需要注意此时可能需要 root 权限:

3、错误:Library not loaded: @rpath/libcudart.7.5.dylib
安装后在测试安装环节使用:

可能会遇到如下错误:
ImportError: dlopen(/Users/valiantliu/tensorflow/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so, 10): Library not loaded: @rpath/libcudart.7.5.dylib
Referenced from: /Users/valiantliu/tensorflow/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so
Reason: image not found

这通常是由于没有安装 CUDA 7.5 驱动所致。请参考安装依赖中3)和4)安装有关依赖。

4、错误:Segmentation fault: 11
安装后在测试安装环节使用:

可能会遇到如下错误:
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.dylib locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.dylib locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.dylib locally
Segmentation fault: 11

5、错误:CUDA driver version is insufficient for CUDA runtime version
在运行 deviceQuery 进行检测时可能出现如下错误:
Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

cudaGetDeviceCount returned 35
-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL

这种情况通常是因为系统的 CUDA 驱动太老了,请参考 安装依赖 中的步骤3)安装最新版本驱动即可。
安装后再次跑 deviceQuery 用例,可以得到类似如下结果,就表示成功支持 CUDA 了:
Starting...

CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GTX 775M"
CUDA Driver Version / Runtime Version 7.5 / 7.5
CUDA Capability Major/Minor version number: 3.0
Total amount of global memory: 2048 MBytes (2147024896 bytes)
( 7) Multiprocessors, (192) CUDA Cores/MP: 1344 CUDA Cores
GPU Max Clock rate: 797 MHz (0.80 GHz)
Memory Clock rate: 2500 Mhz
Memory Bus Width: 256-bit
L2 Cache Size: 524288 bytes
Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers
Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 49152 bytes
Total number of registers available per block: 65536
Warp size: 32
Maximum number of threads per multiprocessor: 2048
Maximum number of threads per block: 1024
Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535)
Maximum memory pitch: 2147483647 bytes
Texture alignment: 512 bytes
Concurrent copy and kernel execution: Yes with 2 copy engine(s)
Run time limit on kernels: Yes
Integrated GPU sharing Host Memory: No
Support host page-locked memory mapping: Yes
Alignment requirement for Surfaces: Yes
Device has ECC support: Disabled
Device supports Unified Addressing (UVA): Yes
Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0
Compute Mode:
< Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 7.5, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce GTX 775M
Result = PASS

6、错误:failed call to cuInit: CUDA_ERROR_NO_DEVICE
在运行 python 示例的时候可能出现如下错误,这通常是由于 cuda 驱动版本低导致的:
E tensorflow/stream_executor/cuda/cuda_driver.cc:509] failed call to cuInit: CUDA_ERROR_NO_DEVICE
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:158] retrieving CUDA diagnostic information for host: liuxiaos-iMac.local
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:165] hostname: liuxiaos-iMac.local
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:189] libcuda reported version is: Not found: was unable to find libcuda.so DSO loaded into this program
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:193] kernel reported version is: Invalid argument: expected %d.%d or %d.%d.%d form for driver version; got “”

解决方法是升级 CUDA Driver 驱动。

7、错误:AttributeError: ‘GFile’ object has no attribute ‘Size’
如果运行示例 models/image/mnist/convolutional.py 时出现如下错误:
Traceback (most recent call last):
File "models/image/mnist/convolutional.py", line 326, in
tf.app.run()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/tensorflow/python/platform/app.py", line 43, in run
sys.exit(main(sys.argv[:1] + flags_passthrough))
File "models/image/mnist/convolutional.py", line 132, in main
train_data_filename = maybe_download('train-images-idx3-ubyte.gz')
File "models/image/mnist/convolutional.py", line 72, in maybe_download
size = f.Size()
AttributeError: 'GFile' object has no attribute 'Size'

修改方法是编辑文件 models/image/mnist/convolutional.py
查找:

修改为:

8、错误:Couldn’t open CUDA library libcuda.1.dylib
如果出现如下错误:
Couldn't open CUDA library libcuda.1.dylib

这是由于 CUDA 默认安装的库名字和 tensorflow 加载的库名字不一样。我们可以运行如下命令进行链接:

9、错误:PermissionError: [Errno 13] Permission denied: ‘/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/external/__init__.py’

如果安装时遇到如下错误:
Exception:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/basecommand.py", line 215, in main
status = self.run(options, args)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/commands/install.py", line 342, in run
prefix=options.prefix_path,
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/req/req_set.py", line 784, in install
**kwargs
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/req/req_install.py", line 851, in install
self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/req/req_install.py", line 1064, in move_wheel_files
isolated=self.isolated,
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/wheel.py", line 377, in move_wheel_files
clobber(source, dest, False, fixer=fixer, filter=filter)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pip/wheel.py", line 323, in clobber
shutil.copyfile(srcfile, destfile)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/shutil.py", line 115, in copyfile
with open(dst, 'wb') as fdst:
PermissionError: [Errno 13] Permission denied: '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/external/__init__.py'

可以考虑使用如下命令安装:

参考文献:
[1] https://gist.github.com/myh1000/3fbb42928d94a083f6eaed28883ef659

[2] https://www.tensorflow.org/get_started/os_setup#mac_os_x_segmentation_fault_when_import_tensorflow

Posted in tensorflow | 1 Comment

[Git] 处理 github 不允许上传超过 100MB 文件的问题

screen-shot-2017-02-04-at-9-10-20-pm
最近在使用 Github 时候遇到一个问题,有一些过大的文件不允许上传,例如:
remote: error: File Examples/iOSDemo/Pods/dependency/libg2o.a is 440.12 MB; this exceeds GitHub's file size limit of 100.00 MB

但有的时候我们还是需要上传这些大文件,这时候怎样做呢?

1、移除错误缓存
首先应该移除所有错误的 cache,对于文件:

对于文件夹:

例如对于我的例子就是这样的:

2、重新提交:
编辑最后提交信息:

修改 log 信息后保存返回。

重新提交:

3、将大文件加入 Git Large File Storage:
1)首先安装 git-lfs

2)将想要保存的大文件 “路径” 或者 “类型” 添加进 track:

例如对于我的例子就是这样的:

* 需要注意的是这里面仅能添加类型的扩展名或者文件名作为跟踪方式,不可以添加路径或者目录进行跟踪。

4、将想要保存的大文件正常添加进 git:

或者:

例如对于我的例子就是这样的:

5、正常进行提交&推送:

补充技巧:
提交以后出错再进行上面的步骤可能比较麻烦,如果你已知自己提交的版本库中确实存在一些大于 100MB 的文件,不妨先搜索:

然后将这些文件移除,等待其他文件提交完后再复制回来,这样只需要从步骤3的操作开始就可以了。

常见问题:
1、错误:fatal error: unexpected signal during runtime execution
goroutine 23 [chan receive]:
github.com/github/git-lfs/lfs.ScanRefsToChan.func2(0xc8200d4540, 0xc8200c6000, 0xc8200d45a0)
/Users/rick/go/src/github.com/github/git-lfs/lfs/scanner.go:153 +0x4e
created by github.com/github/git-lfs/lfs.ScanRefsToChan
/Users/rick/go/src/github.com/github/git-lfs/lfs/scanner.go:160 +0x30c

出现这个问题通常是由于 go 引擎未安装或者版本太老(1.5.1及以下版本在 Mac 上面有未知错误),或者 git-lfs 版本太老。如果没有安装 go,可使用如下命令安装:

然后使用如下命令升级:

然后使用如下命令查看:

我这里的版本号如下,如果你比我的版本高就对了,否则可以尝试卸载之前安装的 go 和 git-lfs 重新安装:
git-lfs/1.5.5 (GitHub; darwin amd64; go 1.7.4)

参考文献:
[1] https://help.github.com/enterprise/11.10.340/user/articles/working-with-large-files/
[2] https://git-lfs.github.com/

Posted in Git | Leave a comment
Optimization WordPress Plugins & Solutions by W3 EDGE