Caffe-TensorFlow 사용법

요새는 TF도 Model Zoo가 잘 갖춰져 있어서 의미는 없지만, Caffe의 (주로 CNN) Model을 TF로 변환해 주는 좋은 도구이다.
물론 모든 모델을 변환할 수는 없는 노릇이다. 코드 업데이트가 멈춘 지 조금 되었기에 최신 레이어는 지원이 안 되고, 오래 된 레이어라고 다 되는 것도 아닌 것 같다. 따라서 사용 전에 README, GitHub issue란을 잘 살펴보아야 의미 없는 노력을 피할 수 있겠다.
GitHub 저장소

그러나, 변환된 모델이 원래 모델의 정확도를 달성하지 못해서 아직까지는 헛짓거리가 되었다...

설치

  • 깃 저장소에서 소스코드 받아오고..
  • PyCaffe 설치하면 좋지만 건너뛰어도 돌아는 가고..
  • TensorFlow 환경을 갖춰준다: Anaconda 사용자라면 TF가 깔린 환경을 activate해 준다

사용 전 코드 수정

Py2, TF 1.0, protocol buffer 예전 버전 (?) 환경에서 작성된 것으로 보인다. Py3, TF 1.2+, protocol buffer 1.2+에서 사용하려면 몇 가지 수정이 필요하다. 주먹구구로 수정한 코드는 아래와 같다.

(TODO link to patch file)
$ git apply {patch file}

사용법

먼저 Caffemodel, model description 파일을 준비한다.
그 다음, 본 프로젝트 루트에서 아래 명령을 실행하면 된다.

$ ./convert.py --caffemodel <path/to/caffemodel> --data-output-path <path/to/output/model.npy> --code-output-path <path/to/otuput/model.py> <path/to/model/description/file>

요렇게 하면 model parameter를 담는 numpy data 파일과 layer 구조를 정의하는 python code 파일이 생성된다.
프로젝트에 함께 들어있는 TF 코드를 통해 (./kaffe/tensorflow/) 돌려볼 수 있으나, 요걸 쓰는 대신 직접... 모델 코드를 작성했다.

ImageNet / AlexNet

ILSVRC '12 training/test 데이터

올바르게 불러오는 방법은 대체 무엇일지...
요전에 TF 공식 저장소의 Inception network 예제에서 가져온 ImageNet data reader는 Caffe에서의 데이터 가공법과 많이 다른지 모델 정확도가 올라오질 않았다. 내가 코드를 잘못 다뤘겠지만!

대신 DoReFa-Net 코드 찾다가 겸사겸사 본 TensorPack의 data reader를 사용했다. 문제는 Caffe 모델, caffe-tensorflow 코드 저자의 시험 결과보다 모델 성능이 1% 적게 나와서 고민. 편의상 TensorPack data source가 가져온 데이터를 placeholder에 feed dict로 넣는 원시적이고 성능 낮은 방법을 써서 또 고민.

그냥 feeddict에 넣는 대신 Tensorpack과 Multigpu를 활용한 빠른 트레이닝 코드 작성하기 글을 참조해서 TF Queue를 씁시다..

  • tensorpack 설치

  • imagenet dataset 다운로드

  • tensorpack 문서에 따라 dataset 재가공

    • 아래와 같은 코드로 이미지들을 lmdb 포맷으로 (또는 TensorPack가 지원하는 다른 포맷) 압축

      class BinaryILSVRC12(ILSVRC12Files):
      def get_data(self):
      for fname, label in super(BinaryILSVRC12, self).get_data():
          with open(fname, 'rb') as f:
              jpeg = f.read()
          jpeg = np.asarray(bytearray(jpeg), dtype='uint8')
          yield [jpeg, label]
      ds0 = BinaryILSVRC12('/home/dataset/imagenet/', 'val')
      ds1 = PrefetchDataZMQ(ds0, nr_proc=1)
      dftools.dump_dataflow_to_lmdb(ds1, '/home/dataset/imagenet/lmdb/orig/ILSVRC-val.lmdb')
      
    • 요 코드를 실행하면 수 시간 후에 lmdb 파일 생성해 줌.

  • data source 코드 작성 -- 입력 파이프라인 연결 : 읽어서 > 순서 섞고 > 필요한 이미지 가공 (주변부 자르기, 평준화 등) > 준비!

다른 AlexNet 모델 실패기

  • 구글에서 alexnet tensorflow 치면 나오는 모델도 있는데... 위의 예전 data reader 문제와 맞물려 정확도가 안 나와서 실패...

그러나...

얻은 Top-5 정확도

(오른쪽은 Caffe-TF README.md에 언급되어 있는, 제작자가 달성한 정확도)

  • CaffeNet: 78% < 79.93%
  • VGG-16: 88% < 89.88%

왜... 낮지...

+ Recent posts