LaTeXのusepackage

Intro

論文を書こうとなったらLaTeXやWordフォーマットな訳ですが,私の狙っている学会ではLaTeXしかありませんでした.LaTeXは大学の修論以来だし当時も使いこなせてなんていなかった.やっとこさ体裁を整えた記憶があります.

最近はarXivでsourceが公開されているので,世のみなさんがどんな書き方をしているのか知れる訳ですが,見てみると知らないpackageが使われまくっています.こんなの絶対頭に入れられない…ということでこの記事で目についてものを備忘録的に書き連ねていきます.完全なる個人メモなので,何かのきっかけでココに辿り着いた方には大変申し訳ない産物かと思われます.

Packages

  • adjustbox[link]
    ページサイズに合わせて表の大きさを調整してくれる(のかな?)
  • cite[link]
    列挙して引用した場合の番号を適切に配置してくれます.
  • color[link]
    テキストに色をつけます.
  • colortbl[link]
    表の指定した箇所の背景に色付けを行います.
  • comment[link]
    複数行のコメントアウトに使用.
  • enumitem[link]
    箇条書きをいい感じに書くためのもののようです.
  • subfig[link]
    図を横に並べて描きたい時のツール.
  • table, tabular[link]
    表作成に必要です.usepackageしなくても読まれてる?

最後に

逐次予定

【論文メモ】FastFCN

FastFCNの紹介

Semantic Segmentationをターゲットとして2019年に提案された,FastFCNというネットワークについてまとめます.
私個人としては,low levelの特徴量をどう使ったら精度向上につながるのかという視点で読んでいきました.

arxiv.org

一言でいうと

Dilated Convolution[1]よりも効率的に,Denseかつ高解像度の特徴量を得るネットワークの提案

論文リンク

https://arxiv.org/abs/1903.11816

実装リンク

GitHub - wuhuikai/FastFCN: FastFCN: Rethinking Dilated Convolution in the Backbone for Semantic Segmentation.

著者/所属機関

Huikai Wu, Junge Zhang, Kaiqi Huang (Institute of Automation, Chinese Academy of Sciences)
Kongming Liang, Yizhou Yu (Deepwise AI Lab)

投稿日付

2019.03.28

概要

  • Dilated Convolutionの課題
    • Denseで高解像度の特徴量を得られるConvolutionの方法
    • 計算時間が長いこととGPUメモリの大量消費が課題
  • 計算コストを低減しつつ,高解像度の特徴量を得るネットワークを提案
    Joint Pyramid Upsampling(JPU)ネットワークと呼んでいる.
  • Dilated Convolutionと精度は同等以上,推論速度は約2~3倍速くなった.

f:id:osazo:20191013063825p:plain
Fig.1 Dilated Convolutionを使ったBackbone Network(output_stride=8)

新規性・差分

マルチスケールの特徴量の使い方として代表的な方法は以下の2つかと思います.

  • それぞれのスケールで出力を予想し,スケール間で和をとり最終出力とする.
    FCN8s,FCN16s等[1]が代表的です.
  • Decoderネットワークに低レベル特徴も入力する.
    U-Net[2]が代表的です.また,Deeplav v3+[3]でも取り入れられています.
    物体検出に出てくるFeature Pyramid Network[4]もこの一種と捉えられます.

提案手法はマルチスケール(high level & low level)の特徴量を統合し,JPUネットワークを通してDilated Convolutionの代替となるDenseで高解像度の特徴量を取得します.Dilated Convolutionと比較すると,最もhigh levelな特徴量の解像度が1/32なので,1/8のDilated Convolutionと比較するとコスト面でのメリットがあります.
イデアとしてはありそうなものなので(Feature Pyramid Networkの拡張と考えられる),探すと類似の既存研究は他にも出てきそうです.
またもう1つのメリットとして,提案されたモジュールは任意のBackboneに組み込み可能のようです.汎用性の高さはこの界隈では1つのウリと言って良いでしょう.

