【Python】 Django 后端物体检测

概要

本文主要介绍利用前端Vue+后端Django框架搭建一个简单的web应用,集成训练好的目标检测模型,输出相关的物体类别信息。

整体架构流程

开发过程中使用Vue 3、TypeScript、Element Plus和Axios,确保已经安装了相关环境,此处只演示整个流程与最终结果,对安装细节不做讲解。

利用Vue3+TypeScript搭建前端图像上传模块,后端利用Django框架接收相关图像数据,加载相关的目标检测模型,将识别的后的目标信息回传给前端页面。
整体逻辑

技术细节

前端搭建

首先在Vue项目中创建一个包含图片上传的组件

 <div>
    <el-card shadow="never" :style="elStyle">
      <template #header>
        <div class="card-header">
          <span>当前检测的物体为:{{ message_V }}</span>
        </div>
      </template>
      <el-form
      label-position= "left"
      label-width="100px"
      :model="formLabelAlign"
      style="max-width: 460px"
      >
        <el-form-item label="检测模型选择">
          <el-select v-model="formLabelAlign.select" placeholder="Select">
          <el-option
            v-for="item in options"
            :key="item.value"
            :label="item.label"
            :value="item.value"
            :disabled="item.disabled"
          />
        </el-select>
        </el-form-item>
        <!-- <el-form-item label="Activity zone">
          <el-input v-model="formLabelAlign.region" />
        </el-form-item>
        <el-form-item label="Activity form">
          <el-input v-model="formLabelAlign.type" />
        </el-form-item> -->
        <el-form-item
          label="上传图像:">
              <el-upload
                ref="upload"
                list-type="picture-card"
                :auto-upload="false"
                :on-change="handleChange"
                :on-exceed="handleExceed"
                :limit="1"
              >
          
          </el-upload>
        </el-form-item>
          <el-button type="primary" @click="handleUpload">
          Upload
          </el-button>
        </el-form>
      </el-card>
    </div>

可视化效果如下
前端物体检测界面
这里我们采用的是densenet121识别模型

前端接口

这里我们将获取到的图像信息通过 getImage_Info 接口传输至baseUrlApi封装后的后端路由中,本地测试中存在跨域问题,可以进行跨域代理

export const baseUrlApi = (url: string) => `/api/${url}`;

type Result = {
  success: boolean;
  data: Array<any>;
};

export const getImage_Info = (data?: object) => {
  return http.request<Result>("post", baseUrlApi("getAsyncRoutes_2/"), { data });
};

这里我们使用的是Vite进行相关的代理,具体可以查看相关的说明文档

    // 服务端渲染
    server: {
      // 是否开启 https
      https: false,
      // 端口号
      port: VITE_PORT,
      host: "0.0.0.0",
      // 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
      proxy: {
        "/api": {
          // 这里填写后端地址
          target: "http://127.0.0.1:8000",
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, "")
        }
      }
    },

后端接口

后端Django相关的安装教程很多,此处略去,直接进入接口编写。
申请好相关的APP应用后,在setting.py内加入以下语句,保证可以接收到前端的相关请求

CSRF_TRUSTED_ORIGINS = [
    "http://localhost:8080", # 发起请求的地址,不需要添加http和端口
]

请求
在urls.py内加入前端请求的接口地址 getAsyncRoutes_2

from app01.views import index
#这里的app01是已经创建好的应用,index是app01中定义的一个函数 前端传输的信息会分配给app01的index函数
urlpatterns = [
    path("admin/", admin.site.urls),
    path('getAsyncRoutes_2/', index, name='index'),
]

后端模型

将模型封装至get_prediction函数中,输出相关图像的标签信息

def index(request):
    image_uri = None
    predicted_label = None
    Temp_Msg = None
    if request.method == 'POST':
        Temp_Msg = 'true'
        image_bytes = request.body  # 二进制图像数据
        img = Image.open(BytesIO(image_bytes))
        buf = BytesIO()
        img.save(buf, 'JPEG')
        buf.seek(0)
        img_data = buf.read()
        buf.close()
        try:
            # image_data = transform_image_M(img_data)
            predicted_label = get_prediction(img_data)
        except RuntimeError as re:
            print(re)
                # predicted_label = "Prediction Error"

    else:
        Temp_Msg = 'false'
        # form = ImageUploadForm()

    print(predicted_label)
    context = {
        'success': Temp_Msg,
        # 'image_uri': image_uri,
        'data': predicted_label,
    }
    return JsonResponse(context)
    # return render(request,"Index.html", context)

图像处理细节

model = models.densenet121(pretrained=True)
model.eval()

json_path = os.path.join('.\static/', "imagenet_class_index.json")#标签相关的文件
imagenet_mapping = json.load(open(json_path))

def transform_image(image_bytes):
    """
    Transform image into required DenseNet format: 224x224 with 3 RGB channels and normalized.
    Return the corresponding tensor.
    """
    my_transforms = transforms.Compose([transforms.Resize(255),
                                        transforms.CenterCrop(224),
                                        transforms.ToTensor(),
                                        transforms.Normalize(
                                            [0.485, 0.456, 0.406],
                                            [0.229, 0.224, 0.225])])
    image = Image.open(io.BytesIO(image_bytes))
    return my_transforms(image).unsqueeze(0)

def get_prediction(image_bytes):
    """For given image bytes, predict the label using the pretrained DenseNet"""
    tensor = transform_image(image_bytes)
    outputs = model.forward(tensor)
    _, y_hat = outputs.max(1)
    predicted_idx = str(y_hat.item())
    class_name, human_label = imagenet_mapping[predicted_idx]
    return human_label

前端展示

检测结果

小结

模型封装还是不够数量,还有一些细节处理的不够好 后续慢慢优化。
详细代码

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
【资源说明】 基于Djangopython实现的流量检测模型系统源码+项目说明.zip `data_cut/`存放按照五元组切割后的流量样本 `data_raw/`存放流量收集来的原始样本 `feature_extract/`存放特征提取后的训练和测试样本 `flow_cut/`按照五元组切割流量样本模块 `flow_collect/`采集流量模块 `model_train/`模型训练模块 `model_test/`模型测试模块 `result_show/`结果展示模块 `flow_system/`配置模块 `home`主页模块 `requirement.txt`配置要求 `manage.py`django主要运行程序 ## Data `data_raw`存放流量收集来的原始样本 `data_cut`存放按照五元组切割后的流量样本,其中`flow/`存放普通流量,`tls/`存放加密流量 `feature_extract/`存放特征提取后的特征,其中`image/`存放图片特征,`flow/`存放流级特征,`tls/`存放加密特征,详细命名规则请看每个文件夹中的readme.txt ## Model VMT HAE WVM ## Model_save `model_save/`存放WVM训练好模型 `modelSaved/`存放VMT和HAE训练好模型 ## Settings `flow_system/settings`中,`DATABASES`设置数据库账号与密码,默认数据库为mysql ## Use `python manage.py migrate flow_cut`建立数据库标项 `python manage.py migrate flow_collect`建立数据库标项 `python manage.py migrate feature_extract`建立数据库标项 `python manage.py migrate model_test`建立数据库标项 `python manage.py makemigrations`保存数据库变动 `python manage.py runserver`运行本地服务器 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱神的箭呵呵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值