前言
本項(xiàng)目基于Keras框架,引入CNN進(jìn)行模型訓(xùn)練,采用Dropout梯度下降算法,按比例丟棄部分神經(jīng)元,同時(shí)利用IOT及微信小程序?qū)崿F(xiàn)自動(dòng)化遠(yuǎn)程監(jiān)測(cè)果實(shí)成熟度以及移動(dòng)端實(shí)時(shí)監(jiān)測(cè)的功能,為果農(nóng)提供采摘指導(dǎo),有利于節(jié)約勞動(dòng)力,提高生產(chǎn)效率,提升經(jīng)濟(jì)效益。
本項(xiàng)目基于Keras框架,采用卷積神經(jīng)網(wǎng)絡(luò)(CNN)進(jìn)行模型訓(xùn)練。通過引入Dropout梯度下降算法,實(shí)現(xiàn)了對(duì)神經(jīng)元的按比例丟棄,以提高模型的魯棒性和泛化性能。同時(shí),利用物聯(lián)網(wǎng)(IoT)技術(shù)和微信小程序,項(xiàng)目實(shí)現(xiàn)了自動(dòng)化遠(yuǎn)程監(jiān)測(cè)果實(shí)成熟度,并在移動(dòng)端實(shí)時(shí)監(jiān)測(cè)果園狀態(tài)的功能。這為果農(nóng)提供了采摘的實(shí)時(shí)指導(dǎo),有助于節(jié)約勞動(dòng)力、提高生產(chǎn)效率,從而提升果園經(jīng)濟(jì)效益。
首先,項(xiàng)目采用Keras框架構(gòu)建了一個(gè)卷積神經(jīng)網(wǎng)絡(luò),利用深度學(xué)習(xí)技術(shù)對(duì)果實(shí)成熟度進(jìn)行準(zhǔn)確的識(shí)別和預(yù)測(cè)。
其次,引入Dropout梯度下降算法,通過隨機(jī)丟棄神經(jīng)元的方式,防止模型過擬合,提高了對(duì)新數(shù)據(jù)的泛化能力。
接著,項(xiàng)目整合了物聯(lián)網(wǎng)技術(shù),通過傳感器等設(shè)備對(duì)果園中的果實(shí)進(jìn)行遠(yuǎn)程監(jiān)測(cè)。這樣,果農(nóng)可以在不同地點(diǎn)遠(yuǎn)程了解果實(shí)的成熟度狀況。
同時(shí),通過微信小程序,果農(nóng)可以實(shí)時(shí)監(jiān)測(cè)果園狀態(tài),了解果實(shí)成熟度、采摘時(shí)機(jī)等信息,從而更加科學(xué)地安排采摘工作。
總體來說,該項(xiàng)目不僅在模型訓(xùn)練上引入了先進(jìn)的深度學(xué)習(xí)技術(shù),還通過物聯(lián)網(wǎng)和微信小程序?qū)崿F(xiàn)了智能化的果園管理系統(tǒng),為果農(nóng)提供了更加便捷、高效的農(nóng)業(yè)生產(chǎn)解決方案。
總體設(shè)計(jì)
本部分包括系統(tǒng)整體結(jié)構(gòu)圖和系統(tǒng)流程圖。
系統(tǒng)整體結(jié)構(gòu)圖
系統(tǒng)整體結(jié)構(gòu)如圖所示。
系統(tǒng)流程圖
模型訓(xùn)練流程如圖所示。
數(shù)據(jù)上傳流程如圖所示。
小程序流程如圖所示。
運(yùn)行環(huán)境
本部分包括Python環(huán)境、TensorFlow環(huán)境、JupyterNotebook環(huán)境、PyCharm環(huán)境、微信開發(fā)者工具和OneNET云平臺(tái)。
Python環(huán)境
詳見博客。
TensorFlow 環(huán)境
詳見博客。
Jupyter Notebook環(huán)境
詳見博客。
Pycharm 環(huán)境
詳見博客。
微信開發(fā)者工具
詳見博客。
OneNET云平臺(tái)
詳見博客。
模塊實(shí)現(xiàn)
本項(xiàng)目包括本項(xiàng)目包括5個(gè)模塊:數(shù)據(jù)預(yù)處理、創(chuàng)建模型與編譯、模型訓(xùn)練及保存、上傳結(jié)果、小程序開發(fā)。下面分別給出各模塊的功能介紹及相關(guān)代碼。
1. 數(shù)據(jù)預(yù)處理
以紅棗為實(shí)驗(yàn)對(duì)象,在互聯(lián)網(wǎng)上爬取1000張圖片作為數(shù)據(jù)集。
詳見博客。
2. 創(chuàng)建模型并編譯
數(shù)據(jù)加載進(jìn)模型之后,需要定義模型結(jié)構(gòu)并優(yōu)化損失函數(shù)。
詳見博客。
3. 模型訓(xùn)練及保存
定義模型架構(gòu)和編譯之后,通過訓(xùn)練集訓(xùn)練,使模型可以識(shí)別紅棗的成熟程度。這里將使用訓(xùn)練集和測(cè)試集來擬合并保存模型。
1)模型訓(xùn)練
本部分相關(guān)代碼如下:
#model.fit函數(shù)返回一個(gè)History的對(duì)象
#History屬性記錄了損失函數(shù)和其他指標(biāo)的數(shù)值隨epoch變化的情況
hist =model.fit(x = train_data, y = train_label,
validation_data=[test_data, test_label],
epochs = 500, batch_size = 64)
hist.history['val_acc'][0]#記錄運(yùn)行輸出
preds = model.evaluate(test_data, test_label)
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
其中,一個(gè)batch就是在一次前向/后向傳播過程用到的訓(xùn)練樣例數(shù)量,本項(xiàng)目中每一次用64張圖片進(jìn)行訓(xùn)練。預(yù)處理數(shù)據(jù)集后,按照8:2的比例劃分訓(xùn)練集和測(cè)試集,如圖所示。
通過觀察訓(xùn)練集和測(cè)試集的損失函數(shù)、準(zhǔn)確率的大小來評(píng)估模型的訓(xùn)練程度,并進(jìn)行模型訓(xùn)練的進(jìn)一步?jīng)Q策。一般來說,訓(xùn)練集和測(cè)試集的損失函數(shù)(或準(zhǔn)確率)不變且基本相等為模型訓(xùn)練的最佳狀態(tài)。
可以將訓(xùn)練過程中保存的準(zhǔn)確率和損失函數(shù)以圖片的形式呈現(xiàn)。
import numpy as np
import matplotlib.pyplot as plt
#繪制曲線
#解決中文顯示問題
plt.rcParams['font.sans-serif'] = ['KaiTi'] #指定默認(rèn)字體
plt.rcParams['axes.unicode_minus'] = False #解決保存圖像是“-”顯示為方塊的問題
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
lns1 = ax1.plot(np.arange(500), loss, label="Loss")
#按一定間隔顯示實(shí)現(xiàn)方法
#ax2.plot(200 * np.arange(len(fig_accuracy)), fig_accuracy, 'r')
lns2 = ax2.plot(np.arange(500), acc, 'r', label="Accuracy")
ax1.set_xlabel('訓(xùn)練輪次')
ax1.set_ylabel('訓(xùn)練損失值')
ax2.set_ylabel('訓(xùn)練準(zhǔn)確率')
#合并圖例
lns = lns1 + lns2
labels = ["損失", "準(zhǔn)確率"]
#labels = [l.get_label() for l in lns]
plt.legend(lns, labels, loc=7)
plt.show()
2)模型保存
為能夠被Python程序讀取,將模型保存為.h5
格式,利用Keras中的Model模塊進(jìn)行保存。模型被保存后,可以被重用,也可以移植到其他環(huán)境中使用。
from keras.models import Model
model = HappyModel((IMG_H,IMG_W,3))
#保存為.h5文件
model.save('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')
模型被保存后,可以被重用,也可以移植到其他環(huán)境中使用。
4. 上傳結(jié)果
上傳結(jié)果有兩種方法:一是調(diào)用計(jì)算機(jī)攝像頭拍攝圖片,將圖片信息轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)流后上傳至OneNET云平臺(tái);二是將數(shù)字圖片輸入Keras模型中,獲取輸出后將識(shí)別結(jié)果上傳至OneNET云平臺(tái)。
1)圖片拍攝
圖片拍攝具體操作如下:
(1)調(diào)用攝像頭需要引入cv2類,對(duì)數(shù)據(jù)進(jìn)行保護(hù)。
import cv2
(2)調(diào)用cv2類中的VideoCapture函數(shù),實(shí)現(xiàn)調(diào)用筆記本內(nèi)置攝像頭拍攝的功能。
#調(diào)用筆記本內(nèi)置攝像頭,參數(shù)為0,如果有其他的攝像頭可以調(diào)整參數(shù)為1,2
cap=cv2.VideoCapture(0)
while True:
#從攝像頭讀取圖片
sucess,img=cap.read()
#顯示攝像頭
cv2.imshow("img",img)
#等待時(shí)延為1ms,保持畫面的持續(xù)
k=cv2.waitKey(1)
if k == 27:
#通過ESC鍵退出攝像
cv2.destroyAllWindows()
break
elif k == 13:
#通過回車保存圖片,并退出
cv2.imwrite('C:/Users/SeverusSnape/Desktop/myProject/images/try.png',img)
cv2.destroyAllWindows()
break
#關(guān)閉攝像頭
cap.release()
2)模型導(dǎo)入及調(diào)用
模型導(dǎo)入及調(diào)用的相關(guān)操作如下:
(1)把訓(xùn)練好的.h5
文件放入myProject
項(xiàng)目目錄。
(2)加載Keras模型庫,調(diào)用Keras模型得到預(yù)測(cè)結(jié)果。
from keras.models import load_model
(3)在xxxtsj.ipynb
中聲明模型存放路徑,調(diào)用load_model()
函數(shù)。
#加載模型.h5文件
model=load_model('C:/Users/SeverusSnape/Desktop/myProject/classifier_3.h5')
#定義規(guī)范化圖片大小和像素值的函數(shù)
def get_inputs(src=[]):
rsltData = []
for s in src:
input = cv2.imread(s)#讀入圖像,BGR
input = cv2.resize(input, (IMG_W, IMG_H))#縮放
input = cv2.cvtColor(input, cv2.COLOR_BGR2RGB)#將BGR圖片轉(zhuǎn)成RGB
pre_y=model.predict(np.reshape(input,[1,IMG_H,IMG_W,3]),batch_size=1)
print(np.argmax(pre_y, axis=1))#打印最大概率對(duì)應(yīng)的標(biāo)簽
a=np.argmax(pre_y,axis=1)#必須通過遍歷否則格式不對(duì),不止包含數(shù)還包括btypy
for i in a:
rsltData.append(i)#將最大概率對(duì)應(yīng)的標(biāo)簽加入rsltData列表尾部
return rsltData
predict_dir = 'C:/Users/SeverusSnape/Desktop/myProject/images/'
#要預(yù)測(cè)圖片所在的文件夾
picName = os.listdir(predict_dir)#獲得文件夾內(nèi)的文件名
images = []
for testpath in picName:
fn = os.path.join(predict_dir, testpath)
if fn.endswith('png'):#后綴是png的文件會(huì)被存入images列表
picData = fn
print(picData)#打印被存入的圖片地址
images.append(picData)#地址存入images列表
rsltData = get_inputs(images)#調(diào)用規(guī)范化圖片函數(shù)得到最大概率對(duì)應(yīng)標(biāo)簽
3)數(shù)據(jù)上傳OneNET云平臺(tái)
本部分包括圖片信息上傳和識(shí)別結(jié)果上傳。
(1)圖片信息上傳
將圖片信息轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)流,使用POST方法上傳。
#定義圖片上傳函數(shù)
http_put_pic(data):
url = "http://api.heclouds.com/bindata"
headers = {
"Content-Type": "image/png", #格式
"api-key": "93IlIl2tfXddMN8sgQIInc7qbXs=",
}
#device_id是設(shè)備ID
#datastream_id是數(shù)據(jù)流ID
querystring = {"device_id": "586488389", "datastream_id": "pic"}
#流式上傳
with open(data, 'rb') as f:
requests.post(url, params=querystring, headers=headers, data=f)
(2)預(yù)測(cè)結(jié)果上傳
因?yàn)樽R(shí)別的結(jié)果是整型數(shù)據(jù),直接使用POST方法上傳數(shù)值。
#定義預(yù)測(cè)結(jié)果上傳函數(shù)
def http_put_rslt(data):
url = "http://api.heclouds.com/devices/" + deviceId + '/datapoints'
d = time.strftime('%Y-%m-%dT%H:%M:%S')
data = int(data) #將Numpy數(shù)據(jù)int64轉(zhuǎn)化成json可識(shí)別的int
values = {"datastreams": [{"id": "rslt", "datapoints": [{"value": data}]}]}
jdata = json.dumps(values).encode("utf-8")
request = urllib.request.Request(url, jdata) #獲取鏈接數(shù)據(jù)
request.add_header('api-key', APIKey)
request.get_method = lambda: 'POST' #POST方法
request = urllib.request.urlopen(request)
return request.read()
相關(guān)其它博客
基于OpenCV+CNN+IOT+微信小程序智能果實(shí)采摘指導(dǎo)系統(tǒng)——深度學(xué)習(xí)算法應(yīng)用(含python、JS工程源碼)+數(shù)據(jù)集+模型(一)
基于OpenCV+CNN+IOT+微信小程序智能果實(shí)采摘指導(dǎo)系統(tǒng)——深度學(xué)習(xí)算法應(yīng)用(含python、JS工程源碼)+數(shù)據(jù)集+模型(二)
基于OpenCV+CNN+IOT+微信小程序智能果實(shí)采摘指導(dǎo)系統(tǒng)——深度學(xué)習(xí)算法應(yīng)用(含python、JS工程源碼)+數(shù)據(jù)集+模型(三)
基于OpenCV+CNN+IOT+微信小程序智能果實(shí)采摘指導(dǎo)系統(tǒng)——深度學(xué)習(xí)算法應(yīng)用(含python、JS工程源碼)+數(shù)據(jù)集+模型(五)
工程源代碼下載
詳見本人博客資源下載頁文章來源:http://www.zghlxwxcb.cn/news/detail-791025.html
其它資料下載
如果大家想繼續(xù)了解人工智能相關(guān)學(xué)習(xí)路線和知識(shí)體系,歡迎大家翻閱我的另外一篇博客《重磅 | 完備的人工智能AI 學(xué)習(xí)——基礎(chǔ)知識(shí)學(xué)習(xí)路線,所有資料免關(guān)注免套路直接網(wǎng)盤下載》
這篇博客參考了Github知名開源平臺(tái),AI技術(shù)平臺(tái)以及相關(guān)領(lǐng)域?qū)<遥篋atawhale,ApacheCN,AI有道和黃海廣博士等約有近100G相關(guān)資料,希望能幫助到所有小伙伴們。文章來源地址http://www.zghlxwxcb.cn/news/detail-791025.html
到了這里,關(guān)于基于OpenCV+CNN+IOT+微信小程序智能果實(shí)采摘指導(dǎo)系統(tǒng)——深度學(xué)習(xí)算法應(yīng)用(含python、JS工程源碼)+數(shù)據(jù)集+模型(四)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!