如何在django中使用yolov5模型
How to use yolov5 model in django
我想在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 视图中 运行 吗?
我尝试了 python 函数,例如 execfile() 和 os.system(),它们在 Python 脚本中以解释器的方式执行命令,但它没有正常工作。 (我认为 Django 和 Yolo 之间的路径是扭曲的。)
其实如果可能的话,最好像Keras那样把yoloapi作为一个模块来加载,运行它就像一个函数,而不是command的方式。
但是我找不到像模块之类的东西一样使用 yolov5 的方法。
我该如何解决这个问题?
请给我一些建议。
使用 Django 和 Yolov5 进行对象检测
我已经在 Github here 上上传了 Django-Yolov5 样板,以供参考。
Models.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 文件的入口。
Forms.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 %}
最初的简单网页:
检测后:
我想在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 视图中 运行 吗?
我尝试了 python 函数,例如 execfile() 和 os.system(),它们在 Python 脚本中以解释器的方式执行命令,但它没有正常工作。 (我认为 Django 和 Yolo 之间的路径是扭曲的。)
其实如果可能的话,最好像Keras那样把yoloapi作为一个模块来加载,运行它就像一个函数,而不是command的方式。 但是我找不到像模块之类的东西一样使用 yolov5 的方法。
我该如何解决这个问题? 请给我一些建议。
使用 Django 和 Yolov5 进行对象检测
我已经在 Github here 上上传了 Django-Yolov5 样板,以供参考。
Models.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 文件的入口。
Forms.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 %}
最初的简单网页:
检测后: