Tensorflow中same padding和valid padding

  • Same Convolution Padding

我之前学习吴恩达老师的课程时,了解到的same padding是指在输入周围填充0,以使卷积操作后输入输出大小相同。而在tensorflow中的same padding却不是这样的。

要理解tensorflow中的same padding是如何操作的,先考虑一维卷积的情况。

ni和no分别表示输入和输出的大小,k为kernel大小,s为stride步长。那么在same padding中,no由ni和s二者确定:no = ceil(ni / s)

比如,假设ni为11,s为2,那么就得到no为6。而s若为1,则输入输出大小相等。

现在已经确定好了输出no的大小,接下来就要确定如何对输入ni进行pad来得到目标输出大小。也就是要找到满足下面公式的pi:

继续阅读Tensorflow中same padding和valid padding

卷积神经网络在ARM-CPU上的推断计算综述

摘要


  深度学习在计算机视觉领域大放异彩,许多在传统方法下无法解决的问题正在被一一攻克。然而,高昂的计算成本也极大地限制了深度学习的使用,在移动端设备、嵌入式设备等计算资源比较拮据的平台上其计算密集的特性尤为突出。本文对现阶段,工业界所使用的深度学习推断阶段的软件操作库、计算框架等,做了充分调研,由底向上勾勒出深度学习推断阶段的技术轮廓。本文主要工作如下:

  1. 总结深度学习推断阶段的主要操作,指出其性能瓶颈所在;
  2. 从软件库层面总结现阶段可用的开源库;
  3. 对比各层次的软件库,做出总结。

深度学习推断的主要操作


  对于大部分的卷积神经网络而言,卷积层是最消耗时间的部分,而全连接层则是参数量最多的部分[2]。 如下图所示[10]为 2012 年获得imagenet冠军的深度神经网络结构Alexnet分别在GPU和CPU进行推断的性能benchmark,由图可以看出,在CPU上卷积层和全连接层占用了95%的计算时间,而在CPU上卷积层和全连接层占用了89%的时间,如何高效地进行卷积层和全连接层的计算成为提升深度学习推断性能的关键点。

继续阅读卷积神经网络在ARM-CPU上的推断计算综述

卷积与反卷积、步长(stride)与重叠(overlap)及output的大小

1. 卷积神经网络的基础概念

        卷积神经网络是一种专门用来处理具有类似网络结果的数据的神经网络。至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

        最核心的几个思想:稀疏交互、参数共享、等变表示(通俗成为平移不变性)。根本目的说白了就是为了节省运算时间和空间。那接下来看一下是怎么实现的。

1.0 卷积

         用一张图展示一下,卷积的计算。element-wise multiply 然后再相加。

继续阅读卷积与反卷积、步长(stride)与重叠(overlap)及output的大小

树莓派4B使用ARM Compute Library运行AlexNet

# Install Build Tools 
$ pip install scons 

# Reload Environment
$ source ~/.profile

# Clone Compute Library 
$ git clone https://github.com/Arm-software/ComputeLibrary.git 

# or wget http://www.mobibrw.com/wp-content/uploads/2019/10/ComputeLibrary.zip

# Enter ComputeLibrary folder 
$ cd ComputeLibrary  

# Build the library and the examples 
$ scons Werror=1 debug=0 asserts=0 neon=1 opencl=1 examples=1 os=linux arch=armv7a -j4 

# Run on the Raspberry Pi
$ export LD_LIBRARY_PATH=build/ 

# Download AlexNet

# Install unzip
$ sudo apt-get install unzip

# Download the zip file with the AlexNet model, input images and labels
$ wget https://armkeil.blob.core.windows.net/developer/developer/technologies/Machine%20learning%20on%20Arm/Tutorials/Running%20AlexNet%20on%20Pi%20with%20Compute%20Library/compute_library_alexnet.zip

# or wget http://www.mobibrw.com/wp-content/uploads/2019/10/compute_library_alexnet.zip

# Create a new folder
$ mkdir assets_alexnet

# Unzip
$ unzip compute_library_alexnet.zip -d assets_alexnet

$ PATH_ASSETS=./assets_alexnet 

$ ./build/examples/graph_alexnet 0 $PATH_ASSETS  $PATH_ASSETS/go_kart.ppm $PATH_ASSETS/labels.txt

继续阅读树莓派4B使用ARM Compute Library运行AlexNet

国内访问Coursera网站上的教学视频

最近在通过 `Coursera` 网站学习 `Andrew Ng` 的 `机器学习` 课程,但是发现网站上的视频无法正常播放。

抓包分析发现课程的视频是通过 `Amazon` 的 `cloudfront.net` 进行加速的,解决方法就是指定一个不被屏蔽的 `IP`地址即可。

在 `/etc/hosts` 中指定解析地址,如下:

52.84.246.90 d3c33hcgiwev3.cloudfront.net

参考链接


Coursera的视频为什么打不开了?

 Andrew Ng机器学习课程相关资料

Andrew Ng 的机器学习课程的视频,由于需要翻墙,因此在这里简单提供一下本站的下载链接。

Mathematics Behind Large Margin Classification

第七周


Support Vector Machines Kernels I

Support Vector Machines Kernels II

UsingAnSVM

讲座幻灯片 Lecture12 Support Vector Machines
编程作业: Support Vector Machines

第八周


讲座幻灯片 Lecture14 K-Means Clustering And PCA
编程作业: K-Means Clustering and PCA

第九周


Density Estimation

Problem Motivation

Gaussian Distribution

Algorithm

Building an Anomaly Detection System

第十周


Learning With Large Datasets

Stochastic Gradient Descent

第十一周


Problem Description and Pipeline

Ubuntu 16.04.3系统上OpenPTrack V1版本安装配置(Kinect V2)

对于Ubuntu 14.04.5系统上的安装操作,请参考Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)

下面是我自己fork出来修改后的代码在Ubuntu 16.04.3系统上的安装操作

要求机器上必须有CUDA 8.0/9.0支持的显卡才可以。

1.从GitHub上获取项目代码
$ sudo apt-get install git -y
$ cd ~
$ git clone https://github.com/wangqiang1588/open_ptrack_org.git open_ptrack
2.安装ROS
$ cd open_ptrack/scripts
$ chmod +x *.sh
$ ./ros_install.sh

$ source /opt/ros/kinetic/setup.bash
$ ./ros_configure.sh
3.安装OpenPTrack
$ sudo apt-get install libdrm-dev

$ ./openptrack_install.sh
4.链接OpenPTrack目录
$ ln -s  ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack
5.Kinect V2驱动程序安装

检查当前用户目录下的.bashrc文件,注释掉如下内容:

export KINECT_DRIVER=openni

然后执行如下命令:

# Nvidia Jetson TX1/TX2 不要安装这个
$ sudo apt-get install nvidia-375-dev

# Nvidia Jetson TX1/TX2不支持OpenCL,因此编译的时候,不要安装ocl-icd-opencl-dev
$ sudo apt-get install ocl-icd-opencl-dev

$ sudo apt-get install m4
$ sudo apt-get install automake
$ sudo apt-get install libjpeg-dev
$ sudo ln -s -f /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so.0 /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so
$ sudo apt-get install libglewmx-dev
$ sudo apt-get install libudev-dev
$ sudo ln -s -f /lib/`uname -m`-linux-gnu/libudev.so.1 /lib/`uname -m`-linux-gnu/libudev.so

$ cd ~/workspace/ros/catkin/src
$ source ~/.profile 
$ roscd open_ptrack/../scripts
$ chmod +x kinect2_install.sh
$ ./kinect2_install.sh

6.重新编译代码

UBUNTU_VERSION=`lsb_release -c -s`
ROS_DISTRO=hydro

if [ $UBUNTU_VERSION = trusty ] || [ $UBUNTU_VERSION = saucy ] ; then
  ROS_DISTRO=indigo
elif [ $UBUNTU_VERSION = xenial ] ; then
  ROS_DISTRO=kinetic
fi

GCC_VERSION=`gcc -dumpversion | cut -f1 -d.`
source /opt/ros/$ROS_DISTRO/setup.bash 
cd ~/workspace/ros/catkin
catkin_make --pkg calibration_msgs
catkin_make --pkg opt_msgs
#GCC 5 bug out of memory
if [ $GCC_VERSION > 4 ] ; then
  catkin_make --force-cmake -j 1
else
  catkin_make --force-cmake
fi

执行如下命令:

$ roscore

检查当前用户目录下的.bashrc文件,然后注释掉如下内容:

export KINECT_DRIVER=openni

上面语句如不注释,会导致程序启动时候的崩溃。

新建一个Shell,执行如下命令

$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge
$ sudo ./kinect2_bridge

执行此步的时候如果提示找不到Kinect设备,请重启一下系统再试试。

7.测试系统

可能需要重新插拔一下KinectUSB数据线,然后执行如下命令

$ roslaunch kinect2_bridge kinect2_bridge.launch

执行之后,等待十几秒,然后Ctrl+C中断执行。
执行完成后,执行

$ roslaunch tracking detection_and_tracking_kinect2.launch

之后,会弹出三个界面出来。

参考链接


Kinect V2 深度图与彩色图融合(Ubuntu 14.04)

参考Kinect V2在Ubuntu 14.04系统上的驱动配置与安装在一个全新安装的Ubuntu 14.04系统中配置完成相关的驱动及其依赖。

Kinect V2深度图与彩色图融合的方式,简单粗暴,由于深度图像是512*424大小,因此,直接把彩色图像缩放成对应的512*424,然后像素点一一对应。至于原始大小的彩色图像,那么就是一片像素对应同一个深度即可。

注意,这个方式只适合Kinect V2,可以理解成Kinect V2的设计就是这样的,两个设备出厂的时候就校准为这样的输出。

具体的转换代码参考registration.cpp,Registration.cpp,建议直接调用驱动层提供的功能来实现,这样的话,一系列的参数设置可以同步,否则上层每次修改了分辨率等参数的时候,要自己手工修改这些数据。

Python深度图与彩色图融合的例子如下:

 

参考连接


Ubuntu 14.04.5系统上OpenPTrack V1版本双Kinect V2简单校准

参照Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)配置安装完成后,是单台机器的方式。

如果场地比较大,则需要部署多个Kinect V2。由于每台Kinect V2看到同一个人的视角不同,因此需要校准,才能进行合并。

下面,我们用两台PC+两个Kinect V2(每台机器上连接一个Kinect V2)来演示一下如何校准的操作。

继续阅读Ubuntu 14.04.5系统上OpenPTrack V1版本双Kinect V2简单校准

Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)

目前在研究视觉跟踪人的事情,找到的比较好的参考项目就是OpenPTrack了,截至目前(2017.8.14OpenPTrackV2版本还没有释放出代码,因此我们只能依旧在V1版本上进行测试,这个版本目前只能在Ubuntu 14.04.5系统上运行,其他系统上(比如Ubuntu 16.04)问题比较多,还是建议在Ubuntu 14.04.5系统上进行安装。

1.从GitHub上获取项目代码
$ sudo apt-get install git -y
$ cd ~
$ git clone https://github.com/OpenPTrack/open_ptrack.git
2.安装ROS
$ cd open_ptrack/scripts
$ chmod +x *.sh
$ ./ros_install.sh

$ source /opt/ros/indigo/setup.bash
$ ./ros_configure.sh
3.安装OpenPTrack
$ ./openptrack_install.sh
4.链接OpenPTrack目录
$ ln -s  ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack
5.Kinect V2驱动程序安装
$ sudo apt-get install nvidia-375-dev
$ sudo apt-get install ocl-icd-opencl-dev

$ cd ~/workspace/ros/catkin/src
$ source ~/.profile 
$ roscd open_ptrack/../scripts
$ chmod +x kinect2_install.sh
$ ./kinect2_install.sh

重启系统,然后执行如下命令:

$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge
$ sudo ./kinect2_bridge
6.完整的自动化安装脚本
import subprocess
def execBashShellCommand(cmd):
    print cmd
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,executable="/bin/bash")
    while True:  
        buff = p.stdout.readline()  
        if buff == '' and p.poll() != None:  
            break
        print buff
    p.wait()


def main():
    execBashShellCommand("rm -rf ~/workspace")
    execBashShellCommand("rm -rf ~/.ros")
    execBashShellCommand("rm -rf ~/.rviz")
    execBashShellCommand("rm -rf ~/open_ptrack")

    execBashShellCommand("sudo apt-get install git -y")
    execBashShellCommand("cd ~ && git clone https://github.com/OpenPTrack/open_ptrack.git")

    execBashShellCommand("sed -i '/source ~\/workspace\/ros\/rosbuild\/setup.bash/d' ~/.bashrc")
    execBashShellCommand("sed -i '/export KINECT_DRIVER=openni/d' ~/.bashrc")
    execBashShellCommand("sed -i '/export LC_ALL=C/d' ~/.bashrc")

    execBashShellCommand("cd ~/open_ptrack/scripts && chmod +x *.sh && ./ros_install.sh")
    execBashShellCommand("cd ~/open_ptrack/scripts && source /opt/ros/indigo/setup.bash ; ./ros_configure.sh")
    execBashShellCommand("cd ~/open_ptrack/scripts && ./openptrack_install.sh")

    execBashShellCommand("ln -s  ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack")

    execBashShellCommand("source ~/workspace/ros/rosbuild/setup.bash ; source ~/.profile ; export KINECT_DRIVER=openni && export LC_ALL=C && cd ~/workspace/ros/catkin && catkin_make --pkg calibration_msgs && catkin_make --pkg opt_msgs && catkin_make --force-cmake")

    execBashShellCommand("sudo apt-get -y install nvidia-375-dev")
    execBashShellCommand("sudo apt-get -y install ocl-icd-opencl-dev")

    execBashShellCommand("source ~/workspace/ros/rosbuild/setup.bash ; source ~/.profile ; export KINECT_DRIVER=openni && export LC_ALL=C && cd ~/workspace/ros/catkin/src && roscd open_ptrack/../scripts && chmod +x kinect2_install.sh && ./kinect2_install.sh")

    execBashShellCommand("cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge && sudo ./kinect2_bridge")

if __name__ == "__main__":
    main()
7.测试系统

可能需要重新插拔一下KinectUSB数据线,然后执行如下命令

$ roslaunch kinect2_bridge kinect2_bridge.launch

执行之后,等待十几秒,然后Ctrl+C中断执行。
执行完成后,执行

$ roslaunch tracking detection_and_tracking_kinect2.launch

之后,会弹出三个界面出来。

参考链接


OpenPTrack Installation Guide