手法

  • Dilated Convolutionについて
    • Semantic SegmentationのSOTAネットワークのほぼ全てで使用されている
    • 通常はstride=2として解像度を落とす部分を,stride=1として高解像度化.
      Receptive fieldが狭くなるのでdilationを上げて対応.
    • 精度改善には貢献
    • 計算量,GPUメモリ使用量の増加がデメリット.
  • Joint Pyramid Upsamplingの提案
    • マルチスケールの特徴量を組み合わせて使用.
    • ASPPのような異なるdilationのConvによる特徴量を統合.
    • Dilated Convolutionを積層するよりも,計算量において効率的.
    • 精度の悪化もほとんどないか,あるいは改善している.

f:id:osazo:20191013063939p:plain
Fig2. FastFCNのPipe Line

f:id:osazo:20191013064046p:plain
Fig.3 Joint Pyramid Upsampling(JPU) Moduleの構成

結果

  • Pascal ContextではSOTAを更新
  • ADE20KでもSOTAではないものの,Dilated Convを用いたものよりも精度改善

参考文献

[1] [1511.07122] Multi-Scale Context Aggregation by Dilated Convolutions
[2] [1605.06211] Fully Convolutional Networks for Semantic Segmentation
[3] [1505.04597] U-Net: Convolutional Networks for Biomedical Image Segmentation
[4] [1802.02611] Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
[5] [1612.03144] Feature Pyramid Networks for Object Detection

UML概観

UMLを学ぶモチベーション

私の職種をざっくりとくくるとソフトウェアエンジニアになるのですが,出来ることと言えばライブラリを使い回しつつPythonで画像処理が出来るくらいのものです。
これではソフトウェアエンジニアとして胸を張れないので,ここではその基礎であるUMLについて学んでいきたいと思います。まずは, http://objectclub.jp/technicaldoc/uml/umlintro1 を参考にさせて頂き,UMLの全体像を理解していきたいと思います。

UMLとは何か?

Unified Modeling Languageの略で,オブジェクト指向分析,設計においてシステムをグラフィカルにモデル化する際の記法を規定した言語です。"規定"されたという部分が重要ポイントでしょうか。
実際にソフトを書いていると,自分以外の人が書いたコードが読みにくい!と思うことってありますよね。(逆も然り)それを少しでも減らすためには何か統一されたルールに沿った記法である必要があります。それがUMLです。

なぜUMLを使うか?

参考記事の中でも個人的に響くポイントです。 記事中ではシステムが大きくなるにつれて,コードの量が増えるにつれてUMLの必要性が高まることを示唆しています。 それは規模が大きくなるほどコミュニケーションの必要性が高まり,その時に共通言語,かつビジュアル的に記述されている設計書があるとそのハードルが下がる,というメリットがあるからでしょう。
弊社ではUMLでの設計プロセスに疑問を呈する方もいるのですが,まだプロダクトがその規模感に到達していないために出てくる声なのかもしれません。遅かれ早かれ直面する課題なんだろうな。

UMLダイアグラムの種類

UMLにはシステム開発の分析,設計フェイズで必要となる各種ダイアグラムが用意されています。

ダイアグラム 役割 開発フェイズ
ユースケース システムの境界,使用機能を定義 分析
アクティビティ図 システムの動作の流れを表現 分析,設計
状態遷移図 オブジェクトの取りうる状態,遷移を表現 分析,設計
クラス図 概念や静的なクラス間相互関係を表現 分析,設計
パッケージ図 各モデル要素の階層的グルーピング 分析,設計
相互作用図
シーケンス図 オブジェクト間のメッセージ交換の時系列表現 分析,設計
コラボレーション図 オブジェクトの集団の協調動作の表現 分析,設計
オブジェクト図 実行時のオブジェクト状態のスナップショット 分析,設計
コンポーネント システムを構成する実行可能モジュールや
ソースコードの物理的構造を表現
設計
配置図 システムを構成するマシンや装置の繋がりを表現 設計

各フェーズでやること

分析フェーズ

