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中使用Inotify监控文件实例
Feb 14 Python
一个Python最简单的接口自动化框架
Jan 02 Python
浅析python的优势和不足之处
Nov 20 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
Python微信操控itchat的方法
May 31 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
python匿名函数的使用方法解析
Oct 10 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
在Python中实现字典反转案例
Dec 05 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 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数据库
2008/03/27 PHP
PHP 定界符 使用技巧
2009/06/14 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
js树插件zTree获取所有选中节点数据的方法
2015/01/28 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
vue中appear的用法
2017/08/17 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
微信小程序自定义对话框弹出和隐藏动画
2018/07/19 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
浅谈HTTP 缓存的那些事儿
2018/10/17 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
Python3基础之基本运算符概述
2014/08/13 Python
Tornado高并发处理方法实例代码
2018/01/15 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python实现汇率转换操作
2020/05/03 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
《菜园里》教学反思
2014/04/17 职场文书
幼师求职自荐信
2014/05/31 职场文书
大学同学会活动方案
2014/08/20 职场文书
学校重阳节活动总结
2015/03/24 职场文书
写作之关于描写老人的好段摘抄
2019/11/14 职场文书
Redis分布式锁Redlock的实现
2021/08/07 Redis