Quantcast
Channel: demura.net
Viewing all 757 articles
Browse latest View live

池の平研修

$
0
0

研究室で2泊3日で池の平温泉スキー場へ行きました。初日は晴れでしたが、2日目は一転して天気は雪模様。おかげ様でコースはパウダースノー。初級コースは小学生団体、自衛隊で多少混雑していましたが、中級コースは人影もまばらで、最高のスノーボード環境です。まるで、海でサーフィンをしている!?ようなフワフワ感です。たった二日ですが、初心者の中にはスラロームもできる学生も現れ驚きです。

夕食後に懇親会があり、研究室のメンバー同士楽しく語らった後、同席していた情報工学科向井研との合コン?になりました。お互いの研究についての苦労話などを語り合い、例年にもまして楽しく実りのある研修となりました。

出村研究室では、前学期はテニス、後学期はスノーボードの習得をメインに池の平研修に参加しています。


WRS FCSC 2019 競技結果と動画公開

$
0
0

WRS FCSC 2019:Happy Robotチームの陳列廃棄タスク

昨年12月に東京ビッグサイトで開始されたWRS FCSC2019トライアル競技会の結果と動画が以下のサイトで公開されました。

陳列廃棄タスクは、上位チームが産業ロボットアームを使用しているなか、金沢工業大学出村研究室Happy Robotチームは、学生の自作アームで韓国KAISTチームと僅差の4位。学生達はベストを尽くしたと思います。なお、KAISTチームはDARPA Robotics Challengeで優勝した研究室チーム。今回は競技会はわずか数カ月の準備で臨んだとのこと。ハードウェアはしっかりしているので、今年の本番では優勝候補の一角になるかもしれません。

Happy Robotチームでは今年の10月に開催される本大会World Robot Summit 2020に出場するメンバーを募集中です。学科学年は問いませんので興味のある学生は出村教授に連絡お願いします。

ROS Melodic: お勧め英語音声合成パッケージ picotts

$
0
0

ROSで使える英語の音声合成パッケージを探していたらオンライン、オフラインの色々なエンジンをサポートしているArnaud Rameyさんが開発した以下のパッケージを見つけた。本記事はインストールしたときのメモ。残念ながら日本語は対応していません。

サポートしているエンジン

  • オフライン:espeak, Festival, GNUstep, MaryTTS, pico2wave, speech_dispatcher
  • オンライン:AT&T, Google TTS, Ivona, Microsoft

インストール

  • picottsの取得
    • $ cd ~/catkin_ws/src
    • $ git clone https://github.com/arnaud-ramey/picotts.git
  •  各エンジン
    •  MaryTTS(オフラインの中ではとてもクオリティが高い)
      • $ sudo apt install mplayer (mplayerは他のエンジンでも使うので必須)
      • $ cd ~/src (~/srcがない場合はmkdir srcで作成してください)
      • $ sudo apt install default-jre
      • $ wget https://github.com/marytts/marytts/releases/download/v5.2/marytts-5.2.zip
      • $ unzip marytts-5.2.zip
      • $ cd marytts-5.2
      • $ wget https://github.com/marytts/voice-upmc-pierre-hsmm/releases/download/v5.2/voice-upmc-pierre-hsmm-5.2.zip
      • $ unzip voice-upmc-pierre-hsmm-5.2.zip
    • Festival
      • $ sudo apt install mbrola mbrola-fr*
    • GNUstep
      • $ sudo apt install gnustep-gui-runtime
    • speech_dispatcher
      • $ sudo apt install speech-dispatcher
  • 必要なファイルのインストール
    • $ rosdep install picotts --ignore-src
  • ビルド
    • $ cd ~/catkin_ws
    • $ catkin build picotts

実 行

  • MarryTTSを使う場合は以下のコマンドによりローカルでサーバーと設定用のクライアントを起動する。
    • $ cd ~/src/marrytts-5.2/bin
    • $ ./marytts-server
    • 別の端末を開き、同じディレクトリにあるクライアントプログラムを起動
      • $ ~/src/marrytts-5.2/bin/marrytts-client
  • 別の端末を開き、次のコマンドを実行
    • $ roscore
  • 別の端末を開き、次のコマンドを実行
    • $ rosrun picotts picotts.exe

テスト

  • 別の端末を開き、次のコマンドを実行。音が聞こえたら成功!
    • rostopic pub /tts std_msgs/String "My name is Happy Robot"
  • エンジンの切り替え: 別の端末を開き、オフラインで使いたいときはMarryTTSがお勧め、ネットに接続しているときはMicroSoftの方がクオリティが高い。なお、標準ではpico2waveなのでクオリティが低い。
    • MarryTTS (オフライン)
      • rostopic pub /picotts/engine std_msgs/String "MarryTTS"
    • Microsoft (オンライン)
      • rostopic pub /picotts/engine std_msgs/String "microsoft"

トピック

  • /tts  [std_msgs/String]  発話される文字列
  • /picotts/engine  [std_msgs/String]  使用されるエンジン。picottsノード実行中に変更可能

その他

演習

  • rostopic pubコマンドを使って”My name is Happy Robot”と発話させたが、これをpythonプログラムで実装しよう。

 

以上

ROS Melodic: Web Speech APIで音声認識

$
0
0

Wep Speech APIを使うと音声認識が簡単にできる。しかも、ROSパッケージは以下のサイトで公開されており、開発者furushchevさんの詳しい日本語の解説記事もある。本記事はその作業メモ。

作業環境

  • Ubuntu18.04
  • ROS Melodic
  • Google Chrome バージョン: 80.0.3987.87(Official Build) (64 ビット)(他のブラウザは対応してないようだ)

インストール

  1. 以下のサイトのとおり実施した。推奨されているaptでのインストールはmelodic用のパッケージが見つけられなかったのでソースからビルドした。wstoolはワークスペースのバージョン管理システム。https://github.com/tork-a/visualization_rwt
  2. ワークスペースを初期化する。
    • $ cd ~/catkin
    • $ wstool init src
  3. ワークスペースに新しいリポジトリを設定する。
    • $ cd src
    • $ wstool set visualization_rwt --git https://github.com/tork-a/visualization_rwt/
  4. ワークスペースのリポジトリをアップデートする。
    • $ wstool update
  5. 依存関係の解消
    • $ cd ~/catkin_ws
    • $ rosdep install --from-paths src --ignore-src --rosdistro ${ROS_DISTRO} -r -y
  6. ビルド
    • $ catkin build

実行

  • 端末を開き、以下のコマンドを実行する
    • $ roslaunch rwt_speech_recognition rwt_speech_recognition.launch
  • 以下のリンクをクリックするかChromeブラウザを起動し以下のアドレスを検索窓に入れる。
  • 音声認識をスタートさせるためには、以下のChrome画面で緑に塗られているStartボタンをクリックする。
  • Chromeの画面のマイクに英語で話しかけ、認識結果が表示されていれば成功。日本語で話しかけたい場合はブラウザのLanguageを日本語にすればよい。デフォルトではROSのトピック名が/Tablet/voiceになっているが、この画面から自由に変更できる。なお、連続して音声認識をしたい場合はModeをContinuousにすればよい。
  • では、最後にトピックを確認しよう。別の端末を開き、以下のコマンドで認識結果のトピック/Tablet/voiceを表示する。
    • $ rostopic echo /Tablet/voice

  • うまくいかない場合は、インストールの4,5,6番の作業を繰り返してみよう。私の環境ではそれで問題が解決した。

カスタマイズ

  • デフォルトではトピック名が/Tablet/voiceになっている。変更したいときは以下のファイル29行目のvalueの値を変更する。
    • ~/catkin_ws/src/visualization_rwt/rwt_speech_recognition/www/index.html

以上

VGG Image Annotator (VIA):インスタンスセグメンテーション用アノテーションツール

$
0
0
インスタンスセグメンテーション用アノテーションツールとして使っているVGG Image Annotator (VIA)の使用法のメモ。この記事は、2019年度出村研究室所属の園田君が制作した資料をベースに作成した。
ソフトウェアのインストールと準備
  • 以下のURLから、via-src-2.0.8.zipをダウンロードし、好きなディレクトリに解凍する。この例では~/srcに解凍する。
  • 画像を読み込むディレクトリと、プロジェクトを保存するディレクトリを事前に用意し、画像読み込み用のディレクトリに、アノテーションする画像を入れておく。この例では「sample」という名前で作成しているが、名前は自由。
    • 端末を開き以下のコマンドを実行して、画像読み込みようのディレクトリを作成する。
      • $ cd ~/src/via-src-2.0.8/data
      • $ mkdir sample
      • $ cd sample
      • $mkdir train  val
    • プロジェクト保存用ディレクトリを作成する。
      • $ cd  ~/via-src-2.0.8
      • $ mkdir project
      • $  cd project
      • $ mkdir sample
      • $ mkdir train  val

アノテーション作業

  • ファイルマネージャーを使って以下のファイルをダブルクリックして起動する。
    • ~/src/via-src-2.0.8/dist/via.html
  • 画像を読み込むには、左にあるバーのAdd Filesを左クリックした後に、画像読み込み用ディレクトリまで移動し、画像を選択する。選択に成功した場合、以下のような画面になる。
  • Region Shapeの中の形状し、アノテーションする。右から3番目のPolygon region shape(多角形)を選択した場合は、多角形の頂点で左マウスボタンをクリックし、アノテーション終了時にはEnterキーを押す。
  • アノテーションした各形状に固有の名前を付ける場合、左にあるバーのAttributesにキーボード入力できる欄がある。そこに「name」と入力し、横にある「+」を左クリックする。
  • アノテーションした形状(ここでは星型)を左クリックすると、下図のようにクラス名を入力できるようになるため、そこに好きなクラス名を入力する。
  • AttributesのToggle Annotation Editorを左クリックすると、現在表示している画像におけるラベリング情報を見ることができる。また、そこでも固有の名前を入力できる。
  • 現在、表示している画像のアノテーションが終われば、キーボードの「→」キーを入力し、次の画像をアノテーションする。このソフトウェアにおけるショートカットキーは、左のバーのなかにあるKeyboard Shortcutsの中に記載されている。他の例として、キーボードの「↑」「↓」キーを入力することで、以下の図のように、ラベリング情報の表示形式を変更できる。

JSONファイルの出力

アノテーションした情報を教師データとして使われるJSON(JavaScript Object Notation)フォーマットのファイルに出力する。JSONはウェブ等で良く使われる軽量のデータ交換フォーマットである。

  • アノテーション作業が全て終了したら、その情報をJSONファイルに出力する。上のバーのAnnotationからExportAnnotations (as json)を左クリックする。
  • 「via-export_json.json」というファイル名で保存される。このファイルは画像読み込み用ディレクトリに移動させておくとよい。この例ではtrainの中の画像をアノテーションしていると仮定。端末を開き以下のコマンドを実行する。
    • $ cd ~/src/via-src-2.0.8
    • $ mv via_export_json.json  ~/via-src-2.8.0/data/sample/train

プロジェクトの保存

アノテーション情報をプロジェクトとして保存することで、そのファイルを読み込めば前回終了した画像の続きからアノテーションを再開できる。

  • プロジェクトの保存の前に、読み込んでいる画像へのパスを指定する。上のバーのProjectからSettingsに移動。
  • Default Pathに画像へのパスを入力する。この例で、trainのディレクトリから読み込んでいるので、パスは以下になる。
    • ~/src/via-src-2.0.8/data/sample/train/
  • 最後に、下の「Save」ボタンを左クリックして設定完了。
  • 次に、プロジェクトを保存する。上のバーのProjectからSaveを選択。以下の画面になるのでProject Nameを好きな名前に変更してOKを左クリックすると本プロジェクトがJSONファイル形式で保存される。この例ではstar.json

  • このファイルをプロジェクト保存用ディレクトリに移動する。
    • $ cd download
    • $ mv star.json  ~/via-src-2.8.0/project/sample/train

