文章目录

  • 深度学习-07(PaddlePaddle图像分类)
    • 图像分类概述
      • 概述
        • 什么是图像分类
        • 图像分类粒度
        • 图像分类发展历程
        • 图像分类问题的挑战
      • 常用数据集介绍
        • MNIST数据集
        • CIFAR10数据集
        • ImageNet数据集
        • FDDB人脸数据集
        • WIDER Face数据集
      • 图像分类的应用
    • 利用CNN实现图片分类
      • 思路及实现
        • 数据集介绍
        • 总体步骤
        • 数据预处理
        • 模型结构
        • 案例1: 利用CNN实现图片分类
      • 图像分类优化手段
        • 样本优化
        • 参数优化
        • 模型优化

深度学习-07(PaddlePaddle图像分类)

图像分类概述

概述

什么是图像分类

图像分类粒度



图像分类发展历程

图像分类问题的挑战

常用数据集介绍

MNIST数据集

CIFAR10数据集

ImageNet数据集

FDDB人脸数据集

WIDER Face数据集

图像分类的应用








利用CNN实现图片分类

思路及实现

数据集介绍

总体步骤

数据预处理

模型结构



案例1: 利用CNN实现图片分类

AIstudio.baidu.com:水果识别项目

  1. 数据预处理部分:
# 02_fruits.py
# 利用深层CNN实现水果分类
# 数据集:爬虫从百度图片搜索结果爬取
# 内容:包含1036张水果图片,共5个类别(苹果288张、香蕉275张、葡萄216张、橙子276张、梨251张)############################# 预处理部分 ################################
import osname_dict = {"apple":0, "banana":1, "grape":2, "orange":3, "pear":4}
data_root_path = "data/fruits/" # 数据样本所在目录
test_file_path = data_root_path + "test.txt" #测试文件路径
train_file_path = data_root_path + "train.txt" # 训练文件路径
name_data_list = {} # 记录每个类别有哪些图片  key:水果名称  value:图片路径构成的列表# 将图片路径存入name_data_list字典中
def save_train_test_file(path, name):if name not in name_data_list: # 该类别水果不在字典中,则新建一个列表插入字典img_list = []img_list.append(path) # 将图片路径存入列表name_data_list[name] = img_list # 将图片列表插入字典else: # 该类别水果在字典中,直接添加到列表name_data_list[name].append(path)# 遍历数据集下面每个子目录,将图片路径写入上面的字典
dirs = os.listdir(data_root_path) # 列出数据集目下所有的文件和子目录
for d in dirs:full_path = data_root_path + d  # 拼完整路径if os.path.isdir(full_path): # 是一个子目录imgs = os.listdir(full_path) # 列出子目录中所有的文件for img in imgs:save_train_test_file(full_path + "/" + img, #拼图片完整路径d) # 以子目录名称作为类别名称else: # 文件pass# 将name_data_list字典中的内容写入文件
## 清空训练集和测试集文件
with open(test_file_path, "w") as f:passwith open(train_file_path, "w") as f:pass# 遍历字典,将字典中的内容写入训练集和测试集
for name, img_list in name_data_list.items():i = 0num = len(img_list) # 获取每个类别图片数量print("%s: %d张" % (name, num))# 写训练集和测试集for img in img_list:if i % 10 == 0: # 每10笔写一笔测试集with open(test_file_path, "a") as f: #以追加模式打开测试集文件line = "%s\t%d\n" % (img, name_dict[name]) # 拼一行f.write(line) # 写入文件else: # 训练集with open(train_file_path, "a") as f: #以追加模式打开测试集文件line = "%s\t%d\n" % (img, name_dict[name]) # 拼一行f.write(line) # 写入文件i += 1 # 计数器加1print("数据预处理完成.")
  1. 模型训练评估
import paddle
import paddle.fluid as fluid
import numpy
import sys
import os
from multiprocessing import cpu_count
import time
import matplotlib.pyplot as pltdef train_mapper(sample):"""根据传入的样本数据(一行文本)读取图片数据并返回:param sample: 元组,格式为(图片路径,类别):return:返回图像数据、类别"""img, label = sample # img为路基,label为类别if not os.path.exists(img):print(img, "图片不存在")# 读取图片内容img = paddle.dataset.image.load_image(img)# 对图片数据进行简单变换,设置成固定大小img = paddle.dataset.image.simple_transform(im=img, # 原始图像数据resize_size=100, # 图像要设置的大小crop_size=100, # 裁剪图像大小is_color=True, # 彩色图像is_train=True) # 随机裁剪# 归一化处理,将每个像素值转换到0~1img = img.astype("float32") / 255.0return img, label  # 返回图像、类别# 从训练集中读取数据
def train_r(train_list, buffered_size=1024):def reader():with open(train_list, "r") as f:lines = [line.strip() for line in f] # 读取所有行,并去空格for line in lines:# 去掉一行数据的换行符,并按tab键拆分,存入两个变量img_path, lab = line.replace("\n","").split("\t")yield img_path, int(lab) # 返回图片路径、类别(整数)return paddle.reader.xmap_readers(train_mapper, # 将reader读取的数进一步处理reader, # reader读取到的数据传递给train_mappercpu_count(), # 线程数量buffered_size) # 缓冲区大小# 定义reader
BATCH_SIZE = 32  # 批次大小
trainer_reader = train_r(train_list=train_file_path) #原始reader
random_train_reader = paddle.reader.shuffle(reader=trainer_reader,buf_size=1300) # 包装成随机读取器
batch_train_reader = paddle.batch(random_train_reader,batch_size=BATCH_SIZE) # 批量读取器
# 变量
image = fluid.layers.data(name="image", shape=[3, 100, 100], dtype="float32")
label = fluid.layers.data(name="label", shape=[1], dtype="int64")# 搭建CNN函数
# 结构:输入层 --> 卷积/激活/池化/dropout --> 卷积/激活/池化/dropout -->
#      卷积/激活/池化/dropout --> fc --> dropout --> fc(softmax)
def convolution_neural_network(image, type_size):"""创建CNN:param image: 图像数据:param type_size: 输出类别数量:return: 分类概率"""# 第一组 卷积/激活/池化/dropoutconv_pool_1 = fluid.nets.simple_img_conv_pool(input=image, # 原始图像数据filter_size=3, # 卷积核大小num_filters=32, # 卷积核数量pool_size=2, # 2*2区域池化pool_stride=2, # 池化步长值act="relu")#激活函数drop = fluid.layers.dropout(x=conv_pool_1, dropout_prob=0.5)# 第二组conv_pool_2 = fluid.nets.simple_img_conv_pool(input=drop, # 以上一个drop输出作为输入filter_size=3, # 卷积核大小num_filters=64, # 卷积核数量pool_size=2, # 2*2区域池化pool_stride=2, # 池化步长值act="relu")#激活函数drop = fluid.layers.dropout(x=conv_pool_2, dropout_prob=0.5)# 第三组conv_pool_3 = fluid.nets.simple_img_conv_pool(input=drop, # 以上一个drop输出作为输入filter_size=3, # 卷积核大小num_filters=64, # 卷积核数量pool_size=2, # 2*2区域池化pool_stride=2, # 池化步长值act="relu")#激活函数drop = fluid.layers.dropout(x=conv_pool_3, dropout_prob=0.5)# 全连接层fc = fluid.layers.fc(input=drop, size=512, act="relu")# dropoutdrop = fluid.layers.dropout(x=fc, dropout_prob=0.5)# 输出层(fc)predict = fluid.layers.fc(input=drop, # 输入size=type_size, # 输出值的个数(5个类别)act="softmax") # 输出层采用softmax作为激活函数return predict# 调用函数,创建CNN
predict = convolution_neural_network(image=image, type_size=5)
# 损失函数:交叉熵
cost = fluid.layers.cross_entropy(input=predict, # 预测结果label=label) # 真实结果
avg_cost = fluid.layers.mean(cost)
# 计算准确率
accuracy = fluid.layers.accuracy(input=predict, # 预测结果label=label) # 真实结果
# 优化器
optimizer = fluid.optimizer.Adam(learning_rate=0.001)
optimizer.minimize(avg_cost) # 将损失函数值优化到最小# 执行器
# place = fluid.CPUPlace()
place = fluid.CUDAPlace(0) # GPU训练
exe = fluid.Executor(place)
exe.run(fluid.default_startup_program())
# feeder
feeder = fluid.DataFeeder(feed_list=[image, label],  # 指定要喂入数据place=place)model_save_dir = "model/fruits/" # 模型保存路径
costs = [] # 记录损失值
accs = [] # 记录准确度
times = 0
batches = [] # 迭代次数# 开始训练
for pass_id in range(40):train_cost = 0 # 临时变量,记录每次训练的损失值for batch_id, data in enumerate(batch_train_reader()): # 循环读取样本,执行训练times += 1train_cost, train_acc = exe.run(program=fluid.default_main_program(),feed=feeder.feed(data), # 喂入参数fetch_list=[avg_cost, accuracy])# 获取损失值、准确率if batch_id % 20 == 0:print("pass_id:%d, step:%d, cost:%f, acc:%f" %(pass_id, batch_id, train_cost[0], train_acc[0]))accs.append(train_acc[0]) # 记录准确率costs.append(train_cost[0]) # 记录损失值batches.append(times) # 记录迭代次数# 训练结束后,保存模型
if not os.path.exists(model_save_dir):os.makedirs(model_save_dir)
fluid.io.save_inference_model(dirname=model_save_dir,feeded_var_names=["image"],target_vars=[predict],executor=exe)
print("训练保存模型完成!")# 训练过程可视化
plt.title("training", fontsize=24)
plt.xlabel("iter", fontsize=20)
plt.ylabel("cost/acc", fontsize=20)
plt.plot(batches, costs, color='red', label="Training Cost")
plt.plot(batches, accs, color='green', label="Training Acc")
plt.legend()
plt.grid()
plt.savefig("train.png")
plt.show()
  1. 预测
from PIL import Image# 定义执行器
place = fluid.CPUPlace()
infer_exe = fluid.Executor(place)
model_save_dir = "model/fruits/" # 模型保存路径# 加载数据
def load_img(path):img = paddle.dataset.image.load_and_transform(path, 100, 100, False).astype("float32")img = img / 255.0return imginfer_imgs = [] # 存放要预测图像数据
test_img = "./data/grape_1.png" #待预测图片
infer_imgs.append(load_img(test_img)) #加载图片,并且将图片数据添加到待预测列表
infer_imgs = numpy.array(infer_imgs) # 转换成数组# 加载模型
infer_program, feed_target_names, fetch_targets = \fluid.io.load_inference_model(model_save_dir, infer_exe)
# 执行预测
results = infer_exe.run(infer_program, # 执行预测programfeed={feed_target_names[0]: infer_imgs}, # 传入待预测图像数据fetch_list=fetch_targets) #返回结果
print(results)result = numpy.argmax(results[0]) # 取出预测结果中概率最大的元素索引值
for k, v in name_dict.items(): # 将类别由数字转换为名称if result == v:  # 如果预测结果等于v, 打印出名称print("预测结果:", k) # 打印出名称# 显示待预测的图片
img = Image.open(test_img)
plt.imshow(img)
plt.show()

图像分类优化手段

样本优化

参数优化

模型优化

深度学习-07(图像分类、常用数据集、利用CNN实现图像分类、图像分类优化)相关推荐

  1. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(综合性)--机器学习.深度学习算法中常用数据集大集合(建议收藏,持续更新) 目录 常规数据集 各大方向分类数据集汇总 具体数据集分类 相关文章 DL:关于深度学习常用数据集 ...

  2. 深度学习 (四)Keras利用CNN实现图片识别(Mnist、Cifar10)

    视觉集 视觉数据库是用来提供给图片识别领域用素材,目前各个教材常用的主要有手写数字识别库.10中小图片分类库,详细介绍如下: Mnist MNIST(Mixed National Institute ...

  3. 深度学习(DL) /人工智能(AI)数据集标注工具、图像语料数据库

    一.NLP标注工具BRAT BRAT是一个基于web的文本标注工具,主要用于对文本的结构化标注,用BRAT生成的标注结果能够把无结构化的原始文本结构化,供计算机处理.利用该工具可以方便的获得各项NLP ...

  4. MachineLearning(2)-图像分类常用数据集

    图像分类常用数据集 1 CIFAR-10 2.MNIST 3.STL_10 4.Imagenet 5.L-Sun 6.caltech-101 在训练神经网络进行图像识别分类时,常会用到一些通用的数据集 ...

  5. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)

    目录 一.前期准备 1.1 环境配置 1.2 CPU和GPU 1.2.1 CPU 1.2.2 GPU 1.2.3 CPU和GPU的区别 第一步:设置GPU 1.3 MNIST 手写数字数据集 第二步: ...

  6. Lesson 12.1 深度学习建模实验中数据集生成函数的创建与使用

    Lesson 12.1 深度学习建模实验中数据集生成函数的创建与使用   为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件.具备某些特性的数据集.相比于传统的机器学 ...

  7. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层

    目录 0. 前言 1. 最大池化(max pooling) 2. 平移不变形 3. 其他池化函数 4. 卷积和池化作为一种无限强的先验 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常 ...

  8. 首个可用于深度学习的ToF相关数据集!基于置信度的立体相机以及ToF相机深度图融合框架...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | cocoon 编辑 | 3D视觉开发者社区 目录 ✦ contents 1. 概述 2. 方 ...

  9. 记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天

    记录|深度学习100例-卷积神经网络(CNN)彩色图片分类 | 第2天 1. 彩色图片分类效果图 数据集如下: 测试图1如下 训练/验证精确图如下: 优化后:测试图--打印预测标签: 优化后:测试图- ...

最新文章

  1. Web访问RabbitMQ
  2. 如何把复杂单体应用快速迁移到微服务
  3. cli2弃用了吗 vue_vue-cli 3 和 vue-cli 2的区别
  4. python nonetype报错_python 查询数据库数据 NoneType报错
  5. 虚函数virtual
  6. Google 今天抽风了!
  7. 机器学习傻瓜的深入研究
  8. Prometheus Operator 架构 - 每天5分钟玩转 Docker 容器技术(178)
  9. HyperLynx(三)传输线类型及相关设置
  10. Win7 FTP搭建
  11. 【科普】AHCI模式是什么,与IDE模式有什么区别?
  12. 安装win10虚拟机遇到的坑
  13. 离散数学中关于自反与反自反的通俗解释
  14. Python爬虫之堆糖网图片(二)
  15. 使用 python 脚本爬取豆瓣电影排行榜
  16. 华为的冬天----任正非
  17. 《AngularJS深度剖析与最佳实践》一1.4 实现第一个页面:注册
  18. php上传文件和下载文件,PHP 如何上传文件和下载
  19. 风吹雪支付系统易支付去后台验证版本代理系统
  20. 程序员实用工作技能之Docker

热门文章

  1. 【Openmv】Openmv脱机运行教程
  2. 2022年第五届“传智杯”全国大学生IT技能大赛——程序设计挑战赛
  3. pycharm环境下配置scrap爬虫环境
  4. 你还敢用导航吗?独角兽“干掉”GPS和北斗导航
  5. 电影影院管理系统电影购票系统java项目jsp web项目
  6. python版本之间的区别_Python各版本之间的区别
  7. AutoCAD .NET开发大师Kean有价值的博客 2006年8月 .NET内容整理
  8. Django发布机器学习服务
  9. 一小时人生服务器维护,一小时人生诅咒是干嘛的
  10. 2016-ECCV-《Learning without Forgetting》论文阅读笔记