mirror of
				https://github.com/qurator-spk/eynollah.git
				synced 2025-10-27 15:54:13 +01:00 
			
		
		
		
	rnn ocr for all layout textregion types
This commit is contained in:
		
							parent
							
								
									27c4b0d0e0
								
							
						
					
					
						commit
						097520bfd2
					
				
					 2 changed files with 50 additions and 22 deletions
				
			
		|  | @ -4715,11 +4715,10 @@ class Eynollah: | ||||||
|         if self.extract_only_images: |         if self.extract_only_images: | ||||||
|             text_regions_p_1, erosion_hurts, polygons_lines_xml, polygons_of_images, image_page, page_coord, cont_page = \ |             text_regions_p_1, erosion_hurts, polygons_lines_xml, polygons_of_images, image_page, page_coord, cont_page = \ | ||||||
|                 self.get_regions_light_v_extract_only_images(img_res, is_image_enhanced, num_col_classifier) |                 self.get_regions_light_v_extract_only_images(img_res, is_image_enhanced, num_col_classifier) | ||||||
|             ocr_all_textlines = None |  | ||||||
|             pcgts = self.writer.build_pagexml_no_full_layout( |             pcgts = self.writer.build_pagexml_no_full_layout( | ||||||
|                 [], page_coord, [], [], [], [], |                 [], page_coord, [], [], [], [], | ||||||
|                 polygons_of_images, [], [], [], [], [], |                 polygons_of_images, [], [], [], [], [], | ||||||
|                 cont_page, [], [], ocr_all_textlines, []) |                 cont_page, [], []) | ||||||
|             if self.plotter: |             if self.plotter: | ||||||
|                 self.plotter.write_images_into_directory(polygons_of_images, image_page) |                 self.plotter.write_images_into_directory(polygons_of_images, image_page) | ||||||
|             return pcgts |             return pcgts | ||||||
|  | @ -4772,7 +4771,7 @@ class Eynollah: | ||||||
|                 cont_page, page_coord, order_text_new, id_of_texts_tot, |                 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, page_coord, polygons_of_images, polygons_of_marginals, | ||||||
|                 all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, |                 all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, | ||||||
|                 cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines, conf_contours_textregions, self.skip_layout_and_reading_order) |                 cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines=ocr_all_textlines, conf_contours_textregion=conf_contours_textregions, skip_layout_reading_order=self.skip_layout_and_reading_order) | ||||||
|             return pcgts |             return pcgts | ||||||
| 
 | 
 | ||||||
|         #print("text region early -1 in %.1fs", time.time() - t0) |         #print("text region early -1 in %.1fs", time.time() - t0) | ||||||
|  | @ -4822,10 +4821,9 @@ class Eynollah: | ||||||
| 
 | 
 | ||||||
|         if not num_col: |         if not num_col: | ||||||
|             self.logger.info("No columns detected, outputting an empty PAGE-XML") |             self.logger.info("No columns detected, outputting an empty PAGE-XML") | ||||||
|             ocr_all_textlines = None |  | ||||||
|             pcgts = self.writer.build_pagexml_no_full_layout( |             pcgts = self.writer.build_pagexml_no_full_layout( | ||||||
|                 [], page_coord, [], [], [], [], [], [], [], [], [], [], |                 [], page_coord, [], [], [], [], [], [], [], [], [], [], | ||||||
|                 cont_page, [], [], ocr_all_textlines, []) |                 cont_page, [], []) | ||||||
|             return pcgts |             return pcgts | ||||||
| 
 | 
 | ||||||
|         #print("text region early in %.1fs", time.time() - t0) |         #print("text region early in %.1fs", time.time() - t0) | ||||||
|  | @ -5004,13 +5002,13 @@ class Eynollah: | ||||||
|                     [], [], page_coord, [], [], [], [], [], [], |                     [], [], page_coord, [], [], [], [], [], [], | ||||||
|                     polygons_of_images, contours_tables, [], |                     polygons_of_images, contours_tables, [], | ||||||
|                     polygons_of_marginals, empty_marginals, empty_marginals, [], [], [], |                     polygons_of_marginals, empty_marginals, empty_marginals, [], [], [], | ||||||
|                     cont_page, polygons_lines_xml, [], [], []) |                     cont_page, polygons_lines_xml) | ||||||
|             else: |             else: | ||||||
|                 pcgts = self.writer.build_pagexml_no_full_layout( |                 pcgts = self.writer.build_pagexml_no_full_layout( | ||||||
|                     [], page_coord, [], [], [], [], |                     [], page_coord, [], [], [], [], | ||||||
|                     polygons_of_images, |                     polygons_of_images, | ||||||
|                     polygons_of_marginals, empty_marginals, empty_marginals, [], [], |                     polygons_of_marginals, empty_marginals, empty_marginals, [], [], | ||||||
|                     cont_page, polygons_lines_xml, contours_tables, [], []) |                     cont_page, polygons_lines_xml, contours_tables) | ||||||
|             return pcgts |             return pcgts | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -5196,16 +5194,28 @@ class Eynollah: | ||||||
|                         contours_only_text_parent_d_ordered, contours_only_text_parent_h_d_ordered, boxes_d, textline_mask_tot_d) |                         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) |             self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||||
| 
 | 
 | ||||||
|             if self.ocr: |             if self.ocr and not self.tr: | ||||||
|                 ocr_all_textlines = [] |                 gc.collect() | ||||||
|  |                 if len(all_found_textline_polygons)>0: | ||||||
|  |                     ocr_all_textlines = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
|  |                 if all_found_textline_polygons_marginals and len(all_found_textline_polygons_marginals)>0: | ||||||
|  |                     ocr_all_textlines_marginals = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons_marginals, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
|  |                  | ||||||
|  |                 if all_found_textline_polygons_h and len(all_found_textline_polygons)>0: | ||||||
|  |                     ocr_all_textlines_h = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons_h, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
|  |                 if polygons_of_drop_capitals and len(polygons_of_drop_capitals)>0: | ||||||
|  |                     ocr_all_textlines_drop = return_rnn_cnn_ocr_of_given_textlines(image_page, polygons_of_drop_capitals, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
|             else: |             else: | ||||||
|                 ocr_all_textlines = None |                 ocr_all_textlines = None | ||||||
|  |                 ocr_all_textlines_marginals = None | ||||||
|  |                 ocr_all_textlines_h = None | ||||||
|  |                 ocr_all_textlines_drop = None | ||||||
|             pcgts = self.writer.build_pagexml_full_layout( |             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, |                 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, |                 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, |                 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, |                 all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_h, slopes_marginals, | ||||||
|                 cont_page, polygons_lines_xml, ocr_all_textlines, conf_contours_textregions, conf_contours_textregions_h) |                 cont_page, polygons_lines_xml, ocr_all_textlines, ocr_all_textlines_h, ocr_all_textlines_marginals, ocr_all_textlines_drop,  conf_contours_textregions, conf_contours_textregions_h) | ||||||
|             return pcgts |             return pcgts | ||||||
| 
 | 
 | ||||||
|         contours_only_text_parent_h = None |         contours_only_text_parent_h = None | ||||||
|  | @ -5278,18 +5288,21 @@ class Eynollah: | ||||||
|                  |                  | ||||||
|         elif self.ocr and not self.tr: |         elif self.ocr and not self.tr: | ||||||
|             gc.collect() |             gc.collect() | ||||||
|             ocr_all_textlines = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) |             if len(all_found_textline_polygons)>0: | ||||||
| 
 |                 ocr_all_textlines = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
|  |             if all_found_textline_polygons_marginals and len(all_found_textline_polygons_marginals)>0: | ||||||
|  |                 ocr_all_textlines_marginals = return_rnn_cnn_ocr_of_given_textlines(image_page, all_found_textline_polygons_marginals, self.prediction_model, self.b_s_ocr, self.num_to_char, self.textline_light, self.curved_line) | ||||||
| 
 | 
 | ||||||
|         else: |         else: | ||||||
|             ocr_all_textlines = None |             ocr_all_textlines = None | ||||||
|             #print(ocr_all_textlines) |             ocr_all_textlines_marginals = None | ||||||
|         self.logger.info("detection of reading order took %.1fs", time.time() - t_order) |         self.logger.info("detection of reading order took %.1fs", time.time() - t_order) | ||||||
|  | 
 | ||||||
|         pcgts = self.writer.build_pagexml_no_full_layout( |         pcgts = self.writer.build_pagexml_no_full_layout( | ||||||
|             txt_con_org, page_coord, order_text_new, id_of_texts_tot, |             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, all_box_coord, polygons_of_images, polygons_of_marginals, | ||||||
|             all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, |             all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, | ||||||
|             cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines, conf_contours_textregions) |             cont_page, polygons_lines_xml, contours_tables, ocr_all_textlines, ocr_all_textlines_marginals, conf_contours_textregions) | ||||||
|         return pcgts |         return pcgts | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -56,10 +56,12 @@ class EynollahXmlWriter(): | ||||||
|             points_page_print = points_page_print + ' ' |             points_page_print = points_page_print + ' ' | ||||||
|         return points_page_print[:-1] |         return points_page_print[:-1] | ||||||
| 
 | 
 | ||||||
|     def serialize_lines_in_marginal(self, marginal_region, all_found_textline_polygons_marginals, marginal_idx, page_coord, all_box_coord_marginals, slopes_marginals, counter): |     def serialize_lines_in_marginal(self, marginal_region, all_found_textline_polygons_marginals, marginal_idx, page_coord, all_box_coord_marginals, slopes_marginals, counter, ocr_all_textlines_textregion): | ||||||
|         for j in range(len(all_found_textline_polygons_marginals[marginal_idx])): |         for j in range(len(all_found_textline_polygons_marginals[marginal_idx])): | ||||||
|             coords = CoordsType() |             coords = CoordsType() | ||||||
|             textline = TextLineType(id=counter.next_line_id, Coords=coords) |             textline = TextLineType(id=counter.next_line_id, Coords=coords) | ||||||
|  |             if ocr_all_textlines_textregion: | ||||||
|  |                 textline.set_TextEquiv( [ TextEquivType(Unicode=ocr_all_textlines_textregion[j]) ] ) | ||||||
|             marginal_region.add_TextLine(textline) |             marginal_region.add_TextLine(textline) | ||||||
|             marginal_region.set_orientation(-slopes_marginals[marginal_idx]) |             marginal_region.set_orientation(-slopes_marginals[marginal_idx]) | ||||||
|             points_co = '' |             points_co = '' | ||||||
|  | @ -168,7 +170,7 @@ class EynollahXmlWriter(): | ||||||
|         with open(self.output_filename, 'w') as f: |         with open(self.output_filename, 'w') as f: | ||||||
|             f.write(to_xml(pcgts)) |             f.write(to_xml(pcgts)) | ||||||
| 
 | 
 | ||||||
|     def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml, found_polygons_tables, ocr_all_textlines, conf_contours_textregion, skip_layout_reading_order=False): |     def build_pagexml_no_full_layout(self, found_polygons_text_region, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_box_coord, found_polygons_text_region_img, found_polygons_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml, found_polygons_tables, ocr_all_textlines=None, ocr_all_textlines_marginals=None, conf_contours_textregion=None, skip_layout_reading_order=False): | ||||||
|         self.logger.debug('enter build_pagexml_no_full_layout') |         self.logger.debug('enter build_pagexml_no_full_layout') | ||||||
| 
 | 
 | ||||||
|         # create the file structure |         # create the file structure | ||||||
|  | @ -198,7 +200,12 @@ class EynollahXmlWriter(): | ||||||
|             marginal = TextRegionType(id=counter.next_region_id, type_='marginalia', |             marginal = TextRegionType(id=counter.next_region_id, type_='marginalia', | ||||||
|                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals[mm], page_coord))) |                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals[mm], page_coord))) | ||||||
|             page.add_TextRegion(marginal) |             page.add_TextRegion(marginal) | ||||||
|             self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals, mm, page_coord, all_box_coord_marginals, slopes_marginals, counter) |             if ocr_all_textlines_marginals: | ||||||
|  |                 ocr_textlines = ocr_all_textlines_marginals[mm] | ||||||
|  |             else: | ||||||
|  |                 ocr_textlines = None | ||||||
|  |                  | ||||||
|  |             self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals, mm, page_coord, all_box_coord_marginals, slopes_marginals, counter, ocr_textlines) | ||||||
| 
 | 
 | ||||||
|         for mm in range(len(found_polygons_text_region_img)): |         for mm in range(len(found_polygons_text_region_img)): | ||||||
|             img_region = ImageRegionType(id=counter.next_region_id, Coords=CoordsType()) |             img_region = ImageRegionType(id=counter.next_region_id, Coords=CoordsType()) | ||||||
|  | @ -242,7 +249,7 @@ class EynollahXmlWriter(): | ||||||
| 
 | 
 | ||||||
|         return pcgts |         return pcgts | ||||||
| 
 | 
 | ||||||
