手把手教你:基于粒子群优化算法(PSO)优化卷积神经网络(CNN)的文本分类
@
本文主要介绍如何使用python搭建:一个基于深度残差网络(ResNet)的图像识别垃圾分类系统。
博主也参考过网上其他博主介绍:ResNet或图像分类的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个分类或预测系统即可。
本文只会告诉你如何快速搭建一个基于ResNet的图像分类系统并运行,原理的东西可以参考其他博主。
也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。
如果您有以上想法,那就找对地方了!
不多废话,直接进入正题!
整个项目的程序流程图如下,分别为:
1.图像数据预处理
2.模型训练
3.模型测试
三个模块

本文用到的垃圾图片数据主要为以下四类:
1.厨余垃圾
2.可回收垃圾
3.其他垃圾
4.有害垃圾
如下:

其中每个类别又涉及多个子类别如,有害垃圾文件夹中,中又涉及以下多个类别:

每类图片数量及图片总数情况如下,共计6038张图像数据:

本项目开发IDE使用的是:Anaconda中的jupyter notebook,大家可以直接csdn搜索安装指南非常多,这里就不再赘述。
因为本项目基于TensorFlow因此需要以下环境:
如下:

环境都可以通过pip进行安装。如果只是想要功能跑起来,这边建议tensorflow安装cpu版的。
如果没使用过pycharm通过pip安装包的同学可以参考如下:

点开“终端”,然后通过pip进行安装tensorflow,其他环境包也可以通过上面的方法安装。
## 读取图像,解决imread不能读取中文路径的问题
def cv_imread(filePath):
# 核心就是下面这句,一般直接用这句就行,直接把图片转为mat数据
cv_img=cv2.imdecode(np.fromfile(filePath,dtype=np.uint8),-1)
# imdecode读取的是rgb,如果后续需要opencv处理的话,需要转换成bgr,转换后图片颜色会变化
# cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
return cv_img
# 定义图像获取函数
def read_img(img_url_list,num):
# 设置随机数种子
random.seed(999)
imgs = []
err_img = []
if num>len(img_url_list):
print("抱歉,出错了,您设置的采样数量大于了图片张数,请调小img_num!")
else:
# 对图片数量进行采样
img_url_list = img_url_list[:num]
for img_url in tqdm(img_url_list):
# 获取图像
img = cv_imread(img_url)
if img is None:
err_img.append(img_url)
else:
# skimage.transform.resize(image, output_shape)改变图片的尺寸
img = cv2.resize(img, (w,h))
if np.asarray(img).shape == (w,h,3):
imgs.append(img)
else:
err_img.append(img_url)
return imgs
因为我们用于训练的图像数量不算多,可以进行以下几种方式进行数据增强:
# 图像增强将图像进行随机翻转,裁剪
def img_create_cut(imgs,label,cut_min,cut_max,cut_true):
imgs_out = []
label_out = []
w = imgs[0].shape[0]
h = imgs[0].shape[1]
for i in tqdm(range(len(imgs))):
# 添加原图
imgs_out.append(imgs[i])
label_out.append(label[i])
if cut_true:
# 原图随机裁剪,执行1次
for f in range(1):
# 生成裁剪随机数
rd_num = np.random.uniform(cut_min, cut_max)
# 生成随机裁剪长宽
rd_w = int(w * rd_num)
rd_h = int(h * rd_num)
# 进行裁剪
crop_img = tf.image.random_crop(imgs[i],[rd_w,rd_h,c]).numpy()
# 重新调整大小
re_img = cv2.resize(crop_img, (w, h))
# 添加裁剪图像
imgs_out.append(re_img)
# 添加类标
label_out.append(label[i])
# 随机翻转
for e in range(0,2):
# 1:水平翻转,0:垂直翻转,-1:水平垂直翻转
f_img = cv2.flip(imgs[i], e)
# 添加翻转图像
imgs_out.append(f_img)
# 添加类标
label_out.append(label[i])
imgs_out,label_out = np.asarray(imgs_out, np.float32), np.asarray(label_out, np.int32)
# 打乱顺序
# 读取data矩阵的第一维数(图片的个数)
num_example = imgs_out.shape[0]
arr = np.arange(num_example)
np.random.seed(99)
np.random.shuffle(arr)
imgs_out= imgs_out[arr]
label_out= label_out[arr]
return imgs_out,label_out


可以看到,训练准确率模型很快就达到了一个比较高的水平,测试集准确率在80分以上。

读取训练好的模型:
w = test_data.shape[1]
h = test_data.shape[2]
c = test_data.shape[3]
# 获取label数量
label_counts = len(classes)
# 加载模型结构
Resnetmodel = ResNetModel(input_shape=(w,h,c),classes=label_counts)
ResNet_model = Resnetmodel.ResNet50()
# 设置学习率
learning_rate=0.001
optimizer = keras.optimizers.Adam(learning_rate=learning_rate)
ResNet_model.compile(optimizer=optimizer,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
ResNet_model.summary()
使用sklearn输出各类别评价指标:
其中类标:
0为:厨余垃圾
1为:可回收垃圾
2为:其他垃圾
3为:有害垃圾


由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区评论或者私信我,我都会一一解答。
完整代码下载:
手把手教你:图像识别的垃圾分类系统
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p