在Django中覆盖保存模型

时间:2019-12-02 06:06:28

标签: python django opencv

我想覆盖模型中的保存按钮以运行脚本。我的脚本包含Tensorflow代码。因此,我想做的是使上载的图像在脚本中运行,然后结果图像将保存在媒体中。我的脚本包含总计数值,因此我想将其保存在模型中。请帮忙。

Model.py

from django.db import models

# Import packages
import os
import cv2
import numpy as np
import tensorflow as tf
import sys

# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")

# Import utilites
from utils import label_map_util
from utils import visualization_utils as vis_util

from api import object_counting_api
from django.conf import settings
from django.shortcuts import render

class District_1_2018(models.Model):
barangay = models.CharField(max_length=255)
totalarea = models.CharField(max_length=10)
image = models.ImageField(upload_to='result/2018/district1') 
totalcount = models.CharField(max_length=10)

def __str__(self):
    return self.barangay

Forms.py

class District_1_2018Form(forms.ModelForm): 
class Meta: 
    model = District_1_2018
    fields = ['barangay', 'totalarea', 'image', 'totalcount'] 

我的脚本

  # Name of the directory containing the object detection module we're using
  MODEL_NAME = 'inference_graph'
  IMAGE_NAME = 'Burol.png'

  # Grab path to current working directory
  CWD_PATH = os.getcwd()

  # Path to frozen detection graph .pb file, which contains the model that is used
  # for object detection.
  PATH_TO_CKPT = os.path.join(CWD_PATH,MODEL_NAME,'frozen_inference_graph.pb')

  # Path to label map file
  PATH_TO_LABELS = os.path.join(CWD_PATH,'training','labelmap.pbtxt')

  # Path to image
  PATH_TO_IMAGE = os.path.join(CWD_PATH,IMAGE_NAME)

  # Number of classes the object detector can identify
  NUM_CLASSES = 2

  # Load the label map.
  # Label maps map indices to category names, so that when our convolution
  # network predicts `5`, we know that this corresponds to `king`.
  # Here we use internal utility functions, but anything that returns a
  # dictionary mapping integers to appropriate string labels would be fine
  label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
  categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
  category_index = label_map_util.create_category_index(categories)

  # Load the Tensorflow model into memory.
  detection_graph = tf.Graph()
  with detection_graph.as_default():
      od_graph_def = tf.GraphDef()
      with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
          serialized_graph = fid.read()
          od_graph_def.ParseFromString(serialized_graph)
          tf.import_graph_def(od_graph_def, name='')

      sess = tf.Session(graph=detection_graph)

  # Define input and output tensors (i.e. data) for the object detection classifier

  # Input tensor is the image
  image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')

  # Output tensors are the detection boxes, scores, and classes
  # Each box represents a part of the image where a particular object was detected
  detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')

  # Each score represents level of confidence for each of the objects.
  # The score is shown on the result image, together with the class label.
  detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
  detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')

  # Number of objects detected
  num_detections = detection_graph.get_tensor_by_name('num_detections:0')

  # Load image using OpenCV and
  # expand image dimensions to have shape: [1, None, None, 3]
  # i.e. a single-column array, where each item in the column has the pixel RGB value
  image = cv2.imread(PATH_TO_IMAGE)
  image_expanded = np.expand_dims(image, axis=0)

  # Perform the actual detection by running the model with the image as input
  (boxes, scores, classes, num) = sess.run(
      [detection_boxes, detection_scores, detection_classes, num_detections],
      feed_dict={image_tensor: image_expanded})

  # Draw the results of the detection (aka 'visulaize the results')

  vis_util.visualize_boxes_and_labels_on_image_array(
      image,
      np.squeeze(boxes),
      np.squeeze(classes).astype(np.int32),
      np.squeeze(scores),
      category_index,
      use_normalized_coordinates=True,
      line_thickness=1,
      min_score_thresh=0.50)

  # All the results have been drawn on image. Now display the image.
  path = 'media/result/2018/district1'
  cv2.imwrite(os.path.join(path , 'Burol.png'), image)
  from utils.visualization_utils import treecount

  value = treecount

