Files
hertz_django/docs/API接口文档/YOLO模块接口文档.md
2025-11-17 16:39:30 +08:00

15 KiB
Raw Blame History

Hertz Studio Django YOLO 接口文档

  • 基础路径: /api/yolo/
  • 统一响应: 使用 HertzResponse 封装,结构为:
    {
      "success": true,
      "code": 200,
      "message": "操作成功",
      "data": {}
    }
    
    参考 hertz_studio_django_utils/responses/HertzResponse.py
  • 认证说明: 标注“需要登录”的接口需在请求头携带 Authorization: Bearer <token>,验证逻辑参考 hertz_studio_django_auth/utils/decorators/auth_decorators.py

一、模型上传与转换

1上传模型压缩包或文件夹

  • 方法: POST
  • 路径: /api/yolo/upload/
  • 认证: 不需要
  • 请求类型: multipart/form-data
  • 参数:
    • zip_file: ZIP 压缩包文件,与 folder_files 互斥
    • folder_files[...]: 文件夹内的多个文件(键名形如 folder_files[path/to/file]),与 zip_file 互斥
    • name: 模型名称(必填)
    • version: 模型版本(默认 1.0
    • description: 模型描述(可选)
  • 参考实现: views.pymodel_upload_handle_zip_upload_handle_folder_upload_validate_and_create_modeld:\All_template\yolo\hertz_studio_django_yolo\views.py:1018,1058,1129,1182
  • 示例请求ZIP 上传):
    curl -X POST "http://localhost:8000/api/yolo/upload/" \
      -F "zip_file=@/path/to/yolo_model.zip" \
      -F "name=MyYolo" \
      -F "version=1.0" \
      -F "description=Demo model"
    
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "模型上传成功",
      "data": {
        "id": 12,
        "name": "MyYolo",
        "version": "1.0",
        "folder_path": "/absolute/path/to/media/models/MyYolo_xxxxxxxx",
        "weights_path": "/absolute/path/to/media/models/MyYolo_xxxxxxxx/weights",
        "model_path": "/absolute/path/to/media/models/MyYolo_xxxxxxxx/weights/best.pt",
        "best_model_path": "/absolute/path/to/media/models/.../weights/best.pt",
        "last_model_path": "/absolute/path/to/media/models/.../weights/last.pt",
        "categories": {"0":"person","1":"bicycle"},
        "created_at": "2025-10-22T03:20:00Z"
      }
    }
    

2上传 .pt 并转换为 ONNX

  • 方法: POST
  • 路径: /api/yolo/onnx/upload/
  • 认证: 不需要
  • 请求类型: multipart/form-data
  • 参数:
    • file: .pt 模型文件(必填)
    • imgsz: 导出图像尺寸(如 640640,640,默认 640
    • opset: ONNX opset 版本(默认 12
    • simplify: 是否简化 ONNXtrue/false,默认 false
  • 参考实现: views.pyupload_pt_convert_onnxd:\All_template\yolo\hertz_studio_django_yolo\views.py:877
  • 示例请求:
    curl -X POST "http://localhost:8000/api/yolo/onnx/upload/" \
      -F "file=@/path/to/best.pt" \
      -F "imgsz=640" \
      -F "opset=12" \
      -F "simplify=true"
    
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "ONNX 导出成功",
      "data": {
        "onnx_relative_path": "yolo/ONNX/best_xxxxxxxx.onnx",
        "download_url": "http://localhost:8000/media/yolo/ONNX/best_xxxxxxxx.onnx",
        "labels_relative_path": "yolo/ONNX/best_xxxxxxxx.labels.json",
        "labels_download_url": "http://localhost:8000/media/yolo/ONNX/best_xxxxxxxx.labels.json"
      }
    }
    

二、模型管理

1获取模型列表

  • 方法: GET
  • 路径: /api/yolo/models/
  • 认证: 不需要
  • 参考实现: model_listd:\All_template\yolo\hertz_studio_django_yolo\views.py:101
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "获取模型列表成功",
      "data": [
        {"id": 1, "name": "ModelA", "version": "1.0", "is_enabled": true, "created_at": "2025-10-22T03:20:00Z"}
      ]
    }
    