ユースケース図を中心に要求分析,要求定義を行います.その過程で見えてきた問題領域の概念を抽出し,クラス図を使ってモデリングをします.補助的に(特にフローチャートを作るような目的で)アクティビティ図,状態遷移図,シーケンス図,コラボレーション図が使用されます.ここで出てくるUMLは,ユーザーや顧客とのコミュニケーションツールとしての位置付けが大きいため,モデリングする際の言葉もユーザーに馴染みの良い言葉を用いるようにします.

設計フェーズ

このフェーズでのUMLは設計者間のコミュニケーションのために用いられます.そのため,扱われるUMLもより開発寄りのものが増えてきます.よく使われるものとして,クラス図,アクティビティ図,状態遷移図,シーケンス図,コラボレーション図があるようです.実装の設計や処理フローに関連したUMLたちですよね.これらのUMLが設計モデルとなり,このフェーズでのアウトプットとなります.
また,システムの論理的な側面とは別にアーキテクチャを決めておくことも必要です.ここでのアーキテクチャはシステム全体の構造を意味し,ハードウェア,データベースなどなど周辺要因から決定されるようです.これは開発も佳境まで進んだ段階でリソースが足りない!といったことがないように,事前に制約は決めておきましょうということですね.また,既に実績のあるアーキテクチャを持っている場合は,それをベースに考えるということもあるでしょう.(その方が楽ですもんね)

実装フェーズ

設計モデルを元に,実際のコーディングを行います.設計フェーズが理想的に進んでいれば,このフェーズでの仕事は要求を実装に落とし込む"作業"になるはずです.

まとめ

UMLの目的,種類,フェーズ毎の作業内容について概観しました.今回の内容はあくまで概観ですので,これでUMLを使ったモデリングができるようになった!とはもちろんいきません.具体的なUMLの作成は次回以降のブログで書きたいと思います.
UMLをベースとしたシステム開発は業務の円滑化に貢献してくれそうだと感じました.1人でシステム開発をするなら良いですが(そんなケースはほぼ皆無でしょう),複数人で開発する場合は設計書があった方がそれぞれの役割を明確化でき作業がし易いですよね.
これまでの自分の仕事を振り返ると,いきなり実装フェーズに飛んでしまうことが多かったなぁ…そういう仕事の仕方だとコミュニケーションも発生し辛い,I/Fが合わないなどのトラブル発生にも繋がってしまうように感じます.
今後はソフトウェアエンジニアとして恥ずかしくない仕事の仕方もできるようにしていかねば.

MIRU2019 初日Tutorial振り返り

MIRU2019 初日Tutorial振り返り

MIRU2019が7/29より始まりました。
第22回 画像の認識・理解シンポジウム (MIRU2019) — 第22回画像の認識・理解シンポジウム (MIRU2019)

早くビール飲みに行きたいので,手短にチュートリアルの感想などを記録しておきます。

Generative Adversarial Networksの基礎・発展・応用

NTTコミュニケーション科学基礎研究所 金子卓弘さん

  1. GANとVAEは知っていたが,それ以前のAuto Regressive Model,Flowなどは知らなかったので勉強になった。
  2. GANの発展の流れをデータセット,入力の条件付け,ネットワーク構造,目的関数という明確な区切りで説明してもらって分かり易かった。
  3. 個人的には生成モデルの研究者はデータ然り,目的関数然り,本質を見る力が高いように思いました。

特に3点目は重要だと思うんですよね。綺麗なデータを生成することを目的にすると,企業・人によっては何のためにやってんの?とちょっと冷たい目で見られるとこもある気はするんですが,実はそんな彼らの方がデータをよく見てるという。そういう副次的な効果でどう説いていったら良いのかな。私もGANそのものの研究とはいかずとも,色んなタスクへの応用としては使えるようにしたいですね。

近似最近傍探索の最前線

東京大学生産技術研究所 松井 勇佑さん

  1. 入力クエリがどの辞書データと近いかを探す問題
    Webアプリなどで需要の高いの高い問題(メルカリの類似商品サーチ機能など)
  2. 距離計算を厳密に行い解く方法
  3. 近似的に距離計算を行う方法
  4. Pythonライブラリとしてはfaiss,nmslibが強力

