歡迎您光臨本站 註冊首頁

keras 讀取多標籤圖像數據方式

←手機掃碼閱讀     qp18502452 @ 2020-06-13 , reply:0

我所接觸的多標籤數據,主要包括兩類:

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多標籤數據

  #此模塊主要用來讀取數據集,返回一個數據可迭代對象  #重點是,此模塊分批次的把圖像讀入內存的,而不是一次全讀入,有效的減少了內存溢出  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,     )

  


[qp18502452 ] keras 讀取多標籤圖像數據方式已經有293次圍觀

http://coctec.com/docs/python/shhow-post-238383.html