步驟
安裝系統(tǒng)
-
根據(jù)教程制作安裝U盤,選擇Ubuntu Sever Installer
image.png 進(jìn)入BIOS,配置UEFI Boot mode的引導(dǎo)為U盤優(yōu)先
-
插入安裝U盤残揉,重啟電腦毡琉,根據(jù)教程安裝Ubuntu Server
- 選擇安裝盤的時(shí)候區(qū)分清楚U盤和主機(jī)硬盤
- 選擇軟件包的時(shí)候及老,勾選standard system utilities和OpenSSH server
拔掉U盤身冬,重啟電腦進(jìn)入系統(tǒng)玄括,如果顯示"/dev/sda2: clean, 55880048/77066240 files, 22630945 blocks"鸦泳,參考教程
基本環(huán)境配置
- 安裝系統(tǒng)包
sudo apt-get update && sudo apt-get upgrade -y && sudo reboot
sudo apt-get install ubuntu-desktop
sudo apt-get install -y vim git build-essential
sudo apt-get install python-dev
sudo apt-get install nginx
sudo apt-get install curl
- 確認(rèn)Python版本是2.7
$ python -V
Python 2.7.12
- 下載配置GOOGLE SDK
- 配置Google密鑰
- 登錄Google Cloud Platform
- 創(chuàng)建一個(gè)Project
- 開放用到的API
- Google Cloud Storage and Google Cloud Storage JSON API
- Vision API
- Speech API
- Natural Language API
- Cloud ML API
- 創(chuàng)建一個(gè)服務(wù)帳號(hào)密鑰银锻,選擇json格式,并下載到/home/dobot/FindYourCandy
- 將密鑰文件的名稱改為credential.json
- 在文件~/.bashrc最后一行加入:```
export GOOGLE_APPLICATION_CREDENTIALS="path_to_your_own_credential_file"
7. `source ~/.bashrc`
- 安裝Python包
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
sudo pip install numpy==1.12.0
- 安裝OpenCV3.2
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libgtk2.0-dev
mkdir ~/opencv_from_git
cd ~/opencv_from_git
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
git clone https://github.com/opencv/opencv_extra.git
cd ~/opencv_from_git/opencv/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ -D BUILD_DOCS=ON -D WITH_TBB=ON ..
make -j7
sudo make install
- 設(shè)置設(shè)備權(quán)限
$ sudo adduser dobot dialout
$ sudo adduser dobot video
$ ls -l /dev/ttyUSB*
crwxrwxrwx 1 root dialout 188, 0 May 6 17:06 /dev/ttyUSB0
$ sudo chmod 777 /dev/ttyUSB0
$ ls -l /dev/video*
crwxrwxrwx+ 1 root video 81, 0 May 6 17:06 /dev/video0
$ sudo chmod 777 /dev/video0
下載FindYourCandy項(xiàng)目并校準(zhǔn)
- 下載FindYourCandy項(xiàng)目
cd ~
git clone https://github.com/BrainPad/FindYourCandy.git
- 為配合GoogleML的默認(rèn)配置做鹰,項(xiàng)目改為使用Tensorflow 1.0.1击纬。修改
~/FindYourCandy/webapp/requirements/base.txt
文件內(nèi)容為:
Flask==0.12
uWSGI==2.0.14
pytz==2016.10
google-cloud==0.23.0
numpy==1.12.0
scipy==0.18.1
gensim==0.13.4.1
scikit-learn==0.18.1
h5py==2.6.0
protobuf==3.2.0
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.0.1-cp27-none-linux_x86_64.whl
- 安裝項(xiàng)目依賴
cd ~/FindYourCandy
sudo pip install -r robot-arm/requirements.txt
sudo pip install -r webapp/requirements.txt
- 配置環(huán)境變量
export FLASK_ENV='prd'
export GOOGLE_APPLICATION_CREDENTIALS="path_to_your_own_credential_file"
export PYTHONPATH=/usr/local/lib/python2.7/dist-packages
cd ~/FindYourCandy/webapp/candysorter/resources/models
wget http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz
tar xvzf inception-2015-12-05.tgz
- 修改~/FindYourCandy/webapp/candysorter/config.py
# replace "YOUR-OWN-BUCKET-NAME" to your own bucket name
CLOUD_ML_BUCKET = 'gs://{YOUR-OWN-BUCKET-NAME}'
CLOUD_ML_PACKAGE_URIS = ['gs://{YOUR-OWN-BUCKET-NAME}/package/trainer-0.0.0.tar.gz']
CLOUD_ML_PYTHON_MODULE = 'trainer.train'
CLOUD_ML_TRAIN_DIR = 'gs://{YOUR-OWN-BUCKET->NAME}/{job_id}/checkpoints'
CLOUD_ML_LOG_DIR = 'gs://{YOUR-OWN-BUCKET-NAME}/logs/{job_id}'
CLOUD_ML_DATA_DIR = 'gs://{YOUR-OWN-BUCKET-NAME}/{job_id}/features'
- 將代碼中TF0.12.1的接口改為TF1.0.1
#/Users/wubinbin/Developer/FindYourCandy
#FindYourCandy/train/trainer/model.py
if not for_predict:
# add loss operation if initializing for training
one_hot = tf.one_hot(self.label_ids, num_classes, name='target')
self.loss_op = tf.reduce_mean(
# JoMar Modify
# tf.nn.softmax_cross_entropy_with_logits(logits, one_hot)
tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=one_hot)
# tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=one_hot)
)
self.softmax_op = tf.nn.softmax(logits)
self.saver = tf.train.Saver()
if not for_predict:
# add train operation and summary operation if initializing for training
# Optimizer
with tf.variable_scope('optimizer'):
self.global_step = tf.Variable(0, name='global_step', trainable=False)
# Summaries
with tf.variable_scope('summaries'):
# JoMar Modify
# tf.scalar_summary('in sample loss', self.loss_op)
# self.summary_op = tf.merge_all_summaries
tf.summary.scalar('in sample loss', self.loss_op)
self.summary_op = tf.summary.merge_all()
#FindYourCandy/train/trainer/train.py
loss_log = []
with tf.Session() as sess:
# JoMar Modify
# summary_writer = tf.train.SummaryWriter(self.log_dir, graph=sess.graph)
summary_writer = tf.summary.FileWriter(self.log_dir, graph=sess.graph)
sess.run(tf.initialize_all_variables())
- 代碼優(yōu)化
#FindYourCandy/webapp/candysorter/views/api.py
#防止沒有糖果的時(shí)候出現(xiàn)崩潰 # Find nearest candy
logger.info('Finding nearest candy.')
# JoMar Modify
listTemp = [speech_sim.dot(s) for s in candy_sims]
if len(listTemp) < 1:
logger.info('Can not found candy.')
else:
nearest_idx = np.argmax(listTemp)
logger.info(' Nearest candy: idx=%d, url=%s', nearest_idx, candy_urls[nearest_idx])
# Save pickup point
logger.info('Saving pickup point.')
nearest_centroid = candies[nearest_idx].box_centroid
pickup_point = image_calibrator.get_coordinate(nearest_centroid[0], nearest_centroid[1])
cache.set('pickup_point', pickup_point)
#FindYourCandy/webapp/candysorter/ext/google/cloud/ml/_http.py
#Google視覺API更新了接口
class Connection(_http.JSONConnection):
API_BASE_URL = 'https://ml.googleapis.com'
# JoMar Modify
# API_VERSION = 'v1beta1'
API_VERSION = 'v1'
API_URL_TEMPLATE = '{api_base_url}/{api_version}{path}'
配置安卓設(shè)備
- 使用安卓設(shè)備
- 使用ChromeV59版本钾麸,并在系統(tǒng)中添加到權(quán)限白名單更振。Tips最新版本不能開麥克風(fēng)權(quán)限
3.Tips 注意服務(wù)界面網(wǎng)頁會(huì)連接Google Cloud
問題
升級(jí)pip后出現(xiàn)ImportError: cannot import name main
- 原因:pip10不向下兼容導(dǎo)致
- 辦法:使用
python -m pip
代替