正直理解が全然追いつきませんでした…。
こういう時に実感するのが計算機科学,アルゴリズムに対する素養のなさですね。
いつか基本的な内容は一通り学びたいところ。計算をうまく怠ける方法はスケーラビリティの観点でもきっと必要になるであろう内容です。

グラフ信号処理〜基礎から応用まで〜

東京農工大学 田中 雄一さん

  • グラフの行列表現からグラフフーリエ変換の導入
    知っている人には自明かもしれないが,グラフラプラシアン固有ベクトル展開でフーリエ変換が表現できるのは面白かった。
  • フィルタリング(Graph Convolution)
    空間的なシフト不変性がないため,GFTした空間で畳み込んでIGFTで戻す
  • グラフ頂点のサンプリング
    なるべくinformativeなサンプリングをしたい。研究が現在進行形で進んでいるところ。
  • グラフ構造の学習
    点群は2D画像のように構造化されていないので,グラフと親和性があるように思いました。

Graph Convolutionは熱いという声はちらほら見かけていましたが,内容を全然知らなかったので良い勉強になりました。
画像を扱っていると構造化データが当たり前のように感じてしまいますが,世の中そうじゃないデータの方が多数ですからね。私は物忘れが激しいので,頭の中のグラフがイケてないのかもしれません。

『視覚は孤立に存在しない!』からグラント獲得スキルまで教えます

大阪大学先導的学際研究機構 共生知能システム研究センター 浅田 稔さん

  • ビジョン・ロボティクスに止まらず,様々な分野からヒントを得ようとしている
    分野を超えて考えることが重要。
  • 人の心を読め
    何かを伝えたい時にはとても大事なことだと思います。
  • 最後をMINORUで締めるのはオシャレ

すごくエネルギーを感じました。私は自分の興味対象にフォーカスしてしまいがちなのですが,そうすると他者とも真っ向勝負になってしまい分が悪い上に新しさもないというのは耳が痛いところです。まずは明日から視野を広げられるように学会を有意義に過ごしたいと思います。

余談

  • 大阪ってセミの鳴き声デカくないか?
  • 意外とコテコテの関西弁が聞こえてこない。
  • やぱ暑い…けど会場は寒い。明日も長袖は持ってこ。
  • やっとビール!(21時回ってしまった)

Virtualenvの使い方

Virtualenv

PythonのVirtualenvについてのメモです。ひとまず使えれば良いというレベルの理解でやってますので,もし間違い等あればコメントで指摘してもらえると嬉しいです。

Virtualenvとは?

PCにPythonをインストールして必要なライブラリをpipでインストールして…としていると,通常1つのマシンには1つの環境しか作れないものです。

しかし時として違うバージョンのPythonを使いたくなることがあると思います。例えばROSを使っているからPythonは2.7を通常使用しているけど,最新の深層学習の実装を試したいからPython3系を使い時などですね。

Virtualenvはそれを可能とする1つの方法です。Virtualenvは独立したPythonの環境をいくつも作ることができます。あるディレクトリ専用の環境を作る,というような使い方も可能です。

他にもDockerで独立な環境を作ってしまうという策もありますが,新しい環境を作る度に新しいコンテナを作り直す必要があるのでVirtualenvと比較すると少々手間かなと思います。

Virtualenvの使い方

Virutalenvの使い方は非常に簡単です。まずは仮想環境を作るためのパッケージインストールですが,Python3.3以降はvenvというパッケージが標準機能として組み込まれているため,特別な作業は一切不要です。

次に実際に仮想環境を作成していきます。 ここでは以下のようなユースケースを考えることにします。

  • 特定のタスク(例えば画像処理の勉強)のためのディレクトリ"my_dir"がある。
  • そのタスクで使うPython環境を"my_env"という名前で管理する。

