劉小紅
(湖南信息學院,湖南 長沙 410151)
水稻病蟲害對糧食生產造成極大威脅,嚴重影響糧食的產量。病蟲害的正確識別和診斷是準確防治的前提和基礎,是提高糧食產量的根本保障。近年來農業病蟲害診斷和識別的研究已成為熱點,隨著手機應用的不斷普及和手機附有攝像頭、攜帶方便等特點,已有國內外學者利用Android手機在病蟲害診斷方面進行了深入研究,大致分為二種情況:一種情況是提出通過移動終端采集害蟲圖像直接傳遞給服務器,服務器端對接收的圖像進行識別和處理[1-2];另一種情況是利用OpenCV在手機端對水稻病害圖像進行識別處理[3]。前者由于Android端將圖片直接上傳,大容量圖片會消耗數據流量,可能會出現上傳緩慢、網絡傳輸噪聲等問題,從而導致病蟲害診斷準確率不是很高或失誤。后者由于手機拍攝的圖片占用大量的數據存儲空間,加上移動終端硬件的配置使得圖像處理能力有限,影響系統識別的實時性;再者SQLite數據庫不適合大量圖像檢索計算,在手機端實現圖像的精確識別有難度。
針對以上問題,以水稻常見的病害為研究對象,利用移動互聯網技術,文中提出將移動端采集的病害圖像進行自適應壓縮處理,保證圖像的清晰度并降低圖片容量大小后再上傳、在服務端對圖像進行識別處理并返回結果的方法,并基于移動客戶端開發了水稻病害圖像識別系統,實現水稻病害的及時診斷,解決圖像上傳緩慢、診斷延誤或失誤、移動端圖像處理能力有限等問題。
根據系統的功能需求以及架構的設計原則,采用了C/S架構。系統架構具體劃分為三層:客戶層、通信層、服務層。系統結構如圖1所示。

圖1 系統架構
(1)客戶層。手機客戶端選擇JDK+Eclipse+Android NDK+ADT插件等主流應用技術進行開發[4];農業種植人員或專業技術人員通過手機客戶端在田間可隨時隨地采集病害圖片、壓縮處理后上傳,并進行病害的診斷、查詢及防治建議,結果以文字和圖片等形式返回。
(2)通信層。采用4G網絡,將客戶層與服務層進行互聯。根據系統特點采用Http協議作為網絡通信技術,并引入JSON輕量級數據轉換格式,實現客戶端和服務器端的跨平臺數據傳輸[5-8]。
(3)服務層。服務端配置為Tomcat服務器,利用Servlet技術響應對不同客戶端發來的HTTP請求。主要負責監聽、接收圖片,并對圖片進行去噪、分割、特征提取、病害識別等圖像處理操作[9-13],保證病害診斷系統的正常運行。
客戶端APP主要在JDK1.8+Eclipse+Android SDK+NDK+ADT平臺上開發,使用Java語言編寫,APP運行于Android平臺上。
農業種植人員或專業技術人通過手機客戶端啟動水稻病害智能診斷平臺后進入界面。選取“圖像采集”圖標后,進入拍照界面,可進行田間無摘取的實時圖像采集;選取“病害診斷”圖標后,進入選擇圖片界面,并裁剪;接著點“壓縮、上傳”圖標后,系統采用JPEG算法將用戶選擇的圖片進行壓縮處理,圖片壓縮碼流通過4G網絡上傳至服務器[14];選取“接收結果”圖標后,自動接收從服務端診斷的結果,并以文字和圖片的形式在手機客戶端顯示。客戶端病害診斷流程如圖2所示。

圖2 客戶端病害診斷流程
經過對智能診斷平臺功能的需求分析,確定三大模塊:用戶信息管理、病害圖像診斷、病害相關數據查詢。其中用戶信息管理模塊為農業種植人員或技術人員提供用戶信息注冊、登錄、帳號管理等操作;圖像診斷模塊為用戶提供圖像實時采集、圖像壓縮上傳和接收結果等功能;查詢模塊提供查詢病害數據、防治措施、服務端發布的指導信息等功能。客戶端功能結構如圖3所示。

圖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 結束語