Deep Coding


  • 关于

  • 标签

  • 日志

  • 首页

论文笔记:《Mask R-CNN》

发表于 2018-05-02 |

背景

Mask R-CNN是基于Faster R-CNN网络打造的,从下面的图就可以直观看出他们的区别
1、首先蓝框中为Faster R-CNN中的全连接网络;
2、左边[7, 7]的conv模块为ROI Pooling/Align的结果;
3、右边[7, 7]的conv模块为新增的用于训练Mask分支的全卷积网络FCN(这里是pixel to pixel的映射,所以需要用到FCN)

图片名称

ROI Align

借用网上的一张图,Faster R-CNN中会造成两次量化误差,一次是RPN网络产生Region Proposal时,对ground bounding box的量化,另外一次是Pooling到[7, 7]的feature map时的量化,均是因为像素没有浮点数,强行四舍五入造成的。图片名称 但是由于feature map大小是原图的1/32,半个像素误差就会导致原图16个像素的差别,这在绘制Mask这种Pixel量级的任务时,会造成很大的误差。
图片名称如上图所示,作者在Mask R-CNN中对RPN、Pooling层都保留浮点数值,并且对Pooling后map中的每个像素点,分别采用双线性插值,本质就是在X/Y两个方向做线性插值(算法解析),来计算4个虚拟点的像素值。之后再进行max/average pooling,池化后的结果即为最终pooling后map的像素值。

Ref:

📎:详解 ROI Align 的基本原理和实现细节
📎:目标检测:Mask R-CNN 论文阅读
📎:Mask RCNN-论文简记

C++连接SQL Server数据库入门

发表于 2018-04-28 |

概述

客户端(网络或C++终端等)管理器通过一系列知名的API(ODBC, OLE-DB, ADO…)提供的不同方式来访问数据库。
Tips1:表现出来的就是同一个数据库,C++中初始化这些API时,方式稍有不同(下面会有代码),但整体的调用方式,sql语句执行方式都是相同的。
Tips2:另外,不论是access、mysql、sql server,都可以通过同一套API进行访问,以统一的方式处理所有的数据库。

组成

API:(ODBC, OLE-DB, ADO…)
驱动程序: 是一些DLL,提供了API和数据库之间的接口。
数据源: 包含了数据库位置和数据库类型等信息,实际上是一种数据连接的抽象。

数据库系统和文件系统的关系

数据库的数据是结构化的,有联系的;而文件系统各记录无联系
关系型数据库(相对于文件系统,是各个分散独立无关系的。但数据表中A项目设置N个属性,便建立了多种关系)
图片名称

ODBC、ADO、DSN关系是什么?

DSN(Data Source Name): 为ODBC定义了一个确定的数据库和必须用到的ODBC驱动程序(换句话说要ODBC就必须要建立DSN)
ODBC API: 访问技术只适用于windows系统,因为需要在ODBC驱动程序管理器中进行数据源注册
ADO API: 具有跨系统平台特性,移植性好,无需手动设置DSN连接

手动建立数据库及数据表

  • 下载安装SQL Server 2016并启动服务(启动方式见【启动】)
  • 找到Managemant studio,点击到SQL Server登陆界面,设置user id:sa,pass word:xxxxxx
  • 右键【数据库】,添加一个名为【track】的数据库
  • 右键【track】,添加一张名为【photos】的数据表(会自动带前缀dbo)(如果新表未显示,刷新数据库即可)
  • 右键【photos】,点击【表】,弹出【列名】、【数据类型】设置窗口,设置两个列属性”path”、”features”,数据类型均为”int”
  • 右键【photos】,点击【编辑前200行】,可手动增删数据表中的数据,在此我们添加1行数据,path值:888;features值:111。

设计好的数据库界面如图所示
图片名称

C++连接SQL

首先建立一个win32应用程序,在#include "stdafx.h"
头文件中加入DLL文件,如下:

1
2
#include <windows.h> // cerr头文件
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

data.cpp文件如下,注释都在代码中。此处采用OLE-DB连接,与ADO一样,具有较强的可移植性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
_ConnectionPtr m_pConnection;
_CommandPtr m_pCommand;
_RecordsetPtr m_pRecodeset;

