切割合并.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import json
  2. import numpy as np
  3. import cv2
  4. from typing import Dict
  5. from app.utils.CardDefectAggregator import CardDefectAggregator
  6. from pathlib import Path
  7. from app.utils.card_inference.fry_bisenetv2_predictor_V04_250819 import FryBisenetV2Predictor
  8. BASE_PATH = Path(__file__).parent.parent.absolute()
  9. def get_predictor(config_params: dict):
  10. # 配置参数
  11. model_path = BASE_PATH / config_params["pth_path"]
  12. real_seg_class_dict = config_params['class_dict']
  13. imgSize_train_dict = config_params['img_size']
  14. confidence = config_params['confidence']
  15. input_channels = config_params['input_channels']
  16. # 为不同类别设置不同颜色(可选)
  17. label_colors_dict = {
  18. 'outer_box': (255, 0, 0),
  19. }
  20. # 创建预测器
  21. predictor = FryBisenetV2Predictor(
  22. pth_path=str(model_path),
  23. real_seg_class_dict=real_seg_class_dict,
  24. imgSize_train_dict=imgSize_train_dict,
  25. confidence=confidence,
  26. label_colors_dict=label_colors_dict,
  27. input_channels=input_channels,
  28. )
  29. return predictor
  30. def _test_face_big_img():
  31. large_image_path = r"C:\Users\wow38\Downloads\_250813_1616_宝可梦非反光卡正面的面模型\pth_and_images\image_origin\250805_pokemon_0001.jpg"
  32. pokemon_front_face_no_reflect_defect = {
  33. "pth_path": "Model/pokemon_front_face_no_reflect_defect.pth",
  34. "class_dict": {"1": "scratch", "2": "pit", "3": "stain"},
  35. "img_size": {'width': 512, 'height': 512},
  36. "confidence": 0.5,
  37. "input_channels": 3,
  38. }
  39. predictor = get_predictor(pokemon_front_face_no_reflect_defect)
  40. # 3. 实例化我们的聚合器,传入预测器
  41. aggregator = CardDefectAggregator(
  42. predictor=predictor,
  43. tile_size=512,
  44. overlap_ratio=0.1, # 10% 重叠
  45. )
  46. # --- 执行任务 ---
  47. # 任务1: 对整个卡片表面进行缺陷检测
  48. aggregator.process_image(
  49. image=large_image_path,
  50. output_json_path="output/final_face_defects.json",
  51. mode='face'
  52. )
  53. print("\n" + "=" * 50 + "\n")
  54. def _test_corner_big_img():
  55. large_image_path = r"C:\Code\ML\Project\CheckCardBoxAndDefectServer\temp\250805_pokemon_0001.jpg"
  56. pokemon_front_corner_no_reflect_defect = {
  57. "pth_path": "Model/pokemon_front_corner_no_reflect_defect.pth",
  58. "class_dict": {"1": "wear", "2": "wear_and_impact", "3": "impact", "4": "damaged"},
  59. "img_size": {'width': 512, 'height': 512},
  60. "confidence": 0.5,
  61. "input_channels": 3,
  62. }
  63. predictor = get_predictor(pokemon_front_corner_no_reflect_defect)
  64. # 3. 实例化我们的聚合器,传入预测器
  65. aggregator = CardDefectAggregator(
  66. predictor=predictor,
  67. tile_size=512,
  68. overlap_ratio=0.1, # 10% 重叠
  69. )
  70. # 任务2: 仅对卡片边缘进行缺陷检测 (使用另一个模型)
  71. # 假设你有一个专门用于边角的模型
  72. # aggregator.process_image(
  73. # image_path=large_image_path,
  74. # output_json_path="output/final_edge_defects.json",
  75. # mode='edge'
  76. # )
  77. json_data = aggregator.process_image(
  78. image=large_image_path,
  79. output_json_path="output/final_face_defects.json",
  80. mode='edge'
  81. )
  82. print(json_data)
  83. def _test_split_img(split_mode):
  84. # "edge", "face"
  85. # --- 输入与输出路径配置 ---
  86. large_image_path = r"C:\Code\ML\Project\CheckCardBoxAndDefectServer\temp\250805_pokemon_0001.jpg"
  87. output_dir = r"C:\Code\ML\Project\CheckCardBoxAndDefectServer\temp\split_output"
  88. # 打印信息
  89. print(f"输入大图: {large_image_path}")
  90. print(f"输出目录: {output_dir}")
  91. print("-" * 50)
  92. # --- 实例化聚合器 ---
  93. # 由于我们只进行分割,不需要预测器,所以 predictor=None 即可。
  94. aggregator = CardDefectAggregator(
  95. predictor=None, # 无需预测器
  96. tile_size=512,
  97. overlap_ratio=0.1, # 10% 重叠
  98. )
  99. # --- 调用新的分割保存功能 ---
  100. # mode='face' 表示对整个图片进行网格分割
  101. saved_tile_paths = aggregator.split_and_save_tiles(
  102. image_path=large_image_path,
  103. output_dir=output_dir,
  104. mode=split_mode
  105. )
  106. # 打印一些结果信息
  107. if saved_tile_paths:
  108. print(f"\n分割出的第一个文件是: {saved_tile_paths[0]}")
  109. print(f"分割出的最后一个文件是: {saved_tile_paths[-1]}")
  110. if __name__ == "__main__":
  111. # _test_face_big_img()
  112. _test_corner_big_img()
  113. # _test_split_img(split_mode='edge')