|     def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_h, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml, ocr_all_textlines, conf_contours_textregion, conf_contours_textregion_h): |     def build_pagexml_full_layout(self, found_polygons_text_region, found_polygons_text_region_h, page_coord, order_of_texts, id_of_texts, all_found_textline_polygons, all_found_textline_polygons_h, all_box_coord, all_box_coord_h, found_polygons_text_region_img, found_polygons_tables, found_polygons_drop_capitals, found_polygons_marginals, all_found_textline_polygons_marginals, all_box_coord_marginals, slopes, slopes_h, slopes_marginals, cont_page, polygons_lines_to_be_written_in_xml, ocr_all_textlines=None, ocr_all_textlines_h=None, ocr_all_textlines_marginals=None, ocr_all_textlines_drop=None, conf_contours_textregion=None, conf_contours_textregion_h=None): | ||||||
|         self.logger.debug('enter build_pagexml_full_layout') |         self.logger.debug('enter build_pagexml_full_layout') | ||||||
| 
 | 
 | ||||||
|         # create the file structure |         # create the file structure | ||||||
|  | @ -272,8 +279,8 @@ class EynollahXmlWriter(): | ||||||
|                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_h[mm], page_coord))) |                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_h[mm], page_coord))) | ||||||
|             page.add_TextRegion(textregion) |             page.add_TextRegion(textregion) | ||||||
| 
 | 
 | ||||||
|             if ocr_all_textlines: |             if ocr_all_textlines_h: | ||||||
|                 ocr_textlines = ocr_all_textlines[mm] |                 ocr_textlines = ocr_all_textlines_h[mm] | ||||||
|             else: |             else: | ||||||
|                 ocr_textlines = None |                 ocr_textlines = None | ||||||
|             self.serialize_lines_in_region(textregion, all_found_textline_polygons_h, mm, page_coord, all_box_coord_h, slopes_h, counter, ocr_textlines) |             self.serialize_lines_in_region(textregion, all_found_textline_polygons_h, mm, page_coord, all_box_coord_h, slopes_h, counter, ocr_textlines) | ||||||
|  | @ -282,7 +289,11 @@ class EynollahXmlWriter(): | ||||||
|             marginal = TextRegionType(id=counter.next_region_id, type_='marginalia', |             marginal = TextRegionType(id=counter.next_region_id, type_='marginalia', | ||||||
|                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals[mm], page_coord))) |                     Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_marginals[mm], page_coord))) | ||||||
|             page.add_TextRegion(marginal) |             page.add_TextRegion(marginal) | ||||||
|             self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals, mm, page_coord, all_box_coord_marginals, slopes_marginals, counter) |             if ocr_all_textlines_marginals: | ||||||
|  |                 ocr_textlines = ocr_all_textlines_marginals[mm] | ||||||
|  |             else: | ||||||
|  |                 ocr_textlines = None | ||||||
|  |             self.serialize_lines_in_marginal(marginal, all_found_textline_polygons_marginals, mm, page_coord, all_box_coord_marginals, slopes_marginals, counter, ocr_textlines) | ||||||
|          |          | ||||||
|         for mm in range(len(found_polygons_drop_capitals)): |         for mm in range(len(found_polygons_drop_capitals)): | ||||||
|             dropcapital = TextRegionType(id=counter.next_region_id, type_='drop-capital', |             dropcapital = TextRegionType(id=counter.next_region_id, type_='drop-capital', | ||||||
|  | @ -290,7 +301,11 @@ class EynollahXmlWriter(): | ||||||
|             page.add_TextRegion(dropcapital) |             page.add_TextRegion(dropcapital) | ||||||
|             all_box_coord_drop = None |             all_box_coord_drop = None | ||||||
|             slopes_drop = None |             slopes_drop = None | ||||||
|             self.serialize_lines_in_dropcapital(dropcapital, [found_polygons_drop_capitals[mm]], mm, page_coord, all_box_coord_drop, slopes_drop, counter, ocr_all_textlines_textregion=None) |             if ocr_all_textlines_drop: | ||||||
|  |                 ocr_textlines = ocr_all_textlines_drop[mm] | ||||||
|  |             else: | ||||||
|  |                 ocr_textlines = None | ||||||
|  |             self.serialize_lines_in_dropcapital(dropcapital, [found_polygons_drop_capitals[mm]], mm, page_coord, all_box_coord_drop, slopes_drop, counter, ocr_all_textlines_textregion=ocr_textlines) | ||||||
| 
 | 
 | ||||||
|         for mm in range(len(found_polygons_text_region_img)): |         for mm in range(len(found_polygons_text_region_img)): | ||||||
|             page.add_ImageRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_img[mm], page_coord)))) |             page.add_ImageRegion(ImageRegionType(id=counter.next_region_id, Coords=CoordsType(points=self.calculate_polygon_coords(found_polygons_text_region_img[mm], page_coord)))) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue