自适应图像压缩的水稻病害诊断平台
2018-10-15刘小红
刘小红
(湖南信息学院,湖南 长沙 410151)
0 引 言
水稻病虫害对粮食生产造成极大威胁,严重影响粮食的产量。病虫害的正确识别和诊断是准确防治的前提和基础,是提高粮食产量的根本保障。近年来农业病虫害诊断和识别的研究已成为热点,随着手机应用的不断普及和手机附有摄像头、携带方便等特点,已有国内外学者利用Android手机在病虫害诊断方面进行了深入研究,大致分为二种情况:一种情况是提出通过移动终端采集害虫图像直接传递给服务器,服务器端对接收的图像进行识别和处理[1-2];另一种情况是利用OpenCV在手机端对水稻病害图像进行识别处理[3]。前者由于Android端将图片直接上传,大容量图片会消耗数据流量,可能会出现上传缓慢、网络传输噪声等问题,从而导致病虫害诊断准确率不是很高或失误。后者由于手机拍摄的图片占用大量的数据存储空间,加上移动终端硬件的配置使得图像处理能力有限,影响系统识别的实时性;再者SQLite数据库不适合大量图像检索计算,在手机端实现图像的精确识别有难度。
针对以上问题,以水稻常见的病害为研究对象,利用移动互联网技术,文中提出将移动端采集的病害图像进行自适应压缩处理,保证图像的清晰度并降低图片容量大小后再上传、在服务端对图像进行识别处理并返回结果的方法,并基于移动客户端开发了水稻病害图像识别系统,实现水稻病害的及时诊断,解决图像上传缓慢、诊断延误或失误、移动端图像处理能力有限等问题。
1 系统总体架构
根据系统的功能需求以及架构的设计原则,采用了C/S架构。系统架构具体划分为三层:客户层、通信层、服务层。系统结构如图1所示。
图1 系统架构
(1)客户层。手机客户端选择JDK+Eclipse+Android NDK+ADT插件等主流应用技术进行开发[4];农业种植人员或专业技术人员通过手机客户端在田间可随时随地采集病害图片、压缩处理后上传,并进行病害的诊断、查询及防治建议,结果以文字和图片等形式返回。
(2)通信层。采用4G网络,将客户层与服务层进行互联。根据系统特点采用Http协议作为网络通信技术,并引入JSON轻量级数据转换格式,实现客户端和服务器端的跨平台数据传输[5-8]。
(3)服务层。服务端配置为Tomcat服务器,利用Servlet技术响应对不同客户端发来的HTTP请求。主要负责监听、接收图片,并对图片进行去噪、分割、特征提取、病害识别等图像处理操作[9-13],保证病害诊断系统的正常运行。
2 客户端设计与实现
客户端APP主要在JDK1.8+Eclipse+Android SDK+NDK+ADT平台上开发,使用Java语言编写,APP运行于Android平台上。
2.1 诊断流程
农业种植人员或专业技术人通过手机客户端启动水稻病害智能诊断平台后进入界面。选取“图像采集”图标后,进入拍照界面,可进行田间无摘取的实时图像采集;选取“病害诊断”图标后,进入选择图片界面,并裁剪;接着点“压缩、上传”图标后,系统采用JPEG算法将用户选择的图片进行压缩处理,图片压缩码流通过4G网络上传至服务器[14];选取“接收结果”图标后,自动接收从服务端诊断的结果,并以文字和图片的形式在手机客户端显示。客户端病害诊断流程如图2所示。
图2 客户端病害诊断流程
2.2 功能设计
经过对智能诊断平台功能的需求分析,确定三大模块:用户信息管理、病害图像诊断、病害相关数据查询。其中用户信息管理模块为农业种植人员或技术人员提供用户信息注册、登录、帐号管理等操作;图像诊断模块为用户提供图像实时采集、图像压缩上传和接收结果等功能;查询模块提供查询病害数据、防治措施、服务端发布的指导信息等功能。客户端功能结构如图3所示。
图3 客户端功能结构
2.3 客户端系统实现
手机端采用JPEG压缩技术对高清大容量病害图像进行自适应的质量压缩处理[15-16],减少传输的比特数,加快上传速度,保证图像清晰度,提高诊断准确率。详细步骤如下:先下载Libjpeg库(C语言编写),编译得到libjpeg.so;配置NDK和设置环境变量;将编译好的动态库和头文件加入到项目中,并修改配置文件;代码实现压缩照片到指定目录并使用AsyncTask执行压缩操作,使用JNI技术来调用Libjpeg库文件。
考虑自适应压缩的耗时问题,在后台线程中使用AsyncTask进行异步压缩操作,创建异步操作类MyCompress,且继承AsyncTask
ImgCompress.getInstance(this).withListener(this).starCompress(Uri.fromFile(imgFile)
为了控制图片输出时的空间大小,设定一种自适应压缩的方法,方法中调用Bitmap类的compres()方法,对压缩后的大小与系统给定值进行循环比较,如果满足条件则继续compress操作;否则退出循环不再压缩,达到自适应压缩的效果。
OutputStream bs=new OutputStream();
int opt=120;
OutImag.compress(Bitmap.CompressFormat.JPEG,opt,bs);
int bsLen=bs.toByteArray().length;
while((bsLen/1024)>maxFileSize) {
bs.reset();
opt=Math.max(0,opt-20);
OutImag.compress(Bitmap.CompressFormat.JPEG,opt,bs);
bsLen=bs.toByteArray().length;
if(opt==0) break;
}
为更好地实现数据传输,根据系统客户端向服务器提出连接请求并成功建立连接后,主动上传图片或查询时向服务端发送数据、服务端接收数据后不断与客户端进行交互响应的特点,采用Http协议和WebService技术,利用JSON进行数据转换[6],实现网络数据传输。如定义一个JsonUtils类,并为其添加解释JSON数据的方法:
Public static List
List
JSONArray jsonArray=new JSONArray(new String(StreamTool.read(jsonData)));
for(int i=0;i JSONObject jsonObject=jsonArray.getJSONObject(i); int id=jsonObject.getInt("id"); String pest=jsonObject.getString("pest"); …… myList.add(new Pests(id, pest,……) ); } return myList; } 在Activity类的“接收结果”方法中,代码创建HttpClient、HttpGet、HttpResponse、HttpEntity等对象,实现从服务器端下载JSON数据。利用以下JSON语句解释接收的网络数据,以本机做测试。 String path="http://10.0.2.2:8080/ServerFromJSON/PestListServlet"; conn.setRequestMethod("GET"); if(conn.getResponseCode()==200){ InputStream jsonIn=conn.getInputStream(); returnparseJSONData(jsonIn); } 该客户端充分利用Android SDK中的LinearLayout类、GridView类、ListView类及TabHost组件等的优势设计个性化的友好、简单的人机交互界面。 服务器端使用Java开源框架struts+spring+hibernate实现Web服务[4]。用struts进行MVC设计,实现Web层的应用;用spring进行数据交换,实现业务逻辑;用hibernate进行数据库的访问,实现对象关系的映射。客户端和服务器端进行数据交换时,存在不同的数据格式,用JSON来封装数据,可解决数据兼容性。为了实现与客户端进行数据交互,先在服务端创建Web项目,再创建Servlet类作为接口程序,接着将该Servlet部署到Tomcat下,同时修改web.xml,再发布项目。Servlet类接口代码分为“处理接收数据”和“处理发送数据”二部分,如下: 在N2和O2环境中、不同的PDA温度下,Al掺杂的HfO2高k栅介质MOSCAP的C-V曲线如图3(a)和图3(b)所示。由图3可见,除了O2环境中700 ℃的PDA处理条件外,Al掺杂HfO2的MOSCAP均表现出良好的C-V特性。而O2环境中700 ℃的PDA处理时C-V特性略微变差可能与该条件下界面态变差有关。 protected void doPost (HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{doGet (req,resp);} proteeted void doGet (HttpServetRequest req,HttpServetResponse resp) throws ServletException,IOException{ resp.setContentType("text/plain"); resp.setCharacterEncoding("UTF-8"); PrintWriter out=resp.getWriter(); JSONArray array=new JSONArray(); for(Pest bean: list){ JS0NObiect obj=new JSONObject(); try{ obj .put("id".bean.getId()); obj .put("pest".bean.getPest()); …….. }catah(Exception e) {array.put(obj);} } out.wrire(array.toSrring()) ; … } 服务器在正常运行的情况下,如果有客户端发送图片请求,就建立连接并接收和存储图片,同时采用OpenCV技术对图像进行特征提取[16-17],与数据库中已有特征数据进行匹配,实现图像识别[14];最后将图像识别结果以文字和高清图片的形式通过网络返回到客户端。选择OpenCV作为图像处理手段,对客户端发来的病害图片进行及时图像处理,可解决移动终端图像处理能力有限、SQLite数据库检索难度大等问题,提高系统识别实时性。 该系统利用一部三星Android手机和一台搭载tomcat7.0服务容器的电脑作为测试环境。在手机上运行客户端软件后,进入登录界面。输入个人账号登录成功,方可进入主功能界面。用户可利用友好、简单的人机交互界面,在田间实地进行图片采集、压缩并上传,进行无采摘式、实时的病害诊断;还可以通过“信息查询”功能,实现在线查询各种病害信息和防治技术等,解决农民在种植过程中遇到的各种问题。经过初步测试,系统在性能、功能方面达到了设计的预期要求。图4是手机端系统实现的部分界面图。 图4 系统界面图 文中研发的基于移动端的自适应图像压缩的水稻病害诊断平台提供了病害图像采集、压缩、上传并诊断,病害防治建议等功能,具备移动端携带方便、平台界面友好简单、实时无采摘的图像采集、快速识别、准确等优点。初步应用证明,该系统的诊断准确性高,然而,处于初期阶段的系统平台仍存在不少问题,后期阶段有待加强:一是系统暂时只对简单背景下的病害图像识别率高,对于阴暗、潮湿等复杂环境下拍的图像在特征提取方面有待研究;二是在病害图像识别处理中,在分类器的算法上须改进提高。3 服务端的设计与实现
4 系统测试
5 结束语