keras 读取多标签图像数据方式


Posted in Python onJune 12, 2020

我所接触的多标签数据,主要包括两类:

1、一张图片属于多个标签,比如,data:一件蓝色的上衣图片.jpg,label:蓝色,上衣。其中label包括两类标签,label1第一类:上衣,裤子,外套。label2第二类,蓝色,黑色,红色。这样两个输出label1,label2都是是分类,我们可以直接把label1和label2整合为一个label,直接编码,比如[蓝色,上衣]编码为[011011]。这样模型的输出也只需要一个输出。实现了多分类。

2、一张图片属于多个标签,但是几个标签不全是分类。比如data:一张结婚现场的图片.jpg,label:高兴,3(表示高兴程度)。这时label1是分类,label2时回归。这种情况就需要多个标签,模型需要多个输出。【其实最好的例子,就是目标检测,不但检测什么物体(分类),还要检测到物体的坐标(回归)】

在这里我主要针对第二种情况加以说明:

keras的ImageDataGenerator.flow_from_directory 只能简单的读取单标签数据。所以我自己写了个data_generate,来生成bathsize多标签数据

keras 读取多标签图像数据方式

#此模块主要用来读取数据集,返回一个数据可迭代对象
#重点是,此模块分批次的把图像读入内存的,而不是一次全读入,有效的减少了内存溢出
import os
import cv2
import numpy as np
import keras
from random import shuffle

#目标图像大小
image_size= (229, 229, 3)
#类别编码
class_dict=dict(zip(['neg','pos','neu'],[0,1,2]))
#处理.txt文件,并加载图片文件夹里的图片名
#txt_path,txt文件路径,data_path,图片文件夹路径

def read_txt(txt_path,data_path):
 # 中间数组
 labels_class = []
 labels_score = []
 with open(txt_path) as f:
 lines_list = f.readlines()
 for lines in lines_list:
  line = lines.split(' ')
  labels_class.append(line[0].rstrip(".jpg"))
  labels_score.append(line[2])
 labels_dict=dict(zip(labels_class,labels_score))
 #处理图片数据集
 all_picture_name = os.listdir(data_path)
 #打乱数据集
 shuffle(all_picture_name)
 all_picture_path=[os.path.join(data_path,one)for one in all_picture_name]
 return all_picture_name,all_picture_path,labels_dict

class data_generate:
 def __init__(self,all_piture_name,all_picture_path,labels_dict,batch_size):
 self.index=0
 self.all_picture_name=all_piture_name
 self.all_picture_path=all_picture_path
 self.labels_dict=labels_dict
 self.batch_size = batch_size
 def get_mini_batch(self):
  while True:
  batch_images=[]
  batch_labels=[]
  batch_class=[]
  batch_score=[]
  for i in range(self.batch_size):
  if(self.index==len(self.all_picture_name)):
   self.index=0

  bgr_image = cv2.imread(self.all_picture_path[self.index])
  if len(bgr_image.shape) == 2: # 若是灰度图则转为三通道
   bgr_image = cv2.cvtColor(bgr_image, cv2.COLOR_GRAY2BGR)
  rgb_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2RGB)
  rgb_image=cv2.resize(rgb_image,(image_size[0], image_size[1]))
  img = np.array(rgb_image)
  img=keras.applications.inception_v3.preprocess_input(img)
  batch_images.append(img)
  #label=[]
  label1=self.all_picture_name[self.index].rstrip(".jpg")
  batch_class.append(keras.utils.to_categorical(class_dict[label1[:3]], 3))
  batch_score.append(np.array(self.labels_dict[label1]))
  #batch_labels.append(label)
  self.index+=1
  batch_images=np.array(batch_images)
  batch_class = np.array(batch_class)
  batch_score = np.array(batch_score)
  #注意label的生成batch_class,一个单独数组,batch_score一个单独的数组
  '''
  注释掉的这段代码生成的label是错误的。
  batch_images=[]
  batch_labels=[]
  for i in range(self.batch_size):
  if(self.index==len(self.images)):
   self.index=0
  batch_images.append(self.images[self.index])
  batch_labels.append(self.labels[self.index])
  self.index+=1
  batch_images=np.array(batch_images)
  batch_labels=np.array(batch_labels)
  yield batch_images,batch_labels
  '''
  yield batch_images,[batch_class,batch_score]

接下来就是放入keras.fit_generate中了

history=model.fit_generator(generator=train_data.get_mini_batch(),
   steps_per_epoch=146,
   epochs=300,
   validation_data=test_data.get_mini_batch(),
   validation_steps=34,
   )

以上这篇keras 读取多标签图像数据方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
Python中str is not callable问题详解及解决办法
Feb 10 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
Python Http请求json解析库用法解析
Nov 28 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
Python机器学习之PCA降维算法详解
May 19 Python
Python接口自动化之文件上传/下载接口详解
Apr 05 Python
Python数据可视化图实现过程详解
Jun 12 #Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 #Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
Jun 12 #Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 #Python
python + selenium 刷B站播放量的实例代码
Jun 12 #Python
解决Keras自带数据集与预训练model下载太慢问题
Jun 12 #Python
keras导入weights方式
Jun 12 #Python
You might like
用PHP和ACCESS写聊天室(五)
2006/10/09 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
PHP new static 和 new self详解
2017/02/19 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
JQuery autocomplete 使用手册
2010/04/01 Javascript
jquery validate poshytip 自定义样式
2012/11/26 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
使用Python解析JSON数据的基本方法
2015/10/15 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
TensorFlow 滑动平均的示例代码
2018/06/19 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
Python魔法方法 容器部方法详解
2020/01/02 Python
python 日志 logging模块详细解析
2020/03/31 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
python 制作磁力搜索工具
2021/03/04 Python
英国电子专家:maplin
2019/09/04 全球购物
实习自我鉴定范文
2013/10/30 职场文书
英语文学专业学生的自我评价
2013/10/31 职场文书
工业自动化专业毕业生推荐信
2013/11/18 职场文书
语文教学感言
2014/02/06 职场文书
入职担保书怎么写
2014/05/12 职场文书
团日活动总结模板
2014/06/25 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
SpringBoot连接MySQL获取数据写后端接口的操作方法
2021/11/02 MySQL