관리 메뉴

HAMA 블로그

Caffe 처음 설치를 마친 사람들을 위한 정리 본문

통계 & 머신러닝 & 딥러닝

Caffe 처음 설치를 마친 사람들을 위한 정리

[하마] 이승현 (wowlsh93@gmail.com) 2016. 3. 12. 13:31

일단 Caffe 를 이미지분류를 위한 목적으로 설치 했다고 치면 아래와 같은 2가지가 핵심입니다.

1.  내 이미지 (혹은 샘플이미지)를 학습시켜서 나만의 모델을 만들자. 

2.  나의 모델 (혹은 샘플 모델) 을 이용하여 이미지를 잘 이해(분류)하는지 보자.


용어 정리 ) 

* 모델 정의 하기:   데이터를 학습 시키기위한,  네트워크 과정 및 파라미터등을 총칭. 그 결과로 '모델' 을 만듬.

* 파인 튜닝 하기:  더 적당한 모델을 만들거나, 더 나은 분류를 위해 조작하면서 최적값을 찾는 행위 


1.  내 데이터를 학습시켜라 


가. 일단 Caffe 내에는 이미 학습된 모델들이 여러개 있습니다. 그 중 ImageNet 의 이미지를 이용하여 학습시킨 예를 살펴봅니다.

/path/to/imagenet/train/n01440764/n01440764_10026.JPEG  //   이런 ImageNet 이미지들이 있구요.

나. 자신의 이미지를 Caffe 에서 요구하는 input 데이터형식으로 바꾸는 작업도 해야합니다. (lmdb 형식 , leveldb 형식) 

ImageNet 의 경우 examples/imagenet/create_imagenet.sh.  이걸 이용했으니 확인하셔야하구요. 

다. 학습과 분류를 더 잘 하기위해서 Image Mean 값을 구해서 이미지를 변화시켜야합니다.

./examples/imagenet/make_imagenet_mean.sh    // ImageNet 의 경우 이것으로 변경했습니다.

data/ilsvrc12/imagenet_mean.binaryproto   // jpeg 들이 이러한 binaryproto 형식으로 변환되었구요. 
io.py (이전에는 convert.py 사용) 의 blobproto_to_array 함수등을 이용하여 최종적으로 iLsvrc_2012_mean.npy

라. 모델 정의를 합니다. 

 imageNet 의 모델을 만들기 위해서  (즉 우리것을 만들기 위해서는 이것들을 참고해서 만들면 됨) 

 네트워크 정의 파일로는 models/bvlc_reference_caffenet/train_val.prototxt 있고

 input 데이터로는 ilsvrc12_train_leveldb 와 ilsvrc12_val_leveld  이 사용되었습니다.

 마지막으로 솔버로는 bvlc_reference_caffenet/solver.prototxt  가 사용되었습니다.


마. 이미지들을 학습시킵니다.

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt

.examples/imagenet/train_caffenet.sh 파일 이용하여 간편히도 가능. 

즉 caffe train 명령으로 데이터들을 학습시킵니다. 인자로는 solver 정의서가 들어가네요. 


바. 학습시킨 중간 결과등을 저장 해 놓을 수 도 있습니다.

./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate


2. 모델을 이용하여 나의 이미지를 잘 이해(분류)하는지 보자.


 가. ImageNet 의 경우 models/bvlc_reference_caffenet/deploy.prototxt 에 분류를 위한 모델정의를 담았고 

    models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel 이것이 1번에서 최종적으로 만든 모델인데 

     이것도 물론 사용됩니다.


  나. Caffe 를 처음 설치하면 Caffe 의 root 로 가서 간단히 run cat1.jpg 하면 고양이를 인식하게 되는데 

      run 의 내부에는 python/classify.py 를 호출하도록 되있습니다. classify.py 내부를 보면 

      아래와 같으며 , 내용을 가져다 우리의 데이터 분류에 사용하면 됩니다. 

# 분류기 만들기. ( 1에서만든 모델, Mean데이터등이 입력으로 이용) 

classifier = caffe.Classifier(args.model_def, args.pretrained_model,

        image_dims=image_dims, mean=mean,

        input_scale=args.input_scale, raw_scale=args.raw_scale,

        channel_swap=channel_swap)


# 고양이 이미지 가져옴 (npy, jpg 형식등) 

args.input_file = os.path.expanduser(args.input_file)

if args.input_file.endswith('npy'):

    print("Loading file: %s" % args.input_file)

    inputs = np.load(args.input_file)

elif os.path.isdir(args.input_file):

    print("Loading folder: %s" % args.input_file)

    inputs =[caffe.io.load_image(im_f)

             for im_f in glob.glob(args.input_file + '/*.' + args.ext)]

else:

    print("Loading file: %s" % args.input_file)

    inputs = [caffe.io.load_image(args.input_file)]


print("Classifying %d inputs." % len(inputs))


# 분류 (알아내기) 시작 

start = time.time()

predictions = classifier.predict(inputs, not args.center_only)

print("Done in %.2f s." % (time.time() - start))


3. 딥러닝 개념 요약 

 http://sanghyukchun.github.io/75/  참고 

Comments