tensorflowで物体認識(YOLOv2)をやってみる

以前chainer版は試しました。
今回はtensorflowで実装されたYOLOv2をやってみたいと思います。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
[追記]
今回はkeras中心の構成になっており、tensorflowの実装は
後日記述したこちらを参考にしてください
weekendproject9.hatenablog.com
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

[環境]
 win7 64bit
 GTX 960
 python3.5
 tensolfolw 1.2.1
 keras 2.0.8


[準備]
参考HPがlinuxのやりかたなのでwinでの手順を書いていきます。
まず下記リンクからzipをDL→解凍。
GitHub - allanzelener/YAD2K: YAD2K: Yet Another Darknet 2 Keras
次に以下のURLをクリックしてDLし、先ほど解凍したフォルダに移動。
http://pjreddie.com/media/files/yolo.weights

次に以下のURLをクリックして同じフォルダに"yolo.cfg"を作成して中身をコピペ
https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolo.cfg

ライブラリ追加インストール

pip install numpy h5py pillow
pip install tensorflow-gpu==1.2.1
pip install keras==2.0.8

[物体認識テスト]
まずモデルを生成します

python yad2k.py yolo.cfg yolo.weights model_data/yolo.h5

実行するとwindowsならエラーがでます。
以下エラー内容(自分のをコピーし忘れたので人のを借用しました)

表示内容
____________________________________________________________________________________________________ 
Layer (type) Output Shape Param #Connected to
====================================================================================================
 lambda_1 (Lambda) (None, 3, 160, 320) 0
lambda_input_1[0][0]
____________________________________________________________________________________________________ 
convolution2d_1 (Convolution2D) (None, 1, 40, 16) 327696

.....
.....続く

エラー内容
Traceback (most recent call last):
  File "./yad2k.py", line 270, in <module>
    _main(parser.parse_args())
  File "./yad2k.py", line 254, in _main
    model.save('{}'.format(output_path))
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\engine\topology.py", line 2506, in save
    save_model(self, filepath, overwrite, include_optimizer)
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\models.py", line 106, in save_model
    'config': model.get_config()
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\engine\topology.py", line 2322, in get_config
    layer_config = layer.get_config()
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\layers\core.py", line 661, in get_config
    function = func_dump(self.function)
  File "C:\Users\DanMo\Anaconda3\envs\py35cv3\lib\site-packages\keras\utils\generic_utils.py", line 176, in func_dump
    code = marshal.dumps(func.__code__).decode('raw_unicode_escape')
UnicodeDecodeError: 'rawunicodeescape' codec can't decode bytes in position 195-196: truncated \uXXXX

どうやらwinだと特殊文字があってだめとのこと。
エラーが出ているkerasを書き換えに行きます。
Anacondaを使っている人は以下にインストールしたフォルダがあります
 C:\ProgramData\Anaconda3\Lib\site-packages\keras\utils 
もしくはここ
 C:\Users\ユーザー名\Anaconda3\Lib\site-packages\keras\utils 
ここの”generic_utils.py”を開き 175行目をコメントアウト、その下に新たに書き込みます

175    #code = marshal.dumps(func.__code__).decode('raw_unicode_escape')
176    code = marshal.dumps(func.__code__).replace(b'\\',b'/').decode('raw_unicode_escape')

セーブしたら再度実行

python yad2k.py yolo.cfg yolo.weights model_data/yolo.h5

今回はできました(194MBのファイルが生成される)

次に本題の物体認識です。

python test_yolo.py model_data/yolo.h5

実行するとimagesフォルダのoutフォルダに結果が表示されました。

f:id:weekendproject9:20170918180348j:plain:w350
f:id:weekendproject9:20170918180822j:plain:w350
f:id:weekendproject9:20170918180755j:plain:w350
f:id:weekendproject9:20170918180829j:plain:w350


2017/09/19 [追記]

PermissionError: [Errno 13] Permission denied:~~~~
というエラーが出ていたので対処しました。

・67行付近のoutputフォルダを生成しているifをコメントアウトを以下に変更

    c_path  = os.getcwd()#カレントディレクトリ取得
    output_file = "out"#出力フォルダ名
    o_path =  os.path.join(c_path,output_file)#出力フォルダパス生成
    if not os.path.exists(o_path):
        print('Creating output path {}'.format(o_path))
        os.mkdir(o_path)#生成

・205行付近の画像保存を以下に変更

  image.save(os.path.join(o_path, image_file), quality=90)

[参考]
YOLOv2(Keras/TensorFlow)でディープラーニングによる画像の物体検出を行う - Qiita
YOLOv2(TensorFlow)を使ってリアルタイムオブジェクト認識をしてみる - Qiita
UnicodeDecodeError · Issue #60 · allanzelener/YAD2K · GitHub
python - Keras model.to_json() error: 'rawunicodeescape' codec can't decode bytes in position 94-98: truncated \uXXXX - Stack Overflow
keras/generic_utils.py at master · fchollet/keras · GitHub

chainer v1系列最終版"chainer1.24"をインストールする

2017/9/17時点でpipでインストールするchainerはv2.0.1です。
これをv1系列の最終版の1.24にバージョンを落とします。

環境:
 win10
 python3.5.2

[pipでインストールする方法]

 pip install chainer==1.24

[ソースからインストールする方法]
まずこちらの一番下からzipをDL.
Release v1.24.0 · chainer/chainer · GitHub

フォルダ移動
 cd chainer-1.24.0\chainer-1.24.0
インストール
 python setup.py install

バージョン確認します

>python

>>> import chainer
>>> print(chainer.__version__)
1.24.0
>>>

無事インストールされました。
また、ubuntu16.04でも確認しましたがインストールできました。


おわり

chainerでYOLOv2をやってみる [訓練済みモデル実行編]

2017年7月ごろに一度YOLOv2でwebカメラから物体認識をさせたのですが、
今回違う環境で動かそうとしたところエラーが出たので対処しました。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
[2017/10/23追記]
自前データでの学習を載せました
ChainerでYOLOv2をやってみる [訓練/学習編] - ロボット、電子工作、AIなどの記録
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・


環境:
 win10
 chainer 1.21.0
 chainer 2.0.1


使用させてただいたプログラムはこちら
https://github.com/leetenki/YOLOv2

ここでDLして持ってきたら解凍。
次にすでに訓練されているモデルデータをDLするんですが、
YOLOv2/YOLOv2_execute.md at master · leetenki/YOLOv2 · GitHub
ここの

1、yolov2学習済みweightsファイルをダウンロードする。
 wget http://pjreddie.com/media/files/yolo.weights

2、以下のコマンドでweightsファイルをchainer用にパースする。
 python yolov2_darknet_parser.py yolo.weights

をしたところ、

<span style="color: #666666">C:\Users\YOLOv2-master\YOLOv2-master>python yolov2_da
rknet_parser.py yolo.weights
loading yolo.weights
loading initial model...
1 992
2 19680
3 93920
4 102368
5 176608
6 472544
7 505824
8 801760
9 1983456
10 2115552
11 3297248
12 3429344
13 4611040
14 9333728
15 9860064
16 14582752
17 15109088
18 19831776
19 29273056
20 38714336
Traceback (most recent call last):
  File "yolov2_darknet_parser.py", line 85, in <module>
    exec(txt)
  File "<string>", line 1, in <module>
ValueError: cannot reshape array of size 12265129 into shape (1024,3072,3,3)</span>

というエラーが出ました。
学習サイズが合っていないとのことなので合うサイズを持ってきます。

ここのお方がサイズが合ったものを提供してくださっています。
yolo.weights - Google ドライブ
ありがたくダウンロードして、YOLOv2-masterのフォルダに置く。
再度、chainer用にパースする

C:\Users\YOLOv2-master\YOLOv2-master>python yolov2_darknet_parser.py yolo.weights
loading yolo.weights
loading initial model...
1 992
2 19680
3 93920
4 102368
5 176608
6 472544
7 505824
8 801760
9 1983456
10 2115552
11 3297248
12 3429344
13 4611040
14 9333728
15 9860064
16 14582752
17 15109088
18 19831776
19 29273056
20 38714336
21 67029984
22 67465609
save weights file to yolov2_darknet.model

これでOK。

写真かWebカメラで動作確認。

python yolov2_darknet_predict.py data/people.png
python yolov2_darknet_camera.py 

f:id:weekendproject9:20170913184745p:plain:w250

※chainerのバージョンが1の系列なら実行可能です
※chainerが2のバージョンだと記述内容が変更になったためエラーで実行できません

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
[2017/10/23追記]
自前データでの学習を載せました
ChainerでYOLOv2をやってみる [訓練/学習編] - ロボット、電子工作、AIなどの記録
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

おわり


[参考]
how to use yolov2_darknet_parser.py ? · Issue #2 · leetenki/YOLOv2 · GitHub

ubuntu16.04にopencv3.3.0をインストールする(できなかった。。)

2017/09/07時点で最新のOpencvをUbuntu16.04にインストールしようとしました。
結果出来ませんでした。参考までにここに2種類載せます。

まず①、②の前にこちらを入れます。
opencvで使用するかなりの部分を入れてます(たぶn)。
このまま入れると環境によっては次回ログイン時に
 "The system is running in low-graphics mode."
って出てきて画面が映らなくなります。

$ 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 libjasper-dev libdc1394-22-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev  libxvidcore-dev libx264-dev libgtk-3-dev libatlas-base-dev gfortran

①の方法
Opencvの最新である3.3.0のソースURLを確認します。
Releases - OpenCV library

ホームに戻り、opencvを取ってきます。

本体を取得
$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/3.3.0.zip 
$ unzip opencv.zip

追加で取得
$ cd ~
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/3.3.0.zip
$ unzip opencv_contrib.zip

ビルド
$ cd opencv-3.3.0
$ mkdir build
$ cd build

$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D INSTALL_C_EXAMPLES=OFF \
      -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-3.3.0/modules \
      -D PYTHON_EXECUTABLE=~/.virtualenvs/cv/bin/python \
      -D BUILD_EXAMPLES=ON ..

