基于度量学习的行人重识别(三)

共 3251字,需浏览 7分钟

 ·

2021-07-29 18:43

在前面的文章中,我们已经完成了对数据的处理,以及模型的搭建,接下来就需要整合起来,进行训练了。


模型训练



新建一个train.py,首先导入依赖:

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


接着,设置参数、读取数据、搭建模型:

# 参数设置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'
# 数据读取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'})


然后,自定义一个回调函数,用来在每次训练开始前进行预测,并可视化预测效果:

# 自定义回调函数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()


接着,定义其他回调函数,就可以开始训练了:

# 回调函数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)
# 模型训练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)

当然,在开始训练之前,我们还需要新建images、logs文件夹用来存放可视化数据以及保存的权重,不然会报错的,训练过程中的图像如下:




可视化训练结果

第一个周期(此时对相同人以及不同人的区分还不是很明显)


第十个周期(此时基本可以区分不同人的特征了)


第四十个周期


至此,基于度量学习的行人重识别模型的训练就到此一段落了,后续我们将会给大家带来行人搜索、单行人跟踪以及多行人跟踪的内容,想要学习的记得关注一下。



浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报