当前位置: 首页 > news >正文

毕业设计 深度学习水果分类系统

文章目录1 前言2 开发简介3 识别原理3.1 传统图像识别原理3.2 深度学习水果识别4 数据集5 部分关键代码5.1 处理训练集的数据结构5.2 模型网络结构5.3 训练模型6 识别效果1 前言Hi大家好这里是丹成学长今天做一个 基于深度学习的水果识别毕业设计项目运行效果毕业设计 深度学习水果分类系统 项目分享:见主页简介2 开发简介深度学习作为机器学习领域内新兴并且蓬勃发展的一门学科 它不仅改变着传统的机器学习方法 也影响着我们对人类感知的理解 已经在图像识别和语音识别等领域取得广泛的应用。 因此 本文在深入研究深度学习理论的基础上 将深度学习应用到水果图像识别中 以此来提高了水果图像的识别性能。3 识别原理3.1 传统图像识别原理传统的水果图像识别系统的一般过程如下图所示主要工作集中在图像预处理和特征提取阶段。在大多数的识别任务中 实验所用图像往往是在严格限定的环境中采集的 消除了外界环境对图像的影响。 但是实际环境中图像易受到光照变化、 水果反光、 遮挡等因素的影响 这在不同程度上影响着水果图像的识别准确率。在传统的水果图像识别系统中 通常是对水果的纹理、 颜色、 形状等特征进行提取和识别。3.2 深度学习水果识别CNN 是一种专门为识别二维特征而设计的多层神经网络 它的结构如下图所示这种结构对平移、 缩放、 旋转等变形具有高度的不变性。学长本次采用的 CNN 架构如图4 数据集数据库分为训练集(train)和测试集(test)两部分训练集包含四类apple,orange,banana,mixed(多种水果混合)四类237张图片测试集包含每类图片各两张。图片集如下图所示。图片类别可由图片名称中提取。训练集图片预览测试集预览数据集目录结构5 部分关键代码5.1 处理训练集的数据结构importosimportpandasaspd train_dir./Training/test_dir./Test/fruits[]fruits_image[]foriinos.listdir(train_dir):forimage_filenameinos.listdir(train_diri):fruits.append(i)# name of the fruitfruits_image.append(i/image_filename)train_fruitspd.DataFrame(fruits,columns[Fruits])train_fruits[Fruits Image]fruits_imageprint(train_fruits)5.2 模型网络结构importmatplotlib.pyplotaspltimportseabornassnsfromkeras.preprocessing.imageimportImageDataGenerator,img_to_array,load_imgfromglobimportglobfromkeras.modelsimportSequentialfromkeras.layersimportConv2D,MaxPooling2D,Activation,Dropout,Flatten,Dense imgload_img(train_dirCantaloupe 1/r_234_100.jpg)plt.imshow(img)plt.axis(off)plt.show()array_imageimg_to_array(img)# shape (100,100)print(Image Shape -- ,array_image.shape)# 131个类目fruitCountUniqueglob(train_dir/*)numberOfClasslen(fruitCountUnique)print(How many different fruits are there -- ,numberOfClass)# 构建模型modelSequential()model.add(Conv2D(32,(3,3),input_shapearray_image.shape))model.add(Activation(relu))model.add(MaxPooling2D())model.add(Conv2D(32,(3,3)))model.add(Activation(relu))model.add(MaxPooling2D())model.add(Conv2D(64,(3,3)))model.add(Activation(relu))model.add(MaxPooling2D())model.add(Flatten())model.add(Dense(1024))model.add(Activation(relu))model.add(Dropout(0.5))# 区分131类model.add(Dense(numberOfClass))# outputmodel.add(Activation(softmax))model.compile(losscategorical_crossentropy,optimizerrmsprop,metrics[accuracy])print(Target Size -- ,array_image.shape[:2])5.3 训练模型train_datagenImageDataGenerator(rescale1./255,shear_range0.3,horizontal_flipTrue,zoom_range0.3)test_datagenImageDataGenerator(rescale1./255)epochs100batch_size32train_generatortrain_datagen.flow_from_directory(train_dir,target_sizearray_image.shape[:2],batch_sizebatch_size,color_modergb,class_modecategorical)test_generatortest_datagen.flow_from_directory(test_dir,target_sizearray_image.shape[:2],batch_sizebatch_size,color_modergb,class_modecategorical)fordata_batch,labels_batchintrain_generator:print(data_batch shape -- ,data_batch.shape)print(labels_batch shape -- ,labels_batch.shape)breakhistmodel.fit_generator(generatortrain_generator,steps_per_epoch1600//batch_size,epochsepochs,validation_datatest_generator,validation_steps800//batch_size)#保存模型 model_fruits.h5model.save(model_fruits.h5)顺便输出训练曲线#展示损失模型结果plt.figure()plt.plot(hist.history[loss],labelTrain Loss,colorblack)plt.plot(hist.history[val_loss],labelValidation Loss,colordarkred,linestyledashed,markeredgecolorpurple,markeredgewidth2)plt.title(Model Loss,colordarkred,size13)plt.legend()plt.show()#展示精确模型结果plt.figure()plt.plot(hist.history[accuracy],labelTrain Accuracy,colorblack)plt.plot(hist.history[val_accuracy],labelValidation Accuracy,colordarkred,linestyledashed,markeredgecolorpurple,markeredgewidth2)plt.title(Model Accuracy,colordarkred,size13)plt.legend()plt.show()6 识别效果fromtensorflow.keras.modelsimportload_modelimportosimportpandasaspdfromkeras.preprocessing.imageimportImageDataGenerator,img_to_array,load_imgimportcv2,matplotlib.pyplotasplt,numpyasnpfromkeras.preprocessingimportimage train_datagenImageDataGenerator(rescale1./255,shear_range0.3,horizontal_flipTrue,zoom_range0.3)modelload_model(model_fruits.h5)batch_size32imgload_img(./Test/Apricot/3_100.jpg,target_size(100,100))plt.imshow(img)plt.show()array_imageimg_to_array(img)array_imagearray_image*1./255xnp.expand_dims(array_image,axis0)imagesnp.vstack([x])classesmodel.predict_classes(images,batch_size10)print(classes)train_dir./Training/train_generatortrain_datagen.flow_from_directory(train_dir,target_sizearray_image.shape[:2],batch_sizebatch_size,color_modergb,class_modecategorical”)print(train_generator.class_indices)figplt.figure(figsize(16,16))axes[]files[]predictions[]true_labels[]rows5cols2# 随机选择几个图片defgetRandomImage(path,img_width,img_height):function loads a random image from a random folder in our test pathfolderslist(filter(lambdax:os.path.isdir(os.path.join(path,x)),os.listdir(path)))random_directorynp.random.randint(0,len(folders))path_classfolders[random_directory]file_pathos.path.join(path,path_class)file_names[fforfinos.listdir(file_path)ifos.path.isfile(os.path.join(file_path,f))]random_file_indexnp.random.randint(0,len(file_names))image_namefile_names[random_file_index]final_pathos.path.join(file_path,image_name)returnimage.load_img(final_path,target_size(img_width,img_height)),final_path,path_classdefdraw_test(name,pred,im,true_label):BLACK[0,0,0]expanded_imagecv2.copyMakeBorder(im,160,0,0,300,cv2.BORDER_CONSTANT,valueBLACK)cv2.putText(expanded_image,predicted: pred,(20,60),cv2.FONT_HERSHEY_SIMPLEX,0.85,(255,0,0),2)cv2.putText(expanded_image,true: true_label,(20,120),cv2.FONT_HERSHEY_SIMPLEX,0.85,(0,255,0),2)returnexpanded_image IMG_ROWS,IMG_COLS100,100# predicting imagesforiinrange(0,10):path./Testimg,final_path,true_labelgetRandomImage(path,IMG_ROWS,IMG_COLS)files.append(final_path)true_labels.append(true_label)ximage.img_to_array(img)xx*1./255xnp.expand_dims(x,axis0)imagesnp.vstack([x])classesmodel.predict_classes(images,batch_size10)predictions.append(classes)class_labelstrain_generator.class_indices class_labels{v:kfork,vinclass_labels.items()}class_listlist(class_labels.values())foriinrange(0,len(files)):imagecv2.imread(files[i])imagedraw_test(Prediction,class_labels[predictions[i][0]],image,true_labels[i])axes.append(fig.add_subplot(rows,cols,i1))plt.imshow(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))plt.grid(False)plt.axis(off)plt.show()项目运行效果毕业设计 深度学习水果分类系统 项目分享:见主页简介
http://www.gsyq.cn/news/1355753.html

