首先来看一下题目要求

①收集数据,并标注数据来源与方式:

在百度上进行搜索,发现了和鲸社区
搜索:天气图片数据集进入,点击

进入

@article{RSCM2017,
title = {RSCM: Region Selection and Concurrency Model for Multi-class Weather Recognition},
author = {Di Lin and Cewu Lu and Hui Huang and Jiaya Jia},
journal = {IEEE Transactions on Image Processing},
volume = {26},
number = {9},
year = {2017},
pages = {4154–4167},
}

进入RSCN

选择这两个压缩文件即可

②数据清洗与可视化分析

我对上面的图片数据集进行了一个大致的整理,有一些图片我自己都分不清楚是什么类别,干脆手动删除,打算做5个分类:haze 、 lingting 、sun snow、 cloudy,但是编号是个问题,下面使用python 进行了编号处理,方便得很,推荐一波~

import os
class BatchRename():'''批量重命名文件夹中的图片文件'''def __init__(self):# 此处应该为自己存放图片文件夹的路径self.path = 'D:\ChromeCoreDownloads\图像分类_天气\sun'def rename(self):filelist = os.listdir(self.path)total_num = len(filelist)i = 0for item in filelist:if item.endswith('.jpg'):src = os.path.join(os.path.abspath(self.path), item)dst = os.path.join(os.path.abspath(self.path), str(i) + '.jpg')try:os.rename(src, dst)print('converting %s to %s ...' % (src, dst))i = i + 1except:continueprint ('total %d to rename & converted %d jpgs' % (total_num, i))if __name__ == '__main__':demo = BatchRename()demo.rename()

效果图

转换图片像素,使其大小一致 参考于此篇大佬博客
PIL安装失败请戳此处~
我调整参数弄了一下午,把代码改得七零八碎,也不太对,总是报exceptHoum后面的错误,基本要放弃了。。。后来尝试了一下,把except删除,终于找到了错误原因/(ㄒoㄒ)/~~

# 1.数据清洗
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import datasets,layers,modelsdef read_image(paths):os.listdir(paths)filelist = []for root, dirs, files in os.walk(paths):for file in files:if os.path.splitext(file)[1] == ".jpg":filelist.append(os.path.join(root, file))return filelist
def im_xiangsu(paths):for filename in paths:try:im = Image.open(filename)newim = im.resize((128, 128))newim.save( filename+ '.jpg')print('图片' + filename[12:-4] + '.jpg' + '像素转化完成')except OSError as e:print(e.args)test='D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou'   #要测试的图片的路径
filelist=read_image(test)
im_xiangsu(filelist)

像素转换完成。但是还要删除原像素的图片,防止多于图片被训练导致内存爆炸。。。
将图片数据转化成数组:此次又踩无数坑。。。调试多次M,终于搞懂。。此处是制作训练集图片:图片标签方式:每类图片所在文件夹相应类别编号【见-3行】*

path1 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou\snowy'
path2 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou\sunny'
filelist_1 = read_image(path1)
filelist_2 = read_image(path2)
filelist_all = filelist_1 + filelist_2M = []
M = im_array(filelist_all)dict_label={0:'雪天',1:'晴天'}
train_images=np.array(M).reshape(len(filelist_all),128,128)
label=[0]*len(filelist_1)+[1]*len(filelist_2)
train_lables=np.array(label)        #数据标签
train_images = train_images[ ..., np.newaxis ]  #数据图片,此处没毛病!

附上文件夹图片

③可视化数据

这里由于我已将图片转化为数组形式,没有用matplotlib绘制出来,但可以看一下标签输出及数据尺寸

print(train_images.shape)# 两个数据集各86张图片
print(train_lables.shape)
print(train_lables)

④进入神经网络进行模型训练