这就是我尝试过的。

class District_1_2018(models.Model):
barangay = models.CharField(max_length=255)
totalarea = models.CharField(max_length=10)
image = models.ImageField(upload_to='result/2018/district1') 
totalcount = models.CharField(max_length=10)

def __str__(self):
    return self.barangay

def save(self, *args, **kwargs):
# Name of the directory containing the object detection module we're using
MODEL_NAME = 'inference_graph'
IMAGE_NAME = self.image

# Grab path to current working directory
CWD_PATH = os.getcwd()

# Path to frozen detection graph .pb file, which contains the model that is used
# for object detection.
PATH_TO_CKPT = os.path.join(CWD_PATH,MODEL_NAME,'frozen_inference_graph.pb')

# Path to label map file
PATH_TO_LABELS = os.path.join(CWD_PATH,'training','labelmap.pbtxt')

# Path to image
PATH_TO_IMAGE = IMAGE_NAME

# Number of classes the object detector can identify
NUM_CLASSES = 2

# Load the label map.
# Label maps map indices to category names, so that when our convolution
# network predicts `5`, we know that this corresponds to `king`.
# Here we use internal utility functions, but anything that returns a
# dictionary mapping integers to appropriate string labels would be fine
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES, use_display_name=True)
category_index = label_map_util.create_category_index(categories)

# Load the Tensorflow model into memory.
detection_graph = tf.Graph()
with detection_graph.as_default():
    od_graph_def = tf.GraphDef()
    with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
        serialized_graph = fid.read()
        od_graph_def.ParseFromString(serialized_graph)
        tf.import_graph_def(od_graph_def, name='')

    sess = tf.Session(graph=detection_graph)

# Define input and output tensors (i.e. data) for the object detection classifier

# Input tensor is the image
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')

# Output tensors are the detection boxes, scores, and classes
# Each box represents a part of the image where a particular object was detected
detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')

# Each score represents level of confidence for each of the objects.
# The score is shown on the result image, together with the class label.
detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')

# Number of objects detected
num_detections = detection_graph.get_tensor_by_name('num_detections:0')

# Load image using OpenCV and
# expand image dimensions to have shape: [1, None, None, 3]
# i.e. a single-column array, where each item in the column has the pixel RGB value
image = cv2.imread(PATH_TO_IMAGE)
image_expanded = np.expand_dims(image, axis=0)

# Perform the actual detection by running the model with the image as input
(boxes, scores, classes, num) = sess.run(
    [detection_boxes, detection_scores, detection_classes, num_detections],
    feed_dict={image_tensor: image_expanded})

# Draw the results of the detection (aka 'visulaize the results')

vis_util.visualize_boxes_and_labels_on_image_array(
    image,
    np.squeeze(boxes),
    np.squeeze(classes).astype(np.int32),
    np.squeeze(scores),
    category_index,
    use_normalized_coordinates=True,
    line_thickness=1,
    min_score_thresh=0.50)

# All the results have been drawn on image. Now display the image.
path = 'media/result/2018/district1'
cv2.imwrite(os.path.join(path , 'Burol.png'), image)

from utils.visualization_utils import treecount
totalcount = treecount

    super(District_1_2018, self).save(*args, **kwargs)

但是我遇到了这个错误。

TypeError at /admin/tcqd/district_1_2018/add/
<built-in function imread> returned NULL without setting an error

C:\tensorflow4\models\research\object_detection\tcqdsite\tcqd\models.py in save
    109. image = cv2.imread(IMAGE_NAME) 

1 个答案:

答案 0 :(得分:0)

而不是覆盖模型的save,请尝试使用Django pre_save信号。与save被覆盖相比,它具有许多优点,主要是它使您的自定义逻辑与Django代码本身分离。

它还为您提供了以后在某个时候修改业务逻辑的灵活性,而不是使用内置的save方法,不要忘记,如果您的自定义逻辑又大又复杂,它将使{{1} }方法也不必要地复杂。

Django Pre Save