一、選題的背景
蘋果在采摘期被采摘后,需要工人進(jìn)行手工對蘋果的成熟度進(jìn)行分類,這耗費(fèi)了大量的人力與物力,而且相近成熟度難以區(qū)分,存在分類顆粒度過粗,分類過程存在較為強(qiáng)烈的主觀因素等問題。
在這里,我們提出了基于深度學(xué)習(xí)的蘋果成熟度識別方案,這是一種用于幫助農(nóng)民和采摘工人判斷蘋果成熟度的人工智能系統(tǒng)。它能夠從圖像中快速、準(zhǔn)確地判斷蘋果的成熟度,判斷蘋果是否已經(jīng)成熟,從而為農(nóng)民和采摘工人提供幫助。
二、數(shù)據(jù)集的來源
數(shù)據(jù)一共有A -F一共六種不同成熟度的蘋果,一共包括6161張照片。
AppleD文件夾: 網(wǎng)上搜索蘋果成熟前5個月,此時蘋果還很青澀
AppleF文件夾: 網(wǎng)上搜索蘋果成熟前4個月
AppleE文件夾: 網(wǎng)上搜索蘋果前成熟3個月
AppleC文件夾: 網(wǎng)上搜索蘋果成熟前2個月
AppleA文件夾: 網(wǎng)上搜索蘋果成熟前1個月
AppleB文件夾: 網(wǎng)上搜索蘋果成熟時,此時蘋果成熟
三、采用的機(jī)器學(xué)習(xí)框架描述
采用keras框架搭建分類模型,完成模型訓(xùn)練、預(yù)測和分類任務(wù)。
采用tensorflow.image API與tensorflow.data API完成圖片的增強(qiáng)與數(shù)據(jù)集的制作。
采用sklearn,完成訓(xùn)練集和測試集的劃分,并且固定隨機(jī)數(shù)種子,防止信息泄露。
四、涉及到的技術(shù)難點(diǎn)與解決思路
tf.data可以把python寫的代碼編譯到C++后端高效執(zhí)行,因此也存在較大的限制。對模型張量存在要求,使用上也有限制。
數(shù)據(jù)集并不算十分充裕,因此引入預(yù)訓(xùn)練模型就十分必要了。這里采用的是ResNet50在imageNet上預(yù)訓(xùn)練的模型,有很強(qiáng)的泛化能力。
五、數(shù)據(jù)的預(yù)處理
為了利用在ResNet在ImageNet上預(yù)訓(xùn)練的權(quán)重,因此我們要使用與預(yù)訓(xùn)練相同的數(shù)據(jù)預(yù)處理方式,使數(shù)據(jù)保證在同一份分布上。
網(wǎng)絡(luò)輸入尺寸設(shè)置為224 * 224 * 3的RGB全彩圖像,為了迎合各種尺寸的實(shí)際圖像,需要把數(shù)據(jù)集中的圖像按比例縮放,保證圖像不會走形,影響模型的性能。將圖片進(jìn)行居中對齊,然后對每個維度缺失部分填0補(bǔ)充,反映到圖像上,及為圖像增加黑邊。
在這里我們采用圖片放大然后隨機(jī)裁剪的方式對數(shù)據(jù)集進(jìn)行擴(kuò)充。
在實(shí)際中,我們縮放后的圖片并非為實(shí)際網(wǎng)絡(luò)輸入尺寸,而是輸入尺寸的1.4倍,然后再隨機(jī)裁剪出需要尺寸。
最后對圖片進(jìn)行隨機(jī)鏡像,隨機(jī)旋轉(zhuǎn)進(jìn)行數(shù)據(jù)增強(qiáng),提高模型性能。
六、模型選擇:
模型采用ResNet50,并加載imageNet數(shù)據(jù)集上訓(xùn)練的權(quán)重,降低訓(xùn)練壓力,提高訓(xùn)練效果。
七、訓(xùn)練參數(shù):
優(yōu)化器: 采用Adam優(yōu)化器學(xué)習(xí)率設(shè)置為2*1e-4,并訓(xùn)練10個epoch
損失函數(shù): 采用SparseCategoryEntropy,及交叉熵作為分類損失。
衡量指標(biāo): 采用正確率和計(jì)算損失作為衡量指標(biāo)
八、開始訓(xùn)練:
這里我訓(xùn)練了6個epoch,但是由圖可知只有前3個epoch是有效訓(xùn)練。
訓(xùn)練集和測試集按照6:4比例劃分,分類模型在測試集上實(shí)現(xiàn)了99.4%的分類精度。
九、模型測試:
我們加載一張圖片對蘋果進(jìn)行分類演示:
模型預(yù)測蘋果為D類,實(shí)現(xiàn)了正確分類。
十、總結(jié)
通過這次的實(shí)驗(yàn),我學(xué)會更好的使用python,利用python做好更多的事情,只要一些簡單的代碼,就能讓電腦學(xué)會分辨蘋果的成熟度,很是方便,自己也可以利用這個程序檢驗(yàn)生活中蘋果的成熟度。
十一、代碼
import tensorflow as tf
from keras.applications import resnet
from keras.losses import SparseCategoricalCrossentropy
from keras.layers import *
from keras.applications.resnet import preprocess_input
from keras import Model
from keras.optimizers import Adam
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from keras.callbacks import ModelCheckpoint
import os
pretained = True
image_size = 224
expand_rate = 1.1
expand_size = int(expand_rate * image_size)
batch_size = 32
learning_rate = 1*1e-5
#classes = [‘Apple’,‘Carambola’,‘Kiwi’,‘Orange’,‘Pear’,‘Pitaya’,‘Pomegranate’,‘muskmelon’,
‘Banana’,‘Guava’,‘Mango’,‘Peach’,‘Persimmon’,‘Plum’,‘Tomatoes’]
#data_dir = r"D:\datasets\水果分類"
classes = [‘Apple A’, ‘Apple B’, ‘Apple C’, ‘Apple D’, ‘Apple E’, ‘Apple F’]
data_dir = r"D:/蘋果成熟度分類\Apple"
weights_file = “蘋果分類ResNet50.h5”
def build_resnet50_model(input_size,num_classes,is_pretrained):
_input = Input((input_size,input_size,3))
_body = resnet.ResNet50(include_top=False,weights= 'imagenet' if is_pretrained else None,pooling='avg')(_input)
_output = Dense(num_classes,activation='softmax')(_body)
model = Model(inputs=_input,outputs=_output)
model.compile(optimizer=Adam(learning_rate= learning_rate),loss=SparseCategoricalCrossentropy(from_logits=False),metrics='accuracy')
return model
model = build_resnet50_model(image_size,len(classes),True)
model.summary()
def process_image(filepath,label_idx,show_image=False):
binary = tf.io.read_file(filepath)
image = tf.image.decode_image(binary,expand_animations=False,dtype=tf.float32)
image_height,image_width = tf.shape(image)[0],tf.shape(image)[1]#獲取圖片的高,獲取圖片的寬
#接下來對圖片進(jìn)行等比例縮放.
#寬與高較大的者的縮放后的尺寸會直接設(shè)置為目標(biāo)圖片大小
#通過上述確定的先后圖片邊的尺寸,進(jìn)而確定比例尺
#通過確定的比例尺對圖片另一條邊進(jìn)行縮放
if image_height > image_width:
new_height = expand_size
new_ratio = tf.cast(expand_size,tf.float32) / tf.cast(image_height,tf.float32)
new_width = tf.clip_by_value(tf.cast(tf.cast(image_width,tf.float32)* new_ratio,tf.int32),0,expand_size)
else:
new_width = expand_size
new_ratio = tf.cast(expand_size,tf.float32) / tf.cast(image_width,tf.float32)
new_height = tf.clip_by_value(tf.cast(tf.cast(image_height,tf.float32)* new_ratio,tf.int32),0,expand_size)
image_big = tf.image.resize(image,[new_height,new_width])#對圖片按照計(jì)算出的高于寬進(jìn)行調(diào)整
image_expand = tf.pad(image_big,[[(expand_size - new_height)//2,expand_size-(new_height+(expand_size - new_height)//2)],
[(expand_size - new_width)//2,expand_size-(new_width+(expand_size - new_width)//2)],[0,0]])
image_crop = tf.image.random_crop(image_expand,[image_size,image_size,3])
image_flip = tf.image.random_flip_left_right(image_crop)
image_output = tf.image.random_flip_up_down(image_flip)
#image_output = tf.image.transpose(image_flip,tf.gather([0,90,270],tf.random.uniform((),minval=0,maxval=3,dtype=tf.int32)))
if not show_image:
image_output = preprocess_input(image_output * 255.)
return image_output,label_idx
test_image,_ = process_image(r"D:/蘋果成熟度分類\Apple\Apple03.jpg",‘’,show_image=True)
print(tf.reduce_mean(test_image))
print(tf.reduce_max(test_image))
import matplotlib.pyplot as plt
plt.imshow(test_image)
def load_dataset(data_dir):
filepaths = []
label_idices = []
for label_idx,current_dir in enumerate(classes):
for filename in os.listdir(os.path.join(data_dir,current_dir)):
filepath = os.path.join(data_dir,current_dir,filename)
filepaths.append(filepath)
label_idices.append(label_idx)
return filepaths,label_idices
x_train,x_test,y_train,y_test = train_test_split(*load_dataset(data_dir),shuffle=True,random_state=1234)
train_dataset = tf.data.Dataset.from_tensor_slices((x_train,y_train)).shuffle(2048,seed=1234).map(process_image,num_parallel_calls=32).prefetch(tf.data.AUTOTUNE).batch(batch_size)
test_dataset = tf.data.Dataset.from_tensor_slices((x_test,y_test)).shuffle(2048,seed=1234).map(process_image,num_parallel_calls=32).prefetch(tf.data.AUTOTUNE).batch(batch_size)
model.compile(optimizer=Adam(learning_rate=2*1e-4),loss=SparseCategoricalCrossentropy(from_logits=False),metrics=‘a(chǎn)ccuracy’)
if os.path.exists(weights_file):
model.load_weights(weights_file)
else:
model.fit(train_dataset,validation_data=test_dataset,epochs=10)
def predict_image(imagepath):
input_image = tf.expand_dims(process_image(imagepath,'')[0],axis=0)
output_probs = model(input_image)
image_label_idx = tf.argmax(output_probs,axis=-1)[0]
image_label = tf.gather(classes,image_label_idx).numpy()
image_label = image_label.decode("UTF-8")
return image_label
label = predict_image(r"D:/蘋果成熟度分類\Apple\Apple03.jpg")
print("預(yù)測的分類為: ",label)
如何學(xué)習(xí)大模型 AI ?
由于新崗位的生產(chǎn)效率,要優(yōu)于被取代崗位的生產(chǎn)效率,所以實(shí)際上整個社會的生產(chǎn)效率是提升的。
但是具體到個人,只能說是:
“最先掌握AI的人,將會比較晚掌握AI的人有競爭優(yōu)勢”。
這句話,放在計(jì)算機(jī)、互聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)的開局時期,都是一樣的道理。
我在一線互聯(lián)網(wǎng)企業(yè)工作十余年里,指導(dǎo)過不少同行后輩。幫助很多人得到了學(xué)習(xí)和成長。
我意識到有很多經(jīng)驗(yàn)和知識值得分享給大家,也可以通過我們的能力和經(jīng)驗(yàn)解答大家在人工智能學(xué)習(xí)中的很多困惑,所以在工作繁忙的情況下還是堅(jiān)持各種整理和分享。但苦于知識傳播途徑有限,很多互聯(lián)網(wǎng)行業(yè)朋友無法獲得正確的資料得到學(xué)習(xí)提升,故此將并將重要的AI大模型資料包括AI大模型入門學(xué)習(xí)思維導(dǎo)圖、精品AI大模型學(xué)習(xí)書籍手冊、視頻教程、實(shí)戰(zhàn)學(xué)習(xí)等錄播視頻免費(fèi)分享出來。
??有需要的小伙伴,可以點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取或者V掃描下方二維碼免費(fèi)領(lǐng)取??
?
第一階段(10天):初階應(yīng)用
該階段讓大家對大模型 AI有一個最前沿的認(rèn)識,對大模型 AI 的理解超過 95% 的人,可以在相關(guān)討論時發(fā)表高級、不跟風(fēng)、又接地氣的見解,別人只會和 AI 聊天,而你能調(diào)教 AI,并能用代碼將大模型和業(yè)務(wù)銜接。
- 大模型 AI 能干什么?
- 大模型是怎樣獲得「智能」的?
- 用好 AI 的核心心法
- 大模型應(yīng)用業(yè)務(wù)架構(gòu)
- 大模型應(yīng)用技術(shù)架構(gòu)
- 代碼示例:向 GPT-3.5 灌入新知識
- 提示工程的意義和核心思想
- Prompt 典型構(gòu)成
- 指令調(diào)優(yōu)方法論
- 思維鏈和思維樹
- Prompt 攻擊和防范
- …
第二階段(30天):高階應(yīng)用
該階段我們正式進(jìn)入大模型 AI 進(jìn)階實(shí)戰(zhàn)學(xué)習(xí),學(xué)會構(gòu)造私有知識庫,擴(kuò)展 AI 的能力??焖匍_發(fā)一個完整的基于 agent 對話機(jī)器人。掌握功能最強(qiáng)的大模型開發(fā)框架,抓住最新的技術(shù)進(jìn)展,適合 Python 和 JavaScript 程序員。
- 為什么要做 RAG
- 搭建一個簡單的 ChatPDF
- 檢索的基礎(chǔ)概念
- 什么是向量表示(Embeddings)
- 向量數(shù)據(jù)庫與向量檢索
- 基于向量檢索的 RAG
- 搭建 RAG 系統(tǒng)的擴(kuò)展知識
- 混合檢索與 RAG-Fusion 簡介
- 向量模型本地部署
- …
第三階段(30天):模型訓(xùn)練
恭喜你,如果學(xué)到這里,你基本可以找到一份大模型 AI相關(guān)的工作,自己也能訓(xùn)練 GPT 了!通過微調(diào),訓(xùn)練自己的垂直大模型,能獨(dú)立訓(xùn)練開源多模態(tài)大模型,掌握更多技術(shù)方案。
到此為止,大概2個月的時間。你已經(jīng)成為了一名“AI小子”。那么你還想往下探索嗎?
- 為什么要做 RAG
- 什么是模型
- 什么是模型訓(xùn)練
- 求解器 & 損失函數(shù)簡介
- 小實(shí)驗(yàn)2:手寫一個簡單的神經(jīng)網(wǎng)絡(luò)并訓(xùn)練它
- 什么是訓(xùn)練/預(yù)訓(xùn)練/微調(diào)/輕量化微調(diào)
- Transformer結(jié)構(gòu)簡介
- 輕量化微調(diào)
- 實(shí)驗(yàn)數(shù)據(jù)集的構(gòu)建
- …
第四階段(20天):商業(yè)閉環(huán)
對全球大模型從性能、吞吐量、成本等方面有一定的認(rèn)知,可以在云端和本地等多種環(huán)境下部署大模型,找到適合自己的項(xiàng)目/創(chuàng)業(yè)方向,做一名被 AI 武裝的產(chǎn)品經(jīng)理。
- 硬件選型
- 帶你了解全球大模型
- 使用國產(chǎn)大模型服務(wù)
- 搭建 OpenAI 代理
- 熱身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地計(jì)算機(jī)運(yùn)行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何優(yōu)雅地在阿里云私有部署開源大模型
- 部署一套開源 LLM 項(xiàng)目
- 內(nèi)容安全
- 互聯(lián)網(wǎng)信息服務(wù)算法備案
- …
學(xué)習(xí)是一個過程,只要學(xué)習(xí)就會有挑戰(zhàn)。天道酬勤,你越努力,就會成為越優(yōu)秀的自己。
如果你能在15天內(nèi)完成所有的任務(wù),那你堪稱天才。然而,如果你能完成 60-70% 的內(nèi)容,你就已經(jīng)開始具備成為一名大模型 AI 的正確特征了。文章來源:http://www.zghlxwxcb.cn/news/detail-849586.html
這份完整版的大模型 AI 學(xué)習(xí)資料已經(jīng)上傳CSDN,朋友們?nèi)绻枰梢晕⑿艗呙柘路紺SDN官方認(rèn)證二維碼免費(fèi)領(lǐng)取【保證100%免費(fèi)
】
??有需要的小伙伴,可以點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取或者V掃描下方二維碼免費(fèi)領(lǐng)取??
?文章來源地址http://www.zghlxwxcb.cn/news/detail-849586.html
到了這里,關(guān)于基于人工智能的蘋果成熟度檢測的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!