Caffe的 Android(安卓)aar库使用(脚手架)
16lz
2021-01-26
文章目录
- 0 试玩一下andorid demo caffe_android.aar库
- 1 添加本地AAR
- 2 Java代码示例
- (1) 申请权限
- (2)设置运行主函数
- (3)异步运行的监听器类
- (4) 启动神经网络识别任务
caffe的android库编译比较费麻烦,网上的教程操作起来也会有很多的坑。思来想去,把caffe的库和java接口全部包装到一个aar库或者jar库,想用的时候直接导入到项目中,简直是不要太爽。
0 试玩一下andorid demo caffe_android.aar库
如果你想直接运行下效果,我在github上有一个android demo
github:https://github.com/liusanchuan/caffe-android-aar-library
1 添加本地AAR
(0)下载AAR库 https://github.com/liusanchuan/caffe-android-aar-library/blob/master/app/libs/caffe_android.aar
(1) 把 caffe_android.aar文件复制到你自己的项目的app/libs
下
(2) 在build.gradle(app)
中添加引用:
apply plugin: 'com.android.application'android {... ...}// 这个repositories { flatDir{ dirs 'libs' }}dependencies { compile (name:'caffe_mobile',ext:'aar') // 和这个... ...}
2 Java代码示例
(1) 申请权限
AndroidManifest.xml 中
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
java代码中
private void checkMyPermission() { if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1); }}
(2)设置运行主函数
// 全局变量String[] IMAGENET_CLASSES;CaffeMobile caffeMobile;String[] IMAGENET_CLASSES;CNNTask cnnTask;// 初始化网络void init_net(){ // 1. 定义模型路径 String modelDir = "/sdcard/caffe_mobile/bvlc_reference_caffenet"; String modelProto = modelDir + "/deploy.prototxt"; String modelBinary = modelDir + "/bvlc_reference_caffenet.caffemodel"; // 2 加载标签列表 AssetManager am = this.getAssets(); try { InputStream is = am.open("synset_words.txt"); Scanner sc = new Scanner(is); List<String> lines = new ArrayList<String>(); while (sc.hasNextLine()) { final String temp = sc.nextLine(); lines.add(temp.substring(temp.indexOf(" ") + 1)); } IMAGENET_CLASSES = lines.toArray(new String[0]); } catch (IOException e) { e.printStackTrace(); } // 3. 创建caffe 解释器实例 caffeMobile = new CaffeMobile(); caffeMobile.setNumThreads(4); caffeMobile.loadModel(modelProto, modelBinary); float[] meanValues = {104, 117, 123}; caffeMobile.setMean(meanValues); // 4 创建输出结果监听器 cnnTask = new CNNTask(new CNNListener() { @Override public void onTaskCompleted(int i) { Toast.makeText(getApplicationContext(),"鉴定结果:"+ IMAGENET_CLASSES[i],Toast.LENGTH_SHORT).show(); } });}
(3)异步运行的监听器类
private class CNNTask extends AsyncTask<String, Void, Integer> { private CNNListener listener; private long startTime; public CNNTask(CNNListener listener) { this.listener = listener; }// 监听器会把这个任务放后台执行 @Override protected Integer doInBackground(String... strings) { startTime = SystemClock.uptimeMillis(); return caffeMobile.predictImage(strings[0])[0]; } @Override protected void onPostExecute(Integer integer) { Log.i(LOG_TAG, String.format("elapsed wall time: %d ms", SystemClock.uptimeMillis() - startTime)); listener.onTaskCompleted(integer); super.onPostExecute(integer); }}
(4) 启动神经网络识别任务
// 输入一张图片的路径,在监听器中获取结果void run_caffe(String imgPath){ cnnTask.execute(imgPath);}
更多相关文章
- Android之Handling Runtime Changes(处理运行时更改)
- Android开发心得(一)
- Android开发环境搭建:SDK在线离线安装+在Eclipse中配置ADT+第一个
- Android(安卓)APK文件在电脑(PC虚拟机)上面运行方法
- 安卓root漏洞分析——CVE-2009-1185
- 谷歌称Android(安卓)3.0系统可运行在任何设备上
- 如何从oat文件中提取内嵌的dex文件
- Android(安卓)Studio下运行开源项目9GAG遇到的问题
- Android传感器之光照传感器