2获取模型详情

  • 方法: GET
  • 路径: /api/yolo/models/{pk}/
  • 认证: 不需要
  • 参考实现: model_detaild:\All_template\yolo\hertz_studio_django_yolo\views.py:121
  • 示例响应(节选):
    {
      "success": true,
      "code": 200,
      "message": "获取模型详情成功",
      "data": {
        "id": 1,
        "name": "ModelA",
        "version": "1.0",
        "model_file": "/media/yolo/models/modela.pt",
        "model_folder_path": "/abs/path/models/modela_...",
        "model_path": "/abs/path/models/modela_/weights/best.pt",
        "weights_folder_path": "/abs/path/models/modela_/weights",
        "categories": {"0": "person"},
        "is_enabled": true,
        "description": "...",
        "created_at": "...",
        "updated_at": "..."
      }
    }
    

2更新模型

  • 方法: PUTPATCH
  • 路径: /api/yolo/models/{pk}/update/
  • 认证: 不需要
  • 请求类型: application/jsonmultipart/form-data
  • 可更新字段: description, is_enabled,(如上传 model_file 必须为 .pt
  • 参考实现: model_updated:\All_template\yolo\hertz_studio_django_yolo\views.py:134
  • 示例请求PATCH:
    PATCH /api/yolo/models/1/update/
    Content-Type: application/json
    
    {
      "description": "更新描述",
      "is_enabled": true
    }
    
  • 示例响应:
    {"success": true, "code": 200, "message": "模型更新成功", "data": {"id": 1, "name": "ModelA", "is_enabled": true}}
    

3删除模型

  • 方法: DELETE
  • 路径: /api/yolo/models/{pk}/delete/
  • 认证: 不需要
  • 参考实现: model_deleted:\All_template\yolo\hertz_studio_django_yolo\views.py:152
  • 示例响应:
    {"success": true, "code": 200, "message": "模型删除成功"}
    

4启用指定模型

  • 方法: POST
  • 路径: /api/yolo/models/{pk}/enable/
  • 认证: 不需要
  • 行为: 先禁用其他模型,再启用当前模型
  • 参考实现: model_enabled:\All_template\yolo\hertz_studio_django_yolo\views.py:165
  • 示例响应:
    {"success": true, "code": 200, "message": "模型 ModelA 已启用", "data": {"id": 1, "is_enabled": true}}
    

5获取当前启用的模型

  • 方法: GET
  • 路径: /api/yolo/models/enabled/
  • 认证: 不需要
  • 参考实现: model_enabledd:\All_template\yolo\hertz_studio_django_yolo\views.py:186
  • 示例响应:
    {"success": true, "code": 200, "message": "获取启用模型成功", "data": {"id": 1, "name": "ModelA"}}
    

6创建模型占位

  • 方法: POST
  • 路径: /api/yolo/models/create/
  • 说明: 返回 405提示使用 /api/yolo/upload/
  • 参考实现: model_created:\All_template\yolo\hertz_studio_django_yolo\views.py:114

三、模型类别管理

提示:类别通常随模型上传自动导入。手动创建/删除不推荐,仅保留接口。

1获取类别列表

  • 方法: GET
  • 路径: /api/yolo/categories/
  • 认证: 不需要
  • 参考实现: category_listd:\All_template\yolo\hertz_studio_django_yolo\views.py:1301

2获取类别详情

  • 方法: GET
  • 路径: /api/yolo/categories/{pk}/
  • 认证: 不需要
  • 参考实现: category_detaild:\All_template\yolo\hertz_studio_django_yolo\views.py:1329

3更新类别

  • 方法: PUTPATCH
  • 路径: /api/yolo/categories/{pk}/update/
  • 认证: 不需要
  • 请求类型: application/json
  • 可更新字段: alias, alert_levelhigh|medium|low|none, is_active
  • 参考实现: category_updated:\All_template\yolo\hertz_studio_django_yolo\views.py:1342
  • 示例请求PATCH:
    PATCH /api/yolo/categories/10/update/
    Content-Type: application/json
    
    {"alias": "行人", "alert_level": "high", "is_active": true}
    
  • 示例响应:
    {"success": true, "code": 200, "message": "更新类别成功", "data": {"id": 10, "alias": "行人", "alert_level": "high"}}
    

4切换类别启用状态

  • 方法: POST
  • 路径: /api/yolo/categories/{pk}/toggle-status/
  • 认证: 不需要
  • 参考实现: category_toggle_statusd:\All_template\yolo\hertz_studio_django_yolo\views.py:1385
  • 示例响应:
    {"success": true, "code": 200, "message": "类别 'person' 启用成功", "data": {"is_active": true}}
    

5获取启用的类别列表

  • 方法: GET
  • 路径: /api/yolo/categories/active/
  • 认证: 不需要
  • 参考实现: category_active_listd:\All_template\yolo\hertz_studio_django_yolo\views.py:1405

6创建类别不推荐

  • 方法: POST
  • 路径: /api/yolo/categories/create/
  • 认证: 不需要
  • 请求类型: application/json
  • 参考实现: category_created:\All_template\yolo\hertz_studio_django_yolo\views.py:1312

7删除类别不推荐

  • 方法: DELETE
  • 路径: /api/yolo/categories/{pk}/delete/
  • 认证: 不需要
  • 参考实现: category_deleted:\All_template\yolo\hertz_studio_django_yolo\views.py:1362

四、目标检测

执行检测

  • 方法: POST
  • 路径: /api/yolo/detect/
  • 认证: 需要登录(Authorization: Bearer <token>
  • 请求类型: multipart/form-data
  • 参数:
    • file: 要检测的图片或视频文件(支持图片:.jpg,.jpeg,.png,.bmp,.tiff,.webp;视频:.mp4,.avi,.mov,.mkv,.wmv,.flv
    • model_id: 指定模型ID可选未提供则使用当前启用模型
    • confidence_threshold: 置信度阈值(默认 0.5,范围 0.1-1.0
  • 参考实现: yolo_detectiond:\All_template\yolo\hertz_studio_django_yolo\views.py:446
  • 示例请求:
    curl -X POST "http://localhost:8000/api/yolo/detect/" \
      -H "Authorization: Bearer <token>" \
      -F "file=@/path/to/image.jpg" \
      -F "model_id=1" \
      -F "confidence_threshold=0.5"
    
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "检测完成",
      "data": {
        "detection_id": 1001,
        "result_file_url": "/media/detection/result/result_xxx.jpg",
        "original_file_url": "/media/detection/original/uuid_image.jpg",
        "object_count": 3,
        "detected_categories": ["person"],
        "confidence_scores": [0.91, 0.87, 0.79],
        "avg_confidence": 0.8567,
        "processing_time": 0.43,
        "model_used": "ModelA 1.0",
        "confidence_threshold": 0.5,
        "user_id": 2,
        "user_name": "alice",
        "alert_level": "medium"
      }
    }
    

五、检测记录

1获取检测记录列表

  • 方法: GET
  • 路径: /api/yolo/detections/
  • 认证: 不需要
  • 查询参数:
    • type: imagevideo
    • model_id: 模型ID
    • user_id: 用户ID
  • 参考实现: detection_listd:\All_template\yolo\hertz_studio_django_yolo\views.py:204
  • 示例响应(节选):
    {
      "success": true,
      "code": 200,
      "message": "获取检测记录列表成功",
      "data": [
        {
          "id": 1001,
          "original_file": "/media/detection/original/uuid_image.jpg",
          "result_file": "/media/detection/result/result_xxx.jpg",
          "original_filename": "uuid_image.jpg",
          "result_filename": "result_xxx.jpg",
          "detection_type": "image",
          "model_name": "ModelA 1.0",
          "model_info": {"id":1, "name":"ModelA", "version":"1.0"},
          "object_count": 3,
          "detected_categories": ["person"],
          "confidence_threshold": 0.5,
          "confidence_scores": [0.91, 0.87, 0.79],
          "avg_confidence": 0.8567,
          "processing_time": 0.43,
          "created_at": "..."
        }
      ]
    }
    

2获取指定用户的检测记录

  • 方法: GET
  • 路径: /api/yolo/detections/{user_id}/user/
  • 认证: 不需要
  • 查询参数同上
  • 参考实现: user_detection_recordsd:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:231

3获取检测记录详情

  • 方法: GET
  • 路径: /api/yolo/detections/{pk}/
  • 认证: 不需要
  • 参考实现: detection_detaild:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:253

4删除检测记录

  • 方法: DELETE
  • 路径: /api/yolo/detections/{pk}/delete/
  • 认证: 不需要
  • 行为: 同时删除其关联的原始文件、结果文件及关联的告警
  • 参考实现: detection_deleted:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:265
  • 示例响应:
    {"success": true, "code": 200, "message": "检测记录删除成功"}
    

5批量删除检测记录

  • 方法: POST
  • 路径: /api/yolo/detections/batch-delete/
  • 认证: 不需要
  • 请求类型: application/json
  • 请求体:
    {"ids": [1001, 1002, 1003]}
    
  • 参考实现: detection_batch_deleted:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:299
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "成功删除 3 条检测记录",
      "data": {
        "deleted_count": 3,
        "found_ids": ["1001","1002","1003"],
        "not_found_ids": []
      }
    }
    

6检测统计

  • 方法: GET
  • 路径: /api/yolo/stats/
  • 认证: 不需要
  • 参考实现: detection_statsd:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:840

六、告警记录

1获取告警记录列表管理员

  • 方法: GET
  • 路径: /api/yolo/alerts/
  • 认证: 不需要
  • 查询参数:
    • status: 默认 pending;传 all 表示不过滤
    • level: 告警等级(high|medium|low|none
    • user_id: 用户ID
    • alter_category: 告警类别关键字(注意字段名为 alter_category
  • 参考实现: alert_listd:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:358

2获取用户的告警记录

  • 方法: GET
  • 路径: /api/yolo/users/{user_id}/alerts/
  • 认证: 需要登录(仅本人或管理员可查)
  • 查询参数:
    • status: pending|is_confirm|false_positive|all
    • level: high|medium|low|none
    • category: 类别关键字
  • 参考实现: user_alert_recordsd:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:391

3更新告警状态

  • 方法: PUTPATCH
  • 路径: /api/yolo/alerts/{pk}/update-status/
  • 认证: 不需要
  • 请求类型: application/json
  • 请求体:
    {"status": "is_confirm"}
    
  • 可选值: pending, is_confirm, false_positive
  • 参考实现: alert_update_statusd:\AllTemplate\yolo\hertz_studio_django_yolo\views.py:426
  • 示例响应:
    {
      "success": true,
      "code": 200,
      "message": "更新告警状态成功",
      "data": {
        "id": 555,
        "status": "is_confirm",
        "alert_level": "medium",
        "alert_category": "person",
        "alert_level_display": "中"
      }
    }
    

七、备注

  • 所有文件型字段响应通常包含可直接访问的媒体 URL媒体服务由 MEDIA_URL=/media/ 提供。
  • 分类的告警等级枚举参考 ModelCategory.ALERT_LEVELSAlert.ALERT_LEVELSd:\AllTemplate\yolo\hertz_studio_django_yolo\models.py:118,153
  • 检测请求的文件大小限制:图片 ≤ 50MB视频 ≤ 500MBd:\AllTemplate\yolo\hertz_studio_django_yolo\serializers.py:99