Как загрузить файл изображения, измененный OpenCV, используя FileSystemStorage в Django?

Я принимаю загруженное изображение от пользователя и затем отправляю его в модель YOLO, которая затем возвращает мне изображение.

Я хочу сохранить полученное изображение в локальной директории и затем отобразить его на пользовательском интерфейсе.

Это код views.py, который принимает изображение и отправляет его в модель Yolo Model,

def predictImage(request):
    # print(request)
    # print(request.POST.dict())
    fileObj = request.FILES['filePath']
    fs = FileSystemStorage()
    filePathName = fs.save(fileObj.name, fileObj)
    filePathName = fs.url(filePathName)
    testimage = '.'+filePathName
    # img = image.load_img(testimage, target_size=(img_height, img_width))
    img = detect_image(testimage)
    filePathName = fs.save(fileObj.name + "_result", img) # -> HERE IS THE ERROR
    filePathName = fs.url(filePathName)

Это функция модели YOLO, которая использует OpenCV для чтения изображения (изображение передается как аргумент функции) и затем возвращает это изображение,

import numpy as np
import cv2

def detect_image(img_path):

    confidenceThreshold = 0.5
    NMSThreshold = 0.3

    modelConfiguration = 'cfg/yolov3.cfg'
    modelWeights = 'yolov3.weights'

    labelsPath = 'coco.names'
    labels = open(labelsPath).read().strip().split('\n')

    np.random.seed(10)
    COLORS = np.random.randint(0, 255, size=(len(labels), 3), dtype="uint8")

    net = cv2.dnn.readNetFromDarknet(modelConfiguration, modelWeights)

    image = cv2.imread(img_path)
    (H, W) = image.shape[:2]

    #Determine output layer names
    layerName = net.getLayerNames()
    layerName = [layerName[i - 1] for i in net.getUnconnectedOutLayers()]

    blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB = True, crop = False)
    net.setInput(blob)
    layersOutputs = net.forward(layerName)

    boxes = []
    confidences = []
    classIDs = []

    for output in layersOutputs:
        for detection in output:
            scores = detection[5:]
            classID = np.argmax(scores)
            confidence = scores[classID]
            if confidence > confidenceThreshold:
                box = detection[0:4] * np.array([W, H, W, H])
                (centerX, centerY,  width, height) = box.astype('int')
                x = int(centerX - (width/2))
                y = int(centerY - (height/2))

                boxes.append([x, y, int(width), int(height)])
                confidences.append(float(confidence))
                classIDs.append(classID)

    #Apply Non Maxima Suppression
    detectionNMS = cv2.dnn.NMSBoxes(boxes, confidences, confidenceThreshold, NMSThreshold)

    if(len(detectionNMS) > 0):
        for i in detectionNMS.flatten():
            (x, y) = (boxes[i][0], boxes[i][1])
            (w, h) = (boxes[i][2], boxes[i][3])

            color = [int(c) for c in COLORS[classIDs[i]]]
            cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
            text = '{}: {:.4f}'.format(labels[classIDs[i]], confidences[i])
            cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    
    return image 
    
    #cv2.imshow('Image', image)
    #cv2.waitKey(0)

В этой строке,

filePathName = fs.save(fileObj.name + "_result", img)

Я получаю следующую ошибку,

'numpy.ndarray' object has no attribute 'read'

Я не уверен, как я могу решить эту проблему. Я пробовал искать, как я могу хранить OpenCV Modified файл с помощью FileSystemStorage, но не нашел ничего полезного. Может ли кто-нибудь помочь мне в этом?

Вы можете использовать функцию imwrite библиотеки cv2 для хранения файлов в локальном каталоге, т.е.

В вашем случае просто сделайте следующее,

img = detect_image(testimage)
cv2.imwrite(fileObj.name+"_result.jpg", img=img) 
Вернуться на верх