使用Django相关实现:首先,用户在页面点击“上传”按钮后可以上传本地MP4视频文件,文件的绝对地址与名称通过后端传入mysql数据库video表中。然后,点击“开始分析”按钮,后端获取视频文件地址,并将该文件作为我自己训练好的ST-Attention模型的输入,模型运行时前端显示“正在分析,请稍后”。其次,经过ST-Attention模型会输出100张图片与其地址,将所得地址与名称传入数据库test表中。最后用户点击“查看结果”可以在页面看到数据库中每隔20张的1张图片,这些图片是横着放置的。
时间: 2023-12-06 12:43:30 浏览: 210
实现这个功能需要进行以下几个步骤:
1. 在 Django 中创建一个包含上传文件和分析结果的页面,并添加相应的按钮和表单元素。
2. 编写后端代码,实现将用户上传的 MP4 文件保存到服务器上,并将文件的地址和名称存储到 MySQL 数据库 video 表中。
3. 在 Django 中集成你训练好的 ST-Attention 模型,并编写代码将用户上传的视频文件作为模型的输入,并将模型输出的 100 张图片及其地址存储到 MySQL 数据库 test 表中。
4. 在 Django 中编写代码,实现在页面上显示数据库中每隔 20 张图片的一张,这些图片是横着放置的。
下面是一个简单的实现示例:
1. 创建一个包含上传文件和分析结果的页面,并添加相应的按钮和表单元素。
```html
<!DOCTYPE html>
<html>
<head>
<title>视频分析系统</title>
</head>
<body>
<h1>视频分析系统</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<label for="video_file">上传视频文件:</label>
<input type="file" name="video_file" id="video_file">
<br><br>
<input type="submit" value="上传">
<br><br>
<button type="button" id="start_analysis">开始分析</button>
<br><br>
<div id="result"></div>
</form>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function() {
$("#start_analysis").click(function() {
$.ajax({
url: "{% url 'start_analysis' %}",
type: "POST",
data: {
csrfmiddlewaretoken: "{{ csrf_token }}"
},
beforeSend: function() {
$("#result").text("正在分析,请稍后...");
},
success: function(data) {
$("#result").html(data);
}
});
});
});
</script>
</body>
</html>
```
2. 编写后端代码,实现将用户上传的 MP4 文件保存到服务器上,并将文件的地址和名称存储到 MySQL 数据库 video 表中。
```python
from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Video
@csrf_exempt
def upload_video(request):
if request.method == "POST":
video_file = request.FILES.get("video_file")
if video_file:
video = Video(video_file=video_file)
video.save()
return HttpResponse("上传成功!")
return render(request, "upload_video.html")
```
3. 在 Django 中集成你训练好的 ST-Attention 模型,并编写代码将用户上传的视频文件作为模型的输入,并将模型输出的 100 张图片及其地址存储到 MySQL 数据库 test 表中。
```python
import os
import cv2
import numpy as np
from django.conf import settings
from .models import Video, Test
import torch
from .models import STAttention
def start_analysis(request):
video = Video.objects.order_by("-id").first()
if not video:
return HttpResponse("请先上传视频文件!")
video_path = os.path.join(settings.MEDIA_ROOT, str(video.video_file))
if not os.path.exists(video_path):
return HttpResponse("视频文件不存在!")
model = STAttention()
model.load_state_dict(torch.load("st_attention.pth", map_location=torch.device("cpu")))
model.eval()
cap = cv2.VideoCapture(video_path)
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))
print("视频帧数:{}".format(frame_count))
print("视频宽度:{}".format(frame_width))
print("视频高度:{}".format(frame_height))
print("视频帧率:{}".format(fps))
frame_indices = np.linspace(0, frame_count-1, 100, dtype=np.int64)
test_list = []
with torch.no_grad():
for i in frame_indices:
cap.set(cv2.CAP_PROP_POS_FRAMES, i)
ret, frame = cap.read()
if not ret:
continue
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame = cv2.resize(frame, (256, 256))
frame = np.transpose(frame, (2, 0, 1))
frame = np.expand_dims(frame, axis=0)
frame = torch.from_numpy(frame).float() / 255.0
prediction = model(frame)
prediction = prediction[0].numpy()
prediction = np.transpose(prediction, (1, 2, 0))
prediction = cv2.resize(prediction, (frame_width, frame_height))
test = Test(video=video, frame_index=i, image=prediction)
test_list.append(test)
Test.objects.bulk_create(test_list)
return HttpResponse("分析成功!共生成 {} 张图片。".format(len(test_list)))
```
4. 在 Django 中编写代码,实现在页面上显示数据库中每隔 20 张图片的一张,这些图片是横着放置的。
```python
def view_results(request):
tests = Test.objects.order_by("frame_index")
num_tests = len(tests)
if num_tests == 0:
return HttpResponse("还没有分析结果!")
image_list = []
for i in range(0, num_tests, 20):
test = tests[i]
image_path = os.path.join(settings.MEDIA_URL, str(test.image))
image_list.append(image_path)
return render(request, "view_results.html", {"image_list": image_list})
```
```html
<!DOCTYPE html>
<html>
<head>
<title>分析结果</title>
<style>
.image {
float: left;
margin-right: 10px;
}
</style>
</head>
<body>
<h1>分析结果</h1>
{% for image in image_list %}
<div class="image"><img src="{{ image }}"></div>
{% endfor %}
</body>
</html>
```
阅读全文