model.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from datetime import datetime
  2. from zoneinfo import ZoneInfo
  3. from app.models import db
  4. class Model(db.Model):
  5. """
  6. 模型类,表示数据库中的 'model' 表。
  7. 该类存储不同训练模型的基本信息和性能评估指标。
  8. 包括模型名称、存储路径、训练数据增强方法、计算量、目标检测精度与召回率、分割掩膜性能等。
  9. 模型还包含与用户、检测分割记录的关系,支持对不同模型进行评估和管理。
  10. Attributes:
  11. model_id (int): 模型的唯一标识符(主键)。
  12. model_name (str): 模型名称,必须唯一,不能为空。
  13. model_path (str): 模型存储路径,必须唯一,不能为空。
  14. disease_category (str): 模型所处理的病害类别。
  15. augmentation (str): 使用的数据增强方式。
  16. layers (int): 模型的层数。
  17. parameters (int): 模型的参数量。
  18. GFLOPs (float): 模型的计算量(Giga Floating-Point Operations)。
  19. box_p (float): 目标检测框的精度。
  20. box_r (float): 目标检测框的召回率。
  21. box_mAP50 (float): 目标检测框在 IoU=0.5 时的 mAP(mean Average Precision)。
  22. box_mAP50_95 (float): 目标检测框在 IoU 从 0.5 到 0.95 的 mAP。
  23. mask_p (float): 分割掩膜的精度。
  24. mask_r (float): 分割掩膜的召回率。
  25. mask_mAP50 (float): 分割掩膜在 IoU=0.5 时的 mAP。
  26. mask_mAP50_95 (float): 分割掩膜在 IoU 从 0.5 到 0.95 的 mAP。
  27. f1_score (float): 模型的 F1 分数,综合精度和召回率的性能指标。
  28. fitness_score (float): 模型的适应度分数,用于评估模型的整体性能。
  29. created_at (datetime): 模型记录的创建时间,自动生成。
  30. updated_at (datetime): 模型记录的最后更新时间,自动更新。
  31. owner_id (int): 所属用户的 ID(外键)。
  32. Relationships:
  33. owner (User): 一个模型只属于一个用户,表示该模型的所有者。
  34. detections (Detection): 一个模型可以有多个检测分割记录(反向关系,表示该模型应用于的检测任务)。
  35. """
  36. __tablename__ = 'model' # 表名
  37. model_id = db.Column(db.Integer, primary_key=True, autoincrement=True) # 模型 ID
  38. model_name = db.Column(db.String(255), unique=True, nullable=False) # 模型名称
  39. model_path = db.Column(db.String(255), unique=True, nullable=False) # 存储路径
  40. disease_category = db.Column(db.String(100), nullable=False) # 病害类别
  41. augmentation = db.Column(db.String(255), default='原图') # 数据增强方式
  42. layers = db.Column(db.Integer, nullable=False, default=0) # 层数
  43. parameters = db.Column(db.Integer, nullable=False, default=0) # 参数量
  44. GFLOPs = db.Column(db.Float, nullable=False, default=lambda: round(0.0, 1)) # 计算量
  45. box_p = db.Column(db.Float, default=lambda: round(0.0, 3)) # 目标检测框的精度
  46. box_r = db.Column(db.Float, default=lambda: round(0.0, 3)) # 目标检测框的召回率
  47. box_mAP50 = db.Column(db.Float, default=lambda: round(0.0, 3)) # 目标检测框在 IoU=0.5 时的 mAP
  48. box_mAP50_95 = db.Column(db.Float, default=lambda: round(0.0, 3)) # 目标检测框在 IoU 从 0.5 到 0.95 的 mAP
  49. mask_p = db.Column(db.Float, default=lambda: round(0.0, 3)) # 分割掩膜的精度
  50. mask_r = db.Column(db.Float, default=lambda: round(0.0, 3)) # 分割掩膜的召回率
  51. mask_mAP50 = db.Column(db.Float, default=lambda: round(0.0, 3)) # 分割掩膜在 IoU=0.5 时的 mAP
  52. mask_mAP50_95 = db.Column(db.Float, default=lambda: round(0.0, 3)) # 分割掩膜在 IoU 从 0.5 到 0.95 的 mAP
  53. f1_score = db.Column(db.Float, default=lambda: round(0.0, 5), nullable=False) # F1 分数
  54. fitness_score = db.Column(db.Float, default=lambda: round(0.0, 5), nullable=False) # 适应度分数
  55. created_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 创建时间
  56. updated_at = db.Column(db.DateTime, default=lambda: datetime.now(ZoneInfo("Asia/Shanghai")),
  57. onupdate=lambda: datetime.now(ZoneInfo("Asia/Shanghai"))) # 最后更新时间
  58. owner_id = db.Column(db.Integer, db.ForeignKey('user.user_id'), nullable=False) # 所属用户 ID(外键)
  59. # 设置与 User 表的关系:一个模型只属于一个用户
  60. owner = db.relationship('User', backref=db.backref('models', lazy=True))
  61. def __repr__(self):
  62. return (f"Model(model_id={self.model_id}, "
  63. f"model_name={self.model_name}, "
  64. f"model_path={self.model_path}, "
  65. f"disease_category={self.disease_category}, "
  66. f"augmentation={self.augmentation}, "
  67. f"layers={self.layers}, "
  68. f"parameters={self.parameters}, "
  69. f"GFLOPs={self.GFLOPs}, "
  70. f"box_p={self.box_p}, "
  71. f"box_r={self.box_r}, "
  72. f"box_mAP50={self.box_mAP50}, "
  73. f"box_mAP50_95={self.box_mAP50_95}, "
  74. f"mask_p={self.mask_p}, "
  75. f"mask_r={self.mask_r}, "
  76. f"mask_mAP50={self.mask_mAP50}, "
  77. f"mask_mAP50_95={self.mask_mAP50_95}, "
  78. f"f1_score={self.f1_score}, "
  79. f"fitness_score={self.fitness_score}, "
  80. f"created_at={self.created_at}, "
  81. f"updated_at={self.updated_at}, "
  82. f"owner_id={self.owner_id})")
  83. def to_dict(self):
  84. """
  85. 将 Model 实例转化为字典。
  86. """
  87. return {
  88. 'model_id': self.model_id,
  89. 'model_name': self.model_name,
  90. 'model_path': self.model_path,
  91. 'disease_category': self.disease_category,
  92. 'augmentation': self.augmentation,
  93. 'layers': self.layers,
  94. 'parameters': self.parameters,
  95. 'GFLOPs': self.GFLOPs,
  96. 'box_p': self.box_p,
  97. 'box_r': self.box_r,
  98. 'box_mAP50': self.box_mAP50,
  99. 'box_mAP50_95': self.box_mAP50_95,
  100. 'mask_p': self.mask_p,
  101. 'mask_r': self.mask_r,
  102. 'mask_mAP50': self.mask_mAP50,
  103. 'mask_mAP50_95': self.mask_mAP50_95,
  104. 'f1_score': self.f1_score,
  105. 'fitness_score': self.fitness_score,
  106. 'created_at': self.created_at,
  107. 'updated_at': self.updated_at,
  108. 'owner_id': self.owner_id
  109. }