222 lines
16 KiB
Python
222 lines
16 KiB
Python
# Generated by Django 5.0.4 on 2026-08-30 23:53
|
|
|
|
import django.db.models.deletion
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='AlgorithmModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=100, verbose_name='算法名称')),
|
|
('algorithm_type', models.CharField(choices=[('yolo5', 'YOLOv5'), ('yolo8', 'YOLOv8'), ('yolo11', 'YOLOv11'), ('yolo26', 'YOLO26'), ('osnet', 'OSNet ReID')], default='yolo8', max_length=30, verbose_name='算法类型')),
|
|
('task_type', models.CharField(choices=[('detect', 'Detect'), ('segment', 'Segment'), ('classify', 'Classify'), ('pose', 'Pose'), ('obb', 'OBB'), ('reid', 'ReID')], default='detect', max_length=20, verbose_name='任务类型')),
|
|
('inference_engine', models.CharField(choices=[('yolo_pytorch', 'Yolo-PyTorch'), ('onnxruntime', 'OnnxRuntime'), ('openvino', 'OpenVINO')], default='yolo_pytorch', max_length=20, verbose_name='推理引擎')),
|
|
('device', models.CharField(choices=[('cpu', 'CPU'), ('cuda', 'CUDA'), ('gpu', 'GPU')], default='cpu', max_length=20, verbose_name='推理设备')),
|
|
('model_file', models.CharField(default='', max_length=300, verbose_name='模型文件相对路径')),
|
|
('model_file_size', models.IntegerField(default=0, verbose_name='模型文件大小(字节)')),
|
|
('input_width', models.IntegerField(default=640, verbose_name='输入宽度')),
|
|
('input_height', models.IntegerField(default=640, verbose_name='输入高度')),
|
|
('conf_threshold', models.FloatField(default=0.4, verbose_name='置信度阈值')),
|
|
('iou_threshold', models.FloatField(default=0.5, verbose_name='NMS IoU 阈值')),
|
|
('labels', models.TextField(default='[]', verbose_name='支持类别JSON数组')),
|
|
('is_default', models.IntegerField(default=0, verbose_name='是否默认算法')),
|
|
('state', models.IntegerField(default=1, verbose_name='状态')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')),
|
|
],
|
|
options={
|
|
'verbose_name': '小模型',
|
|
'verbose_name_plural': '小模型',
|
|
'db_table': 'av_algorithm',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='LLMModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('user_id', models.IntegerField(verbose_name='用户')),
|
|
('sort', models.IntegerField(default=0, verbose_name='排序')),
|
|
('code', models.CharField(max_length=50, verbose_name='编号')),
|
|
('name', models.CharField(default='', max_length=50, verbose_name='名称')),
|
|
('model_name', models.CharField(max_length=200, verbose_name='模型名称')),
|
|
('api_url', models.CharField(max_length=500, verbose_name='API地址')),
|
|
('api_key', models.CharField(default='', max_length=512, verbose_name='API密钥')),
|
|
('timeout', models.IntegerField(default=30, verbose_name='超时时间(秒)')),
|
|
('inference_tool', models.CharField(default='OpenAI', max_length=100, verbose_name='推理工具')),
|
|
('remark', models.TextField(default='', verbose_name='备注')),
|
|
('state', models.IntegerField(default=1, verbose_name='状态')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')),
|
|
],
|
|
options={
|
|
'verbose_name': '大模型',
|
|
'verbose_name_plural': '大模型',
|
|
'db_table': 'av_llm',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='LogModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('user_id', models.IntegerField(verbose_name='用户ID')),
|
|
('log_type', models.IntegerField(verbose_name='日志类型')),
|
|
('content', models.CharField(max_length=200, verbose_name='日志内容')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('state', models.IntegerField(verbose_name='状态')),
|
|
],
|
|
options={
|
|
'verbose_name': '管理员日志',
|
|
'verbose_name_plural': '管理员日志',
|
|
'db_table': 'av_log',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='BizAlgorithmModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=100, verbose_name='算法名称')),
|
|
('flow_type', models.IntegerField(choices=[(1, '小模型+后处理'), (2, '大模型+后处理'), (3, '小模型+大模型+后处理'), (4, '检测+ReID+后处理')], default=1, verbose_name='流程类型')),
|
|
('target_labels', models.TextField(default='[]', verbose_name='目标类别JSON')),
|
|
('llm_prompt', models.TextField(default='', verbose_name='大模型提示词')),
|
|
('llm_validate', models.TextField(default='', verbose_name='提示词校验值')),
|
|
('post_process', models.CharField(choices=[('AREA', '区域入侵'), ('LINE_CROSS', '越线检测'), ('LINE_COUNT', '越线计数'), ('DIRECTION', '方向入侵'), ('DENSITY', '密度报警'), ('DWELL', '滞留报警')], default='AREA', max_length=30, verbose_name='后处理逻辑')),
|
|
('ref_angle', models.FloatField(default=90.0, verbose_name='方向参考角度')),
|
|
('angle_tolerance', models.FloatField(default=45.0, verbose_name='方向容差(度)')),
|
|
('forward_count_threshold', models.IntegerField(default=0, verbose_name='正向计数报警阈值')),
|
|
('reverse_count_threshold', models.IntegerField(default=0, verbose_name='逆向计数报警阈值')),
|
|
('state', models.IntegerField(default=1, verbose_name='状态')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')),
|
|
('detector_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms_as_detector', to='app.algorithmmodel', verbose_name='检测小模型(YOLO)')),
|
|
('small_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms', to='app.algorithmmodel', verbose_name='小模型')),
|
|
('llm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms', to='app.llmmodel', verbose_name='大模型')),
|
|
],
|
|
options={
|
|
'verbose_name': '业务算法',
|
|
'verbose_name_plural': '业务算法',
|
|
'db_table': 'av_biz_algorithm',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='StreamModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('user_id', models.IntegerField(verbose_name='用户')),
|
|
('sort', models.IntegerField(verbose_name='排序')),
|
|
('code', models.CharField(max_length=50, verbose_name='编号')),
|
|
('app', models.CharField(max_length=50, verbose_name='流分组')),
|
|
('name', models.CharField(max_length=50, verbose_name='流名称')),
|
|
('pull_stream_url', models.CharField(max_length=300, verbose_name='视频流源地址')),
|
|
('pull_stream_type', models.IntegerField(verbose_name='视频流来源类型')),
|
|
('pull_stream_transfer_mode', models.IntegerField(verbose_name='视频流传输模式')),
|
|
('pull_stream_ip', models.CharField(max_length=50, verbose_name='拉流IP')),
|
|
('pull_stream_port', models.IntegerField(verbose_name='拉流端口')),
|
|
('pull_stream_username', models.CharField(max_length=512, verbose_name='拉流用户名')),
|
|
('pull_stream_password', models.CharField(max_length=512, verbose_name='拉流密码')),
|
|
('nickname', models.CharField(max_length=200, verbose_name='视频流昵称')),
|
|
('remark', models.CharField(max_length=200, verbose_name='备注')),
|
|
('forward_state', models.IntegerField(verbose_name='转发状态')),
|
|
('is_audio', models.IntegerField(default=0, verbose_name='音频传输类型')),
|
|
('snap_filepath', models.CharField(max_length=200, verbose_name='快照文件路径')),
|
|
('snap_time', models.DateTimeField(auto_now_add=True, verbose_name='快照时间')),
|
|
('camera_sum_num', models.IntegerField(default=0, verbose_name='通道总数')),
|
|
('camera_name', models.CharField(max_length=100, verbose_name='摄像头名称')),
|
|
('camera_manufacturer', models.CharField(max_length=100, verbose_name='摄像头厂商')),
|
|
('camera_owner', models.CharField(max_length=50, verbose_name='摄像头所属者')),
|
|
('camera_model', models.CharField(max_length=50, verbose_name='摄像头型号')),
|
|
('camera_device_id', models.CharField(max_length=50, verbose_name='GB28181设备ID')),
|
|
('camera_parent_id', models.CharField(max_length=50, verbose_name='GB28181父设备ID')),
|
|
('camera_civilcode', models.CharField(max_length=50, verbose_name='行政区划码')),
|
|
('camera_last_keepalive_time', models.DateTimeField(auto_now_add=True, verbose_name='最近一次心跳时间')),
|
|
('camera_last_register_time', models.DateTimeField(auto_now_add=True, verbose_name='最近一次注册时间')),
|
|
('cascade_device_id', models.CharField(default='', max_length=50, verbose_name='向上级联国标编号')),
|
|
('cascade_enable', models.IntegerField(default=0, verbose_name='是否启用向上级联')),
|
|
('record_enable', models.IntegerField(default=0, verbose_name='启用24/7录像')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')),
|
|
('add_type', models.IntegerField(default=0, verbose_name='添加类型')),
|
|
('state', models.IntegerField(default=0, verbose_name='状态')),
|
|
('algorithm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='streams', to='app.algorithmmodel', verbose_name='分析算法')),
|
|
],
|
|
options={
|
|
'verbose_name': '视频流',
|
|
'verbose_name_plural': '视频流',
|
|
'db_table': 'av_stream',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='ZoneModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=100, verbose_name='区域名称')),
|
|
('coordinates', models.TextField(verbose_name='多边形坐标')),
|
|
('is_required', models.IntegerField(default=1, verbose_name='是否必需区域')),
|
|
('loiter_threshold', models.IntegerField(default=0, verbose_name='滞留阈值(秒)')),
|
|
('detect_interval_sec', models.FloatField(default=1.0, verbose_name='检测间隔(秒)')),
|
|
('detect_frames', models.IntegerField(default=1, verbose_name='检测帧数')),
|
|
('color', models.CharField(default='#169F85', max_length=20, verbose_name='显示颜色')),
|
|
('line_a', models.TextField(default='', verbose_name='警戒线端点A')),
|
|
('line_b', models.TextField(default='', verbose_name='警戒线端点B')),
|
|
('density_threshold', models.IntegerField(default=0, verbose_name='密度阈值')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
|
('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')),
|
|
('state', models.IntegerField(default=1, verbose_name='状态')),
|
|
('algorithms', models.ManyToManyField(blank=True, related_name='zones', to='app.bizalgorithmmodel', verbose_name='分析算法')),
|
|
('stream', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='所属摄像头')),
|
|
],
|
|
options={
|
|
'verbose_name': '区域',
|
|
'verbose_name_plural': '区域',
|
|
'db_table': 'av_zone',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='RecordingModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('file_path', models.CharField(max_length=500, verbose_name='文件路径')),
|
|
('start_time', models.DateTimeField(verbose_name='开始时间')),
|
|
('end_time', models.DateTimeField(verbose_name='结束时间')),
|
|
('duration', models.FloatField(default=0, verbose_name='时长(秒)')),
|
|
('file_size', models.BigIntegerField(default=0, verbose_name='文件大小(字节)')),
|
|
('has_motion', models.IntegerField(default=0, verbose_name='含运动')),
|
|
('has_object', models.IntegerField(default=0, verbose_name='含目标')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='入库时间')),
|
|
('stream', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='摄像头')),
|
|
],
|
|
options={
|
|
'verbose_name': '录像分段',
|
|
'verbose_name_plural': '录像分段',
|
|
'db_table': 'av_recording',
|
|
'indexes': [models.Index(fields=['stream', 'start_time'], name='av_recording_st_idx')],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='AlarmModel',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('event_type', models.CharField(default='entered_zone', max_length=32, verbose_name='报警类型')),
|
|
('description', models.CharField(default='', max_length=300, verbose_name='描述')),
|
|
('timestamp', models.DateTimeField(verbose_name='发生时间')),
|
|
('metadata', models.TextField(default='{}', verbose_name='元数据JSON')),
|
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='入库时间')),
|
|
('stream', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='摄像头')),
|
|
],
|
|
options={
|
|
'verbose_name': '报警',
|
|
'verbose_name_plural': '报警',
|
|
'db_table': 'av_alarm',
|
|
'indexes': [models.Index(fields=['-timestamp'], name='av_alarm_ts_idx'), models.Index(fields=['stream', 'timestamp'], name='av_alarm_st_idx')],
|
|
},
|
|
),
|
|
]
|