一、选题的背景
苹果在采摘期被采摘后,需要工人进行手工对苹果的成熟度进行分类,这耗费了大量的人力与物力,而且相近成熟度难以区分,存在分类颗粒度过粗,分类过程存在较为强烈的主观因素等问题。
在这里,我们提出了基于深度学习的苹果成熟度识别方案,这是一种用于帮助农民和采摘工人判断苹果成熟度的人工智能系统。它能够从图像中快速、准确地判断苹果的成熟度,判断苹果是否已经成熟,从而为农民和采摘工人提供帮助。
二、数据集的来源
数据一共有A -F一共六种不同成熟度的苹果,一共包括6161张照片。
AppleD文件夹: 网上搜索苹果成熟前5个月,此时苹果还很青涩
AppleF文件夹: 网上搜索苹果成熟前4个月
AppleE文件夹: 网上搜索苹果前成熟3个月
AppleC文件夹: 网上搜索苹果成熟前2个月
AppleA文件夹: 网上搜索苹果成熟前1个月
AppleB文件夹: 网上搜索苹果成熟时,此时苹果成熟
三、采用的机器学习框架描述
采用keras框架搭建分类模型,完成模型训练、预测和分类任务。
采用tensorflow.image API与tensorflow.data API完成图片的增强与数据集的制作。
采用sklearn,完成训练集和测试集的划分,并且固定随机数种子,防止信息泄露。
四、涉及到的技术难点与解决思路
tf.data可以把python写的代码编译到C++后端高效执行,因此也存在较大的限制。对模型张量存在要求,使用上也有限制。
数据集并不算十分充裕,因此引入预训练模型就十分必要了。这里采用的是ResNet50在imageNet上预训练的模型,有很强的泛化能力。
五、数据的预处理
为了利用在ResNet在ImageNet上预训练的权重,因此我们要使用与预训练相同的数据预处理方式,使数据保证在同一份分布上。
网络输入尺寸设置为224 * 224 * 3的RGB全彩图像,为了迎合各种尺寸的实际图像,需要把数据集中的图像按比例缩放,保证图像不会走形,影响模型的性能。将图片进行居中对齐,然后对每个维度缺失部分填0补充,反映到图像上,及为图像增加黑边。
在这里我们采用图片放大然后随机裁剪的方式对数据集进行扩充。
在实际中,我们缩放后的图片并非为实际网络输入尺寸,而是输入尺寸的1.4倍,然后再随机裁剪出需要尺寸。
最后对图片进行随机镜像,随机旋转进行数据增强,提高模型性能。
六、模型选择:
模型采用ResNet50,并加载imageNet数据集上训练的权重,降低训练压力,提高训练效果。
七、训练参数:
优化器: 采用Adam优化器学习率设置为2*1e-4,并训练10个epoch
损失函数: 采用SparseCategoryEntropy,及交叉熵作为分类损失。
衡量指标: 采用正确率和计算损失作为衡量指标
八、开始训练:
这里我训练了6个epoch,但是由图可知只有前3个epoch是有效训练。
训练集和测试集按照6:4比例划分,分类模型在测试集上实现了99.4%的分类精度。
九、模型测试:
我们加载一张图片对苹果进行分类演示:
模型预测苹果为D类,实现了正确分类。
十、总结
通过这次的实验,我学会更好的使用python,利用python做好更多的事情,只要一些简单的代码,就能让电脑学会分辨苹果的成熟度,很是方便,自己也可以利用这个程序检验生活中苹果的成熟度。
十一、代码
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]#获取图片的高,获取图片的宽
#接下来对图片进行等比例缩放.
#宽与高较大的者的缩放后的尺寸会直接设置为目标图片大小
#通过上述确定的先后图片边的尺寸,进而确定比例尺
#通过确定的比例尺对图片另一条边进行缩放
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])#对图片按照计算出的高于宽进行调整
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=‘accuracy’)
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("预测的分类为: ",label)
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。文章来源:https://www.toymoban.com/news/detail-849586.html
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
文章来源地址https://www.toymoban.com/news/detail-849586.html
到了这里,关于基于人工智能的苹果成熟度检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!