開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

(未完)python3でcaffeを使用可能にする

 最近流行りのchainerを使用して機械学習の挙動を勉強しており、そろそろDeepDreamに手を付けるべくその方法を調査した所、どうやらcaffeが必要だとわかりました。
 しかし問題があります。caffeはpython3を公式サポートしておりません。そのためか、普通にcaffeを使おうと思うとエラーが出ます。

 動作環境はMacOS10.10、Python 3.4.3です。
 今回は先人様のコードをお借りします。
 Chainerで入力画像の最適化 - mktozkの日記

Traceback (most recent call last):
  File "TestDeepGoggle.py", line 14, in <module>
    func = caffe.CaffeFunction('bvlc_reference_caffenet.caffemodel')
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 104, in __init__
    raise RuntimeError('CaffeFunction is not supported on Python 3')
RuntimeError: CaffeFunction is not supported on Python 3

 chainerコード内のエラーです。python3を使用しているとこの先に進めなくなります。
 とりあえずここのコードをいじって無理やり先に進みます。

# in chainer/functions/caffe/caffe_function.py

# caffe_pb2 does not support Py3
# if sys.version_info < (3, 0, 0):
if sys.version_info < (4, 0, 0):

 続いてprotobuf内にエラーが出ました。

Traceback (most recent call last):
  File "TestDeepGoggle.py", line 9, in <module>
    from chainer.functions import caffe
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/__init__.py", line 1, in <module>
    from chainer.functions.caffe import caffe_function
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 13, in <module>
    from chainer.functions.caffe import caffe_pb2
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_pb2.py", line 7, in <module>
    from google.protobuf import reflection as _reflection
  File "/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/google/protobuf/reflection.py", line 68, in <module>
    from google.protobuf.internal import python_message
  File "/usr/local/Cellar/python3/3.4.3_2/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/google/protobuf/internal/python_message.py", line 848
    except struct.error, e:

 なんか途中でpip経由のものを抜けて偉いところにあるpythonファイルを使ってそうです・・・
 python3版のprotobufがあるらしいのでこちらを使います。

pip3 install python3-protobuf

 続くエラーはこちら。

Traceback (most recent call last):
  File "TestDeepGoggle.py", line 9, in <module>
    from chainer.functions import caffe
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/__init__.py", line 1, in <module>
    from chainer.functions.caffe import caffe_function
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 13, in <module>
    from chainer.functions.caffe import caffe_pb2
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_pb2.py", line 905, in <module>
    has_default_value=True, default_value=unicode("constant", "utf-8"),
NameError: name 'unicode' is not defined

 protobufからは抜けられました。caffe内はPython3に対応していないらしく、python2にあったunicode関数が使われています。ちょろっと書きなおして先に進みます。

# in chainer/functions/caffe/caffe_pb2.py

unicode("", "utf-8") -> ""
unicode("warp", "utf-8") -> "warp"
unicode("constant", "utf-8") -> "constant"
unicode("L2", "utf-8") -> "L2"

 えーっと次なるエラーは・・・

Traceback (most recent call last):
  File "TestDeepGoggle.py", line 9, in <module>
    from chainer.functions import caffe
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/__init__.py", line 1, in <module>
    from chainer.functions.caffe import caffe_function
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 37, in <module>
    class CaffeFunction(function.Function):
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 207, in CaffeFunction
    @_layer('Concat', 'CONCAT')
  File "/usr/local/lib/python3.4/site-packages/chainer/functions/caffe/caffe_function.py", line 22, in decorator
    typevalue = getattr(caffe_pb2.V1LayerParameter, oldname)
AttributeError: type object 'V1LayerParameter' has no attribute 'CONCAT'

 だめだ、なんでこのエラーが出るのか、どう対処すれば良いのかわからない・・・