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入门篇之字典
Oct 17 Python
Python AES加密模块用法分析
May 22 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python 判断 有向图 是否有环的实例讲解
Feb 01 Python
python计算日期之间的放假日期
Jun 05 Python
Python中函数参数调用方式分析
Aug 09 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
基于Python爬取爱奇艺资源过程解析
Mar 02 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
Python Pillow(PIL)库的用法详解
Sep 19 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在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
Document 对象的常用方法
2009/07/31 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
2013/09/10 Javascript
JQuery页面地址处理插件jqURL详解
2015/05/03 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
详解angularjs 学习之 scope作用域
2018/01/15 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别
2017/06/23 Python
Python中str.join()简单用法示例
2018/03/20 Python
Django实现分页功能
2018/07/02 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
transform python环境快速配置方法
2018/09/27 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
selenium自动化测试入门实战
2020/12/21 Python
HTML5+CSS3网页加载进度条的实现,下载进度条的代码实例
2016/12/30 HTML / CSS
html5手机键盘弹出收起的处理
2020/01/20 HTML / CSS
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
公务员保密承诺书
2014/03/27 职场文书
目标责任书格式
2014/07/28 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
公司行政管理制度范本
2015/08/05 职场文书
生日宴会祝酒词
2015/08/10 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