mirror of
				https://github.com/qurator-spk/eynollah.git
				synced 2025-10-27 15:54:13 +01:00 
			
		
		
		
	avoid indentation
This commit is contained in:
		
							parent
							
								
									9f12fa241d
								
							
						
					
					
						commit
						5b82320707
					
				
					 1 changed files with 450 additions and 449 deletions
				
			
		|  | @ -4926,496 +4926,497 @@ class Eynollah: | |||
| 
 | ||||
|                 if self.dir_in: | ||||
|                     self.writer.write_pagexml(pcgts) | ||||
|                     continue | ||||
|                 else: | ||||
|                     return pcgts | ||||
|             else: | ||||
|                 img_res, is_image_enhanced, num_col_classifier, num_column_is_classified = self.run_enhancement(self.light_version) | ||||
|                 self.logger.info("Enhancing took %.1fs ", time.time() - t0) | ||||
|                 #print("text region early -1 in %.1fs", time.time() - t0) | ||||
|                 t1 = time.time() | ||||
|                 if not self.skip_layout_and_reading_order: | ||||
|                     if self.light_version: | ||||
|                         text_regions_p_1 ,erosion_hurts, polygons_lines_xml, textline_mask_tot_ea, img_bin_light = self.get_regions_light_v(img_res, is_image_enhanced, num_col_classifier) | ||||
|                         #print("text region early -2 in %.1fs", time.time() - t0) | ||||
|                          | ||||
|                         if num_col_classifier == 1 or num_col_classifier ==2: | ||||
|                             if num_col_classifier == 1: | ||||
|                                 img_w_new = 1000 | ||||
|                                 img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
|                                  | ||||
|                             elif num_col_classifier == 2: | ||||
|                                 img_w_new = 1300 | ||||
|                                 img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
|                                  | ||||
|                             textline_mask_tot_ea_deskew = resize_image(textline_mask_tot_ea,img_h_new, img_w_new ) | ||||
|                              | ||||
|                             slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea_deskew) | ||||
|                         else: | ||||
|                             slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea) | ||||
|                         #print("text region early -2,5 in %.1fs", time.time() - t0) | ||||
|                         #self.logger.info("Textregion detection took %.1fs ", time.time() - t1t) | ||||
|                         num_col, num_col_classifier, img_only_regions, page_coord, image_page, mask_images, mask_lines, text_regions_p_1, cont_page, table_prediction, textline_mask_tot_ea, img_bin_light = \ | ||||
|                                 self.run_graphics_and_columns_light(text_regions_p_1, textline_mask_tot_ea, num_col_classifier, num_column_is_classified, erosion_hurts, img_bin_light) | ||||
|                         #self.logger.info("run graphics %.1fs ", time.time() - t1t) | ||||
|                         #print("text region early -3 in %.1fs", time.time() - t0) | ||||
|                         textline_mask_tot_ea_org = np.copy(textline_mask_tot_ea) | ||||
|                         #print("text region early -4 in %.1fs", time.time() - t0) | ||||
|                     else: | ||||
|                         text_regions_p_1 ,erosion_hurts, polygons_lines_xml = self.get_regions_from_xy_2models(img_res, is_image_enhanced, num_col_classifier) | ||||
|                         self.logger.info("Textregion detection took %.1fs ", time.time() - t1) | ||||
| 
 | ||||
|                         t1 = time.time() | ||||
|                         num_col, num_col_classifier, img_only_regions, page_coord, image_page, mask_images, mask_lines, text_regions_p_1, cont_page, table_prediction = \ | ||||
|                                 self.run_graphics_and_columns(text_regions_p_1, num_col_classifier, num_column_is_classified, erosion_hurts) | ||||
|                         self.logger.info("Graphics detection took %.1fs ", time.time() - t1) | ||||
|                         #self.logger.info('cont_page %s', cont_page) | ||||
|                      | ||||
|                     if not num_col: | ||||
|                         self.logger.info("No columns detected, outputting an empty PAGE-XML") | ||||
|                         ocr_all_textlines = None | ||||
|                         pcgts = self.writer.build_pagexml_no_full_layout([], page_coord, [], [], [], [], [], [], [], [], [], [], cont_page, [], [], ocr_all_textlines) | ||||
|                         self.logger.info("Job done in %.1fs", time.time() - t1) | ||||
|                         if self.dir_in: | ||||
|                             self.writer.write_pagexml(pcgts) | ||||
|                             continue | ||||
|                         else: | ||||
|                             return pcgts | ||||
|                     #print("text region early in %.1fs", time.time() - t0) | ||||
|                     t1 = time.time() | ||||
|                     if not self.light_version: | ||||
|                         textline_mask_tot_ea = self.run_textline(image_page) | ||||
|                         self.logger.info("textline detection took %.1fs", time.time() - t1) | ||||
|             img_res, is_image_enhanced, num_col_classifier, num_column_is_classified = self.run_enhancement(self.light_version) | ||||
|             self.logger.info("Enhancing took %.1fs ", time.time() - t0) | ||||
|             #print("text region early -1 in %.1fs", time.time() - t0) | ||||
|             t1 = time.time() | ||||
|             if not self.skip_layout_and_reading_order: | ||||
|                 if self.light_version: | ||||
|                     text_regions_p_1 ,erosion_hurts, polygons_lines_xml, textline_mask_tot_ea, img_bin_light = self.get_regions_light_v(img_res, is_image_enhanced, num_col_classifier) | ||||
|                     #print("text region early -2 in %.1fs", time.time() - t0) | ||||
| 
 | ||||
|                         t1 = time.time() | ||||
|                         slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea) | ||||
|                         self.logger.info("deskewing took %.1fs", time.time() - t1) | ||||
|                     t1 = time.time() | ||||
|                     #plt.imshow(table_prediction) | ||||
|                     #plt.show() | ||||
|                     if self.light_version and num_col_classifier in (1,2): | ||||
|                         org_h_l_m = textline_mask_tot_ea.shape[0] | ||||
|                         org_w_l_m = textline_mask_tot_ea.shape[1] | ||||
|                     if num_col_classifier == 1 or num_col_classifier ==2: | ||||
|                         if num_col_classifier == 1: | ||||
|                             img_w_new = 2000 | ||||
|                             img_w_new = 1000 | ||||
|                             img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
|                              | ||||
| 
 | ||||
|                         elif num_col_classifier == 2: | ||||
|                             img_w_new = 2400 | ||||
|                             img_w_new = 1300 | ||||
|                             img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
|                              | ||||
|                         image_page = resize_image(image_page,img_h_new, img_w_new ) | ||||
|                         textline_mask_tot_ea = resize_image(textline_mask_tot_ea,img_h_new, img_w_new ) | ||||
|                         mask_images = resize_image(mask_images,img_h_new, img_w_new ) | ||||
|                         mask_lines = resize_image(mask_lines,img_h_new, img_w_new ) | ||||
|                         text_regions_p_1 = resize_image(text_regions_p_1,img_h_new, img_w_new ) | ||||
|                         table_prediction = resize_image(table_prediction,img_h_new, img_w_new ) | ||||
|                          | ||||
|                     textline_mask_tot, text_regions_p, image_page_rotated = self.run_marginals(image_page, textline_mask_tot_ea, mask_images, mask_lines, num_col_classifier, slope_deskew, text_regions_p_1, table_prediction) | ||||
|                      | ||||
|                     if self.light_version and num_col_classifier in (1,2): | ||||
|                         image_page = resize_image(image_page,org_h_l_m, org_w_l_m ) | ||||
|                         textline_mask_tot_ea = resize_image(textline_mask_tot_ea,org_h_l_m, org_w_l_m ) | ||||
|                         text_regions_p = resize_image(text_regions_p,org_h_l_m, org_w_l_m ) | ||||
|                         textline_mask_tot = resize_image(textline_mask_tot,org_h_l_m, org_w_l_m ) | ||||
|                         text_regions_p_1 = resize_image(text_regions_p_1,org_h_l_m, org_w_l_m ) | ||||
|                         table_prediction = resize_image(table_prediction,org_h_l_m, org_w_l_m ) | ||||
|                         image_page_rotated = resize_image(image_page_rotated,org_h_l_m, org_w_l_m ) | ||||
|                          | ||||
|                     self.logger.info("detection of marginals took %.1fs", time.time() - t1) | ||||
|                     #print("text region early 2 marginal in %.1fs", time.time() - t0) | ||||
|                     ## birdan sora chock chakir | ||||
| 
 | ||||
|                         textline_mask_tot_ea_deskew = resize_image(textline_mask_tot_ea,img_h_new, img_w_new ) | ||||
| 
 | ||||
|                         slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea_deskew) | ||||
|                     else: | ||||
|                         slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea) | ||||
|                     #print("text region early -2,5 in %.1fs", time.time() - t0) | ||||
|                     #self.logger.info("Textregion detection took %.1fs ", time.time() - t1t) | ||||
|                     num_col, num_col_classifier, img_only_regions, page_coord, image_page, mask_images, mask_lines, text_regions_p_1, cont_page, table_prediction, textline_mask_tot_ea, img_bin_light = \ | ||||
|                             self.run_graphics_and_columns_light(text_regions_p_1, textline_mask_tot_ea, num_col_classifier, num_column_is_classified, erosion_hurts, img_bin_light) | ||||
|                     #self.logger.info("run graphics %.1fs ", time.time() - t1t) | ||||
|                     #print("text region early -3 in %.1fs", time.time() - t0) | ||||
|                     textline_mask_tot_ea_org = np.copy(textline_mask_tot_ea) | ||||
|                     #print("text region early -4 in %.1fs", time.time() - t0) | ||||
|                 else: | ||||
|                     text_regions_p_1 ,erosion_hurts, polygons_lines_xml = self.get_regions_from_xy_2models(img_res, is_image_enhanced, num_col_classifier) | ||||
|                     self.logger.info("Textregion detection took %.1fs ", time.time() - t1) | ||||
| 
 | ||||
|                     t1 = time.time() | ||||
|                     if not self.full_layout: | ||||
|                         polygons_of_images, img_revised_tab, text_regions_p_1_n, textline_mask_tot_d, regions_without_separators_d, boxes, boxes_d, polygons_of_marginals, contours_tables = self.run_boxes_no_full_layout(image_page, textline_mask_tot, text_regions_p, slope_deskew, num_col_classifier, table_prediction, erosion_hurts) | ||||
|                         ###polygons_of_marginals = self.dilate_textregions_contours(polygons_of_marginals) | ||||
|                     if self.full_layout: | ||||
|                         if not self.light_version: | ||||
|                             img_bin_light = None | ||||
|                         polygons_of_images, img_revised_tab, text_regions_p_1_n, textline_mask_tot_d, regions_without_separators_d, regions_fully, regions_without_separators, polygons_of_marginals, contours_tables = self.run_boxes_full_layout(image_page, textline_mask_tot, text_regions_p, slope_deskew, num_col_classifier, img_only_regions, table_prediction, erosion_hurts, img_bin_light) | ||||
|                         ###polygons_of_marginals = self.dilate_textregions_contours(polygons_of_marginals) | ||||
|                          | ||||
|                         if self.light_version: | ||||
|                             drop_label_in_full_layout = 4 | ||||
|                             textline_mask_tot_ea_org[img_revised_tab==drop_label_in_full_layout] = 0 | ||||
|                              | ||||
|                          | ||||
|                     text_only = ((img_revised_tab[:, :] == 1)) * 1 | ||||
|                     if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                         text_only_d = ((text_regions_p_1_n[:, :] == 1)) * 1 | ||||
|                      | ||||
|                     #print("text region early 2 in %.1fs", time.time() - t0) | ||||
|                     ###min_con_area = 0.000005 | ||||
|                     if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                         contours_only_text, hir_on_text = return_contours_of_image(text_only) | ||||
|                         contours_only_text_parent = return_parent_contours(contours_only_text, hir_on_text) | ||||
|                                      | ||||
|                         if len(contours_only_text_parent) > 0: | ||||
|                             areas_cnt_text = np.array([cv2.contourArea(c) for c in contours_only_text_parent]) | ||||
|                             areas_cnt_text = areas_cnt_text / float(text_only.shape[0] * text_only.shape[1]) | ||||
|                             #self.logger.info('areas_cnt_text %s', areas_cnt_text) | ||||
|                             contours_biggest = contours_only_text_parent[np.argmax(areas_cnt_text)] | ||||
|                             contours_only_text_parent = [c for jz, c in enumerate(contours_only_text_parent) if areas_cnt_text[jz] > MIN_AREA_REGION] | ||||
|                             areas_cnt_text_parent = [area for area in areas_cnt_text if area > MIN_AREA_REGION] | ||||
|                             index_con_parents = np.argsort(areas_cnt_text_parent) | ||||
|                              | ||||
|                             contours_only_text_parent = self.return_list_of_contours_with_desired_order(contours_only_text_parent, index_con_parents) | ||||
|                     num_col, num_col_classifier, img_only_regions, page_coord, image_page, mask_images, mask_lines, text_regions_p_1, cont_page, table_prediction = \ | ||||
|                             self.run_graphics_and_columns(text_regions_p_1, num_col_classifier, num_column_is_classified, erosion_hurts) | ||||
|                     self.logger.info("Graphics detection took %.1fs ", time.time() - t1) | ||||
|                     #self.logger.info('cont_page %s', cont_page) | ||||
| 
 | ||||
|                             ##try: | ||||
|                                 ##contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=object)[index_con_parents]) | ||||
|                             ##except: | ||||
|                                 ##contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=np.int32)[index_con_parents]) | ||||
|                             ##areas_cnt_text_parent = list(np.array(areas_cnt_text_parent)[index_con_parents]) | ||||
|                             areas_cnt_text_parent = self.return_list_of_contours_with_desired_order(areas_cnt_text_parent, index_con_parents) | ||||
|                 if not num_col: | ||||
|                     self.logger.info("No columns detected, outputting an empty PAGE-XML") | ||||
|                     ocr_all_textlines = None | ||||
|                     pcgts = self.writer.build_pagexml_no_full_layout([], page_coord, [], [], [], [], [], [], [], [], [], [], cont_page, [], [], ocr_all_textlines) | ||||
|                     self.logger.info("Job done in %.1fs", time.time() - t1) | ||||
|                     if self.dir_in: | ||||
|                         self.writer.write_pagexml(pcgts) | ||||
|                         continue | ||||
|                     else: | ||||
|                         return pcgts | ||||
|                 #print("text region early in %.1fs", time.time() - t0) | ||||
|                 t1 = time.time() | ||||
|                 if not self.light_version: | ||||
|                     textline_mask_tot_ea = self.run_textline(image_page) | ||||
|                     self.logger.info("textline detection took %.1fs", time.time() - t1) | ||||
| 
 | ||||
|                             cx_bigest_big, cy_biggest_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest]) | ||||
|                             cx_bigest, cy_biggest, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent) | ||||
|                     t1 = time.time() | ||||
|                     slope_deskew, slope_first = self.run_deskew(textline_mask_tot_ea) | ||||
|                     self.logger.info("deskewing took %.1fs", time.time() - t1) | ||||
|                 t1 = time.time() | ||||
|                 #plt.imshow(table_prediction) | ||||
|                 #plt.show() | ||||
|                 if self.light_version and num_col_classifier in (1,2): | ||||
|                     org_h_l_m = textline_mask_tot_ea.shape[0] | ||||
|                     org_w_l_m = textline_mask_tot_ea.shape[1] | ||||
|                     if num_col_classifier == 1: | ||||
|                         img_w_new = 2000 | ||||
|                         img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
| 
 | ||||
|                             contours_only_text_d, hir_on_text_d = return_contours_of_image(text_only_d) | ||||
|                             contours_only_text_parent_d = return_parent_contours(contours_only_text_d, hir_on_text_d) | ||||
|                     elif num_col_classifier == 2: | ||||
|                         img_w_new = 2400 | ||||
|                         img_h_new = int(textline_mask_tot_ea.shape[0] / float(textline_mask_tot_ea.shape[1]) * img_w_new) | ||||
| 
 | ||||
|                             areas_cnt_text_d = np.array([cv2.contourArea(c) for c in contours_only_text_parent_d]) | ||||
|                             areas_cnt_text_d = areas_cnt_text_d / float(text_only_d.shape[0] * text_only_d.shape[1]) | ||||
|                              | ||||
|                             if len(areas_cnt_text_d)>0: | ||||
|                                 contours_biggest_d = contours_only_text_parent_d[np.argmax(areas_cnt_text_d)] | ||||
|                                 index_con_parents_d = np.argsort(areas_cnt_text_d) | ||||
|                                 contours_only_text_parent_d = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d, index_con_parents_d) | ||||
|                                 #try: | ||||
|                                     #contours_only_text_parent_d = list(np.array(contours_only_text_parent_d,dtype=object)[index_con_parents_d]) | ||||
|                                 #except: | ||||
|                                     #contours_only_text_parent_d = list(np.array(contours_only_text_parent_d,dtype=np.int32)[index_con_parents_d]) | ||||
|                                      | ||||
|                                 #areas_cnt_text_d = list(np.array(areas_cnt_text_d)[index_con_parents_d]) | ||||
|                                 areas_cnt_text_d = self.return_list_of_contours_with_desired_order(areas_cnt_text_d, index_con_parents_d) | ||||
|                     image_page = resize_image(image_page,img_h_new, img_w_new ) | ||||
|                     textline_mask_tot_ea = resize_image(textline_mask_tot_ea,img_h_new, img_w_new ) | ||||
|                     mask_images = resize_image(mask_images,img_h_new, img_w_new ) | ||||
|                     mask_lines = resize_image(mask_lines,img_h_new, img_w_new ) | ||||
|                     text_regions_p_1 = resize_image(text_regions_p_1,img_h_new, img_w_new ) | ||||
|                     table_prediction = resize_image(table_prediction,img_h_new, img_w_new ) | ||||
| 
 | ||||
|                                 cx_bigest_d_big, cy_biggest_d_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest_d]) | ||||
|                                 cx_bigest_d, cy_biggest_d, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent_d) | ||||
|                                 try: | ||||
|                                     if len(cx_bigest_d) >= 5: | ||||
|                                         cx_bigest_d_last5 = cx_bigest_d[-5:] | ||||
|                                         cy_biggest_d_last5 = cy_biggest_d[-5:] | ||||
|                                         dists_d = [math.sqrt((cx_bigest_big[0] - cx_bigest_d_last5[j]) ** 2 + (cy_biggest_big[0] - cy_biggest_d_last5[j]) ** 2) for j in range(len(cy_biggest_d_last5))] | ||||
|                                         ind_largest = len(cx_bigest_d) -5 + np.argmin(dists_d) | ||||
|                                     else: | ||||
|                                         cx_bigest_d_last5 = cx_bigest_d[-len(cx_bigest_d):] | ||||
|                                         cy_biggest_d_last5 = cy_biggest_d[-len(cx_bigest_d):] | ||||
|                                         dists_d = [math.sqrt((cx_bigest_big[0]-cx_bigest_d_last5[j])**2 + (cy_biggest_big[0]-cy_biggest_d_last5[j])**2) for j in range(len(cy_biggest_d_last5))] | ||||
|                                         ind_largest = len(cx_bigest_d) - len(cx_bigest_d) + np.argmin(dists_d) | ||||
|                                          | ||||
|                                     cx_bigest_d_big[0] = cx_bigest_d[ind_largest] | ||||
|                                     cy_biggest_d_big[0] = cy_biggest_d[ind_largest] | ||||
|                                 except Exception as why: | ||||
|                                     self.logger.error(why) | ||||
|                 textline_mask_tot, text_regions_p, image_page_rotated = self.run_marginals(image_page, textline_mask_tot_ea, mask_images, mask_lines, num_col_classifier, slope_deskew, text_regions_p_1, table_prediction) | ||||
| 
 | ||||
|                                 (h, w) = text_only.shape[:2] | ||||
|                                 center = (w // 2.0, h // 2.0) | ||||
|                                 M = cv2.getRotationMatrix2D(center, slope_deskew, 1.0) | ||||
|                                 M_22 = np.array(M)[:2, :2] | ||||
|                                 p_big = np.dot(M_22, [cx_bigest_big, cy_biggest_big]) | ||||
|                                 x_diff = p_big[0] - cx_bigest_d_big | ||||
|                                 y_diff = p_big[1] - cy_biggest_d_big | ||||
|                 if self.light_version and num_col_classifier in (1,2): | ||||
|                     image_page = resize_image(image_page,org_h_l_m, org_w_l_m ) | ||||
|                     textline_mask_tot_ea = resize_image(textline_mask_tot_ea,org_h_l_m, org_w_l_m ) | ||||
|                     text_regions_p = resize_image(text_regions_p,org_h_l_m, org_w_l_m ) | ||||
|                     textline_mask_tot = resize_image(textline_mask_tot,org_h_l_m, org_w_l_m ) | ||||
|                     text_regions_p_1 = resize_image(text_regions_p_1,org_h_l_m, org_w_l_m ) | ||||
|                     table_prediction = resize_image(table_prediction,org_h_l_m, org_w_l_m ) | ||||
|                     image_page_rotated = resize_image(image_page_rotated,org_h_l_m, org_w_l_m ) | ||||
| 
 | ||||
|                                 contours_only_text_parent_d_ordered = [] | ||||
|                                 for i in range(len(contours_only_text_parent)): | ||||
|                                     p = np.dot(M_22, [cx_bigest[i], cy_biggest[i]]) | ||||
|                                     p[0] = p[0] - x_diff[0] | ||||
|                                     p[1] = p[1] - y_diff[0] | ||||
|                                     dists = [math.sqrt((p[0] - cx_bigest_d[j]) ** 2 + (p[1] - cy_biggest_d[j]) ** 2) for j in range(len(cx_bigest_d))] | ||||
|                                     contours_only_text_parent_d_ordered.append(contours_only_text_parent_d[np.argmin(dists)]) | ||||
|                                     # img2=np.zeros((text_only.shape[0],text_only.shape[1],3)) | ||||
|                                     # img2=cv2.fillPoly(img2,pts=[contours_only_text_parent_d[np.argmin(dists)]] ,color=(1,1,1)) | ||||
|                                     # plt.imshow(img2[:,:,0]) | ||||
|                                     # plt.show() | ||||
|                             else: | ||||
|                                 contours_only_text_parent_d_ordered = [] | ||||
|                                 contours_only_text_parent_d = [] | ||||
|                                 contours_only_text_parent = [] | ||||
|                                  | ||||
|                 self.logger.info("detection of marginals took %.1fs", time.time() - t1) | ||||
|                 #print("text region early 2 marginal in %.1fs", time.time() - t0) | ||||
|                 ## birdan sora chock chakir | ||||
|                 t1 = time.time() | ||||
|                 if not self.full_layout: | ||||
|                     polygons_of_images, img_revised_tab, text_regions_p_1_n, textline_mask_tot_d, regions_without_separators_d, boxes, boxes_d, polygons_of_marginals, contours_tables = self.run_boxes_no_full_layout(image_page, textline_mask_tot, text_regions_p, slope_deskew, num_col_classifier, table_prediction, erosion_hurts) | ||||
|                     ###polygons_of_marginals = self.dilate_textregions_contours(polygons_of_marginals) | ||||
|                 if self.full_layout: | ||||
|                     if not self.light_version: | ||||
|                         img_bin_light = None | ||||
|                     polygons_of_images, img_revised_tab, text_regions_p_1_n, textline_mask_tot_d, regions_without_separators_d, regions_fully, regions_without_separators, polygons_of_marginals, contours_tables = self.run_boxes_full_layout(image_page, textline_mask_tot, text_regions_p, slope_deskew, num_col_classifier, img_only_regions, table_prediction, erosion_hurts, img_bin_light) | ||||
|                     ###polygons_of_marginals = self.dilate_textregions_contours(polygons_of_marginals) | ||||
| 
 | ||||
|                     if self.light_version: | ||||
|                         drop_label_in_full_layout = 4 | ||||
|                         textline_mask_tot_ea_org[img_revised_tab==drop_label_in_full_layout] = 0 | ||||
| 
 | ||||
| 
 | ||||
|                 text_only = ((img_revised_tab[:, :] == 1)) * 1 | ||||
|                 if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                     text_only_d = ((text_regions_p_1_n[:, :] == 1)) * 1 | ||||
| 
 | ||||
|                 #print("text region early 2 in %.1fs", time.time() - t0) | ||||
|                 ###min_con_area = 0.000005 | ||||
|                 if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                     contours_only_text, hir_on_text = return_contours_of_image(text_only) | ||||
|                     contours_only_text_parent = return_parent_contours(contours_only_text, hir_on_text) | ||||
| 
 | ||||
|                     if len(contours_only_text_parent) > 0: | ||||
|                         areas_cnt_text = np.array([cv2.contourArea(c) for c in contours_only_text_parent]) | ||||
|                         areas_cnt_text = areas_cnt_text / float(text_only.shape[0] * text_only.shape[1]) | ||||
|                         #self.logger.info('areas_cnt_text %s', areas_cnt_text) | ||||
|                         contours_biggest = contours_only_text_parent[np.argmax(areas_cnt_text)] | ||||
|                         contours_only_text_parent = [c for jz, c in enumerate(contours_only_text_parent) if areas_cnt_text[jz] > MIN_AREA_REGION] | ||||
|                         areas_cnt_text_parent = [area for area in areas_cnt_text if area > MIN_AREA_REGION] | ||||
|                         index_con_parents = np.argsort(areas_cnt_text_parent) | ||||
| 
 | ||||
|                         contours_only_text_parent = self.return_list_of_contours_with_desired_order(contours_only_text_parent, index_con_parents) | ||||
| 
 | ||||
|                         ##try: | ||||
|                             ##contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=object)[index_con_parents]) | ||||
|                         ##except: | ||||
|                             ##contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=np.int32)[index_con_parents]) | ||||
|                         ##areas_cnt_text_parent = list(np.array(areas_cnt_text_parent)[index_con_parents]) | ||||
|                         areas_cnt_text_parent = self.return_list_of_contours_with_desired_order(areas_cnt_text_parent, index_con_parents) | ||||
| 
 | ||||
|                         cx_bigest_big, cy_biggest_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest]) | ||||
|                         cx_bigest, cy_biggest, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent) | ||||
| 
 | ||||
|                         contours_only_text_d, hir_on_text_d = return_contours_of_image(text_only_d) | ||||
|                         contours_only_text_parent_d = return_parent_contours(contours_only_text_d, hir_on_text_d) | ||||
| 
 | ||||
|                         areas_cnt_text_d = np.array([cv2.contourArea(c) for c in contours_only_text_parent_d]) | ||||
|                         areas_cnt_text_d = areas_cnt_text_d / float(text_only_d.shape[0] * text_only_d.shape[1]) | ||||
| 
 | ||||
|                         if len(areas_cnt_text_d)>0: | ||||
|                             contours_biggest_d = contours_only_text_parent_d[np.argmax(areas_cnt_text_d)] | ||||
|                             index_con_parents_d = np.argsort(areas_cnt_text_d) | ||||
|                             contours_only_text_parent_d = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d, index_con_parents_d) | ||||
|                             #try: | ||||
|                                 #contours_only_text_parent_d = list(np.array(contours_only_text_parent_d,dtype=object)[index_con_parents_d]) | ||||
|                             #except: | ||||
|                                 #contours_only_text_parent_d = list(np.array(contours_only_text_parent_d,dtype=np.int32)[index_con_parents_d]) | ||||
| 
 | ||||
|                             #areas_cnt_text_d = list(np.array(areas_cnt_text_d)[index_con_parents_d]) | ||||
|                             areas_cnt_text_d = self.return_list_of_contours_with_desired_order(areas_cnt_text_d, index_con_parents_d) | ||||
| 
 | ||||
|                             cx_bigest_d_big, cy_biggest_d_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest_d]) | ||||
|                             cx_bigest_d, cy_biggest_d, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent_d) | ||||
|                             try: | ||||
|                                 if len(cx_bigest_d) >= 5: | ||||
|                                     cx_bigest_d_last5 = cx_bigest_d[-5:] | ||||
|                                     cy_biggest_d_last5 = cy_biggest_d[-5:] | ||||
|                                     dists_d = [math.sqrt((cx_bigest_big[0] - cx_bigest_d_last5[j]) ** 2 + (cy_biggest_big[0] - cy_biggest_d_last5[j]) ** 2) for j in range(len(cy_biggest_d_last5))] | ||||
|                                     ind_largest = len(cx_bigest_d) -5 + np.argmin(dists_d) | ||||
|                                 else: | ||||
|                                     cx_bigest_d_last5 = cx_bigest_d[-len(cx_bigest_d):] | ||||
|                                     cy_biggest_d_last5 = cy_biggest_d[-len(cx_bigest_d):] | ||||
|                                     dists_d = [math.sqrt((cx_bigest_big[0]-cx_bigest_d_last5[j])**2 + (cy_biggest_big[0]-cy_biggest_d_last5[j])**2) for j in range(len(cy_biggest_d_last5))] | ||||
|                                     ind_largest = len(cx_bigest_d) - len(cx_bigest_d) + np.argmin(dists_d) | ||||
| 
 | ||||
|                                 cx_bigest_d_big[0] = cx_bigest_d[ind_largest] | ||||
|                                 cy_biggest_d_big[0] = cy_biggest_d[ind_largest] | ||||
|                             except Exception as why: | ||||
|                                 self.logger.error(why) | ||||
| 
 | ||||
|                             (h, w) = text_only.shape[:2] | ||||
|                             center = (w // 2.0, h // 2.0) | ||||
|                             M = cv2.getRotationMatrix2D(center, slope_deskew, 1.0) | ||||
|                             M_22 = np.array(M)[:2, :2] | ||||
|                             p_big = np.dot(M_22, [cx_bigest_big, cy_biggest_big]) | ||||
|                             x_diff = p_big[0] - cx_bigest_d_big | ||||
|                             y_diff = p_big[1] - cy_biggest_d_big | ||||
| 
 | ||||
|                             contours_only_text_parent_d_ordered = [] | ||||
|                             for i in range(len(contours_only_text_parent)): | ||||
|                                 p = np.dot(M_22, [cx_bigest[i], cy_biggest[i]]) | ||||
|                                 p[0] = p[0] - x_diff[0] | ||||
|                                 p[1] = p[1] - y_diff[0] | ||||
|                                 dists = [math.sqrt((p[0] - cx_bigest_d[j]) ** 2 + (p[1] - cy_biggest_d[j]) ** 2) for j in range(len(cx_bigest_d))] | ||||
|                                 contours_only_text_parent_d_ordered.append(contours_only_text_parent_d[np.argmin(dists)]) | ||||
|                                 # img2=np.zeros((text_only.shape[0],text_only.shape[1],3)) | ||||
|                                 # img2=cv2.fillPoly(img2,pts=[contours_only_text_parent_d[np.argmin(dists)]] ,color=(1,1,1)) | ||||
|                                 # plt.imshow(img2[:,:,0]) | ||||
|                                 # plt.show() | ||||
|                         else: | ||||
|                             contours_only_text_parent_d_ordered = [] | ||||
|                             contours_only_text_parent_d = [] | ||||
|                             contours_only_text_parent = [] | ||||
| 
 | ||||
|                     else: | ||||
|                         contours_only_text, hir_on_text = return_contours_of_image(text_only) | ||||
|                         contours_only_text_parent = return_parent_contours(contours_only_text, hir_on_text) | ||||
|                          | ||||
|                         if len(contours_only_text_parent) > 0: | ||||
|                             areas_cnt_text = np.array([cv2.contourArea(c) for c in contours_only_text_parent]) | ||||
|                             areas_cnt_text = areas_cnt_text / float(text_only.shape[0] * text_only.shape[1]) | ||||
|                         contours_only_text_parent_d_ordered = [] | ||||
|                         contours_only_text_parent_d = [] | ||||
|                         contours_only_text_parent = [] | ||||
|                 else: | ||||
|                     contours_only_text, hir_on_text = return_contours_of_image(text_only) | ||||
|                     contours_only_text_parent = return_parent_contours(contours_only_text, hir_on_text) | ||||
| 
 | ||||
|                             contours_biggest = contours_only_text_parent[np.argmax(areas_cnt_text)] | ||||
|                             contours_only_text_parent = [c for jz, c in enumerate(contours_only_text_parent) if areas_cnt_text[jz] > MIN_AREA_REGION] | ||||
|                             areas_cnt_text_parent = [area for area in areas_cnt_text if area > MIN_AREA_REGION] | ||||
|                     if len(contours_only_text_parent) > 0: | ||||
|                         areas_cnt_text = np.array([cv2.contourArea(c) for c in contours_only_text_parent]) | ||||
|                         areas_cnt_text = areas_cnt_text / float(text_only.shape[0] * text_only.shape[1]) | ||||
| 
 | ||||
|                             index_con_parents = np.argsort(areas_cnt_text_parent) | ||||
|                              | ||||
|                             contours_only_text_parent = self.return_list_of_contours_with_desired_order(contours_only_text_parent, index_con_parents) | ||||
|                             #try: | ||||
|                                 #contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=object)[index_con_parents]) | ||||
|                             #except: | ||||
|                                 #contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=np.int32)[index_con_parents]) | ||||
|                             #areas_cnt_text_parent = list(np.array(areas_cnt_text_parent)[index_con_parents]) | ||||
|                             areas_cnt_text_parent = self.return_list_of_contours_with_desired_order(areas_cnt_text_parent, index_con_parents) | ||||
|                         contours_biggest = contours_only_text_parent[np.argmax(areas_cnt_text)] | ||||
|                         contours_only_text_parent = [c for jz, c in enumerate(contours_only_text_parent) if areas_cnt_text[jz] > MIN_AREA_REGION] | ||||
|                         areas_cnt_text_parent = [area for area in areas_cnt_text if area > MIN_AREA_REGION] | ||||
| 
 | ||||
|                             cx_bigest_big, cy_biggest_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest]) | ||||
|                             cx_bigest, cy_biggest, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent) | ||||
|                             #self.logger.debug('areas_cnt_text_parent %s', areas_cnt_text_parent) | ||||
|                             # self.logger.debug('areas_cnt_text_parent_d %s', areas_cnt_text_parent_d) | ||||
|                             # self.logger.debug('len(contours_only_text_parent) %s', len(contours_only_text_parent_d)) | ||||
|                         else: | ||||
|                             pass | ||||
|                          | ||||
|                     #print("text region early 3 in %.1fs", time.time() - t0) | ||||
|                         index_con_parents = np.argsort(areas_cnt_text_parent) | ||||
| 
 | ||||
|                         contours_only_text_parent = self.return_list_of_contours_with_desired_order(contours_only_text_parent, index_con_parents) | ||||
|                         #try: | ||||
|                             #contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=object)[index_con_parents]) | ||||
|                         #except: | ||||
|                             #contours_only_text_parent = list(np.array(contours_only_text_parent,dtype=np.int32)[index_con_parents]) | ||||
|                         #areas_cnt_text_parent = list(np.array(areas_cnt_text_parent)[index_con_parents]) | ||||
|                         areas_cnt_text_parent = self.return_list_of_contours_with_desired_order(areas_cnt_text_parent, index_con_parents) | ||||
| 
 | ||||
