[PYTHON] "Classer les déchets par image!" Journal de création d'application jour6 ~ Correction de la structure des répertoires ~

introduction

"Classer les déchets par image!" Journal de création d'application Aujourd'hui, le 6ème jour, nous allons corriger la structure des répertoires. C'est léger parce que j'étais occupé aujourd'hui.


Liste d'articles

Synopsis jusqu'à la dernière fois

Dans les articles précédents, j'ai implémenté une application de reconnaissance d'image et l'ai mise sur Django, puis j'ai utilisé Bootstrap pour préparer le front-end. Le premier problème à ce stade est qu'il existe des descriptions en double dans les fichiers de modèle d'index et de résultat, qui peuvent être résolus en créant un fichier de base. Le deuxième problème est que je référence le fichier image à partir du HTML avec un chemin relatif, donc j'aimerais pouvoir le lire à partir du dossier statique.

Création de base.html

Migrez les descriptions en double dans l'index et le résultat vers la base. C'est parce qu'il est inefficace de jouer avec deux fichiers chaque fois que vous modifiez la conception à l'avenir.

garbage/templates/garbage/base.html


{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Classement des déchets par image!</title>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.4.2/css/all.css" integrity="sha384-/rXc/GQVaYpyDdyxK+ecHPVYJSN9bmVFBvjA/9eOB+pb3F2w2N6fc5qB9Ew5yIns" crossorigin="anonymous">
	<link rel="stylesheet" type="text/css" href="{% static 'garbage/css/bootstrap.css' %}" />
	<link rel="stylesheet" type="text/css" href="{% static 'garbage/css/style.css' %}" />
</head>
<body>
	<div id="wrapper">
		<button class="toggler d-md-none" type="button" id="toggler" data-toggle="collapse-side" data-target=".side-collapse">
			<i class="fas fa-bars fa-2x"></i>
		</button>
		<img src="{% static 'garbage/media/images/title.png' %}" alt="Classement des déchets par image!" class="m-4 pb-3" id="title">

		<div class="container row">
			<div class="card col-md-4 py-4 px-0 d-none d-md-block h-100" id="sidebar">
				<p role="button" class="mb-2 btn border-dark rounded-0 btn-secondary">Liens externes</p>
				<a href="https://manage.delight-system.com/threeR/web/bunbetsu?menu=bunbetsu&jichitaiId=kashiwashi&areaId=22125&areaName=%2F&lang=ja&benriCateId=7&bunbetsuCateId=7&faqCateId=%2F&howToCateId=&search=%E3%83%9A%E3%83%83%E3%83%88%E3%83%9C%E3%83%88%E3%83%AB&dummy=" class="btn btn-default border-dark mb-1 rounded-0" role="button" target="_blank" rel="noopener noreferrer">Recherche triée</a>
				<a href="https://manage.delight-system.com/threeR/web/benri?menu=benri&jichitaiId=kashiwashi&areaId=22125&benriCateId=7&bunbetsuCateId=7&faqCateId=%2f&lang=ja" class="btn btn-default border-dark mb-1 rounded-0" role="button" target="_blank" rel="noopener noreferrer">Comment séparer et éliminer les déchets</a>
			</div>

			{% block main %}{% endblock main %}

		</div>

		{% block second %}{% endblock second %}
		
		<footer>
			<p id="copyright" class="mb-0">Copyright &copy; 2020 eycjur All Rights Reserved.</p>
		</footer>
	</div>
</body>
</html>

Comme la description au début et la barre latérale sont courantes, utilisez base. La description de chaque fichier est saisie à la place de «{% block main%} {% endblock main%}».

Donc, si vous regardez à quoi ressemble chaque fichier,

garbage/templates/garbage/index.html


{% extends "garbage/base.html" %}
{% load static %}

{% block main %}
<div class="col-md-8">
	<div class="container card p-4 h-100">
		<p>Veuillez saisir l'image dont vous souhaitez vérifier la classification</p>
		<form action="{% url "garbage:result" %}" method="post" enctype="multipart/form-data">
			{% csrf_token %}
			{{ form }}
			<br>
			<button type="submit" class="mt-3 wait-disappear">Trouver!</button>
		</form>
	</div>
</div>
{% endblock main %}

{% block second %}
<h4>Utiliser des images existantes</h4>
<div class="container row">
	<div class="col-md-6 p-3">
		<a href='{% url "garbage:result_num" num=1 %}'>
			<img src="{% static 'garbage/media/images/temp1.jpg' %}" alt="Image 1" class="sample-img">
		</a>
	</div>
	<div class="col-md-6 p-3">
		<a href='{% url "garbage:result_num" num=2 %}'>
			<img src="{% static 'garbage/media/images/temp2.jpg' %}" alt="Image 2" class="sample-img">
		</a>
	</div>
</div>
{% endblock second %}

En n'écrivant que la partie minimale, je pense que vous pouvez dire que c'est assez soigné comme ça.

Corriger le placement des fichiers image

Image complète

Tout d'abord, décidez du type de structure de répertoires que vous souhaitez. Cette fois, la configuration est la suivante.

garbage_proj ├garbage_proj │ └settings.py etc. ├garbage │ └views.py etc. └static   └garbage    ├css    │ └style.css    └media     └images └image.png etc.

chemins statiques et multimédias

Tout d'abord, définissons les chemins statiques et multimédias.

garbage_proj/setting.py


STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

MEDIA_ROOT = os.path.join(BASE_DIR, 'static/garbage/media')
MEDIA_URL = '/media/'

Maintenant, puisque BASE_DIR est le dossier garbage_proj d'origine, vous pouvez voir que vous pouvez spécifier respectivement les dossiers static et media. En faisant cela, vous pouvez l'utiliser en lisant le répertoire static, donc spécifiez l'image comme <img src =" {% static'garbage / media / images / title.png '%} "> dans le fichier modèle. Je peux le faire.

Je décrirai sur cette base.

garbage/templates/garbage/result.html


{% extends "garbage/base.html" %}
{% load static %}

{% block main %}
<div class="col-md-8">
	<div class="container card p-4 px-5">
		<h2 class="m-3">Résultat de la classification</h2>
		<img src="{% static 'garbage/media/images/image.png' %}" alt="image" id="result-img">
		<div class="container">
			<table class="table">
				<tr><th>Classification</th><td>probabilité</td><td>Jour de collecte</td></tr>
				{% for key, value, day in pred %}
				<tr><th>{{ key }}</th><td>{{ value }}%</td><td>{{ day }}</td></tr>
				{% endfor %}
			</table>
			<a href="{% url "garbage:index" %}">Retour au sommet</a>
		</div>
	</div>
</div>
{% endblock main %}

Écrire de cette manière élimine le besoin d'écrire des chemins relatifs, vous pouvez donc unifier le routage.

garbage/templates/garbage/index.html


{% extends "garbage/base.html" %}
{% load static %}

{% block main %}
<div class="col-md-8">
	<div class="container card p-4 h-100">
		<p>Veuillez saisir l'image dont vous souhaitez vérifier la classification</p>
		<form action="{% url "garbage:result" %}" method="post" enctype="multipart/form-data">
			{% csrf_token %}
			{{ form }}
			<br>
			<button type="submit" class="mt-3 wait-disappear">Trouver!</button>
		</form>
	</div>
</div>
{% endblock main %}

{% block second %}
<h4>Utiliser des images existantes</h4>
<div class="container row">
	<div class="col-md-6 p-3">
		<a href='{% url "garbage:result_num" num=1 %}'>
			<img src="{% static 'garbage/media/images/temp1.jpg' %}" alt="Image 1" class="sample-img">
		</a>
	</div>
	<div class="col-md-6 p-3">
		<a href='{% url "garbage:result_num" num=2 %}'>
			<img src="{% static 'garbage/media/images/temp2.jpg' %}" alt="Image 2" class="sample-img">
		</a>
	</div>
</div>
{% endblock second %}

Le paramètre num est spécifié et passé à result_num de l'application garbage. De plus, le urls.py qui gère cela ressemble à ceci:

garbage/urls.py


from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
from . import views

app_name="garbage"
urlpatterns = [
    path("", views.index, name="index"),
    path("result", views.result, name="result"),
    path("result/<int:num>", views.result, name="result_num"),
]

La même fonction appelée «result» est assignée à «result_num», en passant des paramètres.

garbage/views.py (partiellement omis)


def result(request, num=0):
    if num:
        img = "./static/garbage/media/images/" + ["temp1.jpg ", "temp2.jpg "][num-1]

    else:
        form = UploadPictureForm(request.POST, request.FILES)
        if form.is_valid():
            img = form.cleaned_data["img"]
        else:
            params = {
                "form":UploadPictureForm()
            }
            return render(request, "garbage/index.html", params)

    pred = predict(img)

    params = {
        "img":img,
        "pred":pred
    }
    return render(request, "garbage/result.html", params)

J'ai pu utiliser l'image existante lorsque l'échantillon a été sélectionné.

enfin

Avec ce qui précède, je pense que la structure des fichiers est devenue beaucoup plus facile à comprendre. Le développement futur sera beaucoup plus facile! D'ailleurs, lorsque j'écrivais cet article, j'ai appris pour la première fois que le langage django pouvait être spécifié dans le bloc de code. C'est très pratique car il hérite des surlignages de la syntaxe HTML et rend le modèle django plus facile à voir.

Recommended Posts

"Classer les déchets par image!" Journal de création d'application jour6 ~ Correction de la structure des répertoires ~
"Classer les déchets par image!" Journal de création d'application day8 ~ déploiement heroku ~
"Classer les déchets par image!" Journal de création d'application jour1 ~ Création de l'ensemble de données ~
"Classer les déchets par image!" Journal de création d'application day2 ~ Mise au point avec VGG16 ~
"Classer les déchets par image!" Journal de création d'application day5 ~ Préparez le frontal avec Bootstrap 2 ~
"Classer les déchets par image!" Journal de création d'application day4 ~ Préparez le frontal avec Bootstrap ~
Juge Yosakoi Naruko par classification d'image de Tensorflow.
[PyTorch] Classification des images du CIFAR-10