
3.3.4 模型生成
该测试分两部分:一是移动端(以Android为例)调用摄像头和相册获取数字图片;二是将数字图片转换为数据,输入TensorFlow的模型中,并且获取输出。
1.权限注册
权限注册相关操作步骤如下。
(1)调用摄像头需要注册内容提供器,对数据进行保护。在Android Manifest.xml中注册,相关代码如下:

android:name属性值是固定的(若targetSDKversion为29,该属性应为"androidx.core.content.FileProvider"),android:authorities属性的值必须和FileProvider.getUriForFile()方法中的第二个参数一致。
另外,<meta-data>的resource属性需自行创建,右击res目录→New→Directory,创建xml目录;右击xml目录→New→File,创建file_paths.xml文件。修改file_paths.xml文件中的内容,相关代码如下:

(2)调用摄像头需要访问SD卡的应用关联目录。在Android 4.4系统之前,访问SD卡的应用关联目录要声明权限。为了兼容旧版本系统,需要在AndroidManifest.xml中增加访问SD卡的权限。

(3)调用手机相册时需要动态申请WRITE_EXTERNAL_STORAGE这个危险权限,该权限表示同时授予程序对SD卡读和写的能力。
(4)不同版本的手机,在处理图片上方法不同。因为Android系统从4.4版本开始,选取相册中的图片不再返回真实的Uri,而是封装过的,因此,如果是4.4版本以上的手机需要对Uri进行解析,调用handleImageOnKitKat()方法处理图片,否则调用handleImageBeforeKitKat()。
2.模型导入及调用
模型导入相关操作步骤如下:
(1)把训练好的.pb文件放入Android项目app/src/main/assets下,若不存在assets目录,右击main→new→Directory,输入assets。
(2)新建类PredictionTF.java,在该类中加载so库,调用TensorFlow模型得到预测结果。
(3)在MainActivity.java中声明模型存放路径,调用PredictionTF类。

3.相关代码
本部分包括布局文件、模型预测类和主活动类。
1)布局文件
相关代码如下:

该布局文件提供5个控件,3个button,分别是“拍照上传”“从相册获取”“单击输出结果”,1个TextView,显示预测结果,1个ImageView,展示数字图片。
上述代码中android:src="@drawable/test_image"负责设置初始界面的图片显示。将想要显示的名字为test_image的图片放入/res/drawable文件夹中。
2)模型预测类
相关代码如下:




3)主活动类
相关代码如下:





