fix_model_texts.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """修复 model 表 disease_category / augmentation 及 detection 描述中的 ?? 乱码。"""
  2. import os
  3. import sys
  4. ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  5. if ROOT not in sys.path:
  6. sys.path.insert(0, ROOT)
  7. from app import create_app
  8. from app.config import mysql_uri_with_utf8mb4
  9. from app.constants import DiseaseGrade
  10. from app.models import Detection, Model, db
  11. # 与 sql/init_db.sql 一致
  12. MODEL_CATEGORIES = {
  13. 'steel_corrosion.pt': '钢构件锈蚀',
  14. 'steel_coating_peel_bubble.pt': '钢构件涂层剥脱/鼓包',
  15. 'concrete_peeling_rebar.pt': '混凝土剥落露筋',
  16. 'steel_crack.pt': '钢构件裂缝',
  17. 'concrete_crack.pt': '混凝土裂缝',
  18. 'concrete_weathering.pt': '混凝土风化',
  19. 'road_pothole.pt': '路面坑凼',
  20. }
  21. AUGMENTATION = '随机点+颜色扭曲+高斯模糊'
  22. DESCRIPTIONS = {
  23. DiseaseGrade.MILD: '隐患程度较轻,建议纳入日常巡检观察。',
  24. DiseaseGrade.MODERATE: '存在中等程度结构隐患,建议安排专项复核与养护。',
  25. DiseaseGrade.SEVERE: '隐患较为明显,应尽快组织检测评估并制定处置方案。',
  26. DiseaseGrade.CRITICAL: '隐患严重,需立即采取限载或封闭措施并启动应急处置。',
  27. }
  28. def main() -> None:
  29. uri = os.environ.get('SQLALCHEMY_DATABASE_URI')
  30. if uri:
  31. os.environ['SQLALCHEMY_DATABASE_URI'] = mysql_uri_with_utf8mb4(uri)
  32. app = create_app()
  33. with app.app_context():
  34. model_updated = 0
  35. for model in Model.query.all():
  36. category = MODEL_CATEGORIES.get(model.model_name)
  37. if not category:
  38. print(f'[skip] 未知模型: {model.model_name}')
  39. continue
  40. changed = False
  41. if model.disease_category != category:
  42. model.disease_category = category
  43. changed = True
  44. if model.augmentation != AUGMENTATION:
  45. model.augmentation = AUGMENTATION
  46. changed = True
  47. if changed:
  48. model_updated += 1
  49. print(f'[model] {model.model_name} -> {category}')
  50. det_updated = 0
  51. for det in Detection.query.all():
  52. model = Model.query.get(det.model_id)
  53. if not model:
  54. continue
  55. grade = det.disease_grade
  56. if isinstance(grade, str):
  57. grade = DiseaseGrade(grade.lower())
  58. desc = (
  59. f'【{model.disease_category}】{DESCRIPTIONS.get(grade, "暂无评估。")} '
  60. f'检出隐患 {det.disease_count} 处,覆盖面积约 {int(det.disease_area)} 像素。'
  61. )
  62. if det.disease_description != desc:
  63. det.disease_description = desc
  64. det_updated += 1
  65. db.session.commit()
  66. print(f'完成:更新模型 {model_updated} 条,更新检测描述 {det_updated} 条。')
  67. if __name__ == '__main__':
  68. main()