切割合并.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. # 假设你的预测器类在这里,我们为了测试会创建一个MockPredictor
  8. from app.utils.card_inference.fry_bisenetv2_predictor_V04_250819 import FryBisenetV2Predictor
  9. BASE_PATH = Path(__file__).parent.parent.absolute()
  10. def get_predictor(config_params: dict):
  11. # 配置参数
  12. model_path = BASE_PATH / config_params["pth_path"]
  13. real_seg_class_dict = config_params['class_dict']
  14. imgSize_train_dict = config_params['img_size']
  15. confidence = config_params['confidence']
  16. input_channels = config_params['input_channels']
  17. # 为不同类别设置不同颜色(可选)
  18. label_colors_dict = {
  19. 'outer_box': (255, 0, 0),
  20. }
  21. # 创建预测器
  22. predictor = FryBisenetV2Predictor(
  23. pth_path=str(model_path),
  24. real_seg_class_dict=real_seg_class_dict,
  25. imgSize_train_dict=imgSize_train_dict,
  26. confidence=confidence,
  27. label_colors_dict=label_colors_dict,
  28. input_channels=input_channels,
  29. )
  30. return predictor
  31. def _test_face_big_img():
  32. large_image_path = r"C:\Code\ML\Project\CheckCardBoxAndDefectServer\temp\250805_pokemon_0001.jpg"
  33. pokemon_front_face_no_reflect_defect = {
  34. "pth_path": "Model/pokemon_front_face_no_reflect_defect.pth",
  35. "class_dict": {"1": "scratch", "2": "pit", "3": "stain"},
  36. "img_size": {'width': 512, 'height': 512},
  37. "confidence": 0.5,
  38. "input_channels": 3,
  39. }
  40. predictor = get_predictor(pokemon_front_face_no_reflect_defect)
  41. # 3. 实例化我们的聚合器,传入预测器
  42. aggregator = CardDefectAggregator(
  43. predictor=predictor,
  44. tile_size=512,
  45. overlap_ratio=0.1, # 10% 重叠
  46. )
  47. # --- 执行任务 ---
  48. # 任务1: 对整个卡片表面进行缺陷检测
  49. aggregator.process_image(
  50. image_path=large_image_path,
  51. output_json_path="output/final_face_defects.json",
  52. mode='face'
  53. )
  54. print("\n" + "=" * 50 + "\n")
  55. def _test_corner_big_img():
  56. large_image_path = r"C:\Code\ML\Project\CheckCardBoxAndDefectServer\temp\250805_pokemon_0001.jpg"
  57. pokemon_front_corner_no_reflect_defect = {
  58. "pth_path": "Model/pokemon_front_corner_no_reflect_defect.pth",
  59. "class_dict": {"1": "wear", "2": "wear_and_impact", "3": "impact", "4": "damaged"},
  60. "img_size": {'width': 512, 'height': 512},
  61. "confidence": 0.5,
  62. "input_channels": 3,
  63. }
  64. predictor = get_predictor(pokemon_front_corner_no_reflect_defect)
  65. # 3. 实例化我们的聚合器,传入预测器
  66. aggregator = CardDefectAggregator(
  67. predictor=predictor,
  68. tile_size=512,
  69. overlap_ratio=0.1, # 10% 重叠
  70. )
  71. # 任务2: 仅对卡片边缘进行缺陷检测 (使用另一个模型)
  72. # 假设你有一个专门用于边角的模型
  73. # aggregator.process_image(
  74. # image_path=large_image_path,
  75. # output_json_path="output/final_edge_defects.json",
  76. # mode='edge'
  77. # )
  78. json_data = aggregator.process_image(
  79. image_path=large_image_path,
  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')