깊이 학습[19]ncnn 안 드 로 이 드 구축 및 자신의 모델 사용
3911 단어 딥 러 닝
github 위 에 ncnn 의 안 드 로 이 드 예,주소:https://github.com/dangbo/ncnn-mobile clone 이 프로젝트 는 Android studio 로 열 수 있 습 니 다(12.19 업데이트:이 프로젝트 는 변경 되 었 습 니 다.직접 실행 할 수 없습니다.ncnn 을 컴 파일 한 다음 ncnn-mobile/squeezencn-AS/app/src/main/jni/android.mk 의 ncnn 설치 경 로 를 변경 해 야 합 니 다).
자신의 모형 을 사용 하 다
내 쪽 의 예 는 caffe 에서 ncnn 으로 전환 한 다음 에 ncnn 에서 memery 로 전환 하 는 것 이다.alexnet 를 예 로 들 면.1.먼저 caffe 모델 을 다운로드 하고,
deploy.prototxt: https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet
caffemodel:http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel
2.이 alexnet 의 caffe 버 전이 비교적 오래 되 었 기 때문에 ncnn 은 지원 하지 않 습 니 다.카페 자체 의 변환 도구 로 최신 카페 버 전 으로 전환 해 야 합 니 다.두 명령 을 사용 하 십시오.(이 두 명령 은 최신 caffe 를 설치 해 야 합 니 다.)
upgrade_net_proto_text [ prototxt] [ prototxt]
upgrade_net_proto_binary [ caffemodel] [ caffemodel]
3.deploy.prototxt 에서 caffe 의 입력 층 을 input 층 으로 변경 합 니 다.
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }
}
4、caffe2ncnn 으로 caffe 버 전 alexnet 을 ncnn 으로 변환
caffe2ncnn deploy.prototxt bvlc_alexnet.caffemodel alexnet.param alexnet.bin
5.ncnn2mem 으로 ncnn 의 alexnet 의 param 과 bin 파일 을 끼 워 넣 는 코드 형식 으로 바 꾸 고 안 드 로 이 드 demo 의 param.bin 파일 을 생 성 합 니 다.
ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h
이 때 alexnet.param.bin 파일 6 을 추가 로 생 성하 고,생 성 된 alexnet.param.bin 과 alexnet.bin 파일 을 ncnn 안 드 로 이 드 프로젝트 의 assets 폴 더 에 복사 합 니 다.또한 MainActivity.java 의 initSqueezeNcnn 함수 에서 param.bin 파일 과 bin 파일 관련 코드 를 읽 고 alexnet.param.bin 과 alexnet.bin 을 읽 는 것 으로 변경 합 니 다.(입력 그림 의 크기 를 수정 해 야 할 수도 있 습 니 다)
{
InputStream assetsInputStream = getAssets().open("alexnet.param.bin");
int available = assetsInputStream.available();
param = new byte[available];
int byteCode = assetsInputStream.read(param);
assetsInputStream.close();
}
{
InputStream assetsInputStream = getAssets().open("alexnet.bin");
int available = assetsInputStream.available();
bin = new byte[available];
int byteCode = assetsInputStream.read(bin);
assetsInputStream.close();
}
7.이전에 생 성 된 alexnet.id.h 에서 입력 층 ID 와 추출 하고 자 하 는 층 의 ID 를 보 거나,alexnet.id.h 로 squeezenet 를 교체 합 니 다.v 1.1.id.h,안 드 로 이 드 프로젝트 의 예 를 들 어 입력 층 ID 와 추출 층 ID 를 가 져 옵 니 다.예 를 들 어 저 는 마지막 층 의 데 이 터 를 추출 하려 고 합 니 다.alexnet.id.h 에서 알 수 있 듯 이 입력 층 은 BLOB 입 니 다.data=0,마지막 층 은 BLOBprob=23。 안 드 로 이 드 프로젝트 와 비슷 한 표기 법:
ex.input(alexnet_param_id::BLOB_data, in);
ex.extract(alexnet_param_id::BLOB_prob, out);
직접 쓰기 id:
ex.input(0, in);
ex.extract(23, out);
마지막 으로 주의해 야 할 것 은:
ncnn 의 데이터 정렬 으로 인해 추출 한 데이터 가 잘못 되 었 음 을 발견 할 수 있 습 니 다.특히 중간 층 을 추출 해 야 할 때.그럼 ncnn 에서 Mat 의 reshape 함 수 를 사용 하 세 요.reshape 를 사용 하면 됩 니 다.
ncnn::Mat out1(out.reshape(w * h * c));//w,h,c: w,h channel
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
caffe 데이터 구조 깊이 학습 (4) - blob 데이터 구조 blob. hpp 파일 상세 해석이 줄 은 shape 벡터 를 통 해 Blob 의 모양 을 바 꾸 는 또 다른 변형 함 수 를 정의 합 니 다. 이 줄 은 Blob 모양 의 함 수 를 읽 고 구성원 변수 shape 로 돌아 가 는 것 을 정의 합 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.