不懂keras 讀取多標(biāo)簽圖像數(shù)據(jù)的方法?其實(shí)想解決這個(gè)問(wèn)題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。

我所接觸的多標(biāo)簽數(shù)據(jù),主要包括兩類:
1、一張圖片屬于多個(gè)標(biāo)簽,比如,data:一件藍(lán)色的上衣圖片.jpg,label:藍(lán)色,上衣。其中l(wèi)abel包括兩類標(biāo)簽,label1第一類:上衣,褲子,外套。label2第二類,藍(lán)色,黑色,紅色。這樣兩個(gè)輸出label1,label2都是是分類,我們可以直接把label1和label2整合為一個(gè)label,直接編碼,比如[藍(lán)色,上衣]編碼為[011011]。這樣模型的輸出也只需要一個(gè)輸出。實(shí)現(xiàn)了多分類。
2、一張圖片屬于多個(gè)標(biāo)簽,但是幾個(gè)標(biāo)簽不全是分類。比如data:一張結(jié)婚現(xiàn)場(chǎng)的圖片.jpg,label:高興,3(表示高興程度)。這時(shí)label1是分類,label2時(shí)回歸。這種情況就需要多個(gè)標(biāo)簽,模型需要多個(gè)輸出。【其實(shí)最好的例子,就是目標(biāo)檢測(cè),不但檢測(cè)什么物體(分類),還要檢測(cè)到物體的坐標(biāo)(回歸)】
在這里我主要針對(duì)第二種情況加以說(shuō)明:
keras的ImageDataGenerator.flow_from_directory 只能簡(jiǎn)單的讀取單標(biāo)簽數(shù)據(jù)。所以我自己寫了個(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)
#類別編碼
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]
名稱欄目:keras讀取多標(biāo)簽圖像數(shù)據(jù)的方法-創(chuàng)新互聯(lián)
當(dāng)前網(wǎng)址:http://chinadenli.net/article28/dpiejp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、全網(wǎng)營(yíng)銷推廣、品牌網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、面包屑導(dǎo)航、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容