相关文章:

  • 5分钟永久激活IDM:免费开源脚本终极指南
  • WinAsar终极指南:551KB轻量级工具实现Electron asar文件可视化处理
  • 2026年5月最新延安宜川黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 如何在5分钟内用MATLAB机器人工具箱搞定机器人控制难题?[特殊字符]
  • Bebas Neue:为什么这款免费开源字体成为全球设计师的终极选择?
  • 从游戏开发到数据分析:线段树(Segment Tree)在Python中的那些实用场景
  • 阅读APP书源失效终极解决方案:三步快速恢复优质小说资源
  • 技术人如何用成长型思维应对未知挑战:从心态到实战四步法
  • Docker 入门完全指南
  • 注意力机制的幕后:它到底转化了什么?输入、输出与词向量的类比
  • 2026年5月最新邢台平乡黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • VR-Reversal:打破设备限制,让3D视频在普通屏幕“活“起来
  • 企业内训系统集成Taotoken实现多模型AI助教与可控的交互成本
  • 当目标小到只有几个像素:深入浅出图解NWD(归一化Wasserstein距离)为何比IOU更靠谱
  • 在多模型间切换使用时对响应速度与一致性的感受
  • CompreFace人脸识别系统:5大实战场景下的技术选型指南
  • 如何用JPEXS Free Flash Decompiler拯救即将消失的Flash数字遗产?
  • 2026年5月最新锡林郭勒盟西乌珠穆沁旗黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 如何用Chrome画中画扩展实现多任务并行:终极视频悬浮指南
  • 对比直接使用官方api体验taotoken在模型切换上的便利性
  • TeXLive 2024安装后,你的VSCode还缺这几个关键设置:代码格式化、BibTeX管理与反向搜索
  • 2026年5月最新新疆额敏黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 天津卖金亲历:跑了好几家,最后只认福正美 - 上门黄金回收
  • Antv G6入门避坑指南:从‘Hello Graph’到自定义交互,新手必看的5个关键步骤
  • 终极指南:MATLAB机器人工具箱从入门到精通
  • 告别“手动时代”:腾讯“马威斯”桌面智能体如何让电脑自己会干活?
  • 2026年5月最新邢台沙河黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • 2026年5月最新天水甘谷黄金回收白银回收铂金回收权威排行榜TOP5:纯金+金条+银条+钯金 门店地址联系方式推荐 - 金诚回收
  • Bebas Neue字体完全指南:如何免费获取并专业使用这款几何标题字体
  • Docker Compose多服务编排实战