python - 如何在django中使用yolov5模型

标签 python django module yolo yolov5

我想在django中使用yolov5模型,但是遇到了麻烦。

我想做的是 如果用户将图像上传到django服务器,使用yolov5模型进行对象检测,然后将结果显示在网络上。这个过程本身很简单。 但我不确定如何附加 yolov5 api 和 django。

用过yolo的都知道,yolo基本上是通过命令运行api。

!python train.py --img 512 --batch 16 --epochs 100 --data ~~   # for training
!python detect.py --weights'/content/yolov5/runs/~~            # for detection

有什么方法可以在 Django View 中运行它吗?

我尝试了 execfile() 和 os.system() 等 python 函数,这些函数在 Python 脚本中以解释器的方式执行命令,但它无法正常工作。 (我认为 Django 和 Yolo 之间的路径是扭曲的。)

其实如果可能的话,最好像Keras那样把yolo api作为一个模块来加载,像函数一样运行,而不是command的方式。 但是我找不到像模块之类的东西一样使用 yolov5 的方法。

我该如何解决这个问题? 请给我一些建议。

最佳答案

使用 Django 和 Yolov5 进行目标检测

使用 yolov5 配置你的 Django 项目:

我已经上传了 django-object-detection here , 方便引用。

模型.py:

import os

from django.db import models
from django.utils.translation import gettext_lazy as _


class ImageModel(models.Model):
    image = models.ImageField(_("image"), upload_to='images')

    class Meta:
        verbose_name = "Image"
        verbose_name_plural = "Images"

    def __str__(self):
        return str(os.path.split(self.image.path)[-1])

Views.py:

import io
from PIL import Image as im
import torch

from django.shortcuts import render
from django.views.generic.edit import CreateView

from .models import ImageModel
from .forms import ImageUploadForm


class UploadImage(CreateView):
    model = ImageModel
    template_name = 'image/imagemodel_form.html'
    fields = ["image"]

    def post(self, request, *args, **kwargs):
        form = ImageUploadForm(request.POST, request.FILES)
        if form.is_valid():
            img = request.FILES.get('image')
            img_instance = ImageModel(
                image=img
            )
            img_instance.save()

            uploaded_img_qs = ImageModel.objects.filter().last()
            img_bytes = uploaded_img_qs.image.read()
            img = im.open(io.BytesIO(img_bytes))

            # Change this to the correct path
            path_hubconfig = "absolute/path/to/yolov5_code"
            path_weightfile = "absolute/path/to/yolov5s.pt"  # or any custom trained model

            model = torch.hub.load(path_hubconfig, 'custom',
                               path=path_weightfile, source='local')

            results = model(img, size=640)
            results.render()
            for img in results.imgs:
                img_base64 = im.fromarray(img)
                img_base64.save("media/yolo_out/image0.jpg", format="JPEG")

            inference_img = "/media/yolo_out/image0.jpg"

            form = ImageUploadForm()
            context = {
                "form": form,
                "inference_img": inference_img
            }
            return render(request, 'image/imagemodel_form.html', context)

        else:
            form = ImageUploadForm()
        context = {
            "form": form
        }
        return render(request, 'image/imagemodel_form.html', context)

在这个views.py中可以修改很多,比如添加更多的功能和逻辑,但这里的目的是连接yolov5和Django。 views.py 中的配置最为重要,因为它是通往 yolov5 hubconf.py 文件的入口。

表格.py

from django import forms
from .models import ImageModel


class ImageUploadForm(forms.ModelForm):
    class Meta:
        model = ImageModel
        fields = ['image']

Imagemodel_form.html

{% extends "base.html" %}
{% load crispy_forms_tags %}


{% block leftbar %}
    <div class="col-sm-3">

    </div>
{% endblock leftbar %} 


{% block content %}
    <div class="col-sm-9">
        <div id="uploadedImage"></div>
            <div class="mt-4">
                <form action="" enctype="multipart/form-data" id="imageUploadForm" method="post"> 
                    {% csrf_token %}
                    {{ form|crispy }}
                    <button class="btn btn-outline-success" type="submit">Submit</button>
                </form>
            </div>
        </div>
        <div class="mt-4">
            {% if inference_img %}
                <img src="{{inference_img}}" class="img-fluid" />
            {% else %}
                The inferenced image will be displayed here.
            {% endif %}
        </div>    
    </div>
{% endblock content %}

最初的简单网页:

enter image description here

检测后:

enter image description here

关于python - 如何在django中使用yolov5模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64002542/

相关文章:

module - 使用 waf 构建 fortran 库,安装 .mod 文件

plugins - Intellij IDEA 看不到插件模块

python - Python 中的特殊字符模式匹配

python - 在 Python 中为 Pig 编写 UDF

python - 使用 multiprocessing.Manager.list 而不是真正的列表会使计算花费很长时间

python - XlsxWriter导出的文件有时无法被Numbers打开

Django反向ForeignKey查找返回None

python - 如何在 Django 中比较表单输入和数据库值?

javascript - Webpack 使用 Emscripten 抛出错误 : Can't resolve 'fs'

python - 如何检查是否为字典定义了值变量?