プロジェクトの読み込み

  • 上のバーのProjectからLoadを選択する。そこからプロジェクト(JSONファイル(jsonファイル)
以上

ROS Melodic: シミュレータでTutlebot2 (Kobuki)を動かそう!

$
0
0

この記事はKobukiを使ったROS新人プログラム用の記事です。今回はシミュレータGAZEBOを使い、Kobuki(Turtlebot2)を動かします。

  Simulator GAZEBOを動かそう

次のコマンドでROSのシミュレータGazeboを起動する。

$ roslaunch turtlebot_gazebo turtlebot_world.launch

初回はネットからモデルを取得するので、私の環境で5分程度かかった。しばらくすると次のようなウインドウが開く。下のロボットがTurtlebot2 (kobuki)。

別の端末を開き、次のコマンドを入力するとキーボードからロボットを操縦するためのlaunchファイルを起動。
roslaunch turtlebot_teleop keyboard_teleop.launch

端末に下のように表示される。以下のキーでロボットを操作できる。いずれかのキーを押してロボットを動かそう!なお、マウスのカーソルがturtlebot_teleop_key.launchを起動した端末上になければ動かないので注意。

  • キー
    • i: 前進
    • j:その場、左回転
    • k: 停止
    • l:その場、右回転
    • m:左後方へ回転
    • o:右前方へ回転
    • u:左前方へ回転
    • ,:後進
    • .:右後方へ回転

お疲れ様!

ROS Melodic:トピック通信しよう!(python)

$
0
0


この記事はTurtlebot2 (Kobuki)を使ったROS新人プログラム用の記事です。今回はROSの通信方式であるトピックを学びます。

1. Publisher

キーボードからロボットを操縦するmy_teleopパッケージを作ろう!
はじめてのROSプログラミング(python)と同じ要領でmy_teleopパッケージを作ります。今回の例ではhelloをmy_teleopに置き換えます。このプログラムはメッセージの送リ手であるpublisher(配信者)プログラムの簡単な例にもなっています。プログラムの説明はソースコード内のコメントを参照してください。テキストエディタ(gedit)にコピペして名前を付けて保存します。
保存ディレクトリは~/catkin_ws/src/my_teleop/srcの中です。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import rospy #  rosで必要はモジュール
from geometry_msgs.msg import Twist
from std_msgs.msg import String

def teleop():
    rospy.init_node('my_teleop')  # ノードの初期化

    pub = rospy.Publisher('/cmd_vel_mux/input/teleop', Twist, queue_size=1)

    rate = rospy.Rate(30) # ループの周期。この場合は30Hz、1秒間に30回。
    vel = Twist()

    print("f: forward, b: backward, r: right, l:left")

    while not rospy.is_shutdown():
        key  = input() # 標準入力からキーを読み込む
        print(key)     # 読み込んだキーの値を標準出力へ出力

        if key == 'f': # fキーが押されていたら
            vel.linear.x  =  0.5
        elif key == 'b':
            vel.linear.x  = -0.5
        elif key == 'l':
            vel.angular.z =  1.0
        elif key == 'r':
            vel.angular.z = -1.0
            # linear.xは前後方向の並進速度(m/s)。前方向が正。
            # angular.zは回転速度(rad/s)。反時計回りが正。
        else:
            print("Input f, b, l, r")
        
        pub.publish(vel) # 速度指令メッセージをパブリッシュ
        vel.linear.x  = 0.0 # 並進速度の初期化
        vel.angular.z = 0.0 # 回転速度の初期化
        rate.sleep()        # 指定した周期でループするよう寝て待つ

if __name__ == '__main__':
    teleop()
    rospy.spin()

以下のコマンドでビルドして実行しよう。
$ cd ~/catkin_ws
$ catkin build 
$ roscore
$ rosrun my_teleop my_teleop.py

2. Subscriber

次に、メッセージの受け手であるsubscriber(購読者)の簡単なプログラムを示します。このプログラムはmy_teleop_nodeがパブリッシュするトピック/cmd_vel_mux/input/teleopをサブスクライブして、並進速度(Linear Velocity)と角速度(Angular Velocity)を標準出力に出力する簡単なプログラムです。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import rospy #  rosで必要はモジュール
from geometry_msgs.msg import Twist


def callback(vel):
    rospy.loginfo("Liner:%f",vel.linear.x)
    rospy.loginfo("Angular:%f",vel.angular.z)
    
    
def subscriber():
    rospy.init_node('my_subscriber', anonymous=True) # ノードの初期化

    # subscriberの作成。トピック/cmd_vel_mux/input/teleopを購読する。    
    rospy.Subscriber("/cmd_vel_mux/input/teleop", Twist, callback)

    # コールバック関数を繰り返し呼び出す。
    rospy.spin()
        
if __name__ == '__main__':
    subscriber()

ここで、馴染みのないコールバック関数callbackが登場しています。コールバック関数はIT用語辞典によると「コールバック関数とは、プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。」と定義されています。

通常はマウスで線を描くなどの処理を実装するような、あるイベントが起きた時に処理をするプログラムを実装する場合に使われます。通常は、マウスのイベント処理などの場合のようにマウスのボタンが押されたり、移動したときに自動的にコールバック関数が呼び出されますが、ROSではrospy.spin()で明示的に呼び出さなければいけません。rospy.spin()はノードが動いている間、コールバック関数を呼び続けます。ROSではメッセージの受け渡しにコールバック関数を使います。

では、今までパッケージを作った要領で、my_subscriberパッケージを作りましょう。
~/catkin_ws/src/my_subscriberディレクトリの下にCMakeLists.txt, package.xml, src
などを作ることになります。上のプログラムのファイル名はmy_subscriber.pyとなります。

以下のコマンドでビルドして実行しよう。
$ cd ~/catkin_ws
$ catkin build
$ rosrun my_subscriber my_subscriber.py

3. シミュレータでの確認
turtlebot2シミュレータを起動し、my_teleop_nodeとmy_subscriber_nodeの動作を確認しましょう。シミュレータを次のコマンドで起動します
$ roslaunch turtlebot_gazebo turtlebot_world.launch

次にmy_teleopノードを起動した端末にマウスカーソルを持って行いきます。
f, b, l, rキーでロボットが移動したら成功。キーを押した後はエンターキーを押す。
このシミュレータの場合は、/cmd_vel_mux/input/teleop_velをPublishするだけでロボットがその速度で移動します。

次にSubscriberのプログラムが動作しているか確認するために、my_subscriberノードを起動した端末を見ましょう。速度が表示されていたら成功です。

お疲れ様!

終わり

4. ホームワーク

  • キーsを押すと、turtlebot2が停止するようにmy_teleop.pyのソースコードを変更しよう!
  • my_teleop.pyではキーボードのf, b, r, lを押した後にエンターキーを押すと、一定の速度でturtlebot2が動き出します。キーを押すたびに並進速度が0.01 [m/s]ずつ増減、回転角度が0.1 [rad/s]ずつ変化するようにソースコードを変更しよう!
  • turtlebot2の移動する軌跡が正方形になるようプログラムを変更しよう!

DNN:Detectron2 インストール

$
0
0

Facebook人工知能が開発している最新の物体検出アルゴリズムを実装しているソフトウェアシステムDetectron2のインストールメモ。Detectron2をインストールする前にPyTorchをインストールする。PyTorchはDeep Learningのフレームワークで、2019年12月にPreferred Networksが自前のフレームワークChainerの開発をやめて、PyTorchに乗り換えたことで日本でも注目を集めている。Detectron2のインストールはpipなのでとても簡単。なお、上の写真は先日、ラボのメンバーと池の平温泉スキー場へ行ったときの写真に物体検出アルゴリズム(Mask R-CNN)をかけたもの。Truck以外はほぼ正解。

PyTorch

  • インストール
    • $ pip3 install torch torchvision
  • 検証
      • 次のコマンドを実行して正常にインストールされているか試す

    demulab@razer:~/$ python3
    Python 3.6.9 (default, Nov 7 2019, 10:44:02)
    [GCC 8.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from __future__ import print_function
    >>> import torch
    >>> x = torch.rand(5, 3)
    >>> print(x)
    tensor([[0.9640, 0.3798, 0.5884],
    [0.5195, 0.4264, 0.5103],
    [0.3345, 0.3081, 0.1180],
    [0.4120, 0.9787, 0.6587],
    [0.7861, 0.1901, 0.9091]])
    >>> torch.cuda.is_available()
    True
    >>>

Detectron2

  •  本記事はメモなので以下の説明に従ってインストール等をすることを勧める。
  •  環境
    • Python 3.6.9
    • PyTorch 1.4
    • CUDA 10.2
  •  準備
    • $ pip3 install cython
    • $ pip3 install pycocotools
  •  インストール
    •  インストール済みのCUDAのバージョンが10.2だったので以下のコマンドでソースからビルドした。Prebuild版はCUDA 10.1に対応している。
      • $ cd ~/src
      • $ git clone https://github.com/facebookresearch/detectron2.git
      • $ cd detectron2
      • $ pip3 install -e .
  • はじめよう!
    • チュートリアル
    • 訓練済みモデルによる推論デモ(コマンドによる実行)
      • $ cd ~/src/detectron2
      • $ wget http://images.cocodataset.org/val2017/000000439715.jpg -O input.jpg
      • $ python3 demo/demo.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --input input.jpg  --opts MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
      • 成功すると上図のようなウインドウが表示される。なお、demo.pyの使い方は次のコマンドで調べることができる。
      • $ python3 demo/demo.py -h
        usage: demo.py [-h] [--config-file FILE] [--webcam]
        [--video-input VIDEO_INPUT] [--input INPUT [INPUT ...]]
        [--output OUTPUT] [--confidence-threshold CONFIDENCE_THRESHOLD]
        [--opts ...]Detectron2 demo for builtin models
    • 訓練済みモデルによる推論デモ(プログラムによる実行)
      • 上のコマンドの代わりにプログラムで実行するためには以下のようなコードが必要となる。
      • # detectron2で使うモジュールのインポート
        from detectron2.engine import DefaultPredictor
        from detectron2.config import get_cfg
        from detectron2.utils.visualizer import Visualizer
        from detectron2.data import MetadataCatalog
        import cv2
        
        # 画像の読み込み
        im = cv2.imread("./input.jpg")
        
        # ネットワークの設定
        cfg = get_cfg()
        cfg.merge_from_file("./configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
        cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5  # set threshold for this model
        cfg.MODEL.WEIGHTS = "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl"
        
        # 推論
        predictor = DefaultPredictor(cfg)
        outputs   = predictor(im)
        
        # 結果の表示
        v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
        v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
        cv2.imshow('Results', v.get_image()[:, :, ::-1])
        cv2.waitKey(0) 
        cv2.destroyAllWindows()
        

       

      • このコードをtest.pyとして~/src/detectron2/myprogディレクトリ下に保存する。myprogフォルダはないので事前に次のコマンド作成する。
        • $ mkdir  ~/src/detectron2/myprog
      • 次のコマンドを実行すると上図のウインドウが表示される。ウインドウ上にマウスのポインタをもっていき、何かキーを押すとプログラムは終了する。
        • $  cd ~/src/detectron2
        • $ python3  myprog/test.py

終わり


Twitter始めました!

$
0
0

今までFaceBookも使っていましたが、テック系はTwitterが多いようなのでdemura.netもTwitterを2020年2月23日に始めました。よろしくお願いします。その名もdemura.net。同じなんかい。アドレスは次のとおりです。今の所、demura.netの記事のうち皆さんに有益になりそうな記事をシェアしていますが、そのうちブログにはアップするまでもない小ネタをアップする予定です。逆にフォローするとdemura.netの優良記事?!を見逃しません!?

  • https://twitter.com/NetDemura

DNN: Detectron2 オリジナルデータの学習1/2 (学習)

$
0
0

Detectron2でカスタムデータセット学習のメモ。以下のDetectron2 Beginner’s Tutorialを和訳して説明を加えたもの。TutorialがGoogle Colabというクラウドサービスを使ったJupyterノートブックなのでローカルマシンで動くようにPythonスクリプトを少し変更している。

データセットの準備

  • ここでは1クラスのみのThe balloon segmentation datasetを使う。Detectron2のModel Zooで利用できるCOCOデータセットで学習済みのモデルを使いBalloon segmentation datasetで学習する。なお、COCO(Common Objects in Context)は大規模な物体検出、セグメンテーション、キャプションのデータセットであるが、Balloon(風船)のデータは含まれていない。データセットをダウンロードして解凍する。
    • $ cd ~/src/detectron2/datasets
    • $ wget https://github.com/matterport/Mask_RCNN/releases/download/v2.1/balloon_dataset.zip
    • $ unzip balloon_dataset.zip
  • 以下のDetectron2 custom dataset tutorialに従ってBalloonデータセットをDetectron2に登録する。このBalloonデータセットは独自フォーマットなので、Pythonスクリプトで読み込み変換してDetectron2の標準フォーマットに変換する。詳細は以下のリンクを参照。
  • 以下のスクリプトを~/src/detectron2/myprog/balloon_train.pyとして保存する。
# データセットがCOCOフォーマットなら以下のコードは次の3行で置き換えることができる。
# balloon_train.py: modified the scripts as follows
# Dectron2 Tutorial.ipynb https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5
# データセットがCOCOフォーマットなら以下のコードは次の3行で置き換えることができる。
# from detectron2.data.datasets import register_coco_instances
# register_coco_instances("my_dataset_train", {}, "json_annotation_train.json", "path/to/image/dir")
# register_coco_instances("my_dataset_val", {}, "json_annotation_val.json", "path/to/image/dir")

import os
import numpy as np
import json
import cv2
import random
from detectron2 import model_zoo
from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.structures import BoxMode
from detectron2.data import DatasetCatalog, MetadataCatalog

def get_balloon_dicts(img_dir):
    json_file = os.path.join(img_dir, "via_region_data.json")
    with open(json_file) as f:
        imgs_anns = json.load(f)

    dataset_dicts = []
    for idx, v in enumerate(imgs_anns.values()):
        record = {}
        
        filename = os.path.join(img_dir, v["filename"])
        height, width = cv2.imread(filename).shape[:2]
        
        record["file_name"] = filename
        record["image_id"] = idx
        record["height"] = height
        record["width"] = width
      
        annos = v["regions"]
        objs = []
        for _, anno in annos.items():
            assert not anno["region_attributes"]
            anno = anno["shape_attributes"]
            px = anno["all_points_x"]
            py = anno["all_points_y"]
            poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
            poly = [p for x in poly for p in x]

            obj = {
                "bbox": [np.min(px), np.min(py), np.max(px), np.max(py)],
                "bbox_mode": BoxMode.XYXY_ABS,
                "segmentation": [poly],
                "category_id": 0,
                "iscrowd": 0
            }
            objs.append(obj)
        record["annotations"] = objs
        dataset_dicts.append(record)
    return dataset_dicts

def verify_dataset(dists_name):
    dataset_dicts = get_balloon_dicts(dicts_name)
    for d in random.sample(dataset_dicts,3):
        img = cv2.imread(d["file_name"])
        visualizer = Visualizer(img[:, :, ::-1], metadata=balloon_metadata, scale=0.5)
        vis = visualizer.draw_dataset_dict(d)
        cv2.imshow(dicts_name, vis.get_image()[:, :, ::-1])
        cv2.waitKey(2000) # wait 2000ms
        cv2.destroyAllWindows()

def train_dataset(dataset_name):
    cfg = get_cfg()
    cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
    # cfg.merge_from_file("../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
    cfg.DATASETS.TRAIN = (dataset_name,)
    cfg.DATASETS.TEST = ()
    cfg.DATALOADER.NUM_WORKERS = 2
    cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")  # Let training initialize from model zoo
    cfg.SOLVER.IMS_PER_BATCH = 2
    cfg.SOLVER.BASE_LR = 0.00025  # pick a good LR
    cfg.SOLVER.MAX_ITER = 300    # 300 iterations seems good enough for this toy dataset; you may need to train longer for a practical dataset
    cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128   # faster, and good enough for this toy dataset (default: 512)
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1  # only has one class (ballon)

    os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)
    trainer = DefaultTrainer(cfg) 
    trainer.resume_or_load(resume=False)
    trainer.train()

if __name__ == '__main__':
    # Prepare the data set
    dataset_name = "balloon_train"
    dicts_name   = "balloon/train"

    for d in ["train", "val"]:
        DatasetCatalog.register("balloon_" + d, lambda d=d: get_balloon_dicts("balloon/" + d))
        MetadataCatalog.get("balloon_" + d).set(thing_classes=["balloon"])
    balloon_metadata = MetadataCatalog.get(dataset_name)

    # Verify the data set
    verify_dataset(dicts_name)

    # train
    train_dataset(dataset_name)

次のコマンドを実行すると、写真のような風船がアノテーションされたウインドウが開く。Enterキーを押すと次のウインドウが開き、全部で3枚表示される。その後、学習が始まる。

  • $ cd ~/src/detectron2/datasets
  • $ python3  ../myprog/balloon_train.py


学 習

  • COCOデータセットで学習済みのR50-FPN Mask R-CNNモデルをBalloonデータセットでファインチューニングする。300回学習するのに、Google ColabのK80 GPUでは約6分、P100 GPUでは約2分かかるようだ。自分のGPU GTX1070 MAX Q搭載のノートPC(RAZER Blade 15)では2分38秒かかった。
  • 学習結果の可視化。学習が終了すると~/src/dectron2/datasets/outputにログが保存されるので以下のコマンドでTensorBoardを使い可視化する。
    • $ cd ~/src/dectron2/datasets
    • $ tensorboard --logdir output
      • 実行すると次のように表示されるのでURLをブラウザにコピペすると、下のようなブラウザ画面になる。
        • TensorBoard 2.1.0 at http://localhost:6006/ (Press CTRL+C to quit)

記事が長くなるので、推論は次のリンクをクリックしよう。

終わり

 

DNN: Detectron2 オリジナルデータの学習2/2 (推論)

$
0
0

Detectron2でカスタムデータセット学習メモの続き。長くなったので学習と推論に分けた。以下のDetectron2 Beginner’s Tutorialをもとに説明を加えたもの。TutorialがGoogle ColabのJupyterノートブックを使っているのでローカルマシンで動くようにPythonスクリプトを少し変更している。

学 習

推 論

  • 以下のスクリプトを~/src/detectron2/myprog/balloon_inference.pyとして保存する。
# balloon_inference.py
import cv2
import json
import numpy as np
import os
import random
from detectron2 import model_zoo
from detectron2.utils.visualizer import ColorMode
from detectron2.config import get_cfg
from detectron2.engine import DefaultPredictor
from detectron2.engine import DefaultTrainer
from detectron2.structures import BoxMode
from detectron2.utils.visualizer import Visualizer
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.evaluation import COCOEvaluator, inference_on_dataset
from detectron2.data import build_detection_test_loader

def get_balloon_dicts(img_dir):
    json_file = os.path.join(img_dir, "via_region_data.json")
    with open(json_file) as f:
        imgs_anns = json.load(f)

    dataset_dicts = []
    for idx, v in enumerate(imgs_anns.values()):
        record = {}
        
        filename = os.path.join(img_dir, v["filename"])
        height, width = cv2.imread(filename).shape[:2]
        
        record["file_name"] = filename
        record["image_id"] = idx
        record["height"] = height
        record["width"] = width
      
        annos = v["regions"]
        objs = []
        for _, anno in annos.items():
            assert not anno["region_attributes"]
            anno = anno["shape_attributes"]
            px = anno["all_points_x"]
            py = anno["all_points_y"]
            poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
            poly = [p for x in poly for p in x]

            obj = {
                "bbox": [np.min(px), np.min(py), np.max(px), np.max(py)],
                "bbox_mode": BoxMode.XYXY_ABS,
                "segmentation": [poly],
                "category_id": 0,
                "iscrowd": 0
            }
            objs.append(obj)
        record["annotations"] = objs
        dataset_dicts.append(record)
    return dataset_dicts


if __name__ == '__main__':
    train_dataset_name     = "balloon_train"
    val_dataset_name       = "balloon_val"
    val_dicts_name         = "balloon/val"

    for d in ["train", "val"]:
        DatasetCatalog.register("balloon_" + d, lambda d=d: get_balloon_dicts("balloon/" + d))
        MetadataCatalog.get("balloon_" + d).set(thing_classes=["balloon"])
    balloon_metadata = MetadataCatalog.get(train_dataset_name)

    cfg = get_cfg()
    cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
    # Pretraied weights
    # cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") 

    # Weights trained by a custom dataset
    cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth") #

    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7   # set the testing threshold for this model
    cfg.DATASETS.TRAIN= (train_dataset_name, )
    cfg.DATASETS.TEST = (val_dataset_name, )

    cfg.DATALOADER.NUM_WORKERS = 2
    cfg.SOLVER.IMS_PER_BATCH   = 2
    cfg.SOLVER.BASE_LR  = 0.00025  # pick a good LR
    cfg.SOLVER.MAX_ITER = 300      # 300
    # faster, and good enough for this toy dataset (default: 512)
    cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1  # only has one class (ballon)

    os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)

    trainer   = DefaultTrainer(cfg)  # trainer is used in evaluation
    trainer.resume_or_load(resume=False)

    # train is not need for the inference and evaluation phase
    # trainer.train() 

    # Inference
    predictor = DefaultPredictor(cfg)

    dataset_dicts = get_balloon_dicts(val_dicts_name)

    for d in random.sample(dataset_dicts, 3):    
        im = cv2.imread(d["file_name"])
        outputs = predictor(im)
        v = Visualizer(im[:, :, ::-1],
                       metadata=balloon_metadata, 
                       scale=0.8, 
                       # remove the colors of unsegmented pixels
                       instance_mode=ColorMode.IMAGE_BW )

        v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
        cv2.imshow("Inference", v.get_image()[:, :, ::-1])
        #cv2.waitKey(0)
        cv2.waitKey(2000) # wait for 2000ms
        cv2.destroyAllWindows()
    
    # Evaluation
    evaluator = COCOEvaluator(val_dataset_name, cfg, False, output_dir="./output/")
    val_loader = build_detection_test_loader(cfg, val_dataset_name)
    inference_on_dataset(trainer.model, val_loader, evaluator)

推 論

  •  次のコマンドを実行すると、写真のような風船が推論されたウインドウが開く。各ウインドウは2秒毎に切り替わり、全部で3枚表示される。その後、評価が始まる。
    • $ cd ~/src/detectron2/datasets
    • $ python3  ../myprog/balloon_inference.py

エラーの対応

  • 2020年2月27日時点では、coco APIの問題でnumpyのバージョンが1.18以上だとEvaluationすると次のエラーが出る。それを回避するためにnumpyのバージョンをダウンする。
    • object of type <class ‘numpy.float64’> cannot be safely interpreted as an integer
  • numpy
    • バージョンの確認
    • $ pip3 show numpy
      Name: numpy
      Version: 1.18.1
      Summary: NumPy is the fundamental package for array computing with Python.
      Home-page: https://www.numpy.org
      Author: Travis E. Oliphant et al.
      Author-email: None
      License: BSD
      Location: /home/demulab/.local/lib/python3.6/site-packages
      Requires:
  •  numpyのバージョンダウン
    • $ pip3 uninstall numpy
    • $ pip3 install numpy==1.17.0

DNN: Detectron2 Keypoint 検出モデル

$
0
0

Detectron2でキーポイント検出モデル(keypoint detection model)の推論を試したメモ。以下のDetectron2 Beginner’s Tutorialを和訳して説明を加えたもの。TutorialがGoogle Colabというクラウドサービスを使ったJupyterノートブックなのでローカルマシンで動くようにPythonスクリプトを少し変更している。

過去記事のMask RCNNとスクリプト自体はほとんど同じ。違うのはモデルの設定とウェイトファイルのみ。ほとんど同じスクリプトでいろいろなモデルを試せるのはDetectron2の良いところ。

  • 以下のスクリプトを~/src/detectron2/myprog/keypoint_inference.pyとして保存する。
# kepoint_inference.py
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
import cv2

# 画像の読み込み
im = cv2.imread("./happy_mini.jpg")

# ネットワークの設定
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7  # set threshold for this model
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml")

# 推論
predictor = DefaultPredictor(cfg)
outputs   = predictor(im)

# 結果の表示
v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
cv2.imshow('Results', v.get_image()[:, :, ::-1])
cv2.waitKey(0) 
cv2.destroyAllWindows()

サンプル画像のダウンロード

  • 以下の画像をダウンロードして~/src/detectron2/happy_mini.jpgとして保存する。

 

実 行

次のコマンドを実行すると、人間に関しては次の画像のようにKeypointが表示される。happy mimiちゃんは表示されないのね。

  • $ cd ~/src/detectron2
  • $ python3  ./myprog/keypoint_inference.py

終わり

セマンティック・セグメンテーション用アノテーションツール

$
0
0

セマンティック・セグメンテーション(semantic segmentation)をする機会が増えて、アノテーションツール(annotation tool)を探している。今使っているのは次のツール。シンプルで良いのだが少し自動化があればよい。

  • VIA (VGG Image Annotator )
    • シンプルで軽量なツール。オートアノテーション機能はない。ライセンスはBSD2なので、研究用、商用とも使いやすい。クラスの指定ななどややわかりにくい。

探したところ、以下のツールが良さそうで試している。特に、CVATは深層学習を使った自動アノテーション機能が豊富であり、多くのアノテーションフォーマットにも対応している。

使い方の記事は、お楽しみに!

OpenVINO:インストールメモ

$
0
0

OpenVINO(Open Visual Inference & Neural network Optimization)はIntelが開発しているDeep Learningの推論用ツールキット。CVATでオートアノテーション用のモデルをアップロードするために必要なのでインストールしたときのメモ。私の環境では以下のIntel OpenVINOのサイトに従って簡単にインストールできた。

OpenVINO Toolkit

環 境

  • Razer  Blade 15 (2018)
  • Ubuntu 18.04
  • Kernel 5.3.0-40-generic
  • Python 3.6.9

インストール

  • ダウンロード:次のサイトからLinux用のツールキットをダウンロードする。ダウンロードには登録が必要なので、必要事項を記入してダウンロードする。なお、AdBlockなどの広告ブロッカーを使っているとダウンロードできないで停止する。2020年3月7日時点では最新のバージョン2020.1だとCVATで問題が起きたので、2019R3.1のバージョンを選んだ。~/Downloadsに保存する。
  • インストール: 端末を開き次のコマンドを実行して、インストールする。
    • $  cd  ~/Downloads
    • $  tar  xvzf  l_openvino_toolkit_p_2019.3.376.tgz
    • $ cd  l_openvino_toolkit_p_2019.3.376
    • $  sudo  ./install_GUI
      • 特に変更することはないのでデフォルトのまま、Nextをクリックして最後のFinishを押してインストールを終了する。
  • 追加インストール:依存関係のある外部ソフトをインストールする。
    • $ cd /opt/intel/openvino/install_dependencies
    • $  sudo -E ./install_openvino_dependencies.sh
  • 環境変数の設定:~/.bashrcの最後に以下を追加し保存する。
    • source /opt/intel/openvino/bin/setupvars.sh
  • モデルオプティマイザーの設定:OpenVINOはエッジ用のツールなので学習はCaffe、TensorFlowなどの他のフレームワークを使う。他のフレームワークの学習済みモデルをインポートするツールがモデルオプティマイザーであり、学習済みのモデルを推論するために必要である。モデルオプティマイザーで学習済みのモデルを実行するときは、出力はネットワークのIntermediate Representation (IR)となり次の2つのファイルとなる。詳細はこのリンクを参照。
    • Intermediate Representation (IR)
      • .xml: ネットワーク構造
      • .bin: ネットワークの重み
    • 設定
      • $ cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites
      • $  sudo ./install_prerequisites.sh

検 証

  • インストールがうまくできたが以下のコマンドで確認する。下図のように車が識別できたら成功。
    • $  cd /opt/intel/openvino/deployment_tools/demo
    • $  ./demo_squeezenet_download_convert_run.sh
    • $  ./demo_security_barrier_camera.sh

Intel GPU用の設定

  • $ cd /opt/intel/openvino/install_dependencies/
  • $ sudo -E su
  • $  ./install_NEO_OCL_driver.sh
    • 実行すると以下のメッセージが出力された。

Adding demulab to the video group…
Installation completed successfully.

Next steps:
Add OpenCL users to the video group: ‘sudo usermod -a -G video USERNAME’
e.g. if the user running OpenCL host applications is foo, run: sudo usermod -a -G video foo
Current user has been already added to the video group

If you use 8th Generation Intel® Core™ processor, you will need to add:
i915.alpha_support=1
to the 4.14 kernel command line, in order to enable OpenCL functionality for this platform.

  • 第8世代のIntelプロセッサーを使っている場合は、i915.alpha_support=1をカーネルのコマンドラインに追加する必要がある。lscpuコマンドのモデル名を見るとわかる。私の場合は、以下なのでi7-の後の数字が世代となる。つまり、第8世代になるのでi915.alpha_support=1をカーネルのコマンドラインに追加しなければならない。
    • Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz
  • /etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTにi915.alpha_support=1を追加して次のようにする。
    • GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash i915.alpha_support=1″
  • 次のgrubで変更を反映させる。
    • $ sudo /usr/sbin/update-grub
  • リブートして検証を再度実行してフレームレートが上がっているか確認する。
    • $ sudo reboot
  • 検証
    • $  cd /opt/intel/openvino/deployment_tools/demo
    • Intel内蔵GPUを有効にするためには-d GPUのオプションをつけてスクリプトを実行する。
      • $  ./demo_security_barrier_camera.sh -d GPU
    • CPUとGPUの6回の平均は次のとおり。NVIDIAのGPUのように爆速にはならなかったが、私の環境ではGPUの方が約1.7倍高速になった。
      • CPU: 51.7 fps
      • GPU: 86.5 fps

終わり

OpenVINO:モデルのダウンロード、中間表現への変換、そして推論

$
0
0

OpenVINOはDNNの推論に特化したツールキット。学習済みのいろいろモデルをダウンロードしてから、OpenVINOで使える中間表現(IR)フォーマットに変換してから、推論までの作業メモ。以下のサイトに基づいている。

open_model_zoo: Model Downloader and other automation tools

環 境

  • Razer  Blade 15 (2018)
  • Ubuntu 18.04
  • Kernel 5.3.0-40-generic
  • Python 3.6.9
  • OpenVINO:2019.3.376 (2019R3.1) :DockerでインストールしたCVATで使っているOpenVinoと普通にインストールするOpenVINOのバージョンを合わせる必要がある。2020年3月8日時点だと不具合があったのでOpenVINOのバージョンを2019R3.1にしている。

モデルのダウンロード

  • Open Model Zoo repositoryからモデルをダウンロードする。
    • $ cd  ~/src
    • $ git clone  https://github.com/opencv/open_model_zoo.git
    • OpenVINO 2019R3.1のバージョンに合わせるため2019ブランチでチェックアウトする。これをしないとデモアプリのビルドで失敗する。
      • $ cd ~/src/open_model_zoo
      • $ git checkout 2019
    • デモアプリのビルド
      • $ cd ~/src/open_model_zoo/demos
      • $ ./build_demos.sh
      • ビルドが成功すると~/omz_demos_build/intel64/Releaseにバイナリが保存される。
    • 準備
      • OpenVINO 2019R3.1はインストールしておく。インストールしていない場合はここを参照。
      • $  cd /opt/intel/openvino_2019.3.376/deployment_tools/tools/model_downloader
      • 必要なツールのインストール
        • $ python3 -mpip install –user -r ./requirements.in
        • $ python3 -mpip install –user -r ./requirements-pytorch.in
        • $ python3 -mpip install –user -r ./requirements-caffe2.in
    • モデルのダウンロード
      • ダウンロードできるモデルを知るには次のコマンドを実行する。
        • $  cd /opt/intel/openvino_2019.3.376/deployment_tools/tools/model_downloader
        • $ ./downloader.py --print_all
      •  モデルをダウンロードする。全部ダウンロードすると約15GBになり、中間表現フォーマットに変換するとさらに約12GB、合計約27GBが必要になる。
        • 全部ダウンロード:ディスク容量に余裕がある場合は、次のコマンドで全てダウンロードする。
          • $ mkdir -p ~/openvino_models
          • $ ./downloader.py --all --output_dir ~/openvino_models
        • 一部のモデルだけダウンロード:次のコマンドを一部のモデルだけを実行する。ここでは、この記事で推論のテストを行う7個のモデルだけをインストールする。
          • $ ./downloader.py --name mask_rcnn_inception_resnet_v2_atrous_coco --output_dir ~/openvino_models
          • あと6個のモデルを一つずつダウンロードしてもよいがファイルに書くとまとめてダウンロードできるので、次のファイルをmodels.lstという名前で作成する。各行に1個のモデルを書いて改行する。
            human-pose-estimation-0001
            face-detection-adas-0001
            age-gender-recognition-retail-0013
            head-pose-estimation-adas-0001
            emotions-recognition-retail-0003
            facial-landmarks-35-adas-0002
            
          • $ ./downloader.py --list models.lst --output_dir ~/openvino_models
  • 中間表現への変換
    • 全部ダウンロードした場合:全モデルを以下のコマンドで推論エンジン用IRフォーマットに変換する。
      • $  cd /opt/intel/openvino_2019.3.376/deployment_tools/tools/model_downloader
      • $ ./converter.py --all --download_dir ~/openvino_models
    • 一部だけダウンロードした場合:次のコマンドを一部のモデルだけ変換する。
      • $  cd /opt/intel/openvino_2019.3.376/deployment_tools/tools/model_downloader
      • $ ./converter.py --name mask_rcnn_inception_resnet_v2_atrous_coco --download_dir ~/openvino_models
      • あと6個のモデルを一つずつ変換してもよいがダウンロードと同様にファイルを指定するとまとめてできる。
        • $ ./converter.py --list models.lst --download_dir ~/openvino_models

推 論

  • では、ダウンロードしたモデルのいくつかを使って推論してみよう。
  • Mask R-CNN Demo
    • $ cd ~/omz_demos_build/intel64/Release
    • $ ./mask_rcnn_demo -i ~/Desktop/images/ike2.jpg -m ~/openvino_models/public/mask_rcnn_inception_resnet_v2_atrous_coco/FP32/mask_rcnn_inception_resnet_v2_atrous_coco.xml
      • ここで、必ず必要となるオプションは-iと-m。-i:入力画像、-m:IRフォーマットの学習済みモデル。なお、-dのオプションでCPU、GPU、FPGA等を選択できるが私の環境ではGPUにすると処理時間が遅くなった。
    • 上記コマンドの実行結果。出力はout0.png。処理に約6秒かかったことがわかる。
    • 入力画像:ike2.jpg
    • 出力画像:out0.png
  • Human Pose Estimation Demo
    • $ cd ~/omz_demos_build/intel64/Release
    • 画像
      • $ ./multi-channel-human-pose-estimation-demo -i ~/Desktop/images/ike2.jpg -m ~/openvino_models/intel/human-pose-estimation-0001/FP32/human-pose-estimation-0001.xml
      • 出力として以下のようなウインドウが開く。CPUで12.53 fpsなのでまずまずの速さ。GPUの場合は15.4fpsと若干速くなった。
    • Webカメラ
      • $ ./multi-channel-human-pose-estimation-demo -i  /dev/video0  -m ~/openvino_models/intel/human-pose-estimation-0001/FP32/human-pose-estimation-0001.xml
        • Webカメラを使用するときは-iの後にカメラのデバイスファイル名を入れる。多くの場合はノートパソコン内臓のカメラのファイル名は/dev/video0。
      • 出力として以下のようなウインドウが開く。GPUの場合は約15fps、CPUの場合は1fpsぐらい遅くなるがほとんど変わらない。
  • Interactive Face Detection Demo
    • このデモは、顔検出、年齢・性別識別、頭の姿勢推定、感情識別、顔の特徴点が表示される。フレームレートもCPUで23fpsとかなり高速である。
    • $ cd ~/omz_demos_build/intel64/Release
    • Webカメラ
      • ./interactive_face_detection_demo -i cam -m ~/openvino_models/intel/face-detection-adas-0001/FP32/face-detection-adas-0001.xml -m_ag ~/openvino_models/intel/age-gender-recognition-retail-0013/FP32/age-gender-recognition-retail-0013.xml -m_hp ~/openvino_models/intel/head-pose-estimation-adas-0001/FP32/head-pose-estimation-adas-0001.xml -m_em ~/openvino_models/intel/emotions-recognition-retail-0003/FP32/emotions-recognition-retail-0003.xml -m_lm ~/openvino_models/intel/facial-landmarks-35-adas-0002/FP32/facial-landmarks-35-adas-0002.xml
      • 出力として以下のようなウインドウが開く。
        • 例として風船を持つ少女の画像を試すと感情Happyは当たっているように思えるが年齢が23歳と推定された。
        • 自分を試すと。27歳男性、驚き。年齢が倍ぐらい違う。感情も違う。この学習済み重みでは、年齢と感情はかなり違うが、それ以外は結構使えるかもしれない。

多くの学習済みモデルをCPUで推論しても、ロボットのアプリケーションで使えるレベルだと思う。次は、オリジナルデータで学習したモデルをOpenVINOで推論してみたい。

終わり


CVAT: Computer Vision Annotation Toolインストールメモ

$
0
0

OpenCVが開発しているCVAT(Computer Vision Annotation Tool)のインストールメモ。Dockerを使うのでインストールはとても簡単。ライセンスはMIT Licenseなので使いやすい。次の公式サイトのInstallation Guideの説明に従ってインストールした。特に問題がなかったので、この記事はInstallation Guideを意訳したものになっているので、公式サイトのInstallation Guideに従ってインストールするのが良い。英語が苦手は方は参考になるかもしれない。

公式サイト

環 境

  • Razer  Blade 15 (2018)
  • Ubuntu 18.04
  • Kernel 5.3.0-40-generic
  • Python 3.6.9
  • Google Chrome:ウェブブラウザはChromeしか対応していない。

インストール

  1. 端末を開き、次のコマンドを実行してdockerをインストールする。
    • $ sudo apt update
    • $ sudo apt install -y 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 add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
    • $ sudo apt update
    • $ sudo apt install -y docker-ce docker-ce-cli containerd.io
  2. ルート権限がなくてもdockerを実行できるように設定する。
    • $ sudo groupadd docker
    • $ sudo username -aG docker $USER
    • ログアウト、再ログインしてdockerがグループに追加されたか次のコマンドで確認する。dockerが表示されればOK。
      • $ groups
  3. docker-compose (1.19.0以上)をインストールする。docker-composeは複数のコンテナを定義したり実行したりするためのdockerのツール。
    • $ sudo apt install -y python3-pip
    • $ sudo python3 -m pip install docker-compose
  4. CVATのソースコードをGitHubのレポジトリからクローンする。
    • $ cd  ~/src
    • $ git clone https://github.com/opencv/cvat
    • $ cd cvat
  5. 次のコマンドでdockerのイメージをビルドする。Ubuntu16.04のdockerイメージとCVATサーバーを実行するために必要な全てのファイルをダウンロードする。
    • $ docker-compose build
  6. 管理者(superuser)の生成
    • $ docker exec -it cvat bash -ic ‘python3 ~/manage.py createsuperuser’
    • 管理者アカウントのパスワードを決める。詳細はDjangoドキュメントを参照。なお、DjangoはWEBアプリケーションを開発するためのフレームワークで、CVATに使われている。
  7. Google Chromeのインストール。CVATはChromeしか対応していないので、インストールしていない以下のコマンドでインストールをする。
      • $ curl https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add –
      • $ sudo sh -c ‘echo “deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main” >> /etc/apt/sources.list.d/google-chrome.list’
      • $ sudo apt-get update
      • $ sudo apt-get install -y google-chrome-stable

実 行

  • CVATをdockerでインストールしたので、次のコマンドでCVATのdockerコンテナを起動する。-dのオプションをつけるとバックグラウンドで実行するので、実行した端末で作業を続けることができる。
    • $ cd ~/src/cvat
    • $ docker-compose up -d
  • CVATはサーバーアプリケーションなので、CVATを起動したらChromeを起動して、localhost:8080にアクセスする。
  • 管理者としてログインしてパスワードを入力する。これでアノテーション作業が可能となる。詳細は以下のリンクを参照。CVATのドキュメントはとても詳しい。

終わり

CVAT: 追加コンポーネントのインストール

$
0
0

OpenCVが開発しているCVAT(Computer Vision Annotation Tool)への追加コンポーネントのインストールメモ。コンポーネントを追加することで自動アノテーションが可能となる。以下のリンクにしたがって作業した。ただし、現時点(2020-3-10)では、OpenVINOを最新バージョンにすると自動アノテーションでエラーが出たのでOpenVINOのバージョンは2019R3.1にしている。

参考リンク

自動アノテーションに関する追加コンポーネント

  • 自動アノテーションに関する追加コンポーネントは全部で5つあり、参考リンクにしたがって概要とインストール方法を説明している。使い方に関しては長くなるので別記事で作成予定。
  1. OpenVINOフォーマットの深層学習による自動アノテーション
    • 参考リンク
    •  概要
      • OpenVINOフォーマットの深層学習を使って自動アノテーションが可能になる。OpenVINOフォーマットに対応している学習済みモデルはOpen Model Zooリポジトリに多くあるし、さらに、自分で作成したモデルをOpenVINOフォーマットに変換するとそれを使って自動アノテーションできる驚くべき機能。
    • インストール
      • 最新のOpenVINOツールキットの圧縮ファイル(.tgz)を以下のディレクトリに保存するだけ。ビルドする必要はない。とても簡単。いずれ改善されると思うが現時点では自動アノテーションで不具合がでるのでl_openvino_toolkit_p_2020.1.023.tgzを保存する。
        • ~/src/cvat/components/openvino
      • 以下のソフトウェア利用許諾契約を承認する。
        • ~/src/cvat/components/openvino/eula.cfg
      • ビルド:CVATをDockerでインストールしたのでDockerイメージをビルドする。
        • $ cd ~/src/cvat
        • $ docker-compose -f docker-compose.yml -f components/openvino/docker-compose.openvino.yml build
    • 実行
      • Dockerでインストールしたので、Dockerコンテナの実行するとCVATを使える。
        • $ cd ~/src/cvat
        • $ docker-compose -f docker-compose.yml -f components/openvino/docker-compose.openvino.yml up -d
    • OpenVINO学習済みモデルのダウンロード
    • 使い方
      • 別記事で作成予定。
  2. Tensorflow物体検出
    • 参考リンク
    •  概要
    • ビルド
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/tf_annotation/docker-compose.tf_annotation.yml build
    • 実行
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/tf_annotation/docker-compose.tf_annotation.yml up -d
    • 使い方
      • 別記事で作成予定。
  3. NVIDIA GPUのサポート
    • 参考リンク
    • NVIDIA Dockerのインストール
      • 以下のリンクに従いインストールする。
      • インストールに成功すると以下のコマンドでnvidiaと表示される。
        • $ docker info | grep ‘Runtimes’
    • ビルド
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/cuda/docker-compose.cuda.yml build
    • 実行
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/cuda/docker-compose.cuda.yml up -d
  4. Deep Extreme Cutによる半自動アノテーション
  5. 自動セグメンテーション:Keras+Tensorflow Mask R-CNN
    • 参考リンク
    • 概要
      • COCOデータセットで学習済みのMask R-CNN (バックボーン  FPNとResNet101)を使った自動アノテーション。サポートするクラスは参考リンクを参照。
    • ビルド
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/auto_segmentation/docker-compose.auto_segmentation.yml build
    • 実行
      • $ cd ~/src/cvat
      • $ docker-compose -f docker-compose.yml -f components/auto_segmentation/docker-compose.auto_segmentation.yml up -d
    • 使い方
      • 別記事で作成予定。

追加コンポーネントを全て使いたい場合

  • 上の説明では各コンポーネントごとのDockerイメージの作成とコンテナの実行方法を説明している。追加コンポーネントを全て使いたい場合は以下のコマンドを実行する。
  • Dockerイメージのビルド
    • $ cd ~/src/cvat
    • $ docker-compose
      -f docker-compose.yml
      -f components/openvino/docker-compose.openvino.yml
      -f components/tf_annotation/docker-compose.tf_annotation.yml
      -f components/cuda/docker-compose.cuda.yml
      -f cvat/apps/dextr_segmentation/docker-compose.dextr.yml
      -f components/auto_segmentation/docker-compose.auto_segmentation.yml build
  • Dockerコンテナの実行
    • $ cd ~/src/cvat
    • $ docker-compose
      -f docker-compose.yml
      -f components/openvino/docker-compose.openvino.yml
      -f components/tf_annotation/docker-compose.tf_annotation.yml
      -f components/cuda/docker-compose.cuda.yml
      -f cvat/apps/dextr_segmentation/docker-compose.dextr.yml
      -f components/auto_segmentation/docker-compose.auto_segmentation.yml  up -d
  • 私の環境では全部入りするとcvatのイメージが8.86GBになった。docker imagesコマンドで確認できる。

 

 

  • CATのスクリーンショット。追加コンポーネントを入れるとModelsにRCNN Object DetectorとMask RCNN Object Detectorが追加される。Deep Extreme Cutのモデルはここには表示されない。
    終わり

CVAT: タスクの生成

$
0
0

OpenCVが開発しているCVAT(Computer Vision Annotation Tool)のタスク生成のメモ。CVATはドキュメントが充実している。英語が読める方は参考リンクを参照。

参考リンク

タスク生成

  • http://localhost:8080にアクセスして、ユーザ名とパスワードを入力して”Sign in”をクリックしてログインする。
  • “Create new task”をクリックしてTask画面に移る。
  • “Create a new task” 画面になるので以下を入力する。
    • Name:タスクの名前
    • Labels:ラベル名
      • “Add label”ボタンをクリックしてラベル名を追加する。続けて他のラベル名を追加する場合は”Continue”ボタンをクリックし、終了する場合は”Done”ボタンをクリックする。必要に応じて各ラベルに属性を追加できる。詳細は参考リンクを参照。
    • Select files:アノテーションするファイル群を選択して”Submit”をクリックする。
  • 成功すると画面左上のTasksをクリックすると次のようにタスクが生成されているのがわかる。

終わり

CVAT:カスタムモデルによる自動アノテーション

$
0
0

CVAT(Computer Vision Annotation Tool)ではカスタムDNNモデルによる自動アノテーションができる。この記事は以下の参考リンクをもとにOpenVINOの学習済みネットワークモデルをアップロードして、fruit-360データセットのtest_multipule_fruits(45画像)に自動アノテーションまで実施する。なお、参考リンクとは違うネットワークモデルを試している。

参考リンク

概 要

  • CVATではOpenVINOのコンポーネントをインストールすると、以下の4つのファイルを用意するだけでカスタムモデルを使って自動アノテーションできる。とても便利な機能だ。
    1. Model config (*.xml) – ネットワーク構成が記述されたテキストファイル。拡張子はxml。
    2. Model weights (*.bin) - 学習済みのウェイトファイル(バイナリ)。拡張子はbin。
    3. Label map (*.json) – ラベルの番号とオブジェクトを対応させる簡単な json ファイル。拡張子はjson。以下はその例。なお、以下の実行例では、このmapping.jsonを使っている。
      {
        "label_map": {
          "0": "apple",
          "1": "orange"
        }
      }
      
    4. Interpretation script (*.py) – ネットワークの出力層をCVATで処理できるように変換するPythonスクリプト。このコードはPythonのある限定された環境で実行される。ただし、 str, int, float, max, min, rangeなどの組み込み関数は利用できる。この記事では以下のスクリプト~/src/cvat/utils/open_model_zoo/mask_rcnn_inception_resnet_v2_atrous_coco/interp.pyを使った。詳細については参考リンクを参照。
      import numpy as np
      import cv2
      from skimage.measure import approximate_polygon, find_contours
      
      MASK_THRESHOLD = .5
      PROBABILITY_THRESHOLD = 0.2
      
      # Ref: https://software.intel.com/en-us/forums/computer-vision/topic/804895
      def segm_postprocess(box: list, raw_cls_mask, im_h, im_w, threshold):
      ymin, xmin, ymax, xmax = box
      
      width = int(abs(xmax - xmin))
      height = int(abs(ymax - ymin))
      
      result = np.zeros((im_h, im_w), dtype=np.uint8)
      resized_mask = cv2.resize(raw_cls_mask, dsize=(height, width), interpolation=cv2.INTER_CUBIC)
      
      # extract the ROI of the image
      ymin = int(round(ymin))
      xmin = int(round(xmin))
      ymax = ymin + height
      xmax = xmin + width
      result[xmin:xmax, ymin:ymax] = (resized_mask>threshold).astype(np.uint8) * 255
      
      return result
      
      for detection in detections:
      frame_number = detection['frame_id']
      height = detection['frame_height']
      width = detection['frame_width']
      detection = detection['detections']
      
      masks = detection['masks']
      boxes = detection['reshape_do_2d']
      
      for index, box in enumerate(boxes):
      label = int(box[1])
      obj_value = box[2]
      if obj_value >= PROBABILITY_THRESHOLD:
      x = box[3] * width
      y = box[4] * height
      right = box[5] * width
      bottom = box[6] * height
      mask = masks[index][label - 1]
      
      mask = segm_postprocess((x, y, right, bottom),
      mask,
      height,
      width,
      MASK_THRESHOLD)
      
      contours = find_contours(mask, MASK_THRESHOLD)
      contour = contours[0]
      contour = np.flip(contour, axis=1)
      contour = approximate_polygon(contour, tolerance=2.5)
      segmentation = contour.tolist()
      
      # NOTE: if you want to see the boxes, uncomment next line
      # results.add_box(x, y, right, bottom, label, frame_number)
      results.add_polygon(segmentation, label, frame_number)
      

実行例

  • 準 備
    • では、OpenVINO用に公開されている次のモデルを使って自動アノテーションしてみよう。
      •  mask_rcnn_resnet101_atrous_coco
    • モデルのダウンロードに関しては以下の記事を参照。
    • ダウンロードしたモデルから次の2つのネットワーク構成ファイルと重みファイルを使う。
      • /openvino_models/public/mask_rcnn_resnet101_atrous_coco/FP32/mask_rcnn_resnet101_atrous_coco.xml
      •  /openvino_models/public/mask_rcnn_resnet101_atrous_coco/FP32/mask_rcnn_resnet101_atrous_coco.bin
    • 残りのmapping.jsonとinterp.pyは以下を利用した。interp.pyは上で掲載したinterp.pyと同じ。
      • mapping.json
      • ~/src/cvat/utils/open_model_zoo/mask_rcnn_inception_resnet_v2_atrous_coco/interp.py
  • タスクの生成
    • 以下のリンクを参考にアノテーションするタスクを生成する。
      • CVAT: タスクの生成
      • この例ではオートアノテーションをかけるデータセットとしてFruits 360 (Version 1)のtest-multiple-fruits(45枚)を用いた。次のリンクからダウンロードできる。
  • 自動アノテーション
    • Tasks画面から自動アノテーションしたいタスクのActions -> Automatic annotationをクリックする。
    • Modelを選択する次の画面になるので、”Select a model”をクリックして好きなモデルを選び、自動アノテーションをかける。この例ではmask_rcnn_resnet101_atrous_cocoモデルを選択した。
    • 次の画面になるので、ラベルと認識結果の対応を確認して問題なければ”Submit”をクリックする。左列がmapping.jsonのクラス名、右列がTaskを生成するときに設定したラベル名。
    • 下のような画面になり、進行状況が緑色のプログレスバーで表示される。私の環境ではGPUを使わずに、46枚を自動アノテーションするのに約6分かかった。
  • 結果の確認
    • では、自動アノテーション結果を確認してみよう。Tasksの”Open”をクリックする。
    • 下画面になるので、一番したの”Try new UI”をクリックする。
    • COCOデータセットの学習済みネットワークで自動アノテーションかけた。画像によって比較的うまくアノテーションをかけられているものもあれば、だめなものもある。サンプルを以下に示す。
        • 比較的うまくいった例

      • うまくいかなかった例
  • まとめ
    • 自動アノテーションで全て済めば、そもそもDNNに学習させる必要はないが、うまく活用するとアノテーション作業にかけるリソースを大幅に削減できる可能性がある。

終わり

Xubuntu16.04からVoyager18.04へ

$
0
0

仕事で使っているデスクトップパソコンがXubuntu16.04だったのでそろそろサポートが切れる。Voyager18.04にアップグレードしたので作業メモ。VoyagerはXubuntu18.04ベースのおしゃれなフレンチディストリビューション。上の壁紙はVin rougeをイメージさせる。

環 境

  • CROYDON (BTO組立パソコン)
    (CPU: Intel i7-8700K, GPU: Nvidia 1080Ti, Memory:32GB)
  • Motherboard: ASRock Fatal1ty Z370 Gaming K6
  • Voyager 18.04

ソフトウェアRAIDの解除

  • 必要なファイルのバックアップを取る。RAIDを適用しているのは/homeのみなので、それだけを外付けハードディスクに保存した。約350GBあり、データを保存するまで約半日要した。
  •  現在の環境はVLM上でソフトウェアRAIDを組んでいる。まず、Rootでログインして、次のコマンドでRAIDを解除した。
    • # umount /dev/mapper/vg0-home
    • #  /etc/fstabの該当行を次のようにコメントアウトする。
      • #/dev/vg0/home   /home  ext4  defaults  1   2
    • # reboot
    • 再起動後に/homeを確認すると今までのユーザがないことを確認する。

Voyager 18.04のインストール

  • ダウンロード
  • インストールUSBメディアの作成
    • ダウンロードしたイメージファイルを使いUSBインストールメディアを作成する。ここではLinuxで作成する手順を示す。Voyagerのイメージファイルは1.8GBなので2GB以上のUSB Flash Memoryを用意する。最近はコンビニで8GBなら1000円程度で購入できる。
    • USB Flash MemoryをPCに挿入する
    • USBメモリがマウントさえていると作業できないのでアンマウントする。ファイルマネージャーでもよいし、以下のコマンドでもできる。
      • $ df
        • /dev/sda1 1796960 1796960 0 100% /media/ユーザ名/USB DISK
        • 上のように表示されている場合は/dev/sda1がマウントされている。
      • $ sudo  umount  デバイス名
        • 上の例ではデバイス名は/dev/sda1
      • $ df
        • /dev/sda1は表示されていないことを確認する。
    • イメージファイルをddコマンドを使いUSBメモリに書き込む
      • $sudo dd if=イメージファイル of=USBメモリのデバイス名  bs=ブロックサイズ
        • この例では以下になる
        • イメージファイル:/home/ユーザ名/Downloads/Voyager-18.04.2-amd64.iso
        • デバイス名:/dev/sda    (sda1ではない。数字を除くので注意)
        • ブロックサイズ:4096   (デフォルトは512。4096は私のファイルシステムのブロックサイズ)
  • インストール
    • BIOSの設定を変更して、USBメモリからブートできるようにしてVoyager18.04.2をインストールする。
    • 不具合を避けるためクリーンインストールする。「ディスクを削除してXubuntuをインストール」を選び、「新しいXubuntuのインストールにLVMを使用する」にチェックを入れる。後は指示に従いインストールするだけ。
  • ソフトウェアRAIDの復旧
    • $  sudo apt install  mdadm
    •  /etc/fstabの一番下の行に以下を入れる。
      • /dev/vg0/home   /home  ext4  defaults  1   2
    • $ sudo reboot
    • 再起動が終了すると/homeが復活する。
  •  設定
    •  日本語化
      • Settings->Language Support 「The language support is not installed completely」と表示されるので、[Install]をクリック
      • Settings->Language Support
        • Install/Remove Languages -> Japanese
        • Keyboard Input method system -> fcitx
      • 再起動すると日本語を使えるようになる。
    • ホームディレクトリのフォルダ名を日本語から英語に変更する。
      • $ LANG=C xdg-user-dirs-gtk-update
    •  Conkyの文字化けを直す
      • 日本語フォントを設定して日本語化もできるが、デザイン的に英語が合うので、英語で表示する。
      • この記事のとおり実施
      • メニュー->設定->セッションと起動->自動開始アプリケーションのConky Controlを選択してEditをクリックする。コマンドに以下に変更する。つまり、言語環境を英語にする。
        • ALLh -c “sleep 5;LC_ALL=C sh ~/.scripts/Conky/DemConky.sh;”
    •  すぐ必要なソフトのインストール
      • $ sudo apt install git emacs25
    • CAPS LOCKとCTRLキーの入れ替える
      • /etc/default/keyboardのXKBOPTIONS=”ctrl:nocaps”と変更する。
    • ログイン画面に写真を入れる
      • 入れたい写真の画像ファイルを~/.faceにコピーする。これだけ。
    • ブートのメニューを変更するのは、Grub Customizerを使うと簡単。以下のコマンドでインストールできる。
      • sudo add-apt-repository ppa:danielrichter2007/grub-customizer
      • sudo apt update
      •  sudo apt install grub-customizer
    • Grub Customizerは以下のコマンで実行する。使い方は検索して調べる。
      • sudo grub-customizer

Fin

 

Viewing all 757 articles
Browse latest View live