video_monitor/app/migrations/0001_initial.py

222 lines
16 KiB
Python
Raw Normal View History

2026-09-04 18:16:14 +08:00
# 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')],
},
),
]