劉小紅
(湖南信息學(xué)院,湖南 長沙 410151)
水稻病蟲害對糧食生產(chǎn)造成極大威脅,嚴(yán)重影響糧食的產(chǎn)量。病蟲害的正確識別和診斷是準(zhǔn)確防治的前提和基礎(chǔ),是提高糧食產(chǎn)量的根本保障。近年來農(nóng)業(yè)病蟲害診斷和識別的研究已成為熱點(diǎn),隨著手機(jī)應(yīng)用的不斷普及和手機(jī)附有攝像頭、攜帶方便等特點(diǎn),已有國內(nèi)外學(xué)者利用Android手機(jī)在病蟲害診斷方面進(jìn)行了深入研究,大致分為二種情況:一種情況是提出通過移動終端采集害蟲圖像直接傳遞給服務(wù)器,服務(wù)器端對接收的圖像進(jìn)行識別和處理[1-2];另一種情況是利用OpenCV在手機(jī)端對水稻病害圖像進(jìn)行識別處理[3]。前者由于Android端將圖片直接上傳,大容量圖片會消耗數(shù)據(jù)流量,可能會出現(xiàn)上傳緩慢、網(wǎng)絡(luò)傳輸噪聲等問題,從而導(dǎo)致病蟲害診斷準(zhǔn)確率不是很高或失誤。后者由于手機(jī)拍攝的圖片占用大量的數(shù)據(jù)存儲空間,加上移動終端硬件的配置使得圖像處理能力有限,影響系統(tǒng)識別的實(shí)時性;再者SQLite數(shù)據(jù)庫不適合大量圖像檢索計(jì)算,在手機(jī)端實(shí)現(xiàn)圖像的精確識別有難度。
針對以上問題,以水稻常見的病害為研究對象,利用移動互聯(lián)網(wǎng)技術(shù),文中提出將移動端采集的病害圖像進(jìn)行自適應(yīng)壓縮處理,保證圖像的清晰度并降低圖片容量大小后再上傳、在服務(wù)端對圖像進(jìn)行識別處理并返回結(jié)果的方法,并基于移動客戶端開發(fā)了水稻病害圖像識別系統(tǒng),實(shí)現(xiàn)水稻病害的及時診斷,解決圖像上傳緩慢、診斷延誤或失誤、移動端圖像處理能力有限等問題。
根據(jù)系統(tǒng)的功能需求以及架構(gòu)的設(shè)計(jì)原則,采用了C/S架構(gòu)。系統(tǒng)架構(gòu)具體劃分為三層:客戶層、通信層、服務(wù)層。系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)架構(gòu)
(1)客戶層。手機(jī)客戶端選擇JDK+Eclipse+Android NDK+ADT插件等主流應(yīng)用技術(shù)進(jìn)行開發(fā)[4];農(nóng)業(yè)種植人員或?qū)I(yè)技術(shù)人員通過手機(jī)客戶端在田間可隨時隨地采集病害圖片、壓縮處理后上傳,并進(jìn)行病害的診斷、查詢及防治建議,結(jié)果以文字和圖片等形式返回。
(2)通信層。采用4G網(wǎng)絡(luò),將客戶層與服務(wù)層進(jìn)行互聯(lián)。根據(jù)系統(tǒng)特點(diǎn)采用Http協(xié)議作為網(wǎng)絡(luò)通信技術(shù),并引入JSON輕量級數(shù)據(jù)轉(zhuǎn)換格式,實(shí)現(xiàn)客戶端和服務(wù)器端的跨平臺數(shù)據(jù)傳輸[5-8]。
(3)服務(wù)層。服務(wù)端配置為Tomcat服務(wù)器,利用Servlet技術(shù)響應(yīng)對不同客戶端發(fā)來的HTTP請求。主要負(fù)責(zé)監(jiān)聽、接收圖片,并對圖片進(jìn)行去噪、分割、特征提取、病害識別等圖像處理操作[9-13],保證病害診斷系統(tǒng)的正常運(yùn)行。
客戶端APP主要在JDK1.8+Eclipse+Android SDK+NDK+ADT平臺上開發(fā),使用Java語言編寫,APP運(yùn)行于Android平臺上。
農(nóng)業(yè)種植人員或?qū)I(yè)技術(shù)人通過手機(jī)客戶端啟動水稻病害智能診斷平臺后進(jìn)入界面。選取“圖像采集”圖標(biāo)后,進(jìn)入拍照界面,可進(jìn)行田間無摘取的實(shí)時圖像采集;選取“病害診斷”圖標(biāo)后,進(jìn)入選擇圖片界面,并裁剪;接著點(diǎn)“壓縮、上傳”圖標(biāo)后,系統(tǒng)采用JPEG算法將用戶選擇的圖片進(jìn)行壓縮處理,圖片壓縮碼流通過4G網(wǎng)絡(luò)上傳至服務(wù)器[14];選取“接收結(jié)果”圖標(biāo)后,自動接收從服務(wù)端診斷的結(jié)果,并以文字和圖片的形式在手機(jī)客戶端顯示。客戶端病害診斷流程如圖2所示。
圖2 客戶端病害診斷流程
經(jīng)過對智能診斷平臺功能的需求分析,確定三大模塊:用戶信息管理、病害圖像診斷、病害相關(guān)數(shù)據(jù)查詢。其中用戶信息管理模塊為農(nóng)業(yè)種植人員或技術(shù)人員提供用戶信息注冊、登錄、帳號管理等操作;圖像診斷模塊為用戶提供圖像實(shí)時采集、圖像壓縮上傳和接收結(jié)果等功能;查詢模塊提供查詢病害數(shù)據(jù)、防治措施、服務(wù)端發(fā)布的指導(dǎo)信息等功能??蛻舳斯δ芙Y(jié)構(gòu)如圖3所示。
圖3 客戶端功能結(jié)構(gòu)
手機(jī)端采用JPEG壓縮技術(shù)對高清大容量病害圖像進(jìn)行自適應(yīng)的質(zhì)量壓縮處理[15-16],減少傳輸?shù)谋忍財(cái)?shù),加快上傳速度,保證圖像清晰度,提高診斷準(zhǔn)確率。詳細(xì)步驟如下:先下載Libjpeg庫(C語言編寫),編譯得到libjpeg.so;配置NDK和設(shè)置環(huán)境變量;將編譯好的動態(tài)庫和頭文件加入到項(xiàng)目中,并修改配置文件;代碼實(shí)現(xiàn)壓縮照片到指定目錄并使用AsyncTask執(zhí)行壓縮操作,使用JNI技術(shù)來調(diào)用Libjpeg庫文件。
考慮自適應(yīng)壓縮的耗時問題,在后臺線程中使用AsyncTask進(jìn)行異步壓縮操作,創(chuàng)建異步操作類MyCompress,且繼承AsyncTask
ImgCompress.getInstance(this).withListener(this).starCompress(Uri.fromFile(imgFile)
為了控制圖片輸出時的空間大小,設(shè)定一種自適應(yīng)壓縮的方法,方法中調(diào)用Bitmap類的compres()方法,對壓縮后的大小與系統(tǒng)給定值進(jìn)行循環(huán)比較,如果滿足條件則繼續(xù)compress操作;否則退出循環(huán)不再壓縮,達(dá)到自適應(yīng)壓縮的效果。
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;
}
為更好地實(shí)現(xiàn)數(shù)據(jù)傳輸,根據(jù)系統(tǒng)客戶端向服務(wù)器提出連接請求并成功建立連接后,主動上傳圖片或查詢時向服務(wù)端發(fā)送數(shù)據(jù)、服務(wù)端接收數(shù)據(jù)后不斷與客戶端進(jìn)行交互響應(yīng)的特點(diǎn),采用Http協(xié)議和WebService技術(shù),利用JSON進(jìn)行數(shù)據(jù)轉(zhuǎn)換[6],實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)傳輸。如定義一個JsonUtils類,并為其添加解釋JSON數(shù)據(jù)的方法:
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類的“接收結(jié)果”方法中,代碼創(chuàng)建HttpClient、HttpGet、HttpResponse、HttpEntity等對象,實(shí)現(xiàn)從服務(wù)器端下載JSON數(shù)據(jù)。利用以下JSON語句解釋接收的網(wǎng)絡(luò)數(shù)據(jù),以本機(jī)做測試。 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組件等的優(yōu)勢設(shè)計(jì)個性化的友好、簡單的人機(jī)交互界面。 服務(wù)器端使用Java開源框架struts+spring+hibernate實(shí)現(xiàn)Web服務(wù)[4]。用struts進(jìn)行MVC設(shè)計(jì),實(shí)現(xiàn)Web層的應(yīng)用;用spring進(jìn)行數(shù)據(jù)交換,實(shí)現(xiàn)業(yè)務(wù)邏輯;用hibernate進(jìn)行數(shù)據(jù)庫的訪問,實(shí)現(xiàn)對象關(guān)系的映射??蛻舳撕头?wù)器端進(jìn)行數(shù)據(jù)交換時,存在不同的數(shù)據(jù)格式,用JSON來封裝數(shù)據(jù),可解決數(shù)據(jù)兼容性。為了實(shí)現(xiàn)與客戶端進(jìn)行數(shù)據(jù)交互,先在服務(wù)端創(chuàng)建Web項(xiàng)目,再創(chuàng)建Servlet類作為接口程序,接著將該Servlet部署到Tomcat下,同時修改web.xml,再發(fā)布項(xiàng)目。Servlet類接口代碼分為“處理接收數(shù)據(jù)”和“處理發(fā)送數(shù)據(jù)”二部分,如下: 在N2和O2環(huán)境中、不同的PDA溫度下,Al摻雜的HfO2高k柵介質(zhì)MOSCAP的C-V曲線如圖3(a)和圖3(b)所示。由圖3可見,除了O2環(huán)境中700 ℃的PDA處理?xiàng)l件外,Al摻雜HfO2的MOSCAP均表現(xiàn)出良好的C-V特性。而O2環(huán)境中700 ℃的PDA處理時C-V特性略微變差可能與該條件下界面態(tài)變差有關(guān)。 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()) ; … } 服務(wù)器在正常運(yùn)行的情況下,如果有客戶端發(fā)送圖片請求,就建立連接并接收和存儲圖片,同時采用OpenCV技術(shù)對圖像進(jìn)行特征提取[16-17],與數(shù)據(jù)庫中已有特征數(shù)據(jù)進(jìn)行匹配,實(shí)現(xiàn)圖像識別[14];最后將圖像識別結(jié)果以文字和高清圖片的形式通過網(wǎng)絡(luò)返回到客戶端。選擇OpenCV作為圖像處理手段,對客戶端發(fā)來的病害圖片進(jìn)行及時圖像處理,可解決移動終端圖像處理能力有限、SQLite數(shù)據(jù)庫檢索難度大等問題,提高系統(tǒng)識別實(shí)時性。 該系統(tǒng)利用一部三星Android手機(jī)和一臺搭載tomcat7.0服務(wù)容器的電腦作為測試環(huán)境。在手機(jī)上運(yùn)行客戶端軟件后,進(jìn)入登錄界面。輸入個人賬號登錄成功,方可進(jìn)入主功能界面。用戶可利用友好、簡單的人機(jī)交互界面,在田間實(shí)地進(jìn)行圖片采集、壓縮并上傳,進(jìn)行無采摘式、實(shí)時的病害診斷;還可以通過“信息查詢”功能,實(shí)現(xiàn)在線查詢各種病害信息和防治技術(shù)等,解決農(nóng)民在種植過程中遇到的各種問題。經(jīng)過初步測試,系統(tǒng)在性能、功能方面達(dá)到了設(shè)計(jì)的預(yù)期要求。圖4是手機(jī)端系統(tǒng)實(shí)現(xiàn)的部分界面圖。 圖4 系統(tǒng)界面圖 文中研發(fā)的基于移動端的自適應(yīng)圖像壓縮的水稻病害診斷平臺提供了病害圖像采集、壓縮、上傳并診斷,病害防治建議等功能,具備移動端攜帶方便、平臺界面友好簡單、實(shí)時無采摘的圖像采集、快速識別、準(zhǔn)確等優(yōu)點(diǎn)。初步應(yīng)用證明,該系統(tǒng)的診斷準(zhǔn)確性高,然而,處于初期階段的系統(tǒng)平臺仍存在不少問題,后期階段有待加強(qiáng):一是系統(tǒng)暫時只對簡單背景下的病害圖像識別率高,對于陰暗、潮濕等復(fù)雜環(huán)境下拍的圖像在特征提取方面有待研究;二是在病害圖像識別處理中,在分類器的算法上須改進(jìn)提高。3 服務(wù)端的設(shè)計(jì)與實(shí)現(xiàn)
4 系統(tǒng)測試
5 結(jié)束語