U-Netのネットワーク構成を可視化してみた

Photo credit: Christian Gloor (mostly) underwater photographer via Visual Hunt / CC BY

U-Netのネットワーク構成をDocker版Caffeのdraw_net.pyで可視化してみました。

U-Netは、以下の記事のFCNと同じく、セグメンテーション用のネットワークです。

FCNのCaffe実装でセグメンテーションデモを試してみた
FCN(Fully Convolutional Network)のCaffe実装でセマンティック・セグメンテーション(Semantic Segmentation)のデモを試してみました。
スポンサーリンク

Caffeのdraw_net.pyによるネットワーク構成の可視化

U-Netのネットワーク構成を可視化するために、Caffe 1.0のDockerコンテナを準備します。

Docker版Caffe 1.0については、以下の記事をご覧ください。

Caffe 1.0をNVIDIA Dockerで試してみた
RCの取れたCaffe 1.0とそのDockerイメージがリリースされましたので、NVIDIA Docker上でResNet-50のベンチマークを実施してみました。

以下のコマンドでDockerコンテナを起動します。

$ nvidia-docker run -it \
    -v /home/sora/data:/workspace \
    bvlc/caffe:gpu \
    bash

draw_net.pyのテストとして、AlexNetを可視化してみます。

# python /opt/caffe/python/draw_net.py \
    /opt/caffe/models/bvlc_alexnet/train_val.prototxt \
    alexnet.png
Drawing net to alexnet.png
Traceback (most recent call last):
  File "/opt/caffe/python/draw_net.py", line 58, in 
    main()
  File "/opt/caffe/python/draw_net.py", line 54, in main
    phase)
  File "/opt/caffe/python/caffe/draw.py", line 244, in draw_net_to_file
    fid.write(draw_net(caffe_net, rankdir, ext, phase))
  File "/opt/caffe/python/caffe/draw.py", line 223, in draw_net
    return get_pydot_graph(caffe_net, rankdir, phase=phase).create(format=ext)
  File "/usr/local/lib/python2.7/dist-packages/pydot.py", line 1883, in create
    prog=prog))
Exception: "dot" not found in path.

ファイル(alexnet.png)は作成されるのですが、画像になっていません。

Docker版Caffe 1.0にインストールされているパッケージを調べてみると、pydotはインストールされているのですが、graphvizがインストールされていません。

以下のコマンドでgraphvizをインストールします。

# apt-get update
# apt-get install graphviz
# pip install graphviz

再度実行すると、今度は画像化されました。

なお、draw_net.pyのデフォルトでは、ネットワークがLR(左から右)へ向かう画像が生成されますが、--rankdirオプションでネットワークの向きをTB(上から下)・BT(下から上)・RL(右から左)にも変更できます。

# python /opt/caffe/python/draw_net.py \
    /opt/caffe/models/bvlc_alexnet/train_val.prototxt \
    alexnet.png --rankdir TB

U-Netのネットワーク構成の可視化

ここ(https://lmb.informatik.uni-freiburg.de/people/ronneber/u-net/)から、U-Netのアーカイブ(u-net-release-2015-10-02.tar.gz)をダウンロードします。

U-Netのアーカイブからtmp-test.prototxtを解凍し、tmp-test.prototxtを解凍したディレクトリに移動して、以下のコマンドを実行します。

# python /opt/caffe/python/draw_net.py \
    tmp-test.prototxt \
    unet.png --rankdir TB
...
google.protobuf.text_format.ParseError: 43:80 : Enum type "caffe.V1LayerParameter.LayerType" has no value named CROP.

Caffeのprototxtの仕様?が変更されているようで、エラーが発生しています。

ここでは、tmp-test.prototxtに対して、以下の3点の変更を行いました。

  • layers { ... }layer { ... }に変更
  • type: CROP等は、type: "Crop"等に変更
  • blobs_lr ...param { lr_mult: ...}に変更

U-Netの変更したprototxtを可視化した結果が、下の画像です。

まとめ

Docker版Caffe 1.0を利用して、U-Netのネットワーク構造を可視化してみました。

U-NetのprototxtをCaffe 1.0に対応させたので、今後は、U-Netのアーカイブに含まれるphseg_v5.caffemodelと組み合わせて、予測ができるのかテストしてみたいと思います。