keras 讀取多標(biāo)簽圖像數(shù)據(jù)方式
我所接觸的多標(biāo)簽數(shù)據(jù),主要包括兩類(lèi):
1、一張圖片屬于多個(gè)標(biāo)簽,比如,data:一件藍(lán)色的上衣圖片.jpg,label:藍(lán)色,上衣。其中l(wèi)abel包括兩類(lèi)標(biāo)簽,label1第一類(lèi):上衣,褲子,外套。label2第二類(lèi),藍(lán)色,黑色,紅色。這樣兩個(gè)輸出label1,label2都是是分類(lèi),我們可以直接把label1和label2整合為一個(gè)label,直接編碼,比如[藍(lán)色,上衣]編碼為[011011]。這樣模型的輸出也只需要一個(gè)輸出。實(shí)現(xiàn)了多分類(lèi)。
2、一張圖片屬于多個(gè)標(biāo)簽,但是幾個(gè)標(biāo)簽不全是分類(lèi)。比如data:一張結(jié)婚現(xiàn)場(chǎng)的圖片.jpg,label:高興,3(表示高興程度)。這時(shí)label1是分類(lèi),label2時(shí)回歸。這種情況就需要多個(gè)標(biāo)簽,模型需要多個(gè)輸出。【其實(shí)最好的例子,就是目標(biāo)檢測(cè),不但檢測(cè)什么物體(分類(lèi)),還要檢測(cè)到物體的坐標(biāo)(回歸)】
在這里我主要針對(duì)第二種情況加以說(shuō)明:
keras的ImageDataGenerator.flow_from_directory 只能簡(jiǎn)單的讀取單標(biāo)簽數(shù)據(jù)。所以我自己寫(xiě)了個(gè)data_generate,來(lái)生成bathsize多標(biāo)簽數(shù)據(jù)

#此模塊主要用來(lái)讀取數(shù)據(jù)集,返回一個(gè)數(shù)據(jù)可迭代對(duì)象
#重點(diǎn)是,此模塊分批次的把圖像讀入內(nèi)存的,而不是一次全讀入,有效的減少了內(nèi)存溢出
import os
import cv2
import numpy as np
import keras
from random import shuffle
#目標(biāo)圖像大小
image_size= (229, 229, 3)
#類(lèi)別編碼
class_dict=dict(zip(['neg','pos','neu'],[0,1,2]))
#處理.txt文件,并加載圖片文件夾里的圖片名
#txt_path,txt文件路徑,data_path,圖片文件夾路徑
def read_txt(txt_path,data_path):
# 中間數(shù)組
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))
#處理圖片數(shù)據(jù)集
all_picture_name = os.listdir(data_path)
#打亂數(shù)據(jù)集
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: # 若是灰度圖則轉(zhuǎn)為三通道
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,一個(gè)單獨(dú)數(shù)組,batch_score一個(gè)單獨(dú)的數(shù)組
'''
注釋掉的這段代碼生成的label是錯(cuò)誤的。
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]
接下來(lái)就是放入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 讀取多標(biāo)簽圖像數(shù)據(jù)方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python光學(xué)仿真實(shí)現(xiàn)波長(zhǎng)與顏色之間對(duì)應(yīng)關(guān)系示例解析
這篇文章主要為大家介紹了Python光學(xué)仿真實(shí)現(xiàn)波長(zhǎng)與顏色之間對(duì)應(yīng)關(guān)系的示例解析,有需要的我朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Python實(shí)現(xiàn)Excel和CSV之間的相互轉(zhuǎn)換
通過(guò)使用Python編程語(yǔ)言,編寫(xiě)腳本來(lái)自動(dòng)化Excel和CSV之間的轉(zhuǎn)換過(guò)程,可以批量處理大量文件,定期更新數(shù)據(jù),并集成轉(zhuǎn)換過(guò)程到自動(dòng)化工作流程中,本文將介紹如何使用Python 實(shí)現(xiàn)Excel和CSV之間的相互轉(zhuǎn)換,需要的朋友可以參考下2024-03-03
python通過(guò)elixir包操作mysql數(shù)據(jù)庫(kù)實(shí)例代碼
這篇文章主要介紹了python通過(guò)elixir包操作mysql數(shù)據(jù)庫(kù),分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
CNN的Pytorch實(shí)現(xiàn)(LeNet)
本文主要從CNN的Pytorch實(shí)現(xiàn)庫(kù)導(dǎo)入,模型定義,數(shù)據(jù)加載、處理,模型訓(xùn)練,代碼匯總等方面入手介紹,運(yùn)用代碼講解相關(guān)內(nèi)容非常的詳細(xì),大家如果有需要了解相關(guān)知識(shí)的可以參考這篇文章2021-09-09