|                         cx_bigest_big, cy_biggest_big, _, _, _, _, _ = find_new_features_of_contours([contours_biggest]) | ||||
|                         cx_bigest, cy_biggest, _, _, _, _, _ = find_new_features_of_contours(contours_only_text_parent) | ||||
|                         #self.logger.debug('areas_cnt_text_parent %s', areas_cnt_text_parent) | ||||
|                         # self.logger.debug('areas_cnt_text_parent_d %s', areas_cnt_text_parent_d) | ||||
|                         # self.logger.debug('len(contours_only_text_parent) %s', len(contours_only_text_parent_d)) | ||||
|                     else: | ||||
|                         pass | ||||
| 
 | ||||
|                 #print("text region early 3 in %.1fs", time.time() - t0) | ||||
|                 if self.light_version: | ||||
|                     contours_only_text_parent = self.dilate_textregions_contours(contours_only_text_parent) | ||||
|                     contours_only_text_parent = self.filter_contours_inside_a_bigger_one(contours_only_text_parent, text_only, marginal_cnts=polygons_of_marginals) | ||||
|                     #print("text region early 3.5 in %.1fs", time.time() - t0) | ||||
|                     txt_con_org = get_textregion_contours_in_org_image_light(contours_only_text_parent, self.image, slope_first) | ||||
|                     #txt_con_org = self.dilate_textregions_contours(txt_con_org) | ||||
|                     #contours_only_text_parent = self.dilate_textregions_contours(contours_only_text_parent) | ||||
|                 else: | ||||
|                     txt_con_org = get_textregion_contours_in_org_image(contours_only_text_parent, self.image, slope_first) | ||||
|                 #print("text region early 4 in %.1fs", time.time() - t0) | ||||
|                 boxes_text, _ = get_text_region_boxes_by_given_contours(contours_only_text_parent) | ||||
|                 boxes_marginals, _ = get_text_region_boxes_by_given_contours(polygons_of_marginals) | ||||
|                 #print("text region early 5 in %.1fs", time.time() - t0) | ||||
|                 ## birdan sora chock chakir | ||||
|                 if not self.curved_line: | ||||
|                     if self.light_version: | ||||
|                         contours_only_text_parent = self.dilate_textregions_contours(contours_only_text_parent) | ||||
|                         contours_only_text_parent = self.filter_contours_inside_a_bigger_one(contours_only_text_parent, text_only, marginal_cnts=polygons_of_marginals) | ||||
|                         #print("text region early 3.5 in %.1fs", time.time() - t0) | ||||
|                         txt_con_org = get_textregion_contours_in_org_image_light(contours_only_text_parent, self.image, slope_first) | ||||
|                         #txt_con_org = self.dilate_textregions_contours(txt_con_org) | ||||
|                         #contours_only_text_parent = self.dilate_textregions_contours(contours_only_text_parent) | ||||
|                     else: | ||||
|                         txt_con_org = get_textregion_contours_in_org_image(contours_only_text_parent, self.image, slope_first) | ||||
|                     #print("text region early 4 in %.1fs", time.time() - t0) | ||||
|                     boxes_text, _ = get_text_region_boxes_by_given_contours(contours_only_text_parent) | ||||
|                     boxes_marginals, _ = get_text_region_boxes_by_given_contours(polygons_of_marginals) | ||||
|                     #print("text region early 5 in %.1fs", time.time() - t0) | ||||
|                     ## birdan sora chock chakir | ||||
|                     if not self.curved_line: | ||||
|                         if self.light_version: | ||||
|                             if self.textline_light: | ||||
|                                 #slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light(txt_con_org, contours_only_text_parent, textline_mask_tot_ea_org, image_page_rotated, boxes_text, slope_deskew) | ||||
|                                  | ||||
|                                 slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light2(txt_con_org, contours_only_text_parent, textline_mask_tot_ea_org, image_page_rotated, boxes_text, slope_deskew) | ||||
|                                 slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new_light(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea_org, image_page_rotated, boxes_marginals, slope_deskew) | ||||
|                                  | ||||
|                                 #slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, index_by_text_par_con = self.delete_regions_without_textlines(slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, index_by_text_par_con) | ||||
|                                  | ||||
|                                 #slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, polygons_of_marginals, polygons_of_marginals, _ = self.delete_regions_without_textlines(slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, polygons_of_marginals, polygons_of_marginals, np.array(range(len(polygons_of_marginals)))) | ||||
|                                 #all_found_textline_polygons = self.dilate_textlines(all_found_textline_polygons) | ||||
|                                 #####all_found_textline_polygons = self.dilate_textline_contours(all_found_textline_polygons) | ||||
|                                 all_found_textline_polygons = self.dilate_textregions_contours_textline_version(all_found_textline_polygons) | ||||
|                                 all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea_org, type_contour="textline") | ||||
|                                 all_found_textline_polygons_marginals = self.dilate_textregions_contours_textline_version(all_found_textline_polygons_marginals) | ||||
|                                  | ||||
|                                 contours_only_text_parent, txt_con_org, all_found_textline_polygons = self.filter_contours_without_textline_inside(contours_only_text_parent,txt_con_org, all_found_textline_polygons) | ||||
|                                  | ||||
|                             else: | ||||
|                                 textline_mask_tot_ea = cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=1) | ||||
|                                 slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light(txt_con_org, contours_only_text_parent, textline_mask_tot_ea, image_page_rotated, boxes_text, slope_deskew) | ||||
|                                 slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new_light(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea, image_page_rotated, boxes_marginals, slope_deskew) | ||||
|                                  | ||||
|                                 #all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea_org, type_contour="textline") | ||||
|                         if self.textline_light: | ||||
|                             #slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light(txt_con_org, contours_only_text_parent, textline_mask_tot_ea_org, image_page_rotated, boxes_text, slope_deskew) | ||||
| 
 | ||||
|                             slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light2(txt_con_org, contours_only_text_parent, textline_mask_tot_ea_org, image_page_rotated, boxes_text, slope_deskew) | ||||
|                             slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new_light(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea_org, image_page_rotated, boxes_marginals, slope_deskew) | ||||
| 
 | ||||
|                             #slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, index_by_text_par_con = self.delete_regions_without_textlines(slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, index_by_text_par_con) | ||||
| 
 | ||||
|                             #slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, polygons_of_marginals, polygons_of_marginals, _ = self.delete_regions_without_textlines(slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, polygons_of_marginals, polygons_of_marginals, np.array(range(len(polygons_of_marginals)))) | ||||
|                             #all_found_textline_polygons = self.dilate_textlines(all_found_textline_polygons) | ||||
|                             #####all_found_textline_polygons = self.dilate_textline_contours(all_found_textline_polygons) | ||||
|                             all_found_textline_polygons = self.dilate_textregions_contours_textline_version(all_found_textline_polygons) | ||||
|                             all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea_org, type_contour="textline") | ||||
|                             all_found_textline_polygons_marginals = self.dilate_textregions_contours_textline_version(all_found_textline_polygons_marginals) | ||||
| 
 | ||||
|                             contours_only_text_parent, txt_con_org, all_found_textline_polygons = self.filter_contours_without_textline_inside(contours_only_text_parent,txt_con_org, all_found_textline_polygons) | ||||
| 
 | ||||
|                         else: | ||||
|                             textline_mask_tot_ea = cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=1) | ||||
|                             slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new(txt_con_org, contours_only_text_parent, textline_mask_tot_ea, image_page_rotated, boxes_text, slope_deskew) | ||||
|                             slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea, image_page_rotated, boxes_marginals, slope_deskew) | ||||
|                             slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new_light(txt_con_org, contours_only_text_parent, textline_mask_tot_ea, image_page_rotated, boxes_text, slope_deskew) | ||||
|                             slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new_light(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea, image_page_rotated, boxes_marginals, slope_deskew) | ||||
| 
 | ||||
|                             #all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea_org, type_contour="textline") | ||||
|                     else: | ||||
|                          | ||||
|                         scale_param = 1 | ||||
|                         all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con, slopes = self.get_slopes_and_deskew_new_curved(txt_con_org, contours_only_text_parent, cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=2), image_page_rotated, boxes_text, text_only, num_col_classifier, scale_param, slope_deskew) | ||||
|                         all_found_textline_polygons = small_textlines_to_parent_adherence2(all_found_textline_polygons, textline_mask_tot_ea, num_col_classifier) | ||||
|                         all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _, slopes_marginals = self.get_slopes_and_deskew_new_curved(polygons_of_marginals, polygons_of_marginals, cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=2), image_page_rotated, boxes_marginals, text_only, num_col_classifier, scale_param, slope_deskew) | ||||
|                         all_found_textline_polygons_marginals = small_textlines_to_parent_adherence2(all_found_textline_polygons_marginals, textline_mask_tot_ea, num_col_classifier) | ||||
|                     #print("text region early 6 in %.1fs", time.time() - t0) | ||||
|                     if self.full_layout: | ||||
|                         if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                             contours_only_text_parent_d_ordered = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d_ordered, index_by_text_par_con) | ||||
|                             #try: | ||||
|                                 #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=np.int32)[index_by_text_par_con]) | ||||
|                             #except: | ||||
|                                 #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=object)[index_by_text_par_con]) | ||||
|                             if self.light_version: | ||||
|                                 text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header_light(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                             else: | ||||
|                                 text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                         textline_mask_tot_ea = cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=1) | ||||
|                         slopes, all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con = self.get_slopes_and_deskew_new(txt_con_org, contours_only_text_parent, textline_mask_tot_ea, image_page_rotated, boxes_text, slope_deskew) | ||||
|                         slopes_marginals, all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _ = self.get_slopes_and_deskew_new(polygons_of_marginals, polygons_of_marginals, textline_mask_tot_ea, image_page_rotated, boxes_marginals, slope_deskew) | ||||
| 
 | ||||
|                 else: | ||||
| 
 | ||||
|                     scale_param = 1 | ||||
|                     all_found_textline_polygons, boxes_text, txt_con_org, contours_only_text_parent, all_box_coord, index_by_text_par_con, slopes = self.get_slopes_and_deskew_new_curved(txt_con_org, contours_only_text_parent, cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=2), image_page_rotated, boxes_text, text_only, num_col_classifier, scale_param, slope_deskew) | ||||
|                     all_found_textline_polygons = small_textlines_to_parent_adherence2(all_found_textline_polygons, textline_mask_tot_ea, num_col_classifier) | ||||
|                     all_found_textline_polygons_marginals, boxes_marginals, _, polygons_of_marginals, all_box_coord_marginals, _, slopes_marginals = self.get_slopes_and_deskew_new_curved(polygons_of_marginals, polygons_of_marginals, cv2.erode(textline_mask_tot_ea, kernel=KERNEL, iterations=2), image_page_rotated, boxes_marginals, text_only, num_col_classifier, scale_param, slope_deskew) | ||||
|                     all_found_textline_polygons_marginals = small_textlines_to_parent_adherence2(all_found_textline_polygons_marginals, textline_mask_tot_ea, num_col_classifier) | ||||
|                 #print("text region early 6 in %.1fs", time.time() - t0) | ||||
|                 if self.full_layout: | ||||
|                     if np.abs(slope_deskew) >= SLOPE_THRESHOLD: | ||||
|                         contours_only_text_parent_d_ordered = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d_ordered, index_by_text_par_con) | ||||
|                         #try: | ||||
|                             #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=np.int32)[index_by_text_par_con]) | ||||
|                         #except: | ||||
|                             #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=object)[index_by_text_par_con]) | ||||
|                         if self.light_version: | ||||
|                             text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header_light(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                         else: | ||||
|                             #takes long timee | ||||
|                             contours_only_text_parent_d_ordered = None | ||||
|                             if self.light_version: | ||||
|                                 text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header_light(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                             else: | ||||
|                                 text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
| 
 | ||||
|                         if self.plotter: | ||||
|                             self.plotter.save_plot_of_layout(text_regions_p, image_page) | ||||
|                             self.plotter.save_plot_of_layout_all(text_regions_p, image_page) | ||||
|                  | ||||
|                         pixel_img = 4 | ||||
|                         polygons_of_drop_capitals = return_contours_of_interested_region_by_min_size(text_regions_p, pixel_img) | ||||
|                         all_found_textline_polygons = adhere_drop_capital_region_into_corresponding_textline(text_regions_p, polygons_of_drop_capitals, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, kernel=KERNEL, curved_line=self.curved_line, textline_light=self.textline_light) | ||||
|                         pixel_lines = 6 | ||||
|                          | ||||
|                         if not self.reading_order_machine_based: | ||||
|                             if not self.headers_off: | ||||
|                                 if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                     num_col, _, matrix_of_lines_ch, splitter_y_new, _ = find_number_of_columns_in_document(np.repeat(text_regions_p[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables,  pixel_lines, contours_only_text_parent_h) | ||||
|                                 else: | ||||
|                                     _, _, matrix_of_lines_ch_d, splitter_y_new_d, _ = find_number_of_columns_in_document(np.repeat(text_regions_p_1_n[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables, pixel_lines, contours_only_text_parent_h_d_ordered) | ||||
|                             elif self.headers_off: | ||||
|                                 if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                     num_col, _, matrix_of_lines_ch, splitter_y_new, _ = find_number_of_columns_in_document(np.repeat(text_regions_p[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables,  pixel_lines) | ||||
|                                 else: | ||||
|                                     _, _, matrix_of_lines_ch_d, splitter_y_new_d, _ = find_number_of_columns_in_document(np.repeat(text_regions_p_1_n[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables, pixel_lines) | ||||
| 
 | ||||
|                             if num_col_classifier >= 3: | ||||
|                                 if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                     regions_without_separators = regions_without_separators.astype(np.uint8) | ||||
|                                     regions_without_separators = cv2.erode(regions_without_separators[:, :], KERNEL, iterations=6) | ||||
| 
 | ||||
|                                 else: | ||||
|                                     regions_without_separators_d = regions_without_separators_d.astype(np.uint8) | ||||
|                                     regions_without_separators_d = cv2.erode(regions_without_separators_d[:, :], KERNEL, iterations=6) | ||||
|                                  | ||||
|                         if not self.reading_order_machine_based: | ||||
|                             if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                 boxes, peaks_neg_tot_tables = return_boxes_of_images_by_order_of_reading_new(splitter_y_new, regions_without_separators, matrix_of_lines_ch, num_col_classifier, erosion_hurts, self.tables, self.right2left) | ||||
|                             else: | ||||
|                                 boxes_d, peaks_neg_tot_tables_d = return_boxes_of_images_by_order_of_reading_new(splitter_y_new_d, regions_without_separators_d, matrix_of_lines_ch_d, num_col_classifier, erosion_hurts, self.tables, self.right2left)      | ||||
|                             text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                     else: | ||||
|                         #takes long timee | ||||
|                         contours_only_text_parent_d_ordered = None | ||||
|                         if self.light_version: | ||||
|                             text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header_light(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
|                         else: | ||||
|                             text_regions_p, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, slopes, slopes_h, contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered = check_any_text_region_in_model_one_is_main_or_header(text_regions_p, regions_fully, contours_only_text_parent, all_box_coord, all_found_textline_polygons, slopes, contours_only_text_parent_d_ordered) | ||||
| 
 | ||||
|                     if self.plotter: | ||||
|                         self.plotter.write_images_into_directory(polygons_of_images, image_page) | ||||
|                     t_order = time.time() | ||||
|                              | ||||
|                     if self.full_layout: | ||||
|                          | ||||
|                         if self.reading_order_machine_based: | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions_with_model_optimized_algorithm(contours_only_text_parent, contours_only_text_parent_h, text_regions_p) | ||||
|                         else: | ||||
|                         self.plotter.save_plot_of_layout(text_regions_p, image_page) | ||||
|                         self.plotter.save_plot_of_layout_all(text_regions_p, image_page) | ||||
| 
 | ||||
|                     pixel_img = 4 | ||||
|                     polygons_of_drop_capitals = return_contours_of_interested_region_by_min_size(text_regions_p, pixel_img) | ||||
|                     all_found_textline_polygons = adhere_drop_capital_region_into_corresponding_textline(text_regions_p, polygons_of_drop_capitals, contours_only_text_parent, contours_only_text_parent_h, all_box_coord, all_box_coord_h, all_found_textline_polygons, all_found_textline_polygons_h, kernel=KERNEL, curved_line=self.curved_line, textline_light=self.textline_light) | ||||
|                     pixel_lines = 6 | ||||
| 
 | ||||
|                     if not self.reading_order_machine_based: | ||||
|                         if not self.headers_off: | ||||
|                             if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                 order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot) | ||||
|                                 num_col, _, matrix_of_lines_ch, splitter_y_new, _ = find_number_of_columns_in_document(np.repeat(text_regions_p[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables,  pixel_lines, contours_only_text_parent_h) | ||||
|                             else: | ||||
|                                 order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered, boxes_d, textline_mask_tot_d) | ||||
|                         self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||
|                          | ||||
|                         if self.ocr: | ||||
|                             ocr_all_textlines = [] | ||||
|                                 _, _, matrix_of_lines_ch_d, splitter_y_new_d, _ = find_number_of_columns_in_document(np.repeat(text_regions_p_1_n[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables, pixel_lines, contours_only_text_parent_h_d_ordered) | ||||
|                         elif self.headers_off: | ||||
|                             if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                 num_col, _, matrix_of_lines_ch, splitter_y_new, _ = find_number_of_columns_in_document(np.repeat(text_regions_p[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables,  pixel_lines) | ||||
|                             else: | ||||
|                                 _, _, matrix_of_lines_ch_d, splitter_y_new_d, _ = find_number_of_columns_in_document(np.repeat(text_regions_p_1_n[:, :, np.newaxis], 3, axis=2), num_col_classifier, self.tables, pixel_lines) | ||||
| 
 | ||||
|                         if num_col_classifier >= 3: | ||||
|                             if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                 regions_without_separators = regions_without_separators.astype(np.uint8) | ||||
|                                 regions_without_separators = cv2.erode(regions_without_separators[:, :], KERNEL, iterations=6) | ||||
| 
 | ||||
|                             else: | ||||
|                                 regions_without_separators_d = regions_without_separators_d.astype(np.uint8) | ||||
|                                 regions_without_separators_d = cv2.erode(regions_without_separators_d[:, :], KERNEL, iterations=6) | ||||
| 
 | ||||
|                     if not self.reading_order_machine_based: | ||||
|                         if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                             boxes, peaks_neg_tot_tables = return_boxes_of_images_by_order_of_reading_new(splitter_y_new, regions_without_separators, matrix_of_lines_ch, num_col_classifier, erosion_hurts, self.tables, self.right2left) | ||||
|                         else: | ||||
|                             ocr_all_textlines = None | ||||
|                              | ||||
|                         pcgts = self.writer.build_pagexml_full_layout(contours_only_text_parent, contours_only_text_parent_h, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, polygons_of_images, contours_tables, polygons_of_drop_capitals, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_h, slopes_marginals, cont_page, polygons_lines_xml, ocr_all_textlines) | ||||
|                         self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|                         if not self.dir_in: | ||||
|                             return pcgts | ||||
|                          | ||||
|                          | ||||
|                             boxes_d, peaks_neg_tot_tables_d = return_boxes_of_images_by_order_of_reading_new(splitter_y_new_d, regions_without_separators_d, matrix_of_lines_ch_d, num_col_classifier, erosion_hurts, self.tables, self.right2left)      | ||||
| 
 | ||||
|                 if self.plotter: | ||||
|                     self.plotter.write_images_into_directory(polygons_of_images, image_page) | ||||
|                 t_order = time.time() | ||||
| 
 | ||||
|                 if self.full_layout: | ||||
| 
 | ||||
|                     if self.reading_order_machine_based: | ||||
|                         order_text_new, id_of_texts_tot = self.do_order_of_regions_with_model_optimized_algorithm(contours_only_text_parent, contours_only_text_parent_h, text_regions_p) | ||||
|                     else: | ||||
|                         contours_only_text_parent_h = None | ||||
|                         if self.reading_order_machine_based: | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions_with_model_optimized_algorithm(contours_only_text_parent, contours_only_text_parent_h, text_regions_p) | ||||
|                         if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot) | ||||
|                         else: | ||||
|                             if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                                 order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot) | ||||
|                             else: | ||||
|                                 contours_only_text_parent_d_ordered = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d_ordered, index_by_text_par_con) | ||||
|                                 #try: | ||||
|                                     #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=object)[index_by_text_par_con]) | ||||
|                                 #except: | ||||
|                                     #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=np.int32)[index_by_text_par_con]) | ||||
|                                 order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h, boxes_d, textline_mask_tot_d) | ||||
|                              | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered, boxes_d, textline_mask_tot_d) | ||||
|                     self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||
| 
 | ||||
|                         if self.ocr: | ||||
|                     if self.ocr: | ||||
|                         ocr_all_textlines = [] | ||||
|                     else: | ||||
|                         ocr_all_textlines = None | ||||
| 
 | ||||
|                             device = cuda.get_current_device() | ||||
|                             device.reset() | ||||
|                             gc.collect() | ||||
|                             model_ocr = VisionEncoderDecoderModel.from_pretrained(self.model_ocr_dir) | ||||
|                             device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | ||||
|                             processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-printed") | ||||
|                             torch.cuda.empty_cache() | ||||
|                             model_ocr.to(device) | ||||
|                              | ||||
|                             ind_tot = 0 | ||||
|                             #cv2.imwrite('./img_out.png', image_page) | ||||
|                              | ||||
|                             ocr_all_textlines = [] | ||||
|                             for indexing, ind_poly_first in enumerate(all_found_textline_polygons): | ||||
|                                 ocr_textline_in_textregion = [] | ||||
|                                 for indexing2, ind_poly in enumerate(ind_poly_first): | ||||
|                                     if not (self.textline_light or self.curved_line): | ||||
|                                         ind_poly = copy.deepcopy(ind_poly) | ||||
|                                         box_ind = all_box_coord[indexing] | ||||
|                                         #print(ind_poly,np.shape(ind_poly), 'ind_poly') | ||||
|                                         #print(box_ind) | ||||
|                                         ind_poly = self.return_textline_contour_with_added_box_coordinate(ind_poly, box_ind) | ||||
|                                         #print(ind_poly_copy) | ||||
|                                         ind_poly[ind_poly<0] = 0 | ||||
|                                     x, y, w, h = cv2.boundingRect(ind_poly) | ||||
|                                     #print(ind_poly_copy, np.shape(ind_poly_copy)) | ||||
|                                     #print(x, y, w, h, h/float(w),'ratio') | ||||
|                                     h2w_ratio = h/float(w) | ||||
|                                     mask_poly = np.zeros(image_page.shape) | ||||
|                                     if not self.light_version: | ||||
|                                         img_poly_on_img = np.copy(image_page) | ||||
|                                     else: | ||||
|                                         img_poly_on_img = np.copy(img_bin_light) | ||||
| 
 | ||||
|                                     mask_poly = cv2.fillPoly(mask_poly, pts=[ind_poly], color=(1, 1, 1)) | ||||
|                                      | ||||
|                                     if self.textline_light: | ||||
|                                         mask_poly = cv2.dilate(mask_poly, KERNEL, iterations=1) | ||||
|                                     img_poly_on_img[:,:,0][mask_poly[:,:,0] ==0] = 255 | ||||
|                                     img_poly_on_img[:,:,1][mask_poly[:,:,0] ==0] = 255 | ||||
|                                     img_poly_on_img[:,:,2][mask_poly[:,:,0] ==0] = 255 | ||||
|                                      | ||||
|                                     img_croped = img_poly_on_img[y:y+h, x:x+w, :] | ||||
|                                     #cv2.imwrite('./extracted_lines/'+str(ind_tot)+'.jpg', img_croped) | ||||
|                                     text_ocr = self.return_ocr_of_textline_without_common_section(img_croped, model_ocr, processor, device, w, h2w_ratio, ind_tot) | ||||
|                                      | ||||
|                                     ocr_textline_in_textregion.append(text_ocr) | ||||
|                                  | ||||
|                                      | ||||
|                                     ind_tot = ind_tot +1 | ||||
|                                 ocr_all_textlines.append(ocr_textline_in_textregion) | ||||
|                                  | ||||
|                         else: | ||||
|                             ocr_all_textlines = None | ||||
|                         #print(ocr_all_textlines) | ||||
|                         self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||
|                         pcgts = self.writer.build_pagexml_no_full_layout(txt_con_org, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, all_box_coord, polygons_of_images, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines) | ||||
|                         self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|                         if not self.dir_in: | ||||
|                             return pcgts | ||||
|                     #print("text region early 7 in %.1fs", time.time() - t0) | ||||
|                 else: | ||||
|                     _ ,_, _, textline_mask_tot_ea, img_bin_light = self.get_regions_light_v(img_res, is_image_enhanced, num_col_classifier, skip_layout_and_reading_order=self.skip_layout_and_reading_order) | ||||
|                      | ||||
|                     page_coord, image_page, textline_mask_tot_ea, img_bin_light, cont_page = self.run_graphics_and_columns_without_layout(textline_mask_tot_ea, img_bin_light) | ||||
|                      | ||||
|                      | ||||
|                     ##all_found_textline_polygons =self.scale_contours_new(textline_mask_tot_ea) | ||||
|                      | ||||
|                     cnt_clean_rot_raw, hir_on_cnt_clean_rot = return_contours_of_image(textline_mask_tot_ea) | ||||
|                     all_found_textline_polygons = filter_contours_area_of_image(textline_mask_tot_ea, cnt_clean_rot_raw, hir_on_cnt_clean_rot, max_area=1, min_area=0.00001) | ||||
|                      | ||||
|                     all_found_textline_polygons=[ all_found_textline_polygons ] | ||||
|                      | ||||
|                     all_found_textline_polygons = self.dilate_textregions_contours_textline_version(all_found_textline_polygons) | ||||
|                     all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea, type_contour="textline") | ||||
|                      | ||||
|                      | ||||
|                     order_text_new = [0] | ||||
|                     slopes =[0] | ||||
|                     id_of_texts_tot =['region_0001'] | ||||
|                      | ||||
|                     polygons_of_images = [] | ||||
|                     slopes_marginals = [] | ||||
|                     polygons_of_marginals = [] | ||||
|                     all_found_textline_polygons_marginals = [] | ||||
|                     all_box_coord_marginals = [] | ||||
|                     polygons_lines_xml = [] | ||||
|                     contours_tables = [] | ||||
|                     ocr_all_textlines = None | ||||
|                      | ||||
|                     pcgts = self.writer.build_pagexml_no_full_layout(cont_page, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, page_coord, polygons_of_images, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines) | ||||
|                     pcgts = self.writer.build_pagexml_full_layout(contours_only_text_parent, contours_only_text_parent_h, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, polygons_of_images, contours_tables, polygons_of_drop_capitals, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_h, slopes_marginals, cont_page, polygons_lines_xml, ocr_all_textlines) | ||||
|                     self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|                     if not self.dir_in: | ||||
|                         return pcgts | ||||
|                  | ||||
|                 if self.dir_in: | ||||
|                     self.writer.write_pagexml(pcgts) | ||||
|                 #self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|                 print("Job done in %.1fs", time.time() - t0) | ||||
| 
 | ||||
| 
 | ||||
|                 else: | ||||
|                     contours_only_text_parent_h = None | ||||
|                     if self.reading_order_machine_based: | ||||
|                         order_text_new, id_of_texts_tot = self.do_order_of_regions_with_model_optimized_algorithm(contours_only_text_parent, contours_only_text_parent_h, text_regions_p) | ||||
|                     else: | ||||
|                         if np.abs(slope_deskew) < SLOPE_THRESHOLD: | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent, contours_only_text_parent_h, boxes, textline_mask_tot) | ||||
|                         else: | ||||
|                             contours_only_text_parent_d_ordered = self.return_list_of_contours_with_desired_order(contours_only_text_parent_d_ordered, index_by_text_par_con) | ||||
|                             #try: | ||||
|                                 #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=object)[index_by_text_par_con]) | ||||
|                             #except: | ||||
|                                 #contours_only_text_parent_d_ordered = list(np.array(contours_only_text_parent_d_ordered, dtype=np.int32)[index_by_text_par_con]) | ||||
|                             order_text_new, id_of_texts_tot = self.do_order_of_regions(contours_only_text_parent_d_ordered, contours_only_text_parent_h, boxes_d, textline_mask_tot_d) | ||||
| 
 | ||||
| 
 | ||||
|                     if self.ocr: | ||||
| 
 | ||||
|                         device = cuda.get_current_device() | ||||
|                         device.reset() | ||||
|                         gc.collect() | ||||
|                         model_ocr = VisionEncoderDecoderModel.from_pretrained(self.model_ocr_dir) | ||||
|                         device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") | ||||
|                         processor = TrOCRProcessor.from_pretrained("microsoft/trocr-base-printed") | ||||
|                         torch.cuda.empty_cache() | ||||
|                         model_ocr.to(device) | ||||
| 
 | ||||
|                         ind_tot = 0 | ||||
|                         #cv2.imwrite('./img_out.png', image_page) | ||||
| 
 | ||||
|                         ocr_all_textlines = [] | ||||
|                         for indexing, ind_poly_first in enumerate(all_found_textline_polygons): | ||||
|                             ocr_textline_in_textregion = [] | ||||
|                             for indexing2, ind_poly in enumerate(ind_poly_first): | ||||
|                                 if not (self.textline_light or self.curved_line): | ||||
|                                     ind_poly = copy.deepcopy(ind_poly) | ||||
|                                     box_ind = all_box_coord[indexing] | ||||
|                                     #print(ind_poly,np.shape(ind_poly), 'ind_poly') | ||||
|                                     #print(box_ind) | ||||
|                                     ind_poly = self.return_textline_contour_with_added_box_coordinate(ind_poly, box_ind) | ||||
|                                     #print(ind_poly_copy) | ||||
|                                     ind_poly[ind_poly<0] = 0 | ||||
|                                 x, y, w, h = cv2.boundingRect(ind_poly) | ||||
|                                 #print(ind_poly_copy, np.shape(ind_poly_copy)) | ||||
|                                 #print(x, y, w, h, h/float(w),'ratio') | ||||
|                                 h2w_ratio = h/float(w) | ||||
|                                 mask_poly = np.zeros(image_page.shape) | ||||
|                                 if not self.light_version: | ||||
|                                     img_poly_on_img = np.copy(image_page) | ||||
|                                 else: | ||||
|                                     img_poly_on_img = np.copy(img_bin_light) | ||||
| 
 | ||||
|                                 mask_poly = cv2.fillPoly(mask_poly, pts=[ind_poly], color=(1, 1, 1)) | ||||
| 
 | ||||
|                                 if self.textline_light: | ||||
|                                     mask_poly = cv2.dilate(mask_poly, KERNEL, iterations=1) | ||||
|                                 img_poly_on_img[:,:,0][mask_poly[:,:,0] ==0] = 255 | ||||
|                                 img_poly_on_img[:,:,1][mask_poly[:,:,0] ==0] = 255 | ||||
|                                 img_poly_on_img[:,:,2][mask_poly[:,:,0] ==0] = 255 | ||||
| 
 | ||||
|                                 img_croped = img_poly_on_img[y:y+h, x:x+w, :] | ||||
|                                 #cv2.imwrite('./extracted_lines/'+str(ind_tot)+'.jpg', img_croped) | ||||
|                                 text_ocr = self.return_ocr_of_textline_without_common_section(img_croped, model_ocr, processor, device, w, h2w_ratio, ind_tot) | ||||
| 
 | ||||
|                                 ocr_textline_in_textregion.append(text_ocr) | ||||
| 
 | ||||
| 
 | ||||
|                                 ind_tot = ind_tot +1 | ||||
|                             ocr_all_textlines.append(ocr_textline_in_textregion) | ||||
| 
 | ||||
|                     else: | ||||
|                         ocr_all_textlines = None | ||||
|                     #print(ocr_all_textlines) | ||||
|                     self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||
|                     pcgts = self.writer.build_pagexml_no_full_layout(txt_con_org, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, all_box_coord, polygons_of_images, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines) | ||||
|                     self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|                     if not self.dir_in: | ||||
|                         return pcgts | ||||
|                 #print("text region early 7 in %.1fs", time.time() - t0) | ||||
|             else: | ||||
|                 _ ,_, _, textline_mask_tot_ea, img_bin_light = self.get_regions_light_v(img_res, is_image_enhanced, num_col_classifier, skip_layout_and_reading_order=self.skip_layout_and_reading_order) | ||||
| 
 | ||||
|                 page_coord, image_page, textline_mask_tot_ea, img_bin_light, cont_page = self.run_graphics_and_columns_without_layout(textline_mask_tot_ea, img_bin_light) | ||||
| 
 | ||||
| 
 | ||||
|                 ##all_found_textline_polygons =self.scale_contours_new(textline_mask_tot_ea) | ||||
| 
 | ||||
|                 cnt_clean_rot_raw, hir_on_cnt_clean_rot = return_contours_of_image(textline_mask_tot_ea) | ||||
|                 all_found_textline_polygons = filter_contours_area_of_image(textline_mask_tot_ea, cnt_clean_rot_raw, hir_on_cnt_clean_rot, max_area=1, min_area=0.00001) | ||||
| 
 | ||||
|                 all_found_textline_polygons=[ all_found_textline_polygons ] | ||||
| 
 | ||||
|                 all_found_textline_polygons = self.dilate_textregions_contours_textline_version(all_found_textline_polygons) | ||||
|                 all_found_textline_polygons = self.filter_contours_inside_a_bigger_one(all_found_textline_polygons, textline_mask_tot_ea, type_contour="textline") | ||||
| 
 | ||||
| 
 | ||||
|                 order_text_new = [0] | ||||
|                 slopes =[0] | ||||
|                 id_of_texts_tot =['region_0001'] | ||||
| 
 | ||||
|                 polygons_of_images = [] | ||||
|                 slopes_marginals = [] | ||||
|                 polygons_of_marginals = [] | ||||
|                 all_found_textline_polygons_marginals = [] | ||||
|                 all_box_coord_marginals = [] | ||||
|                 polygons_lines_xml = [] | ||||
|                 contours_tables = [] | ||||
|                 ocr_all_textlines = None | ||||
| 
 | ||||
|                 pcgts = self.writer.build_pagexml_no_full_layout(cont_page, page_coord, order_text_new, id_of_texts_tot, all_found_textline_polygons, page_coord, polygons_of_images, polygons_of_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines) | ||||
|                 if not self.dir_in: | ||||
|                     return pcgts | ||||
| 
 | ||||
|             if self.dir_in: | ||||
|                 self.writer.write_pagexml(pcgts) | ||||
|             #self.logger.info("Job done in %.1fs", time.time() - t0) | ||||
|             print("Job done in %.1fs" % time.time() - t0) | ||||
|              | ||||
|         if self.dir_in: | ||||
|             self.logger.info("All jobs done in %.1fs", time.time() - t0_tot) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue