---
---
# obj on web
# 參考資料
[Tensorflow Object Detection API Web Service](https://github.com/webrtcHacks/tfObjWebrtc)
https://github.com/SamsungInternet/ar-demos
# 基本安裝
```shell=
sudo apt-get update
sudo apt-get install tasksel
sudo tasksel
cd /var/www/html
```
### git clone 參考資料
```shell=
sudo git clone https://github.com/webrtcHacks/tfObjWebrtc.git
cd tfObjWebrtc/
```
# Install docker
```shell=
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
apt-cache madison docker-ce
sudo docker run hello-world
```
# 進入root 創建tf-webrtchacks container
## 將container的5000端口映射到主機的5000端口
```shell=
sudo docker run -it -p 5000:5000 --name tf-webrtchacks -v $(pwd):/code chadhart/tensorflow-object-detection:webrtchacks
```
## 解決運行server.py的問題
```shell=
python setup.py install
protoc object_detection/protos/*.proto --python_out=.
apt-get update
apt-get install wget
wget -O protobuf.zip https://github.com/google/protobuf/releases/download/v3.0.0/protoc-3.0.0-linux-x86_64.zip
unzip protobuf.zip
./bin/protoc object_detection/protos/*.proto --python_out=.
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
```
## 把http變https(生產憑證)
```shell=
wget https://ftp.openssl.org/source/openssl-1.0.2r.tar.gz //ssl生產工具
tar -zxvf openssl-1.0.2r.tar.gz
cd openssl-1.0.2r/
apt-get install build-essential
./config --prefix=/usr/local --openssldir=/usr/local/openssl
make
make test
make install
openssl version //版本
which openssl //openssl的位置
openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365 //生產憑證
nano server.py //最下面有個with SSL,改成下面程式碼
app.run(debug=True, host='0.0.0.0') 將此行註解
app.run(debug=True, host='0.0.0.0', ssl_context=('cert.pem','key.pem'))
```
# 換model
* 下載[zip](https://drive.google.com/file/d/1RbkCuZSkIzByKfPzqxQrbFK-d16WjTae/view?usp=sharing)檔
* 上傳訓練後的 frozen_inference_graph.pb 、 labelmap.pbtxt 、 object_detection_api.py
* 替換 ssd_mobilenet_v1_coco_2017_11_17 內的 frozen_inference_graph.pb
* 將 labelmap.pbtxt 複製到 object_detection/data
* 替換 object_detection_api.py 檔案
```shell=
exit
sudo rm object_detection_api.py
cd ssd_mobilenet_v1_coco_2017_11_17
sudo rm frozen_inference_graph.pb
cd
sudo cp frozen_inference_graph.pb /var/www/html/tfObjWebrtc/ssd_mobilenet_v1_coco_2017_11_17
sudo cp labelmap.pbtxt /var/www/html/tfObjWebrtc/object_detection/data
sudo cp object_detection_api.py /var/www/html/tfObjWebrtc/
cd /var/www/html/tfObjWebrtc/
```
## 會遇到的狀況
* No op named GatherV2 in defined operations.
* Tensorflow的版本不合『docker的Tensorflow的版本 != 訓練時的Tensorflow的版本』
## 要改docker下面的Tensorflow的版本
* 改成你訓練時的Tensorflow的版本,pip install tensorflow==XXX
```shell=
sudo docker rm tf-webrtchacks
sudo docker run -it -p 5000:5000 --name tf-webrtchacks -v $(pwd):/code chadhart/tensorflow-object-detection:webrtchacks
pip install tensorflow==1.9.0
python server.py
```
## 執行'object_detection_api_test.py'會遇到這個問題
* Attempted to use a closed Session
* 參考 https://www.twblogs.net/a/5b8c36e52b71771883315b6d
* session 執行後會關閉,導致server.py內的程式碼get_objects的function 沒辦法執行所以要把session的程式碼改到get_objects內
* 改object_detection_api.py 這個檔案內的get_objects
# 套用 3D 圖檔
```shell=
cd /var/www/html/tfObjWebrtc/static
sudo git clone https://github.com/SamsungInternet/ar-demos.git
sudo git clone https://github.com/jphone0921/3d.git
sudo rm objDetect.js
sudo rm local.html
cd /var/www/html/tfObjWebrtc/static/3d
sudo cp objDetect.js ..
sudo cp local.html ..
```
# 後製鏡頭
參考資料
https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
* local.js 的video改成以下
```shell=
video: {
width: {min: 640, ideal: 1280, max: 1920},
height: {min: 480, ideal: 720, max: 1080},
facingMode:"environment"
}
```
## 改鏡頭左右相反問題
* 修改 local.html 中的 -webkit-transform: scale(1, 1);
參考資料
https://tympanus.net/codrops/css_reference/scale/
# 運行
* 要先移除docker
* 在執行docker
```shell=
python server.py
http://localhost:5000/local chrome需https (火狐不用)
http://localhost:5000/video 狗狗
```
```shell=
sudo docker rm tf-webrtchacks
cd /var/www/html/tfObjWebrtc/
sudo docker run -it -p 5000:5000 --name tf-webrtchacks -v $(pwd):/code chadhart/tensorflow-object-detection:webrtchacks
pip install tensorflow==1.9.0
python server.py
```
# 結果
當辨識到撲克牌的時候,會相對應的出現其數字而在螢幕上顯示POKEMON。
EX: 數字9 > 皮卡丘