主だった必要手順は次のたった3つだけです。

  1. 仮想環境を作る。
  2. 仮想環境をactivate状態にして仮想環境に入る。
  3. 仮想環境を抜けるときは状態をdeactivateにする。

まずはディレクトリを作ってcdします。

$ mkdir my_dir  
$ cd my_dir  
  1. 次のコマンドで仮想環境を作ります。

    $ python3 -m venv my_env  
    
  2. 次のコマンドで仮想環境に入ります。
    仮想環境に入ったら好きなパッケージをpipでインストールします。
    ここではnumpyのインストールを例にしました。

     $ source my_env/bin/activate  
     $ pip3 install numpy  
    

    実際にPythonを起動しnumpyがimportできることを確認してみて下さい。

  3. 次のコマンドで仮想環境を抜けます。
    $ deactivate
    もう一度Pythonを起動すると,今度はnumpyのimportでエラーが出るでしょう。

再度仮想環境に入りたい場合は,2.の操作を行うだけです。
これで仮想環境が使えるようになりましたね。

終わりに

Python(3系)の仮想環境の使い方についてまとめました。仮想環境を使うことでPythonの環境構成が非常に柔軟になります。また,pipでインストールするパッケージをrequirements.txtで管理するとパッケージ管理も容易になります。

ただし,apt or brewでインストールするものについては管理できないので,その際はdockerの使用を検討する必要が出てくる点はご注意下さい。

macbookで機械学習の環境構築

ノートPCを買い換えました

自宅にはノートPCが2台あったのですが,少々不満が溜まってきたので買い換えることにしました。ちなみに旧PCは以下の2つです。

  • dynabook(2011年購入)
    windowsが入っていましたが,使っているうちに重くなってきたのでubuntuに入れ替えました。(ubuntuは軽いですね。)
    ただ解像度がWXGAだったのがプログラミングの勉強をするには辛く,今回の買い換え理由の一番の要因となっています。
  • HP Pavilion ノートだけど自宅据え置きPCにしようと考えていたのでサイズも大きめの15.4インチ。
    windowsが入っていますが,なぜかすぐ重くなる。ディスク使用率が100%に張り付くんですよねー。
    ログインしてchromeを開くまでで20分ほどかかってましたから,もう完全な戦力外でした。

ということで買い換えの検討をした結果,macbook proという個人的には清水の舞台から飛び降りるような決断をしました!

私のニーズを全て満足してくれそうです!
これでどこでもプログラミングできるぞ!

機械学習環境の構築

それでは機械学習をやるためのPython環境を作っていきましょう。 尚,以下の記事を参考にさせて頂きました。
https://qiita.com/yoshizaki_kkgk/items/4663148a2b3ca078ddbc

brewのインストール

macではbrewというパッケージマネージャーを使うんですね。 ubuntuのaptと同じ位置付けかな。

homebrewのページからインストールのコマンドをターミナルにコピペします。homebrew

$ usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

python3のインストール

会社ではpython2を使うことがほとんどなんですが,今回はpython3で行きます。

$ brew install python3

これだけです。簡単ですね。

よく使うライブラリのインストール

本当はvirtualenvとかを使って管理したいんですが,その使い方は次の機会にまとめることにします。 ここでは仮想環境ではなく,ホストに入っていても良いほど使用頻度の高い物をいくつかインストールしておきます。
これに画像処理系のライブラリを追加すれば,最低限の機械学習環境にはなると思います。
(私が画像系のエンジニアであることをご了承下さい。)

$ pip3 install numpy matplotlib pandas scikit-learn ipython jupyterlab

 周辺のライブラリも一緒にインストールされましたが,全て正常にインストールを完了することができました。

最後に

初めてのmac OSで,機械学習の環境構築を行いました。
普段からLinux OSを使われている方は,ほとんど違いがないと感じられたかと思います。
mac OSの親はLinuxの親でもあるUnixベースらしいので,当然と言えば当然なのでしょう。
まだまだ環境構築は入口段階なので,自分好みの環境を作り上げていきたいと思います。