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对两个有序列表进行合并和排序的例子
Jun 13 Python
web.py 十分钟创建简易博客实现代码
Apr 22 Python
python Flask实现restful api service
Dec 04 Python
详解django自定义中间件处理
Nov 21 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
Python之列表实现栈的工作功能
Jan 28 Python
详解Django-restframework 之频率源码分析
Feb 27 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
Sep 26 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
Django之腾讯云短信的实现
Jun 12 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 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.ini中文版(2)
2006/10/09 PHP
国内php原创论坛
2006/10/09 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
thinkPHP+LayUI 流加载实现功能
2019/09/27 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
javascript Keycode对照表
2009/10/24 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
JavaScript数组的栈方法与队列方法详解
2016/05/26 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
python开发之字符串string操作方法实例详解
2015/11/12 Python
python 默认参数问题的陷阱
2016/02/29 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
浅谈python中的占位符
2017/11/09 Python
python SMTP实现发送带附件电子邮件
2018/05/22 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
2018/12/10 Python
Python实现分段线性插值
2018/12/17 Python
python实现随机漫步方法和原理
2019/06/10 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python xlwt模块使用代码实例
2020/06/10 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
高中毕业生自我鉴定范文
2013/09/26 职场文书
毕业生的自我鉴定
2013/10/29 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
提拔干部考察材料
2014/05/26 职场文书
2014年煤矿安全工作总结
2014/12/04 职场文书
小学优秀教师材料
2014/12/15 职场文书
实习生辞职信范文
2015/03/02 职场文书
士兵突击观后感
2015/06/16 职场文书