ここで僕の環境では以下のエラーが出たのでここからは未確認の作業です。
 エラー:sys/videoio.h - not found
どうやらGCCのヴァージョンを最新にすればいいらしいです。

$ make -j4
$ sudo make install
$ sudo ldconfig

名前の変更
*cv2.cpython-35m-x86_64-linux-gnu.soが以下の場所にない場合は探す必要あり

$ cd /usr/local/lib/python3.5/site-packages/
$ sudo mv cv2.cpython-35m-x86_64-linux-gnu.so cv2.so

②の方法

$ cd ~
$ wget -O opencv.zip https://github.com/Itseez/opencv/archive/3.3.0.zip
$ unzip opencv.zip
$ cd opencv-3.3.0
$ mkdir release
$ cd release
$ cmake -DBUILD_TIFF=ON -DBUILD_opencv_java=OFF -DWITH_CUDA=OFF -DENABLE_AVX=ON -DWITH_OPENGL=ON -DWITH_OPENCL=ON -DWITH_IPP=ON -DWITH_TBB=ON -DWITH_EIGEN=ON -DWITH_V4L=ON -DWITH_VTK=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_opencv_python2=OFF -DCMAKE_INSTALL_PREFIX=$(python3 -c "import sys; print(sys.prefix)") -DPYTHON3_EXECUTABLE=$(which python3) -DPYTHON3_INCLUDE_DIR=$(python3 -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..


f:id:weekendproject9:20170913143728p:plain
 ↑ pythonの項目が入っている ↑

$ make -j4
$ sudo make install
$ sudo ldconfig

おわり

参考:
https://medium.com/@debugvn/installing-opencv-3-3-0-on-ubuntu-16-04-lts-7db376f93961
https://www.scivision.co/anaconda-python-opencv3/
http://pythonopencv.com/install-opencv-3-3-and-python2-7-3-5-bindings-on-ubuntu-16-04/

USB/ACコンセント、アダプター、バッテリーからSTMマイコンを起動させる

秋月などで売っているSTMマイコンは、回路上の初期設定でパソコンとの通信を確立しないと動作しません。
(電流制限のため)

このため、コンセントやモバイルバッテリーから給電したいときは動作しません。

[解決方法]
今回のマイコン:STM F303k8
STMマイコン上部のSB1を見つけます(写真赤丸)
f:id:weekendproject9:20170912164105j:plain

SB1をショートさせます。
f:id:weekendproject9:20170912164144j:plain

PC以外の電源にマイコンをつなげて起動してるか確認します。

おわり

Raspberrypi OS (stretch) のリポジトリを日本に変更する

2017/09/08時点でラズベリーパイ最新OS(stretch)のリポジトリを日本に変更します。
ラズパイOS:
Download Raspbian for Raspberry Pi

ここに変更可能な一覧があります。
RaspbianMirrors - Raspbian

今回はJAISTにしました。

deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi

これで完了。


おわり

RaspberryPiとUbuntu16.04にpipでtensorflowをインストールする

RaspberryPi3(Raspbian)とUbuntu16.04にtensorflowをインストールしていきます。

[python3系デフォルト設定]
*python2の人はここの作業は不要です。
すでに以下のpython3系のインストールをやっているとして

sudo apt-get install  python3 python3-pip python3-dev python3-numpy python3-scipy python3-matplotlib

まず僕の環境はpython3なので、
python3をデフォルトに設定させました

sudo nano .bashrc

一番下に記入

alias python=python3
$ . ~/.bashrc
$ python --version

確認できたらok

[tensorflowインストール]
次にネイティブpipでtensorflowをインストール
tensorflowでgpuとかpython2系3系があるので以下を参照

$ pip install tensorflow      # Python 2.7; CPU support (no GPU support)
$ pip3 install tensorflow     # Python 3.n; CPU support (no GPU support)
$ pip install tensorflow-gpu  # Python 2.7;  GPU support
$ pip3 install tensorflow-gpu # Python 3.n; GPU support

もしできなかった場合は、.whlでインストール
下のコマンドの最後にある”tfBinaryURL”の部分を自分の環境に合うURLに置き換える。

Python 2.7の場合
$ sudo pip  install --upgrade tfBinaryURL

# Python 3系の場合
$ sudo pip3 install --upgrade tfBinaryURL   

Python 2.7
CPU only:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.3.0-cp27-none-linux_x86_64.whl
GPU support:
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp27-none-linux_x86_64.whl

Python 3.4
CPU only:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.3.0-cp34-cp34m-linux_x86_64.whl
GPU support:
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp34-cp34m-linux_x86_64.whl

Python 3.5
CPU only:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.3.0-cp35-cp35m-linux_x86_64.whl
GPU support:
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp35-cp35m-linux_x86_64.whl

Python 3.6
CPU only:
https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.3.0-cp36-cp36m-linux_x86_64.whl
GPU support:
https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.3.0-cp36-cp36m-linux_x86_64.whl



ちなみにtensorflowのアンインストールは

$ sudo pip uninstall tensorflow  # for Python 2.7
$ sudo pip3 uninstall tensorflow # for Python 3.n

おわり