From 686f1d34aa6037c2f604d100a454f96ddf565a96 Mon Sep 17 00:00:00 2001 From: Robert Sachunsky Date: Sun, 1 Mar 2026 04:37:20 +0100 Subject: [PATCH] do_prediction*: simplify (esp. indexing/slicing) --- src/eynollah/eynollah.py | 432 +++++++++++---------------------------- 1 file changed, 116 insertions(+), 316 deletions(-) diff --git a/src/eynollah/eynollah.py b/src/eynollah/eynollah.py index d089511..5cad8a0 100644 --- a/src/eynollah/eynollah.py +++ b/src/eynollah/eynollah.py @@ -724,25 +724,21 @@ class Eynollah: if thresholding_for_some_classes_in_light_version: seg_not_base = label_p_pred[:,:,:,4] - seg_not_base[seg_not_base>0.03] =1 - seg_not_base[seg_not_base<1] =0 + seg_not_base = (seg_not_base > 0.03).astype(int) seg_line = label_p_pred[:,:,:,3] - seg_line[seg_line>0.1] =1 - seg_line[seg_line<1] =0 + seg_line = (seg_line > 0.1).astype(int) seg_background = label_p_pred[:,:,:,0] - seg_background[seg_background>0.25] =1 - seg_background[seg_background<1] =0 + seg_background = (seg_background > 0.25).astype(int) seg[seg_not_base==1]=4 seg[seg_background==1]=0 seg[(seg_line==1) & (seg==0)]=3 + if thresholding_for_artificial_class_in_light_version: seg_art = label_p_pred[:,:,:,2] - - seg_art[seg_art0] =1 + seg_art = (seg_art >= threshold_art_class_textline).astype(int) ##seg[seg_art==1]=2 @@ -759,113 +755,51 @@ class Eynollah: index_x_u_in = list_x_u[indexer_inside_batch] index_x_d_in = list_x_d[indexer_inside_batch] - if i_batch == 0 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[0:-margin or None, - 0:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[0:-margin or None, - 0:-margin or None] - - elif i_batch == nxf - 1 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[margin:, - margin:, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[margin:, - margin:] - - elif i_batch == 0 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[margin:, - 0:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[margin:, - 0:-margin or None] - - elif i_batch == nxf - 1 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[0:-margin or None, - margin:, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[0:-margin or None, - margin:] - - elif i_batch == 0 and j_batch != 0 and j_batch != nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[margin:-margin or None, - 0:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[margin:-margin or None, - 0:-margin or None] - - elif i_batch == nxf - 1 and j_batch != 0 and j_batch != nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[margin:-margin or None, - margin:, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[margin:-margin or None, - margin:] - - elif i_batch != 0 and i_batch != nxf - 1 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[0:-margin or None, - margin:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[0:-margin or None, - margin:-margin or None] - - elif i_batch != 0 and i_batch != nxf - 1 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[margin:, - margin:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[margin:, - margin:-margin or None] - + where = np.index_exp[index_y_d_in:index_y_u_in, + index_x_d_in:index_x_u_in] + if (i_batch == 0 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + margin:] + elif (i_batch == 0 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + margin:] + elif (i_batch == 0 and + j_batch != 0 and + j_batch != nyf - 1): + inbox = np.index_exp[margin:-margin or None, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch != 0 and + j_batch != nyf - 1): + inbox = np.index_exp[margin:-margin or None, + margin:] + elif (i_batch != 0 and + i_batch != nxf - 1 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + margin:-margin or None] + elif (i_batch != 0 and + i_batch != nxf - 1 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + margin:-margin or None] else: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[margin:-margin or None, - margin:-margin or None, - np.newaxis] - if thresholding_for_artificial_class_in_light_version: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[margin:-margin or None, - margin:-margin or None] + inbox = np.index_exp[margin:-margin or None, + margin:-margin or None] + prediction_true[where][inbox] = seg_in[inbox + (np.newaxis,)] + if thresholding_for_artificial_class_in_light_version: + prediction_true[where][inbox + (1,)] = seg_in_art[inbox] + indexer_inside_batch += 1 @@ -885,11 +819,7 @@ class Eynollah: kernel_min = np.ones((3, 3), np.uint8) prediction_true[:,:,0][prediction_true[:,:,0]==2] = 0 - skeleton_art = skeletonize(prediction_true[:,:,1]) - skeleton_art = skeleton_art*1 - - skeleton_art = skeleton_art.astype('uint8') - + skeleton_art = skeletonize(prediction_true[:,:,1]).astype(np.uint8) skeleton_art = cv2.dilate(skeleton_art, kernel_min, iterations=1) prediction_true[:,:,0][skeleton_art==1]=2 @@ -924,18 +854,13 @@ class Eynollah: if thresholding_for_artificial_class_in_light_version: kernel_min = np.ones((3, 3), np.uint8) seg_art = label_p_pred[0,:,:,4] - seg_art[seg_art0] =1 + seg_art = (seg_art >= threshold_art_class_layout).astype(int) #seg[seg_art==1]=4 seg_art = resize_image(seg_art, img_h_page, img_w_page).astype(np.uint8) prediction_true[:,:,0][prediction_true[:,:,0]==4] = 0 - skeleton_art = skeletonize(seg_art) - skeleton_art = skeleton_art*1 - - skeleton_art = skeleton_art.astype('uint8') - + skeleton_art = skeletonize(seg_art).astype(np.uint8) skeleton_art = cv2.dilate(skeleton_art, kernel_min, iterations=1) prediction_true[:,:,0][skeleton_art==1] = 4 @@ -948,6 +873,8 @@ class Eynollah: img = resize_image(img, img.shape[0], img_width_model) self.logger.debug("Patch size: %sx%s", img_height_model, img_width_model) + thresholding = (thresholding_for_artificial_class_in_light_version or + thresholding_for_some_classes_in_light_version) margin = int(marginal_of_patch_percent * img_height_model) width_mid = img_width_model - 2 * margin height_mid = img_height_model - 2 * margin @@ -974,18 +901,10 @@ class Eynollah: img_patch = np.zeros((n_batch_inference, img_height_model, img_width_model, 3)) for i in range(nxf): for j in range(nyf): - if i == 0: - index_x_d = i * width_mid - index_x_u = index_x_d + img_width_model - else: - index_x_d = i * width_mid - index_x_u = index_x_d + img_width_model - if j == 0: - index_y_d = j * height_mid - index_y_u = index_y_d + img_height_model - else: - index_y_d = j * height_mid - index_y_u = index_y_d + img_height_model + index_x_d = i * width_mid + index_x_u = index_x_d + img_width_model + index_y_d = j * height_mid + index_y_u = index_y_d + img_height_model if index_x_u > img_w: index_x_u = img_w index_x_d = img_w - img_width_model @@ -1000,7 +919,8 @@ class Eynollah: list_y_d.append(index_y_d) list_y_u.append(index_y_u) - img_patch[batch_indexer] = img[index_y_d:index_y_u, index_x_d:index_x_u] + img_patch[batch_indexer] = img[index_y_d:index_y_u, + index_x_d:index_x_u] batch_indexer += 1 if (batch_indexer == n_batch_inference or @@ -1012,29 +932,25 @@ class Eynollah: if thresholding_for_some_classes_in_light_version: seg_art = label_p_pred[:,:,:,4] - seg_art[seg_art0] =1 + + seg_art = (seg_art >= threshold_art_class_layout).astype(int) seg_line = label_p_pred[:,:,:,3] - seg_line[seg_line>0.4] =1#seg_line[seg_line>0.5] =1#seg_line[seg_line>0.1] =1 - seg_line[seg_line<1] =0 + seg_line = (seg_line > 0.4).astype(int) ##seg[seg_art==1]=4 #seg[(seg_line==1) & (seg==0)]=3 if thresholding_for_artificial_class_in_light_version: seg_art = label_p_pred[:,:,:,2] - seg_art[seg_art0] =1 - + seg_art = (seg_art >= threshold_art_class_textline).astype(int) ##seg[seg_art==1]=2 indexer_inside_batch = 0 for i_batch, j_batch in zip(list_i_s, list_j_s): seg_in = seg[indexer_inside_batch] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): + if thresholding: seg_in_art = seg_art[indexer_inside_batch] index_y_u_in = list_y_u[indexer_inside_batch] @@ -1043,164 +959,56 @@ class Eynollah: index_x_u_in = list_x_u[indexer_inside_batch] index_x_d_in = list_x_d[indexer_inside_batch] - if i_batch == 0 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[0:-margin or None, - 0:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - label_p_pred[0, 0:-margin or None, - 0:-margin or None, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[0:-margin or None, - 0:-margin or None] - - elif i_batch == nxf - 1 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[margin:, - margin:, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - 0] = \ - label_p_pred[0, margin:, - margin:, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[margin:, - margin:] - - elif i_batch == 0 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[margin:, - 0:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + 0:index_x_u_in - margin] = \ - label_p_pred[0, margin:, - 0:-margin or None, - 1] - - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[margin:, - 0:-margin or None] - - elif i_batch == nxf - 1 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[0:-margin or None, - margin:, - np.newaxis] - confidence_matrix[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - label_p_pred[0, 0:-margin or None, - margin:, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[0:-margin or None, - margin:] - - elif i_batch == 0 and j_batch != 0 and j_batch != nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - seg_in[margin:-margin or None, - 0:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin] = \ - label_p_pred[0, margin:-margin or None, - 0:-margin or None, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + 0:index_x_u_in - margin, 1] = \ - seg_in_art[margin:-margin or None, - 0:-margin or None] - elif i_batch == nxf - 1 and j_batch != 0 and j_batch != nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - seg_in[margin:-margin or None, - margin:, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0] = \ - label_p_pred[0, margin:-margin or None, - margin:, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - 0, 1] = \ - seg_in_art[margin:-margin or None, - margin:] - elif i_batch != 0 and i_batch != nxf - 1 and j_batch == 0: - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[0:-margin or None, - margin:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - label_p_pred[0, 0:-margin or None, - margin:-margin or None, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + 0:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[0:-margin or None, - margin:-margin or None] - elif i_batch != 0 and i_batch != nxf - 1 and j_batch == nyf - 1: - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[margin:, - margin:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - margin] = \ - label_p_pred[0, margin:, - margin:-margin or None, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - 0, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[margin:, - margin:-margin or None] + where = np.index_exp[index_y_d_in:index_y_u_in, + index_x_d_in:index_x_u_in] + if (i_batch == 0 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + margin:] + elif (i_batch == 0 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + margin:] + elif (i_batch == 0 and + j_batch != 0 and + j_batch != nyf - 1): + inbox = np.index_exp[margin:-margin or None, + 0:-margin or None] + elif (i_batch == nxf - 1 and + j_batch != 0 and + j_batch != nyf - 1): + inbox = np.index_exp[margin:-margin or None, + margin:] + elif (i_batch != 0 and + i_batch != nxf - 1 and + j_batch == 0): + inbox = np.index_exp[0:-margin or None, + margin:-margin or None] + elif (i_batch != 0 and + i_batch != nxf - 1 and + j_batch == nyf - 1): + inbox = np.index_exp[margin:, + margin:-margin or None] else: - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - seg_in[margin:-margin or None, - margin:-margin or None, - np.newaxis] - confidence_matrix[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin] = \ - label_p_pred[0, margin:-margin or None, - margin:-margin or None, - 1] - if (thresholding_for_artificial_class_in_light_version or - thresholding_for_some_classes_in_light_version): - prediction_true[index_y_d_in + margin:index_y_u_in - margin, - index_x_d_in + margin:index_x_u_in - margin, 1] = \ - seg_in_art[margin:-margin or None, - margin:-margin or None] + inbox = np.index_exp[margin:-margin or None, + margin:-margin or None] + prediction_true[where][inbox] = seg_in[inbox + (np.newaxis,)] + confidence_matrix[where][inbox] = label_p_pred[(0,) + inbox + (1,)] + # rs: why is prediction_true 3ch when only 1st gets used? + # artificial boundary class map should be extra array + # rs: why does confidence_matrix only get text-label scores? + # should be scores at final argmax + if thresholding: + prediction_true[where][inbox + (1,)] = seg_in_art[inbox] + indexer_inside_batch += 1 list_i_s = [] @@ -1219,11 +1027,7 @@ class Eynollah: kernel_min = np.ones((3, 3), np.uint8) prediction_true[:,:,0][prediction_true[:,:,0]==2] = 0 - skeleton_art = skeletonize(prediction_true[:,:,1]) - skeleton_art = skeleton_art*1 - - skeleton_art = skeleton_art.astype('uint8') - + skeleton_art = skeletonize(prediction_true[:,:,1]).astype(np.uint8) skeleton_art = cv2.dilate(skeleton_art, kernel_min, iterations=1) prediction_true[:,:,0][skeleton_art==1]=2 @@ -1232,11 +1036,7 @@ class Eynollah: kernel_min = np.ones((3, 3), np.uint8) prediction_true[:,:,0][prediction_true[:,:,0]==4] = 0 - skeleton_art = skeletonize(prediction_true[:,:,1]) - skeleton_art = skeleton_art*1 - - skeleton_art = skeleton_art.astype('uint8') - + skeleton_art = skeletonize(prediction_true[:,:,1]).astype(np.uint8) skeleton_art = cv2.dilate(skeleton_art, kernel_min, iterations=1) prediction_true[:,:,0][skeleton_art==1]=4