HRESULT hr = CoInitialize(NULL); //初始化COM
hr = m_pConnection.CreateInstance("ADODB.Connection"); // 建立数据库连接
if (FAILED(hr))
cout << "Init failed!" << endl;
try
{
_bstr_t strConnect = "Provider=SQLOLEDB.1;Persist Security Info=True;Initial Catalog = track; Data Source = 192.168.1.190; User ID = sa; PassWord = 123456;";
//Data Source为主机IP地址,若为access数据库,则为数据库文件名:"xxx.mdb"
//Initial Catalog:数据库名
//User ID:用户名
//PassWord:用户密码

hr = m_pConnection->Open(strConnect, "", "", adModeUnknown);
if (FAILED(hr))
cout << "Open failed!" << endl;
}
catch (_com_error e){
//MessageBox(e.Description(), "warning");
cerr << "ERROR:" << (char*)e.Description();
}
_bstr_t bstrSQL;
bstrSQL = "update photos set path = 555 where features = 111"; // SQL语句,修改features属性中value == 111的path值。
m_pConnection->Execute(bstrSQL, NULL, adCmdText); // 执行SQL语句

return 0;

}

ODBC连接上面写到过只能在win平台,且需要手动建立DSN连接。DSN建立连接方式如下:

  • 【控制面板】——【管理工具】——【ODBC数据源】根据你的电脑选择32、64位
  • 接着在【用户DSN、系统DSN】中均要添加相应的数据源,【添加方式】

接下来仅修改data.cpp文件中connection处的代码即可

1
2
3
4
5
6
7
8
string strConnection = "dsn=";
strConnection += "sql";
strConnection += ";uid=";
strConnection += "sa";
strConnection += ";pwd=";
strConnection += "123456";
strConnection += ";";
hr = m_pConnection->Open(strConnection.c_str(),"","",adModeUnknown);

Ref:
📎:数据库原理分析
📎:C++与SQL Server2008连接及配置
📎:用数据源(ODBC)创建数据库连接DSN设置

Deeplearning.ai课程备忘录(一)

发表于 2018-04-15 |

背景

工作后很少有时间进行理论知识的充电,抽出晚上的时间,再把吴恩达前辈的Deeplearning.ai课程过一遍,重在记录之前掌握不牢靠及容易忽视的知识点。

神经网络和深度学习

课程的第一讲,从经典的线性回归、逻辑回归、激活函数、损失函数、梯度下降几个方面,引出了神经网络知识,以下:

浅层神经网络

1、NN(neural networks)类似于多层逻辑回归网络,不断执行wx+b、激活、wa+b、激活….到loss function的计算
一张图代表逻辑回归和神经元
图片名称
2、论文中一般说的两层神经网络,为input、hidden、output形式,默认input为0层。
3、对于一个样本:wx+b的循环转矩阵的快速运算,[4,3]乘[3,1]加[4,1] 等于4,1。
图片名称
而对于batch个样本(此处假设有3个样本),即是把样本特征横向堆叠即可,即:[4,3]乘[3,3]加[4,3] 等于[4,3],如图示:
图片名称
4、激活函数
sigmoid:最常用的二分类函数,表达式如下,导数为$g(z)(1-g(z))$,所以最大值为0.25
$$g(z)=\frac{1}{1+e^{-z}}$$
tanh:表达式如下,相当于将sigmoid函数平移,然后进行纵向拉伸(-1,1),除 了最后一层二分类使用sigmoid,中间的hidden layer极力推荐tanh取代它。但这两个函数在Z很大或者很小时,都会发生梯度消失,导数趋近于0。tanh的导数为$(1-g(z)^{2})$
$$g(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}$$
Relu:表达式为:$a = max(0,z)$,相对来说不容易梯度消失,Z>0时,导数为1,Z<0时,导数为0。Z=0时不可导,我们指定它为0或1就好了(实际Z=0的概率非常低)。三者中目前较常用的函数是Relu,对于拥有大量节点的神经网络来说,总会有很多Z>0的神经元,梯度下降速度还是比较可观的。
 
leaker Relu:表达式为:$a = max(0.01\ast z,z)$,此处的0.01是个参数,你可以改成其它值进行尝试,说到底就是梯度下降速度的问题(太大了可能扯着蛋…)
5、神经网络权重(w)不能初始化为全0,因为这样导致每个神经元对输出的贡献是一样的,所以反向传播后神经元修正也一样。换句话说每个隐藏单元都在计算一样的函数,没有什么意义。
python:$ w = np.random.randn((2,2))0.01,如前所示,浅层神经网络用接近0的一个高斯分布随机值初始化。深层NN吴恩达老师卖了个关子,且听下次分解吧

改善深层神经网络

主要解决神经网络超参数优化原因及方法

正则化缓解过拟合

L2正则化(有时也称weight decay):$J_{new} = J + \frac{\lambda}{2m}\left | w \right |^{2}$,其中$\left | w\right |^{2} = \sum_{j=1}^{n}w_{j}^{2} = w^{T}w$。或者如下公式(m:样本数量,n:权重w数量),可以看到lambda足够大时,会使得权重矩阵w很小,大致想象,再深的网络都可以化为逻辑回归的样式。
$$min_{\theta } \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta }(x^{i})-y^{i})^{2}+\lambda \sum_{j=1}^{n}\theta_{j}^{2}$$
换种较理性的方式来解说是:假如激活函数采用tanh,lambda越大,w越小,$g(z)=wx+b$越小,激活函数此时位于斜率$k=1$的线性段(相对来说比较线性的区间),线性激活函数是拟合不出复杂的边界的。

Dropout正则化

反向随机失活推导

其它缓解过拟合的方法

数据扩充(左右对称、随机裁剪放大、旋转一定角度、扭曲),early stoping

CMakeLists入门

发表于 2018-04-11 |

背景

最近在编写各个C++项目时,经常用到CMakeLists.txt,今天花了半天时间进行了初步学习,现有一个test工程目录,内部的src及工程文件夹下各有一个cpp文件如图示。
 
example
├── build
├── CMakeLists.txt
├── include
│ └── Detection.h
├── libs
├── main.cpp
└── src
├── CMakeLists.txt
└── Detection.cpp

直接编写CMakeLists.txt,注释已经比较清楚了如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
cmake_minimum_required(VERSION 2.8.12)

project(examples)

# find_package()该指令会从8个系统路径查找包,但事先指定CMAKE_PREFIX_PATH(优先级最高的查找路径),再去找包,保证可以万无一失,就跟在ccmake中指定一样的道理。

list(APPEND CMAKE_PREFIX_PATH "/usr/local/Cellar/opencv/3.4.1_2")
find_package(OpenCV)


# message("OpenCV_INCLUDE_DIRS is : ${OpenCV_INCLUDE_DIRS}")
# message("OpenCV_LIBRARIES is ${OpenCV_LIBS}")

# PROJECT_SOURCE_DIR 跟 CMakeLists.txt文件位置保持一致
# message("SOURCE_DIR is ${PROJECT_SOURCE_DIR}")
# message("BINARY_DIR is ${PROJECT_BINARY_DIR}")

aux_source_directory(. SRC_LIST) # 当前目录下的所有源文件
message("${SRC_LIST}")

# where to find Headers
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${OpenCV_INCLUDE_DIRS})

# set 显示的指定变量,把多个cpp文件指定到src_files中
set(src_files
main.cpp
)

# 将src子目录加入工程,并指定编译输出路径为bin 目录。如果不指定bin目录,编译结果都将存放在build/src目录,通过这种方式生成的静态库不需要再link_directories。

# src目录有自己的CMakelists,指导其编译

ADD_SUBDIRECTORY(src bin)

# 或者先编译src,将生成的静态库放入libs目录,再通过下式link即可
# link_directories(${PROJECT_SOURCE_DIR}/libs)

# pack objects to static library
add_library(main STATIC ${src_files})

add_executable(demo main.cpp)

target_link_libraries(demo ${OpenCV_LIBS} detect)

# ps:
# 1,变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
# 2,指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号分开,风格统一即可
# 3,指令是大小写无关的,参数和变量是大小写相关的。

src文件夹下的CPP也需要一个CMakeLists.txt进行编译,它的内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake_minimum_required(VERSION 2.8.12)

project(detect) # 如果此处未重新定义project,那么${PROJECT_SOURCE_DIR}指的是上一级cmake所指的目录

include_directories(${PROJECT_SOURCE_DIR}/../include)

set(src_files
Detection.cpp
)

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../libs) # 注意这里变量名后加'/'

add_library(detect STATIC ${src_files})

一点顿悟

笔者本身做算法研发的,最近接触了一些SDK编写方面的任务,调试CMakeLists的动态、静态库时,突然就想明白了二者的区别。
 
在打包成exe时,静态库会和代码一起打包,这样给到其他用户时基本下载即可使用,无需下载opencv等“乱七八糟”的东西。而动态库则不行,动态库的exe并没有将其打包,只是留了动态库的借口。换句话说,用户使用你的demo时,一定要指到对应的第三库上。比如opencv3.4.1,要么他自己安装一份,要么你把用到的opencv打包一起传给他使用。
 
那他们的优缺点是什么呢?静态库虽然使用方便,但每个demo都需要一份独有的库(因为已经被打包到一起了),这样就会造成一定的空间浪费。而动态库,英文也叫”share lib”,每个demo可以共享同一份动态库,需要时调用对应的库便可以。对于Mac中,动态库的路径是绝对路径,给笔者最初的调试也造成了很大的困扰。而Linux中,动态库使用相对路径,只要指到对应的库就好。

Eg:

  • 本机:/home/wuxj/opencv/lib/libxxx.so
  • 其他用户:/home/zhaorui/opencv/lib/libxxx.so
  • Linux系统,libxxx.so吻合就ok;而Mac必须动态库路径才行,显然这样的指向,Mac就Error了

Linux中常用动态库的方法是指定库搜索路径,export LD_LIBRARY_PATH=<Path_to_libs>:$LD_LIBRARY_PATH
 
另外需要注意在CMakelists中带版本的动态库,需要指向其不带版本的软连接,因为ld查找时就是基于规则libxxxxx.so的查找。而cmake生成带版本的动态库时,会自动生成其相应软连接。

dlib(C++)人脸关键点检测 for Linux/Mac

发表于 2018-04-11 |

背景

上一篇章讲解了Seetaface在Mac端的编译与demo,但Seetaface关键点检测(facial landmark detection)只包含5个关键点,用于人脸姿态矫正完全没问题,但用于美颜、加挂件等场合,则无法施展拳脚。
 
笔者尝试了编译dlib C++ Library,这是一个开源的C++图像处理、机器学习库,可以作为opencv的一个良好补充,采用Seetaface Detect模块,检测人脸区域,接着将该区域(Rect)输入dlib的关键点检测模型,可以快速实现人脸68个关键点检测。
硬件环境:Intel(R) Core(TM) i5 @ 2.70GHz(mac),单张图片单个人脸,两兄弟默契配合,检测时间如下所示:

  • Seeta_人脸检测耗时:0.1840 秒
  • dlib_人脸关键点检测耗时:0.0023 秒

检测效果如图(原图来源于网络,侵删):
图片名称

dlib的依赖

dlib安装需要的依赖有openblas,opencv。可以直接使用brew安装。

1
2
brew install openblas
brew install opencv

X11是执行Unix程序的图形窗口环境。Mac OS X本身的程序是Aqua界面的,但是为了能够兼容unix和linux移植过来的程序(Mac OS X由BSD-UNIX修改而来),比如MatLab,就需要x11窗口环境。
 
运行dlib需要X11,但Mac目前没有自带X11,需要重新下载安装,下载地址
下载后直接安装,默认安装目录为/opt/X11,需要在/usr/loca/opt目录下创建软连接(最好使用绝对地址),创建命令如下,创建后重启Mac。

1
2
cd /usr/local/opt
ln -s /opt/X11 X11

编译dlib

1
2
3
4
5
6
7
git clone https://github.com/davisking/dlib.git  # 下载dlib
cd dlib/examples
mkdir build
cd build

cmake .. -DUSE_SSE4_INSTRUCTIONS=ON 进行配置
cmake --build . --config Release(此处都是demo,没必要全部进行build,需要用到那些build一下就好了)

运行一个build好的demo

1
2
3
cd dlib/examples/build/
wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 #下载face landmark模型,并解压文件
./webcam_face_pose_ex

至此,会出现X11窗口,打开Mac摄像头自动检测人脸并标注人脸的landmar。

dlib::Rect 与 opencv::Rect转换

dlib、opencv Rect结构体参数是不同的,所以需要进行一下转换

1
2
3
4
5
// cv 转 dlib
dlib::rectangle dlibrect;
dlibrect = dlib::rectangle((long)face_rect.tl().x, (long)face_rect.tl().y, (long)face_rect.br().x - 1, (long)face_rect.br().y - 1);
// dlib 转 cv,分别为左上、右下[x,y]坐标
faces[i].left(), faces[i].top(), faces[i].right()+1, faces[i].bottom()

dlib加载图像的两种方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array2d<rgb_pixel> cimg;  //dlib方式读取图像(从图像路径)
load_image(cimg, srcImagePath);
std::vector<full_object_detection> shapes;

array2d<bgr_pixel> cimg(gallery_img_color.rows, gallery_img_color.cols); //dlib方式读取图像(从cv::MAT)
for(int i=0; i < gallery_img_color.rows; i++)
{
for(int j=0; j < gallery_img_color.cols; j++)
{
cimg[i][j].blue = gallery_img_color.at< cv::Vec3b>(i,j)[0];
cimg[i][j].green= gallery_img_color.at< cv::Vec3b>(i,j)[1];
cimg[i][j].red = gallery_img_color.at< cv::Vec3b>(i,j)[2];
}
}

Ref:
📎:Mac下dlib安装

Seetaface 人脸识别 for Linux/Mac

发表于 2018-03-29 |

最近做人脸检测的项目,需要用到中科院山世光老师团队开源的SeetaFace,在Ubuntu、Mac端分别进行了编译,系统信息如下:

Ubuntu:16.04 opencv:3.1.0 cmake:3.5.1
MacOS:10.13 opencv:3.4.3 cmake:3.0.2

FaceDetection 模块

1
2
3
4
5
cd ~/<user name>/SeetaFaceEngine/FaceDetection
mkdir build
cd build
cmake ..
make -j8

不出意外即可在build目录下生成可执行文件facedet_test,调用方式./facedet_test image_path ../model/seeta_fd_frontal_v1.0.bin,结果如图示
图片名称
PS:
1、编译阶段若提示opencv版本问题
ccmake .. 修改其中OpenCV_DIR路径为自己的opencv安装目录,configuration使之生效
Eg:OpenCV_DIR /home//opencv-3.1.0/build
接着设置CUDA_USE_STATIC_CUDA_RUNTIME OFF
重新cmake ..,不报错再继续make。

FaceAlignment 模块

该模块依赖FaceDetection,先检测图像中哪个区域存在人脸,之后进行关键点检测,所以先复制FaceDetection模块中的相关头文件、依赖、模型到FaceAlignment/build目录中,具体如下:

1
2
3
4
5
6
cd ~/<user name>/SeetaFaceEngine/FaceAlignment
mkdir build
cd build
cp ../../FaceDetection/include/face_detection.h ../include
cp ../../FaceDetection/build/libseeta_facedet_lib.so ./
cp ../../FaceDetection/model/seeta_fd_frontal_v1.0.bin ./

接着修改face_alignment_test.cpp中,FaceDetection model路径

1
2
// Initialize face detection model
seeta::FaceDetection detector("./build/seeta_fd_frontal_v1.0.bin");

接着编译

1
2
cmake ..
make -j8

之后运行下./build/fa_test,生成如图示的关键点检测图片(注意.cpp文件中定义了仅能检测一张人脸)
图片名称
PS:
1、编译阶段若提示‘isnan’ was not declared in this scope,定位到源文件,修改为std::isnan便可以了。
2、运行阶段提示Segmentation fault (core dumped),应该是模型或图片路径不对,对于Linux或mac,cpp文件中指定的路径应当是相对于CMakelists.txt的路径

FaceIdentification 模块

类似的步骤如上,把FaceDetection、FaceAlignment模块的相关依赖拷贝进入build文件夹。

1
2
3
4
5
6
7
8
9
cd ~/<user name>/SeetaFaceEngine/FaceAlignment
mkdir build
cd build
cp ../../FaceDetection/include/face_detection.h ../include
cp ../../FaceDetection/build/libseeta_facedet_lib.so ./
cp ../../FaceDetection/model/seeta_fd_frontal_v1.0.bin ./
cp ../../FaceAlignment/include/face_alignment.h ../include
cp ../../FaceAlignment/build/libseeta_fa_lib.so ./
cp ../../FaceAlignment/model/seeta_fa_v1.1.bin ./

解压FaceIdentification/model中的两个文件(解压part1,会自动将part2解压),同样修改./src/test目录的两个CPP文件中,前两个model的路径,同上。
 
再修改/test下的两个cpp文件,加上opencv2头文件,注意这里头文件顺序需要放在cvLIB宏定义之后,如下:

1
2
3
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

接着编译

1
2
cmake ..
make -j8

之后运行./build/src/test/test_face_recognizer.bin,测试3个模块。./build/src/test/test_face_verification.bin测试存取的样本中图片的相似度即可。
PS:
1、编译到99%时报错,提示没有相关的库,需要改写/src/test中的Cmakelists.txt,在其中添加Detect、Align模块的lib库(也就是在当前build文件夹下查找),如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
aux_source_directory (. SRC_LIST)
link_directories(${PROJECT_BINARY_DIR}) # 添加lib库搜索路径
message(${SRC_LIST})
# add external libraries
find_package(OpenCV REQUIRED)
include_directories(${seeta_facedet_lib_INCLUDE_DIRS} ${seeta_fa_lib_INCLUDE_DIRS})
list(APPEND seeta_fi_lib_required_libs ${OpenCV_LIBS} seeta_facedet_lib seeta_fa_lib)
enable_testing ()
foreach (f ${SRC_LIST})
string(REGEX REPLACE "[.]cpp" ".bin" BIN ${f})
add_executable(${BIN} ${f})
#target_link_libraries(${BIN} viplnet ${OpenCV_LIBS} seeta_facede_lib seeta_fa_lib)
target_link_libraries(${BIN} viplnet ${seeta_fi_lib_required_libs}) # 添加lib
endforeach ()

Mac编译

与Linux相比,Mac的就非常简单了,需要注意Detection模块中,CMakelists.txt要求的cmake为3.1及以上,笔者是3.0,所以在这里对CMakelists.txt做简单修改,如果是Brew安装的opencv,那其他的ccmake配置也不用修改
 
之后的操作步骤与Linux描述的基本一致,编译过程中可能会有很多warning,不用管,直接make即可。

Ubuntu1604装机系列(五):认识Ubuntu系统目录

发表于 2018-03-27 |

背景

装拆了十几遍ubuntu1604系统、opencv3.1/3.4、cuda8/9后,开始慢慢领悟到ubuntu系统文件即一切的魅力。
 
usr: 并不是user的意思,而是unix system resrouces,所以上述文件夹都是系统目录,跟服务器中的某个单独用户没什么”私人关系”,直白点说,所有用户都可以访问。
bin: 指代binary,二进制/可执行程序的存储目录,直白点说,这里的文件都可以在terminal中直接输入进行访问


/bin: 存储ubuntu很底层的可执行文件,你用到的cp, ls, mv等基本指令都在这里。
/usr/bin:存储系统级的可执行文件,以及apt-get安装的文件。

1
2
3
4
5
6
7
8
9
10
11
cd /usr/bin
ls | grep python # 系统自带python
python
python3
...

ls | grep ssh # 笔者apt-get安装的ssh、tmux软件
ssh

ls | grep tmux
tmux

/usr/local/:很多人都说用户自己编译的安装目录就在这里,比如opencv、比如cuda。这种方式一般是通过sudo安装。但刚刚说了这些系统目录所有用户都可以访问,所以当A用户装了cuda8,B用户装了cuda9,A用户装了opencv2,B用户装了opencv3…这样就会造成local目录极其混乱。
 
所以建议在安装cuda、opencv时,在安装选项/cmake中指定安装目录到一可见文件夹,比如/home/cuda/,/home/Matlab,这样即使安装出错,删除整个cuda或Matlab文件夹就行了。就没必要非得安装在/usr/local目录。
 
/usr/local/bin:存储用户级的可执行文件。还是拿matlab来说,可以将/home/Matlab下的bin文件建立软连接到这里,这样系统就可以搜索到了,在终端直接开启matlab。

1
sudo ln -s /home/Matlab/r2017b/bin/matlab /usr/local/bin/matlab

小结:
/usr/...下的文件,所有用户都可以访问
bin/、/usr/bin、/usr/local/bin,只要在bin目录下的,都可以在terminal中直接访问。关系为层层递进,以上面的matlab来说,你确实也可以将软连接放到前面两个目录。但它没有cp、mv这些指令底层,也没有python这些工具,是每个用户的通用工具。所以放到最上层的local 目录即可。

Ubuntu1604装机系列(四):cuda8/cuda9及对应版本的cudnn安装

发表于 2018-03-27 |

背景

笔者事先在ubuntu上安装了cuda9.0,然而在编译opencv3.1时候,发生了版本不匹配的冲突。遂又安装了cuda8.0,但二者极其cudnn的安装,如出一辙,在这里记录下安装过程。

cuda下载及安装

NVIDIA官网下载cuda8.0的安装run文件
注意安装时候不要sudo安装,同样的原因,若安装出错,可能难以卸载干净。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
./cuda_8.0.61_375.26_linux-run 注意不要更新显卡驱动,更改安装及链接库路径到个人指定目录下

Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n

Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]: /home/tucodec/wuxj/cuda-9.0

Do you want to install a symbolic link at /usr/local/cuda?
(y)es/(n)o/(q)uit: n

Install the CUDA 8.0 Samples?
(y)es/(n)o/(q)uit: y

Enter CUDA Samples Location
[ default is /home/tucodec ]: /home/tucodec/wuxj/cuda-8.0

安装完成后需要在系统内写入bin及lib搜索路径,以笔者的安装路径为例

1
2
3
vi ~/.bashrc
export PATH=$PATH:/home/<user name>/wuxj/cuda-8.0/bin:/home/<user name>/wuxj/cuda-9.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/<user name>/wuxj/cuda-8.0/lib64:/home/<user name>/wuxj/cuda-9.0/lib64

其中PATH为bin可执行程序路径,一般添加安装软件的terminal快速启动,LD_LIBRARY_PATH为依赖库的路径。
另外笔者同时安装了cuda8.0/cuda9.0,系统路径中哪个在前即可先被访问调用。而在cmake中会更加灵活,直接指定cuda安装目录便可以正确调用。

cudnn下载及安装

NVIDIA官网下载cudnn压缩文件(需先注册)。cudnn其实无需安装, 解压后即可看到里面是include头文件夹,及NVIDIA事先编译好的lib库。所以我们只需要将其复制到cuda对应目录即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd cudnn6

cp include/* ../../cuda-8.0/include/ # 复制到你cuda安装目录的对应文件夹

cp lib64/* ../../cuda-8.0/lib64/

cd ../../cuda-8.0/lib64/

sudo rm libcudnn.so

sudo rm libcudnn.so.6

sudo ln -sf libcudnn.so.6.0.21 libcudnn.so.6

sudo ln -sf libcudnn.so.6 libcudnn.so

兼容 cuda-8.0 和 cuda-9.0

1
2
3
4
5
6
7
8
9
10
function activate_cuda_80() {
echo "切换至 cuda-8.0 环境"
export PATH=/home/tucoder/Documents/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/home/tucoder/Documents/cuda-8.0/lib64:$LD_LIBRARY_PATH
}
function activate_cuda_90() {
echo "切换至 cuda-9.0 环境"
export PATH=/home/tucoder/Documents/cuda-9.0/bin:$PATH
export LD_LIBRARY_PATH=/home/tucoder/Documents/cuda-9.0/lib64:$LD_LIBRARY_PATH
}

安装成功

一些体会:Linux系统完美诠释了文件即一切,所有安装内容都暴露在外部,所有想删除的东西一键删除安装文件夹即可,强烈不推荐sudo安装。
pip可以用sudo安装,因为pip安装的软件很容易卸载
pip的安装目录:/usr/local/lib/python3.5/dist-packages/ /usr/local/lib/python3.5/dist-packages/,pip安的软件可以到该目录查看是否被安装好

Ubuntu1604装机系列(三):Matlab2017b安装

发表于 2018-03-27 |

下载

Matlab下载链接 密码: ckw4
解压后得到xxx_dvd1.iso、xxx_dvd2.iso、crack破解文件

挂载镜像文件dvd1

1
2
mkdir /home/<user name>/Matlab 
sudo mount -t auto -o loop /home/<user name>/xxx_dvd1.iso /home/<user name>/Matlab

安装

1
2
cd 
sudo ./Matlab/install

Tips

在弹出的安装对话框中,选择离线安装,并填入license number,复制crack解压后出现的readme.txt文件中的第一个安装密钥即可
 
安装路径默认是系统目录,改为/home/<user name>/matlab/r2017b,这样的好处是遵循了Linux处处是文件的思想,方便每个用户的版本管理,同时若安装失败直接删除该/matlab/r2017b文件夹即可。
 
安装选项中,笔者首先选择了全部安装,但symbolic_doc_en_common模块一直提示安装出错,无奈去掉了该模块的对勾,从目前跑的几个模型来看,该模块并无影响。

挂载镜像文件dvd2

安装到一半多,会提示载入dvd2,这时候重启一个终端,用相同的方式载入,点击ok直到安装结束即可

1
2
cd 
sudo mount -t auto -o loop /home/<user name>/xxx_dvd2.iso /home/<user name>/Matlab

结束安装

删除不用的文件夹及卸载盘符

1
2
sudo rm -r /home/<user name>/Matlab  
sudo umount /home/<user name>/Matlab

破解

1
2
3
4
cd crack绝对路径
sudo mkdir /home/<user name>/matlab/r2017b/bin/licenses/
sudo cp license_standalone.lic /home/<user name>/matlab/r2017b/bin/licenses/
sudo cp libmwservices.so /home/<user name>/matlab/r2017b/bin/glnxa64/

启动matlab

1
2
cd /home/<user name>/matlab/r2017b/bin
sudo ./matlab

第一次打开matlab会再次提示输入破解密钥,在对话框窗口中填入crack目录下的license_standalone.lic绝对路径即可。

添加Matlab到系统路径

这里注意一点:路径如果写到/etc/profile,那么会影响到该服务器的所有用户。所以我们在~/.bashrc中进行配置即可

1
export PATH=$PATH:/home/<user name>/Matlab/r2017b/bin

笔者尝试第一种解决方案失败,遂采用了下一种,建立软连接到系统启动目录(注意建立软连接一定要使用绝对路径)

1
sudo ln -s /home/<user name>/Matlab/r2017b/bin/matlab /usr/local/bin/matlab

可能的问题

/usr/local/MATLAB/R2017b/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: version GLIBCXX_3.4.21 not found,运行matlab时出现这样的错误提示是matlab g++版本libstdc++.so.6.0.20版本较低,复制高版本的lib,设置新的软连接即可

1
2
3
4
5
loacte  libstdc++.so.6.0.21 # 查看高版本lib路径
cd ~/<user name>/matlab/r2017b/sys/os/glnxa64
sudo cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21 ./
sudo rm -rf libstdc++.so.6
sudo ln -s libstdc++.so.6.0.21 libstdc++.so.6

不通过sudo启动matlab

注意matlab是隐藏文件,前面有.

1
sudo chmod -R a+rw ~/.matlab

Ubuntu1604装机系列(二):Opencv安装

发表于 2018-03-27 |

下载

官网下载opencv3.4.1,选择source版本
官网下载opencv3.4.1_contrib,选择source版本

首先安装必要的依赖

1
sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils

编译安装opencv

1
2
3
4
5
6
7
8
cp ../opencv3.4.1_contrib ./   # 复制contrib到opencv3.4.1文件夹并重命名
cd opencv3.4.1
mv opencv3.4.1_contrib opencv_contrib
mkdir buildc
cd build
cmake ..
ccmake ..
几个要注意的修改项(cuda/python根据自己的安装路径来写):
1
2
3
4
5
6
7
8
CUDA_TOOLKIT_ROOT_DIR:		/home/<user name>/wuxj/cuda-8.0
OPENCV_EXTRA_MODULES_PATH: /home/<user name>/wuxj/opencv-3.4.1/opencv_contrib/modules
PYTHON2_EXECUTABLE: /usr/bin/python2.7
PYTHON2_INCLUDE_DIR: /usr/include/python2.7
PYTHON2_LIBRARY: /usr/lib/x86_64-linux-gnu/libpython2.7.so
PYTHON2_NUMPY_INCLUDE_DIRS: /usr/local/lib/python2.7/dist-packages/dist-packages/numpy/core/include
PYTHON2_PACKAGES_PATH: lib/python2.7/dist-packages
CMAKE_INSTALL_PREFIX: /home/<user name>/wuxj # make install的安装路径

make -j8 # 等待安装成功即可 8:8核CPU,编译速度更快

make install # 复制上一步build文件夹到/home/<user name>/wuxj 中,这时候wuxj文件夹会包含bin(exe)、include(头文件)、lib(动态库)、share4个文件夹

123…5
祥吉

祥吉

CV/NLP,Studying,Coding

49 日志
10 标签
E-Mail 知乎 微博
© 2018 祥吉
由 Hexo 强力驱动
|
主题 — NexT.Mist v5.1.4
博客全站共37.2k字
本站访客数: