基于度量學(xué)習(xí)的行人重識別(三)

在前面的文章中,我們已經(jīng)完成了對數(shù)據(jù)的處理,以及模型的搭建,接下來就需要整合起來,進(jìn)行訓(xùn)練了。
模型訓(xùn)練
新建一個train.py,首先導(dǎo)入依賴:
from load_data import Person_Datasetfrom loss.Triplet_loss import triplet_lossfrom models.create_model import Create_Modelfrom tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateauimport tensorflow as tfimport tensorflow.keras as kimport randomfrom utils import detect_imageimport matplotlib.pyplot as pltimport numpy as np
接著,設(shè)置參數(shù)、讀取數(shù)據(jù)、搭建模型:
# 參數(shù)設(shè)置batch_size=64input_size=(215,90,3)epoch =100init_epoch =0train_image_path =r'E:\DataSets\DukeMTMC-reID\DukeMTMC-reID\bounding_box_train'test_image_path =r'E:\DataSets\DukeMTMC-reID\DukeMTMC-reID\query'# 數(shù)據(jù)讀取train_dataset=Person_Dataset(train_image_path,batch_size)# test_dataset = Person_Dataset(test_image_path,batch_size,train=False)test_dataset_2=Person_Dataset(test_image_path,batch_size=1,train=False)#模型搭建model,pred_model = Create_Model(inpt=input_size,num_classes=1812)# model.summary()model.compile(loss={'Embedding':triplet_loss(batch_size=batch_size),'Softmax':"categorical_crossentropy"},optimizer=tf.keras.optimizers.Adam(lr=1e-5),metrics={'Softmax':'acc'})
然后,自定義一個回調(diào)函數(shù),用來在每次訓(xùn)練開始前進(jìn)行預(yù)測,并可視化預(yù)測效果:
# 自定義回調(diào)函數(shù)class Evaluator(k.callbacks.Callback):def __init__(self):self.accs = []def on_epoch_begin(self, epoch, logs=None):for i in range(3):plt.clf()radmon_int = random.randint(0,test_dataset_2.__len__()-1)image, _ = test_dataset_2.__getitem__(radmon_int)# print(image[0].shape)same_l1 = detect_image(image[0],image[1],model=pred_model)diff_l2 = detect_image(image[0],image[2],model=pred_model)plt.subplot(1, 3, 1)plt.imshow(np.array(image[0]))plt.subplot(1, 3, 2)plt.imshow(np.array(image[1]))plt.text(-12, -12, 'same:%.3f' % same_l1, ha='center', va='bottom', fontsize=11)plt.subplot(1, 3, 3)plt.imshow(np.array(image[2]))plt.text(-24, -12, 'diff:%.3f' % diff_l2, ha='center', va='bottom', fontsize=11)plt.savefig(r'image\test_epoch_%s_%s.png'%(epoch,i))# cv2.imwrite('train_img\epoch_%s_train.jpg'%epoch,train_img)evaluator = Evaluator()
接著,定義其他回調(diào)函數(shù),就可以開始訓(xùn)練了:
# 回調(diào)函數(shù)checkpoint_period = ModelCheckpoint(r'logs/' + 'ep{epoch:03d}-loss{loss:.3f}.h5',monitor='val_loss', save_weights_only=True, save_best_only=True, period=1)reduce_lr = ReduceLROnPlateau(monitor='loss', factor=0.1, patience=5, verbose=1)early_stopping = EarlyStopping(monitor='loss', min_delta=0, patience=10, verbose=1)# 模型訓(xùn)練model.fit(train_dataset,steps_per_epoch=train_dataset.__len__(),# validation_data=test_dataset,validation_steps=test_dataset.__len__(),epochs=epoch,initial_epoch=init_epoch,callbacks=[checkpoint_period,reduce_lr,early_stopping,evaluator],workers=1)
當(dāng)然,在開始訓(xùn)練之前,我們還需要新建images、logs文件夾用來存放可視化數(shù)據(jù)以及保存的權(quán)重,不然會報錯的,訓(xùn)練過程中的圖像如下:
可視化訓(xùn)練結(jié)果
第一個周期(此時對相同人以及不同人的區(qū)分還不是很明顯)

第十個周期(此時基本可以區(qū)分不同人的特征了)

第四十個周期

至此,基于度量學(xué)習(xí)的行人重識別模型的訓(xùn)練就到此一段落了,后續(xù)我們將會給大家?guī)硇腥怂阉鳌涡腥烁櫼约岸嘈腥烁櫟膬?nèi)容,想要學(xué)習(xí)的記得關(guān)注一下。
評論
圖片
表情
