2016-08-11 1 views
2

저는 카페를 사용하는 데 비교적 새로운 데, (나중에) 조정할 수있는 최소한의 작업 예제를 만들려고합니다. 나는 MNIST 데이터로 카페 예제를 사용하는 데 어려움이 없었다. 나는 이미지-NET 데이터 (ILSVRC12를) 다운로드하고 사용 lmdb 데이터베이스로 변환 CAFFE의 도구를 사용하여 :카페에서 lmdb 데이터베이스의 인코딩 된 이미지 데이터 읽기

$CAFFE_ROOT/build/install/bin/convert_imageset -shuffle -encoded=true top_level_data_dir/ fileNames.txt lmdb_name 

인코딩 (JPEG) 이미지 데이터를 포함하는 lmdb을 만들 수 있습니다. 인코딩 된 이유는 lmdb가 약 64GB이고 인코딩되지 않은 것은 약 240GB입니다.

그물을 묘사하는 나의 .prototxt 파일은 최소한이다. (MNIST 예제에서 대부분 차용 한 내부 제품 레이어의 한 쌍 - 여기서 정확성을 위해 쓰지 않는다.

name: "example" 
layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "train-lmdb" 
    batch_size: 100 
    backend: LMDB 
    } 
} 
layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TEST 
    } 
    transform_param { 
    scale: 0.00390625 
    } 
    data_param { 
    source: "test-lmdb" 
    batch_size: 100 
    backend: LMDB 
    } 
} 
layer { 
    name: "ip1" 
    type: "InnerProduct" 
    bottom: "data" 
    top: "ip1" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 1000 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "ip1" 
    top: "ip1" 
} 
layer { 
    name: "ip2" 
    type: "InnerProduct" 
    bottom: "ip1" 
    top: "ip2" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 1000 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "accuracy" 
    type: "Accuracy" 
    bottom: "ip2" 
    bottom: "label" 
    top: "accuracy" 
    include { 
    phase: TEST 
    } 
} 
layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "ip2" 
    bottom: "label" 
    top: "loss" 
} 

기차 lmdb가 인코딩되지 않은 경우,이 .prototxt 파일이 미세 (정확도 한심한이지만, CAFFE 충돌하지 않습니다) 작동합니다. 기차 lmdb가 다음 인코딩 그러나, 나는 다음과 같은 오류가 발생합니다 :

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1) 

질문 :가 일부 "플래그가"나는 기차 lmdb임을 나타내는 .prototxt 파일에 설정해야합니다인가 인코딩 된 이미지? (같은 플래그 가능성이 테스트 데이터 층, 테스트 lmdb 위해 부여되어야 할 것이다.)

조금 연구 : 구글에서 주변에 파고

내가 유망 듯 resolved issue을 발견했다. 그러나 'force_encoded_color'을 true로 설정해도 문제가 해결되지 않았습니다.

또한 lmdb (특히 인코딩을 사용하기위한 지시 사항)를 만드는 데 매우 도움이되는 대답을 발견했으나 caffe가 이미지가 인코딩되었음을 인식 할 수 있도록 수행해야 할 내용은 없습니다.

답변

2

오류 메시지가 있어요 :

data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1) 

을 CAFFE 데이터 변압기와 입력을 기대하고 의미 3 channels (즉, 컬러 이미지), 만 1 img_channels과 이미지를 얻고있다 (즉, 그레이 스케일 이미지) .

는 것 caffe.proto 아칸소 찾고 당신이 transformation_param에서 매개 변수를 설정해야합니다 것 같아 :

layer { 
    name: "imagenet" 
    type: "Data" 
    top: "data" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    transform_param { 
    scale: 0.00390625 
    force_color: true ## try this 
    } 
    data_param { 
    source: "train-lmdb" 
    batch_size: 100 
    backend: LMDB 
    force_encoded_color: true ## cannot hurt... 
    } 
} 
+0

이 작동하는 것 같다! 이는 일부 회색 음영 이미지가 데이터에 혼합되어 있음을 의미합니까? 나는 그들이 모든 색이었다고 생각했다/생각했다 (내가 보았던 소수는 확실히 색이 있었다). 아마도 lmdb를 만들 때 --check_size 옵션을 사용했다면 이걸 잡았을 것입니다. 이전에 모든 이미지의 크기를 256x256으로 조정했기 때문에 수표를 귀찮게하지 않았습니다. – TravisJ

+0

@TravisJ'--check_size'는 채널의 수를 확인하지 않습니다. AFAIK는 너비와 높이만 검사하지만, 틀릴 수도 있습니다. – Shai

+0

크기가 너비 x 높이 x 깊이 (즉 채널 수)라고 가정했는데 잘못 될 수 있습니다 ... caffe에 새로 왔습니다. – TravisJ