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 相关文章推荐
仅用50行Python代码实现一个简单的代理服务器
Apr 08 Python
通过Python 获取Android设备信息的轻量级框架
Dec 18 Python
pandas获取groupby分组里最大值所在的行方法
Apr 20 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
python 读取修改pcap包的例子
Jul 23 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
pytorch之inception_v3的实现案例
Jan 06 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
关于python中的xpath解析定位
Mar 06 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
matplotlib相关系统目录获取方式小结
Feb 03 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+MYSQL开发工具及资源收藏
2007/01/02 PHP
php 设计模式之 单例模式
2008/12/19 PHP
php获取远程图片体积大小的实例
2013/11/12 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
js中删除数组中的某一元素实例(无下标时)
2017/02/28 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
详解nodeJS之二进制buffer对象
2017/06/03 NodeJs
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
信号生成及DFT的python实现方式
2020/02/25 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
体育教育毕业生自荐信
2013/11/21 职场文书
自荐书封面下载
2013/11/29 职场文书
群众路线教育实践活动对照检查材料
2014/09/22 职场文书
颐和园的导游词
2015/01/30 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书
Python基础之进程详解
2021/05/21 Python
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers