def validation(self): valid_data = parse_annotation(YoloParams.VALIDATION_ANN_PATH, YoloParams.VALIDATION_IMG_PATH) generator = YoloDataGenerator(valid_data, shuffle=True) yolo_eval = YoloEvaluate(generator=generator, model=self.inf_model) AP = yolo_eval.comp_map() _AP_items = [[class_label, ap] for class_label, ap in AP.items()] AP_items = sorted(_AP_items, key=lambda x: x[1], reverse=True) for class_label, ap in AP_items: print("AP( %s ): %.3f" % (class_label, ap)) # Store AP results as csv #df_ap = pd.DataFrame.from_dict(AP, orient='index') #df_ap.loc['mAP'] = df_ap.mean() #df_ap.to_csv('validation_maP.csv', header=False) print('-------------------------------') print("mAP: %.3f" % (np.mean(list(AP.values())))) return AP
def gen_anchors(fname): imgs = parse_annotation(YoloParams.TRAIN_ANN_PATH, YoloParams.TRAIN_IMG_PATH) data_wh = [] for img in imgs: data_wh += exrtract_wh(img) clustering = KMeans(NUM_CENTROIDS) centroids, _ = clustering.fit(np.array(data_wh)) anchors = list(centroids.flatten()) anchors_text = "".join(["%.5f, "%a \ if i < len(anchors)-1 else "%.5f"%a for i,a in enumerate(anchors)]) fname = fname if fname != 'custom_' else 'custom_anchors.txt' with open(fname, 'w') as f: f.write("%s" % anchors_text) print("\nAnchors: \n") print(anchors_text) print("\n\tSored at: %s\n" % (fname)) return anchors
def training(self): train_data = parse_annotation(YoloParams.TRAIN_ANN_PATH, YoloParams.TRAIN_IMG_PATH) valid_data = parse_annotation(YoloParams.VALIDATION_ANN_PATH, YoloParams.VALIDATION_IMG_PATH) train_gen = YoloDataGenerator(train_data, shuffle=True, augment=True) valid_gen = YoloDataGenerator(valid_data, shuffle=True) early_stop = EarlyStopping(monitor='val_loss', min_delta=0.001, patience=3, mode='min', verbose=1) log_path = setup_logging() checkpoint_path = os.path.join(log_path, self.trained_model_name) checkpoint = ModelCheckpoint( checkpoint_path, #monitor='val_loss', monitor='loss', verbose=1, save_best_only=True, mode='min', period=1) #tb_path = os.path.join(log_path, ) tensorboard = YoloTensorBoard(log_dir=log_path, histogram_freq=0, write_graph=True, write_images=False) """ optimizer = SGD( lr=YoloParams.L_RATE, momentum=0.9, decay=0.0005 ) """ optimizer = Adam(lr=YoloParams.L_RATE, beta_1=0.9, beta_2=0.999, decay=0.0) map_cbck = Callback_MAP(generator=valid_gen, model=self.inf_model, tensorboard=tensorboard) yolo_recall.__name__ = 'recall' metrics = [ self.yolo_loss.l_coord, self.yolo_loss.l_obj, self.yolo_loss.l_class, yolo_recall ] self.model.compile(loss=self.yolo_loss, optimizer=optimizer, metrics=metrics) self.model.fit_generator( generator=train_gen, steps_per_epoch=len(train_gen), verbose=YoloParams.TRAIN_VERBOSE, validation_data=valid_gen, validation_steps=len(valid_gen), callbacks=[early_stop, checkpoint, tensorboard, map_cbck], #callbacks=[tensorboard, map_cbck], epochs=YoloParams.NUM_EPOCHS, max_queue_size=20)