瀏覽代碼

download font only needed (#4279)

Tingquan Gao 4 月之前
父節點
當前提交
7c3b7cd3a1
共有 31 個文件被更改,包括 100 次插入96 次删除
  1. 2 2
      paddlex/inference/models/formula_recognition/result.py
  2. 3 5
      paddlex/inference/models/image_classification/result.py
  3. 2 2
      paddlex/inference/models/image_multilabel_classification/result.py
  4. 2 2
      paddlex/inference/models/object_detection/result.py
  5. 2 2
      paddlex/inference/models/text_recognition/result.py
  6. 3 3
      paddlex/inference/models/video_classification/result.py
  7. 2 4
      paddlex/inference/models/video_detection/result.py
  8. 2 2
      paddlex/inference/pipelines/attribute_recognition/result.py
  9. 2 2
      paddlex/inference/pipelines/doc_preprocessor/result.py
  10. 2 2
      paddlex/inference/pipelines/formula_recognition/result.py
  11. 2 2
      paddlex/inference/pipelines/layout_parsing/result_v2.py
  12. 2 4
      paddlex/inference/pipelines/ocr/result.py
  13. 2 2
      paddlex/inference/pipelines/pp_shitu_v2/result.py
  14. 3 3
      paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/visualizer.py
  15. 2 2
      paddlex/modules/formula_recognition/dataset_checker/dataset_src/analyse_dataset.py
  16. 2 2
      paddlex/modules/general_recognition/dataset_checker/dataset_src/analyse_dataset.py
  17. 3 3
      paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/visualizer.py
  18. 2 2
      paddlex/modules/image_classification/dataset_checker/dataset_src/analyse_dataset.py
  19. 3 3
      paddlex/modules/image_classification/dataset_checker/dataset_src/utils/visualizer.py
  20. 2 2
      paddlex/modules/instance_segmentation/dataset_checker/dataset_src/analyse_dataset.py
  21. 2 2
      paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/visualizer.py
  22. 2 2
      paddlex/modules/m_3d_bev_detection/dataset_checker/dataset_src/analyse_dataset.py
  23. 2 2
      paddlex/modules/multilabel_classification/dataset_checker/dataset_src/analyse_dataset.py
  24. 2 2
      paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/visualizer.py
  25. 2 2
      paddlex/modules/object_detection/dataset_checker/dataset_src/analyse_dataset.py
  26. 2 2
      paddlex/modules/object_detection/dataset_checker/dataset_src/utils/visualizer.py
  27. 2 2
      paddlex/modules/text_recognition/dataset_checker/dataset_src/analyse_dataset.py
  28. 2 2
      paddlex/modules/ts_classification/dataset_checker/dataset_src/analyse_dataset.py
  29. 2 2
      paddlex/modules/video_classification/dataset_checker/dataset_src/analyse_dataset.py
  30. 2 2
      paddlex/modules/video_detection/dataset_checker/dataset_src/analyse_dataset.py
  31. 35 25
      paddlex/utils/fonts.py

+ 2 - 2
paddlex/inference/models/formula_recognition/result.py

@@ -27,7 +27,7 @@ from PIL import Image, ImageDraw, ImageFont
 from ....utils import logging
 from ....utils.deps import function_requires_deps, is_dep_available
 from ....utils.file_interface import custom_open
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 
 if is_dep_available("opencv-contrib-python"):
@@ -308,7 +308,7 @@ def draw_formula_module(
             return formula_img
         else:
             img_right_text = draw_box_txt_fine(
-                img_size, box, "Rendering Failed", PINGFANG_FONT_FILE_PATH
+                img_size, box, "Rendering Failed", PINGFANG_FONT.path
             )
         return img_right_text
 

+ 3 - 5
paddlex/inference/models/image_classification/result.py

@@ -19,7 +19,7 @@ import numpy as np
 import PIL
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...utils.color_map import get_colormap
 
@@ -47,9 +47,7 @@ class TopkResult(BaseCVResult):
         min_font_size = int(image_size[0] * 0.02)
         max_font_size = int(image_size[0] * 0.05)
         for font_size in range(max_font_size, min_font_size - 1, -1):
-            font = ImageFont.truetype(
-                PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8"
-            )
+            font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
             if tuple(map(int, PIL.__version__.split("."))) <= (10, 0, 0):
                 text_width_tmp, text_height_tmp = draw.textsize(label_str, font)
             else:
@@ -58,7 +56,7 @@ class TopkResult(BaseCVResult):
             if text_width_tmp <= image_size[0]:
                 break
             else:
-                font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, min_font_size)
+                font = ImageFont.truetype(PINGFANG_FONT.path, min_font_size)
         color_list = get_colormap(rgb=True)
         color = tuple(color_list[0])
         font_color = tuple(self._get_font_colormap(3))

+ 2 - 2
paddlex/inference/models/image_multilabel_classification/result.py

@@ -18,7 +18,7 @@ import numpy as np
 import PIL
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...utils.color_map import get_colormap
 
@@ -43,7 +43,7 @@ class MLClassResult(BaseCVResult):
         image_width, image_height = image.size
         font_size = int(image_width * 0.06)
 
-        font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size)
+        font = ImageFont.truetype(PINGFANG_FONT.path, font_size)
         text_lines = []
         row_width = 0
         row_height = 0

+ 2 - 2
paddlex/inference/models/object_detection/result.py

@@ -18,7 +18,7 @@ from typing import List
 import PIL
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...utils.color_map import font_colormap, get_colormap
 
@@ -32,7 +32,7 @@ def draw_box(img: Image.Image, boxes: List[dict]) -> Image.Image:
         img (PIL.Image.Image): visualized image
     """
     font_size = int(0.018 * int(img.width)) + 2
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
 
     draw_thickness = int(max(img.size) * 0.002)
     draw = ImageDraw.Draw(img)

+ 2 - 2
paddlex/inference/models/text_recognition/result.py

@@ -17,7 +17,7 @@ import copy
 import PIL
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 
 
@@ -41,7 +41,7 @@ class TextRecResult(BaseCVResult):
         image = image.convert("RGB")
         image_width, image_height = image.size
         text = f"{rec_text} ({rec_score})"
-        font = self.adjust_font_size(image_width, text, PINGFANG_FONT_FILE_PATH)
+        font = self.adjust_font_size(image_width, text, PINGFANG_FONT.path)
         row_height = font.getbbox(text)[3]
         new_image_height = image_height + int(row_height * 1.2)
         new_image = Image.new("RGB", (image_width, new_image_height), (255, 255, 255))

+ 3 - 3
paddlex/inference/models/video_classification/result.py

@@ -17,7 +17,7 @@ import PIL
 from PIL import Image, ImageDraw, ImageFont
 
 from ....utils.deps import class_requires_deps, is_dep_available
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseVideoResult
 from ...utils.color_map import get_colormap
 from ...utils.io import VideoReader
@@ -47,7 +47,7 @@ class TopkVideoResult(BaseVideoResult):
             max_font_size = int(image_size[0] * 0.05)
             for font_size in range(max_font_size, min_font_size - 1, -1):
                 font = ImageFont.truetype(
-                    PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8"
+                    PINGFANG_FONT.path, font_size, encoding="utf-8"
                 )
                 if tuple(map(int, PIL.__version__.split("."))) <= (10, 0, 0):
                     text_width_tmp, text_height_tmp = draw.textsize(label_str, font)
@@ -57,7 +57,7 @@ class TopkVideoResult(BaseVideoResult):
                 if text_width_tmp <= image_size[0]:
                     break
                 else:
-                    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, min_font_size)
+                    font = ImageFont.truetype(PINGFANG_FONT.path, min_font_size)
             color_list = get_colormap(rgb=True)
             color = tuple(color_list[0])
             font_color = tuple(self._get_font_colormap(3))

+ 2 - 4
paddlex/inference/models/video_detection/result.py

@@ -19,7 +19,7 @@ import PIL
 from PIL import Image, ImageDraw, ImageFont
 
 from ....utils.deps import class_requires_deps, is_dep_available
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseVideoResult
 from ...utils.color_map import get_colormap
 from ...utils.io import VideoReader
@@ -46,9 +46,7 @@ class DetVideoResult(BaseVideoResult):
             image = Image.fromarray(video[i].asnumpy())
             image.size
             font_size = int(0.018 * int(image.width)) + 2
-            font = ImageFont.truetype(
-                PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8"
-            )
+            font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
             draw_thickness = int(max(image.size) * 0.002)
             draw = ImageDraw.Draw(image)
             results = self["result"][i]

+ 2 - 2
paddlex/inference/pipelines/attribute_recognition/result.py

@@ -18,7 +18,7 @@ import PIL
 from PIL import Image, ImageDraw, ImageFont
 
 from ....utils.deps import class_requires_deps, is_dep_available
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...utils.color_map import font_colormap, get_colormap
 
@@ -35,7 +35,7 @@ def draw_attribute_result(img, boxes):
         img (PIL.Image.Image): visualized image
     """
     font_size = int((0.024 * int(img.width) + 2) * 0.7)
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
 
     draw_thickness = int(max(img.size) * 0.005)
     draw = ImageDraw.Draw(img)

+ 2 - 2
paddlex/inference/pipelines/doc_preprocessor/result.py

@@ -16,7 +16,7 @@ from typing import Dict
 
 from PIL import Image, ImageDraw
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH, create_font
+from ....utils.fonts import PINGFANG_FONT, create_font
 from ...common.result import BaseCVResult, JsonMixin
 
 
@@ -55,7 +55,7 @@ class DocPreprocessorResult(BaseCVResult):
         beg_w_list = [0, w1, w1 + w2]
         for tno in range(len(txt_list)):
             txt = txt_list[tno]
-            font = create_font(txt, (region_w_list[tno], 20), PINGFANG_FONT_FILE_PATH)
+            font = create_font(txt, (region_w_list[tno], 20), PINGFANG_FONT.path)
             draw_text.text(
                 [10 + beg_w_list[tno], h + 2], txt, fill=(0, 0, 0), font=font
             )

+ 2 - 2
paddlex/inference/pipelines/formula_recognition/result.py

@@ -24,7 +24,7 @@ from PIL import Image, ImageDraw
 
 from ....utils import logging
 from ....utils.deps import class_requires_deps, function_requires_deps, is_dep_available
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...models.formula_recognition.result import (
     crop_white_area,
@@ -277,6 +277,6 @@ def draw_box_formula_fine(
             )
         else:
             img_right_text = draw_box_txt_fine(
-                img_size, box, "Rendering Failed", PINGFANG_FONT_FILE_PATH
+                img_size, box, "Rendering Failed", PINGFANG_FONT.path
             )
         return img_right_text

+ 2 - 2
paddlex/inference/pipelines/layout_parsing/result_v2.py

@@ -21,7 +21,7 @@ from typing import List
 import numpy as np
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import (
     BaseCVResult,
     HtmlMixin,
@@ -194,7 +194,7 @@ class LayoutParsingResultV2(BaseCVResult, HtmlMixin, XlsxMixin, MarkdownMixin):
         image = Image.fromarray(self["doc_preprocessor_res"]["output_img"][:, :, ::-1])
         draw = ImageDraw.Draw(image, "RGBA")
         font_size = int(0.018 * int(image.width)) + 2
-        font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+        font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
         parsing_result: List[LayoutBlock] = self["parsing_res_list"]
         for block in parsing_result:
             bbox = block.bbox

+ 2 - 4
paddlex/inference/pipelines/ocr/result.py

@@ -20,7 +20,7 @@ import numpy as np
 from PIL import Image, ImageDraw
 
 from ....utils.deps import class_requires_deps, function_requires_deps, is_dep_available
-from ....utils.fonts import SIMFANG_FONT_FILE_PATH, create_font, create_font_vertical
+from ....utils.fonts import SIMFANG_FONT, create_font, create_font_vertical
 from ...common.result import BaseCVResult, JsonMixin
 
 if is_dep_available("opencv-contrib-python"):
@@ -100,9 +100,7 @@ class OCRResult(BaseCVResult):
                     box_pts = [(int(x), int(y)) for x, y in box.tolist()]
                     draw_left.polygon(box_pts, fill=color)
 
-                img_right_text = draw_box_txt_fine(
-                    (w, h), box, txt, SIMFANG_FONT_FILE_PATH
-                )
+                img_right_text = draw_box_txt_fine((w, h), box, txt, SIMFANG_FONT.path)
                 pts = np.array(box, np.int32).reshape((-1, 1, 2))
                 cv2.polylines(img_right_text, [pts], True, color, 1)
                 img_right = cv2.bitwise_and(img_right, img_right_text)

+ 2 - 2
paddlex/inference/pipelines/pp_shitu_v2/result.py

@@ -17,7 +17,7 @@ import copy
 import PIL
 from PIL import Image, ImageDraw, ImageFont
 
-from ....utils.fonts import PINGFANG_FONT_FILE_PATH
+from ....utils.fonts import PINGFANG_FONT
 from ...common.result import BaseCVResult, JsonMixin
 from ...utils.color_map import font_colormap, get_colormap
 
@@ -32,7 +32,7 @@ def draw_box(img, boxes):
     """
     img = Image.fromarray(img)
     font_size = int(0.018 * int(img.width)) + 2
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
 
     draw_thickness = int(max(img.size) * 0.002)
     draw = ImageDraw.Draw(img)

+ 3 - 3
paddlex/modules/face_recognition/dataset_checker/dataset_src/utils/visualizer.py

@@ -16,7 +16,7 @@ import numpy as np
 import PIL
 from PIL import ImageDraw, ImageFont
 
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 
 def colormap(rgb=False):
@@ -114,7 +114,7 @@ def draw_label(image, label, label_map_dict):
     min_font_size = int(image_size[0] * 0.02)
     max_font_size = int(image_size[0] * 0.05)
     for font_size in range(max_font_size, min_font_size - 1, -1):
-        font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+        font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
         if tuple(map(int, PIL.__version__.split("."))) <= (10, 0, 0):
             text_width_tmp, text_height_tmp = draw.textsize(
                 label_map_dict[int(label)], font
@@ -127,7 +127,7 @@ def draw_label(image, label, label_map_dict):
         if text_width_tmp <= image_size[0]:
             break
         else:
-            font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, min_font_size)
+            font = ImageFont.truetype(PINGFANG_FONT.path, min_font_size)
     color_list = colormap(rgb=True)
     color = tuple(color_list[0])
     font_color = tuple(font_colormap(3))

+ 2 - 2
paddlex/modules/formula_recognition/dataset_checker/dataset_src/analyse_dataset.py

@@ -22,7 +22,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 from .....utils.logging import warning
 
 if is_dep_available("opencv-contrib-python"):
@@ -128,7 +128,7 @@ def deep_analyse(dataset_path, output, datatype="FormulaRecDataset"):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=15)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=15)
 
     fig, ax = plt.subplots(figsize=(15, 9), dpi=120)
     xlabel_name = "公式长度区间"

+ 2 - 2
paddlex/modules/general_recognition/dataset_checker/dataset_src/analyse_dataset.py

@@ -19,7 +19,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -52,7 +52,7 @@ def deep_analyse(dataset_path, output, dataset_type="ShiTuRec"):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=10)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=10)
 
     x = np.arange(len(categories))  # 标签位置
     width = 0.35  # 每个条形的宽度

+ 3 - 3
paddlex/modules/general_recognition/dataset_checker/dataset_src/utils/visualizer.py

@@ -16,7 +16,7 @@ import numpy as np
 import PIL
 from PIL import ImageDraw, ImageFont
 
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 
 def colormap(rgb=False):
@@ -114,7 +114,7 @@ def draw_label(image, label):
     min_font_size = int(image_size[0] * 0.02)
     max_font_size = int(image_size[0] * 0.05)
     for font_size in range(max_font_size, min_font_size - 1, -1):
-        font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+        font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
         if tuple(map(int, PIL.__version__.split("."))) <= (10, 0, 0):
             text_width_tmp, text_height_tmp = draw.textsize(label, font)
         else:
@@ -123,7 +123,7 @@ def draw_label(image, label):
         if text_width_tmp <= image_size[0]:
             break
         else:
-            font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, min_font_size)
+            font = ImageFont.truetype(PINGFANG_FONT.path, min_font_size)
     color_list = colormap(rgb=True)
     color = tuple(color_list[0])
     font_color = tuple(font_colormap(3))

+ 2 - 2
paddlex/modules/image_classification/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -68,7 +68,7 @@ def deep_analyse(dataset_path, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=10)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=10)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=300)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 3 - 3
paddlex/modules/image_classification/dataset_checker/dataset_src/utils/visualizer.py

@@ -16,7 +16,7 @@ import numpy as np
 import PIL
 from PIL import ImageDraw, ImageFont
 
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 
 def colormap(rgb=False):
@@ -114,7 +114,7 @@ def draw_label(image, label, label_map_dict):
     min_font_size = int(image_size[0] * 0.02)
     max_font_size = int(image_size[0] * 0.05)
     for font_size in range(max_font_size, min_font_size - 1, -1):
-        font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+        font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
         if tuple(map(int, PIL.__version__.split("."))) <= (10, 0, 0):
             text_width_tmp, text_height_tmp = draw.textsize(
                 label_map_dict[int(label)], font
@@ -127,7 +127,7 @@ def draw_label(image, label, label_map_dict):
         if text_width_tmp <= image_size[0]:
             break
         else:
-            font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, min_font_size)
+            font = ImageFont.truetype(PINGFANG_FONT.path, min_font_size)
     color_list = colormap(rgb=True)
     color = tuple(color_list[0])
     font_color = tuple(font_colormap(3))

+ 2 - 2
paddlex/modules/instance_segmentation/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ from collections import defaultdict
 import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -64,7 +64,7 @@ def deep_analyse(dataset_dir, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=120)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/instance_segmentation/dataset_checker/dataset_src/utils/visualizer.py

@@ -18,7 +18,7 @@ from PIL import Image, ImageDraw, ImageFont
 
 from ......utils import logging
 from ......utils.deps import function_requires_deps, is_dep_available
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 if is_dep_available("pycocotools"):
     from pycocotools.coco import COCO
@@ -124,7 +124,7 @@ def draw_bbox(image, coco_info: "COCO", img_id):
         font_size = int(0.024 * int(image_info["width"])) + 2
     except:
         font_size = 12
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
 
     image = image.convert("RGB")
     draw = ImageDraw.Draw(image)

+ 2 - 2
paddlex/modules/m_3d_bev_detection/dataset_checker/dataset_src/analyse_dataset.py

@@ -21,7 +21,7 @@ from collections import defaultdict
 import numpy as np
 
 from paddlex.utils.deps import function_requires_deps, is_dep_available
-from paddlex.utils.fonts import PINGFANG_FONT_FILE_PATH
+from paddlex.utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -88,7 +88,7 @@ def deep_analyse(dataset_dir, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=120)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/multilabel_classification/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -70,7 +70,7 @@ def deep_analyse(dataset_path, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=10)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=10)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=300)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/multilabel_classification/dataset_checker/dataset_src/utils/visualizer.py

@@ -15,7 +15,7 @@
 import numpy as np
 from PIL import Image, ImageDraw, ImageFont
 
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 
 def colormap(rgb=False):
@@ -114,7 +114,7 @@ def draw_multi_label(image, label, label_map_dict):
     image_width, image_height = image.size
     font_size = int(image_width * 0.06)
 
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size)
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size)
     text_lines = []
     row_width = 0
     row_height = 0

+ 2 - 2
paddlex/modules/object_detection/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ from collections import defaultdict
 import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -64,7 +64,7 @@ def deep_analyse(dataset_dir, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=120)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/object_detection/dataset_checker/dataset_src/utils/visualizer.py

@@ -18,7 +18,7 @@ from PIL import ImageDraw, ImageFont
 
 from ......utils import logging
 from ......utils.deps import function_requires_deps, is_dep_available
-from ......utils.fonts import PINGFANG_FONT_FILE_PATH
+from ......utils.fonts import PINGFANG_FONT
 
 if is_dep_available("pycocotools"):
     from pycocotools.coco import COCO
@@ -124,7 +124,7 @@ def draw_bbox(image, coco_info: "COCO", img_id):
         font_size = int(0.024 * int(image_info["width"])) + 2
     except:
         font_size = 12
-    font = ImageFont.truetype(PINGFANG_FONT_FILE_PATH, font_size, encoding="utf-8")
+    font = ImageFont.truetype(PINGFANG_FONT.path, font_size, encoding="utf-8")
 
     image = image.convert("RGB")
     draw = ImageDraw.Draw(image)

+ 2 - 2
paddlex/modules/text_recognition/dataset_checker/dataset_src/analyse_dataset.py

@@ -22,7 +22,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 from .....utils.logging import warning
 
 if is_dep_available("opencv-contrib-python"):
@@ -130,7 +130,7 @@ def deep_analyse(dataset_path, output, datatype="MSTextRecDataset"):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=15)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=15)
     if datatype == "LaTeXOCRDataset":
         fig, ax = plt.subplots(figsize=(15, 9), dpi=120)
         xlabel_name = "公式长度区间"

+ 2 - 2
paddlex/modules/ts_classification/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ import numpy as np
 import pandas as pd
 
 from .....utils.deps import function_requires_deps, is_dep_available
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -59,7 +59,7 @@ def deep_analyse(dataset_dir, output, label_col="label"):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path)
     fig, ax = plt.subplots(figsize=(max(8, int(len(label_unique) / 5)), 5), dpi=120)
     ax.bar(x, cls_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cls_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/video_classification/dataset_checker/dataset_src/analyse_dataset.py

@@ -25,7 +25,7 @@ if is_dep_available("matplotlib"):
     from matplotlib import font_manager
 
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 
 @function_requires_deps("matplotlib")
@@ -69,7 +69,7 @@ def deep_analyse(dataset_path, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=10)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=10)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=300)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 2 - 2
paddlex/modules/video_detection/dataset_checker/dataset_src/analyse_dataset.py

@@ -20,7 +20,7 @@ import numpy as np
 
 from .....utils.deps import function_requires_deps, is_dep_available
 from .....utils.file_interface import custom_open
-from .....utils.fonts import PINGFANG_FONT_FILE_PATH
+from .....utils.fonts import PINGFANG_FONT
 
 if is_dep_available("matplotlib"):
     import matplotlib.pyplot as plt
@@ -74,7 +74,7 @@ def deep_analyse(dataset_path, output):
     if os_system == "windows":
         plt.rcParams["font.sans-serif"] = "FangSong"
     else:
-        font = font_manager.FontProperties(fname=PINGFANG_FONT_FILE_PATH, size=10)
+        font = font_manager.FontProperties(fname=PINGFANG_FONT.path, size=10)
     fig, ax = plt.subplots(figsize=(max(8, int(len(classes) / 5)), 5), dpi=300)
     ax.bar(x, cnts_train_sorted, width=0.5, label="train")
     ax.bar(x + width, cnts_val_sorted, width=0.5, label="val")

+ 35 - 25
paddlex/utils/fonts/__init__.py → paddlex/utils/fonts.py

@@ -17,27 +17,10 @@ from pathlib import Path
 import PIL
 from PIL import ImageFont
 
-from .. import logging
-from ..cache import CACHE_DIR
-from ..download import download
-from ..flags import LOCAL_FONT_FILE_PATH
-
-
-def get_font_file_path(file_name: str) -> str:
-    """
-    Get the path of the font file.
-
-    Returns:
-    str: The path to the font file.
-    """
-    font_path = (Path(CACHE_DIR) / "fonts" / file_name).resolve().as_posix()
-    if not Path(font_path).is_file():
-        download(
-            url=f"https://paddle-model-ecology.bj.bcebos.com/paddlex/PaddleX3.0/fonts/{file_name}",
-            save_path=font_path,
-        )
-
-    return font_path
+from . import logging
+from .cache import CACHE_DIR
+from .download import download
+from .flags import LOCAL_FONT_FILE_PATH
 
 
 def create_font(txt: str, sz: tuple, font_path: str) -> ImageFont:
@@ -87,12 +70,39 @@ def create_font_vertical(
     return font
 
 
+class Font:
+    def __init__(self, font_name=None, local_path=None):
+        self._local_path = local_path
+        if not local_path:
+            assert font_name is not None
+            self._font_name = font_name
+
+    @property
+    def path(self):
+        # HACK: download font file when needed only
+        if not self._local_path:
+            self._get_offical_font()
+        return self._local_path
+
+    def _get_offical_font(self):
+        """
+        Download the official font file.
+        """
+        font_path = (Path(CACHE_DIR) / "fonts" / self._font_name).resolve().as_posix()
+        if not Path(font_path).is_file():
+            download(
+                url=f"https://paddle-model-ecology.bj.bcebos.com/paddlex/PaddleX3.0/fonts/{self._font_name}",
+                save_path=font_path,
+            )
+        self._local_path = font_path
+
+
 if Path(str(LOCAL_FONT_FILE_PATH)).is_file():
     logging.warning(
         f"Using the local font file(`{LOCAL_FONT_FILE_PATH}`) specified by `LOCAL_FONT_FILE_PATH`!"
     )
-    PINGFANG_FONT_FILE_PATH = LOCAL_FONT_FILE_PATH
-    SIMFANG_FONT_FILE_PATH = LOCAL_FONT_FILE_PATH
+    PINGFANG_FONT = Font(local_path=LOCAL_FONT_FILE_PATH)
+    SIMFANG_FONT = Font(local_path=LOCAL_FONT_FILE_PATH)
 else:
-    PINGFANG_FONT_FILE_PATH = get_font_file_path("PingFang-SC-Regular.ttf")
-    SIMFANG_FONT_FILE_PATH = get_font_file_path("simfang.ttf")
+    PINGFANG_FONT = Font(font_name="PingFang-SC-Regular.ttf")
+    SIMFANG_FONT = Font(font_name="simfang.ttf")