在Ubuntu下对USB HID设备进行读写的编程方法

在Ubuntu下对USB HID设备进行读写的编程方法:

第一步:根据USB设备的Vendor ID和Product ID来寻找usb设备:

my_usb_hid_dev = usb.core.find(idVendor=0x0483, idProduct=0x1230)

第二步:判断内核驱动的状态,并进行对应处理:

if my_usb_hid_dev.is_kernel_driver_active(0):
my_usb_hid_dev.detach_kernel_driver(0)

第三步:对USB设备进行set configuration和相关操作

my_usb_hid_dev.set_configuration()
my_usb_hid_dev.reset()

第四步:获取USB设备的读写端口地址

my_endpoint_in = my_usb_hid_dev[0][(0,0)][0]
my_endpoint_out = my_usb_hid_dev[0][(0,0)][1]

第五步:对输出端口进行写操作:

my_sent_msg=”USB-MCUID”+b’\x0d’
my_endpoint_out.write(my_sent_msg)

第六步:对输入端口进行读操作

my_received_data = my_usb_hid_dev.read(my_endpoint_in.bEndpointAddress, 64, 1000)
my_received_msg=”.join([chr(a) for a in [my_received_data[i] for i in range(0, 64)]])

第七步:关闭USB:

usb.util.dispose_resources(my_usb_hid_dev)
my_usb_hid_dev.attach_kernel_driver(0)

通过上述操作,即可以成功对USB HID设备进行读写。

 

使用Face_recognition和dlib库进行人脸识别

使用Face_recognition和dlib库进行人脸识别:

第一步:安装boost库,cmake和dlib库:
$ sudo apt-get install libboost-all-dev
$ sudo apt-get install cmake
$ sudo pip install dlib

第二步:安装face_recognition:
$ sudo pip install face_recognition

第三步:下载face_recognition代码:
$ git clone https://github.com/ageitgey/face_recognition.git

第四步:测试人脸识别例子:
$ cd face_recognition/examples
$ python facerec_from_webcam_faster.py

成功运行后,程序通过摄像头获取图像,并用红色方框把人脸框出来。

Ubuntu下安装pyusb进行usb设备编程

Ubuntu下安装pyusb进行usb设备编程:

第一步:安装libus库:

$ sudo apt-get install libusb-1.0-0

第二步:安装pyusb:

$ pip install pyusb

第三步:列出usb设备:

$ lsusb

第四步:测试

$ python
>>> import usb
>>> my_dev = usb.core.find(idVendor=0x0483, idProduct=0x1230)
>>> my_dev

 

Ubuntu下安装Jupyter进行远程访问

Ubuntu下安装Jupyter进行远程访问

第一步:进入python虚拟环境并激活,然后回到工作目录下

$ cd /tensorflow_env/env_python2/bin
$ source activate
$ cd /my_work

第二步:通过pip安装Jupyte

$ pip install jupyter

第三步:生成jupyter配置文件并设置密码

$ jupyter notebook –generate-config
$ jupyter notebook password

第四步:编辑配置文件并允许远程访问

$ vim /root/.jupyter/jupyter_notebook_config.py
把c.NotebookApp.ip=从’localhost’改为 ‘*’,如有需要也可以通过c.NotebookApp.port =8888来指定IP

第五步:运行Jupyter

$  jupyter notebook –allow-root

此时,就可以从Windows平台下通过网页来访问远程服务器:
http://xx.xx.xx.xx:8888

Ubuntu下安装Tensorflow 1.10.1 (支持cuda 9.0)

Ubuntu下安装Tensorflow 1.10.1 (支持cuda 9.0)

第一步:安装Python虚拟环境。

$ sudo apt-get install python-pip python-dev python-virtualenv
$ pip install –upgrade pip
$ mkdir tensorflow_env
$ cd tensorflow_env
$ virtualenv –system-site-packages env_python2

第二步:激活虚拟环境:

$ source tensorflow_env/env_python2/bin/activate

第三步:通过pip安装tensorflow:

$ pip install –upgrade pip
$ pip install –upgrade tensorflow-gpu

第四步:查看tensorflow版本

$ python -c “import tensorflow as tf; print(tf.__version__)”

第五步:测试tensflow代码

(env_python2) user@xxx# Python
>>>import tensorflow as tf
>>>hello = tf.constant(‘Hello, TensorFlow!’)
>>>sess = tf.Session()
>>>print(sess.run(hello))
>>>quit()

当需要卸载tensorflow的时候,停用虚拟环境并删除目录:

$ deactivate
$ rm -f xxx

 

Ubuntu下安装cuda 9.0和cuda深度学习库cudnn

Ubuntu下安装cuda 9.0和cuda深度学习库cudnn:

第一步:下载CUDA安装包,如 cuda_9.0.176_384.81_linux.run

第二步:运行安装 sudo sh cuda_9.0.176_384.81_linux.run

第三步:等待安装完成后,加入环境变量:

$ vim ~/.bashrc
export PATH=$PATH:/usr/local/cuda-9.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-9.0/lib64
export CUDA_HOME=/usr/local/cuda-9.0
$ source ~/.bashrc
$ export

第四步:查看cuda编译器nvcc版本:  $ nvcc -V

第五步:编译cuda例子:

$ cd /usr/local/cuda-9.0/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery

第六步:下载cudnn,如:cudnn-9.0-linux-x64-v7.2.1.38.tgz

第七步:解压文件

$ tar xvzf cudnn-9.0-linux-x64-v7.2.1.38.tgz

第八步:拷贝cudnn库文件到cuda的对应目录

$ cp cuda/include/* /usr/local/cuda-9.0/include
$ cp cuda/lib64/* /usr/local/cuda-9.0/lib64

至此,安装完成。如需要卸载cuda,采用下面的方法:

$ sudo apt-get remove cuda
$ sudo apt-get autoclean
$ sudo apt-get remove cuda*
$ cd /usr/local/
$ sudo rm -rf cuda-9.0

 

 

 

 

 

 

 

Ubuntu下OpenCV的安装

Ubuntu下OpenCV的安装:

第一步:安装库和关联程序包:

$ sudo apt update
$ sudo apt-get install build-essential
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev
$ sudo apt-get install libatlas-base-dev gfortran
$ sudo apt-get install ffmpeg

第二步:下载opencv文件并解压

$ wget https://github.com/opencv/opencv/archive/3.3.0.zip
$ wget https://github.com/opencv/opencv_contrib/archive/3.3.0.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip

第三部:安装pip

$ sudo apt-get install python-pip python-dev build-essential
$ sudo pip install –upgrade pip
$ sudo pip install numpy

第四步:编译Opencv

$ cd opencv3.3.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D PYTHON_EXECUTABLE=/usr/bin/python \
-D WITH_CUDA=OFF \
-D BUILD_EXAMPLES=ON ..
$ make -j4

第五步:安装Opencv和flask

$ sudo make install
$ sudo ldconfig
$ sudo pip install flask

第六步:测试Opencv

$ python –version
Python 2.7.12
$ python
>>> import cv2
>>> cv2.__version__
‘3.3.0’
>>>quit()

深度学习之卷积神经网络CNN

深度学习之卷积神经网络CNN:

卷积神经网络CNN的计算过程如下图所示:
最左边橙色的是输入图片;
我们用3个Feature Maps对左边的橙色图片进行提取,就可以得到三张绿色的图片。图中的B是每张图片的偏置值。
然后我们再对每张绿色的照片采用32个Feature Maps进行提取,得到32张蓝色图片。由于我们有三张绿色图片,所以我们一共能得到96张蓝色图片。
把每张绿色照片提取出来的第0张照片相加,并加上偏置B,作为照片0。重复同样的动作,就可以到到0-31共32张图片,这就是CNN的运输结果。
当然在运算过程中,我们通过Pooling来减少图片的数据量,通过Relu来去除一些数据。

 

 

 

 

上文详细描述了卷积神经网络CNN的计算方法,如需转载,请勿用于商业目的,并注明:该文章出自圆点博士www.bspilot.com

用卷积神经网络CNN识别手写数字的方法

用卷积神经网络CNN识别手写数字的方法:

卷积神经网络,英文全称为Convolutional Neural Network。在手写数字识别上应用该神经网络,识别的准确率能提升到99%以上。下面我们来描述下利用CNN进行手写数字识别的基本思路。

卷积神经网络主要有下列几个部分组成:输入层(Input Layer),卷积层(Convolution Layer),池化层(Pooling Layer),全连接层(Fully Connected Network)

第一步,我们从输入层通过卷积运算来提取出卷积层。首先,我们要定义出特征图和偏置数:
w_fm1_in=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-w1′)
b_fm1=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-b1′)

第二步,把输入的图片数据和特征图进行卷积运算,并加上偏置数,然后使用激活函数Relu对数据进行处理,得到卷积后的数据层。卷积的运算方法是2个相同大小的矩阵的同一位置的数相乘,然后求和,举例如下:
假定矩阵M和N都为2×2矩阵:
M(0,0) M(0,1) N(0,0) N(0,1)
M(1,0) M(1,1) N(1,0) N(1,1)
卷积的结果是:M(0,0)*N(0,0)+M(0,1)*N(0,1)+M(1,0)*N(1,0)+M(1,1)*N(1,1)
x_conv_l1 = tf.nn.relu(_cnn_convolution_fun_(input_image, w_fm1) + b_fm1)

第三步:我们对上面得到的数据进行池化,以缩减图片的数据量。池化的方法是把图片切割成2X2的小方块,然后取每个小方块中的最大值来重新组合成一张图片。如一张28×28的图片,经过池化后就变成14×14。
x_pool_l1 = _cnn_max_pooling_fun_(x_conv_l1)

重复上述步骤,以获得两层的卷积结果:
w_fm2_in=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-w2′)
b_fm2=tf.placeholder(tf.float32, shape=[None], name=’Feature-Maps-b2′)
x_conv_l2 = tf.nn.relu(_cnn_convolution_fun_(x_pool_l1, w_fm2) + b_fm2)
x_pool_l2 = _cnn_max_pooling_fun_(x_conv_l2)

经过上述的卷积运算后,我们把一张图片分离成大小为x*y的z张图片。接下来,我们把提取到的卷积图像压平成一个一维的数组,以进行全连接运算。
h_pool2_flat = tf.reshape(x_pool_l2, [-1, x*y*z])

在进行全连接运算前,我们要定义好全连接权重和偏置:
w_fcn1_in=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-w1′)
b_fcn1=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-b1′)

然后进行矩阵运算:
x_fcn_l1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fcn1) + b_fcn1)

为了获得更精确的运算结果,我们也可以多加一层全连接层:
w_fcn2_in=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-w2′)
b_fcn2=tf.placeholder(tf.float32, shape=[None], name=’Fully-Connected-Network-b2′)
y = tf.nn.softmax(tf.matmul(x_fcn_l1, w_fcn2) + b_fcn2)

程序的运行结果如下:
0:[ 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 ]=0.996759 num=5/5 Y
1:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
2:[ 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=4/4 Y
3:[ 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=1/1 Y
4:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 ]=1.000000 num=9/9 Y
。。。
79:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 ]=1.000000 num=7/7 Y
80:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=0.999991 num=8/9 N
81:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
82:[ 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=2/2 Y
。。。
94:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=1.000000 num=8/8 Y
95:[ 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=0/0 Y
96:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 ]=1.000000 num=7/7 Y
97:[ 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 ]=1.000000 num=8/8 Y
98:[ 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=3/3 Y
99:[ 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=1.000000 num=1/1 Y

由此,可以看出,采用卷积神经网络CNN后,手写数字的识别率能提高到99%

上文详细描述了采用卷积神经网络CNN进行手写数字识别的方法,如需转载,请勿用于商业目的,并注明:该文章出自圆点博士www.bspilot.com

深度学习在手写数字识别上的使用方法

深度学习在手写数字识别上的使用方法

本节描述如何给手写的数字图片进行数字识别,我们知道,数字识别的公式是:z=x*w+b。其中x是指图片数据,w是权重值,b是偏置值。程序的实现方法如下:
x = tf.placeholder(tf.float32, [None,784],name=’picture’)
w = tf.placeholder(tf.float32, [784,10],name=’weight’)
b = tf.placeholder(tf.float32, [10],name=’bias’)
z = tf.matmul(x, w) + b
上述程序中,我们所采用的手写数字图是28*28尺寸,进行一纬展后,得到784个数据
w是二维数组,分别记录了每个象素点在数字0-9上的权重值
b是一维数字,记录了每张图片在数字0-9上的偏置。
在计算出z的结果后,通过y = tf.nn.softmax(z)进行归一化运算,就可以得到图片对应0-9数字的概率。
程序的具体运行过程如下:
首先定义shibie_num_2d_array=bs_np.zeros((100,10))来记录100张图片的计算结果
然后定义shibie_num=bs_np.zeros((100),dtype=int)来记录100张图片的识别结果

with tf.Session() as sess:
通过bias_data_1d_array=_read_bias_file_(‘bias.bin’)读入偏置数据
通过weight_2d_array=_read_weight_file_(‘weight.bin’)读入权重数据
通过label_byte_array=_read_txt_label_file_(“label/label.txt”)读入图片的正确数据用于精确度分析

下面程序读入100张图片,并进行识别,识别后把结果存入数组
for i in range(100):
image_filename= ‘pic/’ + str(i) + ‘.png’
bs_image_1d_float_array=_read_image_file_(image_filename)
num_array=sess.run(y,feed_dict={x:bs_image_1d_float_array,w:weight_2d_array,b:bias_data_1d_array})
shibie_num[i]=_get_the_maximun_value_index_(num_array.flat)
shibie_num_2d_array[i]=num_array.flat

接下来我们看看程序运行的情况:
用于识别的图片显示如下:
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
0000000000000000000000000D1D1D421C00000AB3F22F0000000000
00000000000000000000001390FDFCFCD7AA521CD1FD540000000000
00000000000000000000007BFCFDFCFCFCFDF048D2FD540000000000
0000000000000000000097F6FCB21C1C1CFD975BFCFD540000000000
00000000000000000010B3FDB200000000A65BE5FDC9000000000000
0000000000000000002FC4FC670000000010D7FCFC00000000000000
0000000000000000000083FCE426000000CCFCFC7F00000000000000
0000000000000000000020E4FCE22626D5FDFC7F0300000000000000
000000000000000000000055FDFFCBFDFDD626000000000000000000
00000000000000000000001CB8FDFCFCCA0000000000000000000000
00000000000000000000001DB8FDFCFC1C0000000000000000000000
000000000000000000001A9FFCFDFCFCB20000000000000000000000
0000000000000000000078FDFD72C2FDFD3F00000000000000000000
000000000000000000AAE1E9600083FCFC2600000000000000000000
000000000000000059FDFC50000DCEFCCA0000000000000000000000
0000000000000026E1FD6606000DCEFC660000000000000000000000
0000000000000056FDFB4B000068FDCE0D0000000000000000000000
000000000000006EFCF4905FA9FDFC8E000000000000000000000000
000000000000006EFCFDFCFCFCF45D0D000000000000000000000000
000000000000000A80FDFCCA66190000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000

权重数据如下:
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
-6.21575339e-07 -1.86172690e-06 -5.57173621e-07 -2.32155664e-08
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
。。。
-1.54554844e-04 -3.04110348e-04 -3.00577842e-04 -5.12265367e-04
-3.28946696e-03 -4.95949062e-03 -5.91816520e-03 -6.42772997e-03
-3.28246248e-03 -2.04786961e-03 -1.98838650e-03 -2.18997570e-03
-4.78268741e-03 -4.11115354e-03 -9.97261051e-03 -2.30694585e-03
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00

偏置数据如下:
-0.38391989 0.36819908 0.14742972 -0.2485853 0.00678487
1.50934291 -0.1230232 0.66861355 -1.6545428 -0.29029697

所获得的计算结果是:
。。。
19:[ 0.00 0.01 0.00 0.06 0.01 0.01 0.00 0.16 0.40 0.34 ]=0.400554 num=8/9 N
20:[ 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 ]=0.996658 num=4/4 Y
21:[ 0.99 0.00 0.00 0.00 0.00 0.01 0.00 0.00 0.00 0.00 ]=0.987394 num=0/0 Y
22:[ 0.00 0.00 0.01 0.01 0.17 0.01 0.01 0.10 0.16 0.54 ]=0.538625 num=9/9 Y
23:[ 0.00 0.90 0.02 0.01 0.00 0.00 0.00 0.00 0.07 0.00 ]=0.901153 num=1/1 Y
24:[ 0.00 0.09 0.02 0.24 0.00 0.38 0.03 0.03 0.18 0.02 ]=0.384953 num=5/1 N
25:[ 0.00 0.00 0.18 0.16 0.00 0.00 0.00 0.00 0.65 0.00 ]=0.654692 num=8/2 N
26:[ 0.00 0.00 0.00 0.01 0.92 0.01 0.00 0.01 0.01 0.05 ]=0.920881 num=4/4 Y
27:[ 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 ]=0.999994 num=3/3 Y
28:[ 0.00 0.00 0.06 0.01 0.00 0.00 0.00 0.93 0.00 0.00 ]=0.930135 num=7/2 N

其中,:前面的数字是图片序号,[。。。]内的数据为图片为0-9中数字的概率,=后面是最大的概率,/前面的数字是识别出来的数据,/后面是实际的数据,如果识别正确,则为Y,识别错误,则为N。