【由于作者本身是个小白,对这些模型的理解就是公式,并感激于keras的友好此处可以稍微参考一下我学习keras时写的文章~】

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))
model.summary()  # 显示模型的架构
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#epochs为训练多少轮、batch_size为每次训练多少个样本
model.fit(train_images, train_lables, epochs=5)
print(model.evaluate(train_images,train_lables))

查看精度


可以看到,在训练集上,模型精度可以达到88%,下一步我将会制作测试集数据,并预测模型准确率,先将此时完成的代码粘到这里~

# 1.数据清洗、图片处理
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import datasets,layers,modelsdef read_image(paths):os.listdir(paths)filelist = []for root, dirs, files in os.walk(paths):for file in files:if os.path.splitext(file)[1] == ".jpg":filelist.append(os.path.join(root, file))return filelist
def im_xiangsu(paths):for filename in paths:try:im = Image.open(filename)newim = im.resize((128, 128))newim.save( filename+ '.jpg')print('图片' + filename[12:-4] + '.jpg' + '像素转化完成')except OSError as e:print(e.args)
def im_array(paths):M=[]for filename in paths:im=Image.open(filename)im_L=im.convert("L")                #模式LCore=im_L.getdata()arr1=np.array(Core,dtype='float32')/255.0list_img=arr1.tolist()M.extend(list_img)return Mpath1 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou\snowy'
path2 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou\sunny'
filelist_1 = read_image(path1)
filelist_2 = read_image(path2)
filelist_all = filelist_1 + filelist_2M = []
M = im_array(filelist_all)dict_label={0:'雪天',1:'晴天'}
train_images=np.array(M).reshape(len(filelist_all),128,128)
label=[0]*len(filelist_1)+[1]*len(filelist_2)
train_lables=np.array(label)        #数据标签
train_images = train_images[ ..., np.newaxis ]        #数据图片#数据可视化 :由于图片进行了数组转化,没办法进行展示
# print(train_images.shape)#输出验证一下(172, 128, 128, 1)
# print(train_lables.shape)
# print(train_lables)# 进入神经网络
#
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))
model.summary()  # 显示模型的架构
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#epochs为训练多少轮、batch_size为每次训练多少个样本
model.fit(train_images, train_lables, epochs=5)
print(model.evaluate(train_images,train_lables))

⑤模型评估【数据加强】

测试集的制作于训练集基本相似

path3 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_test\_rainy_'
path4 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_test\_sunny_'
filelist_3 = read_image(path3)
filelist_4 = read_image(path4)
filelist_tot = filelist_3 + filelist_4N = []
N = im_array(filelist_tot)dict_label={0:'雨天',1:'晴天'}
test_images=np.array(N).reshape(len(filelist_tot),128,128)
label=[0]*len(filelist_3)+[1]*len(filelist_4)
test_lables=np.array(label)        #数据标签
test_images = test_images[ ..., np.newaxis ]        #数据图片

将数据扩到train:100 test:35 可以看到训练集的精度有所上升,但是测试集的精度很低

print(model.evaluate(train_images,train_lables))
print(model.evaluate(test_images,test_lables))


参数调整:将训练次数epochs调整为10,发现训练集与测试集的精度都有一定增加,由此得出:增大样本容量和增加训练次数可以提高精度
⑥实现预测
预测图片(应选择裁剪好像素的图片上传):


预测结果:

预测图片:

预测结果

附完整代码:

# 1.数据清洗、图片处理
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import datasets,layers,modelsdef read_image(paths):os.listdir(paths)filelist = []for root, dirs, files in os.walk(paths):for file in files:if os.path.splitext(file)[1] == ".jpg":filelist.append(os.path.join(root, file))return filelist
def im_xiangsu(paths):for filename in paths:try:im = Image.open(filename)newim = im.resize((128, 128))newim.save( filename+ '.jpg')print('图片' + filename[12:-4] + '.jpg' + '像素转化完成')except OSError as e:print(e.args)
def im_array(paths):M=[]for filename in paths:im=Image.open(filename)im_L=im.convert("L")                #模式LCore=im_L.getdata()arr1=np.array(Core,dtype='float32')/255.0list_img=arr1.tolist()M.extend(list_img)return Mpath1 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_train\_rainy'
path2 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_train\_sunny'
filelist_1 = read_image(path1)
filelist_2 = read_image(path2)
filelist_all = filelist_1 + filelist_2M = []
M = im_array(filelist_all)dict_label={0:'雨天',1:'晴天'}
train_images=np.array(M).reshape(len(filelist_all),128,128)
label=[0]*len(filelist_1)+[1]*len(filelist_2)
train_lables=np.array(label)        #数据标签
train_images = train_images[ ..., np.newaxis ]        #数据图片path3 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_test\_rainy_'
path4 = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_test\_sunny_'
filelist_3 = read_image(path3)
filelist_4 = read_image(path4)
filelist_tot = filelist_3 + filelist_4N = []
N = im_array(filelist_tot)dict_label={0:'雨天',1:'晴天'}
test_images=np.array(N).reshape(len(filelist_tot),128,128)
label=[0]*len(filelist_3)+[1]*len(filelist_4)
test_lables=np.array(label)        #数据标签
test_images = test_images[ ..., np.newaxis ]        #数据图片#数据可视化 :由于图片进行了数组转化,没办法进行展示
# print(train_images.shape)#输出验证一下(172, 128, 128, 1)
# print(train_lables.shape)
# print(train_lables)# 进入神经网络
#
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(2, activation='softmax'))
model.summary()  # 显示模型的架构
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
#epochs为训练多少轮、batch_size为每次训练多少个样本
model.fit(train_images, train_lables, epochs=10)print(model.evaluate(train_images,train_lables))
print(model.evaluate(test_images,test_lables))# 实现模型预测
def im_s_array(paths):im = Image.open(paths[0])im_L = im.convert("L")  # 模式LCore = im_L.getdata()arr1 = np.array(Core, dtype='float32') / 255.0list_img = arr1.tolist()images = np.array(list_img).reshape(-1, 128, 128, 1)return imagestest = 'D:\ChromeCoreDownloads\图像分类_天气\LovelyZhou_predict'  # 你要测试的图片的路径
filelist = read_image(test)
im_xiangsu(filelist)
img = im_s_array(filelist)
# 预测图像
predictions_single = model.predict(img)
print("预测结果为:", dict_label[np.argmax(predictions_single)])
# 这里返回数组中概率最大的那个
print(predictions_single)

文件夹情况

小结:本次图像处理任务完毕!庆祝小白的第一个实战任务完成~!但是模型有时候也会预测失误,需要继续加强网络并调整参数。所以还要继续学习哦!加油! (ง •_•)ง

特别致谢博文:https://blog.csdn.net/m0_45093509/article/details/105924348

图像识别实战——天气分类相关推荐

  1. PyTorch 图像识别实战

    图像识别实战 概述 预处理 导包 数据读取与预处理 数据可视化 主体 加载参数 建立模型 设置哪些层需要训练 优化器设置 训练模块 开始训练 测试 测试网络效果 测试训练好的模型 测试数据预处理 展示 ...

  2. 『矩阵论笔记』线性判别分析(LDA)最全解读+python实战二分类代码+补充:矩阵求导可以参考

    线性判别分析(LDA)最全解读+python实战二分类代码! 文章目录 一.主要思想! 二.具体处理流程! 三.补充二中的公式的证明! 四.目标函数的求解过程! 4.1.优化问题的转化 4.2.拉格朗 ...

  3. 刻意学习:机器学习实战--Task03分类问题:支持向量机

    刻意学习:机器学习实战–Task03分类问题:支持向量机 1 什么是SVM? 首先,支持向量机不是一种机器,而是一种机器学习算法. 1.SVM - Support Vector Machine ,俗称 ...

  4. Python图像识别实战(四):搭建卷积神经网络进行图像二分类(附源码和实现效果)

    前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章). 从本期开始,我将做一个关于图像识别的系列文章,让读者慢慢理解 ...

  5. PyTorch框架:(6)图像识别实战常用模块解读

    1.TorchVision 官网:torchvision - Torchvision 0.10.0 documentation 在torchvision这个模块当中,包含了很多后续需要的功能: 需要自 ...

  6. 电商小程序实战教程-分类导航

    电商小程序实战教程 第一章 总体介绍 第二章 创建数据源 第三章 创建管理后台 第四章 首页的创建 前言 从上一篇开始,我们就正式进入到了电商小程序的实战开发阶段.首先是介绍了首页的开发,首页主要是展 ...

  7. 黑马NLP实战 --- 新闻分类模型训练

    关于<黑马程序员>课程中NLP中 训练新闻分类模型 最近在学习NLP的相关知识,找了资料比较全的黑马程序员中讲解NLP的课程,可是其中有一部分实战 新闻主题分类实战项目中,我发现黑马程序员 ...

  8. Bert实战--文本分类(一)

    使用Bert预训练模型进行文本分类 bert做文本分类,简单来说就是将每句话的第一个位置加入了特殊分类嵌入[CLS].而该[CLS]包含了整个句子的信息,它的最终隐藏状态(即,Transformer的 ...

  9. Python图像识别实战(一):实现按数量随机抽取图像复制到另一文件夹(附源码和实现效果)

    前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型)(具体见之前的文章). 从本期开始,我将做一个关于图像识别的系列文章,让读者慢慢理解 ...

  10. 【sklearn入门】决策树在sklearn中的实现--实战红酒分类案例

    scikit-learn简介 scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包.它通过NumPy, SciPy和 Matplotlib等python数值 ...

最新文章

  1. 关于Configuration.ConfigurationManager
  2. webapi同一个Controller多个函数
  3. 杨攀:融云专注极致技术 不忘初心打造极简体验
  4. 14、ORACLE下的基本SQL操作
  5. php2588,搞清楚一下必胜2588z和2582z哪个好点?都有些什么区别?内幕评测分析
  6. cmake编译Debug和Release
  7. 时隔两年,盘点ECCV 2018影响力最大的20篇论文
  8. 用Java实现在【520,1314】之间生成随机整数的故事
  9. 理解python的类实例化_理解python的类实例化
  10. MySQL(基础技能)
  11. Ubuntu 12.04.1 mysql从5.5升级到5.6
  12. 【云服务月刊】2018年第7期:云栖大会门票免费送!阿里云MVP招募,就等你了!...
  13. ssh: connect to host port 22: Connection refused
  14. 使用ExtendSim进行医疗仿真
  15. python中用pygame创建一个精致的窗口
  16. Linux串口通信之termios结构体说明
  17. JAVA学习:将字符串转成数字
  18. (二)使用npm搭建React项目
  19. 如何写出高效的代码?(持续更新)
  20. 如何让U盘同时兼容Windows和Mac OS X系统

热门文章

  1. linux设置gmt时区,关于GMT UTC CST和Linux时区设置
  2. xp配置iis和php,XP下让IIS支持PHP
  3. HTML:雪碧图、高度塌陷和序号选择器
  4. c语言 归一化图片大小,OpenCV学习笔记(1)——resize函数实现图像大小归一化
  5. 分布式存储系统学习笔记(一)—什么是分布式系统(4)—容错机制
  6. 每天2小时,吃透 985博士总结的这份目标检测、卷积神经网络和OpenCV学习资料笔记(20G高清/PPT/代码)...
  7. 在手机上实现实时的单目3D重建
  8. Yann LeCun送你的春节大礼:免费学习全部2020春季深度学习课程
  9. Delphi Sysem.JSON 链式写法(转全能中间件)
  10. Intellij IDEA 修改默认配置