Python Pytorch Executable在从Anaconda提示符运行时可以工作,但不能从Cmd或.exe运行?

Python Pytorch Executable在从Anaconda提示符运行时可以工作,但不能从Cmd或.exe运行?,python,pytorch,pyinstaller,Python,Pytorch,Pyinstaller,我打包(使用Pyinstaller)了一个简约的Yolo github repo的小变体,发现,打包是使用Pyinstaller完成的,使用Flask作为服务器运行对象检测 因此,在尝试运行服务器时,它仅在从Anaconda提示符(我编写pyinstaller命令的地方)运行时工作,除此之外,还会发生以下错误 从(exe、Cmd、PowerShell)运行时出现的错误是: 但是,当在conda中运行时,代码运行良好。 所以我怀疑这是PyTorch依赖的问题 当前代码: from __future

我打包(使用Pyinstaller)了一个简约的Yolo github repo的小变体,发现,打包是使用Pyinstaller完成的,使用Flask作为服务器运行对象检测

因此,在尝试运行服务器时,它仅在从Anaconda提示符(我编写pyinstaller命令的地方)运行时工作,除此之外,还会发生以下错误

从(exe、Cmd、PowerShell)运行时出现的错误是:

但是,当在conda中运行时,代码运行良好。 所以我怀疑这是PyTorch依赖的问题

当前代码:

from __future__ import division

from flask import Flask, Response, jsonify
app = Flask(__name__)

from models import *
from utils.utils import *
from utils.datasets import *

import os
import sys
import time
import datetime
import argparse

from PIL import Image

import torch
from torch.utils.data import DataLoader
from torchvision import datasets
from torch.autograd import Variable

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.ticker import NullLocator

import cv2 
import time 
import json


@app.route('/CheckIfRunning')
def CheckIfRunning():
    return '1'

@app.route('/detect')
def Hello():
    global device
    global model
    global classes
    global colors
    global Tensor
    global a
    img=cv2.imread("temp.jpg")
    PILimg = np.array(Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)))
    imgTensor = transforms.ToTensor()(PILimg)
    imgTensor, _ = pad_to_square(imgTensor, 0)
    imgTensor = resize(imgTensor, 416)
    #add the batch size
    imgTensor = imgTensor.unsqueeze(0)
    imgTensor = Variable(imgTensor.type(Tensor))
    with torch.no_grad():
        detections = model(imgTensor)
        detections = non_max_suppression(detections,0.8, 0.4)
    a.clear()

    Return={}
    ReturnCounter=0
    if detections is not None:
            a.extend(detections)
            b=len(a)
            if len(a)  :
                for detections in a:
                    if detections is not None:
                        detections = rescale_boxes(detections, 416, PILimg.shape[:2])
                        unique_labels = detections[:, -1].cpu().unique()
                        n_cls_preds = len(unique_labels)
                        for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:
                            box_w = x2 - x1
                            box_h = y2 - y1
                            color = [int(c) for c in colors[int(cls_pred)]]
                            img = cv2.rectangle(img, (x1, y1 + box_h), (x2, y1), color, 2)
                            cv2.putText(img, classes[int(cls_pred)], (x1, y1),     cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
                            cv2.putText(img, str("%.2f" % float(conf)), (x2, y2 - box_h), cv2.FONT_HERSHEY_SIMPLEX, 0.5,color, 2)
                            Return[ReturnCounter]=    [x1.item(),y1.item(),x2.item(),y2.item(),conf.item(),cls_conf.item(),classes[int(cls_pred)]]
                            ReturnCounter+=1
                        cv2.imwrite("Temp2.jpg",img)
                        return Return
                

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Set up model
model = Darknet("config/yolov3.cfg", img_size=416).to(device)

model.load_darknet_weights("weights/yolov3.weights")

model.eval()  # Set in evaluation mode

classes = load_classes("data/coco.names")  # Extracts class labels from file
colors = np.random.randint(0, 255, size=(len(classes), 3), dtype="uint8")
Tensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor

a=[]
app.run(threaded=True) 

好的,这是pyinstaller的一个问题

如果Pytorch是使用Conda安装的,那么它需要CUDANN,并且无法使用它(即没有该环境)

如果你想让它在任何地方都能工作,Pytorch必须使用pip安装

作为参考,

from __future__ import division

from flask import Flask, Response, jsonify
app = Flask(__name__)

from models import *
from utils.utils import *
from utils.datasets import *

import os
import sys
import time
import datetime
import argparse

from PIL import Image

import torch
from torch.utils.data import DataLoader
from torchvision import datasets
from torch.autograd import Variable

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.ticker import NullLocator

import cv2 
import time 
import json


@app.route('/CheckIfRunning')
def CheckIfRunning():
    return '1'

@app.route('/detect')
def Hello():
    global device
    global model
    global classes
    global colors
    global Tensor
    global a
    img=cv2.imread("temp.jpg")
    PILimg = np.array(Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)))
    imgTensor = transforms.ToTensor()(PILimg)
    imgTensor, _ = pad_to_square(imgTensor, 0)
    imgTensor = resize(imgTensor, 416)
    #add the batch size
    imgTensor = imgTensor.unsqueeze(0)
    imgTensor = Variable(imgTensor.type(Tensor))
    with torch.no_grad():
        detections = model(imgTensor)
        detections = non_max_suppression(detections,0.8, 0.4)
    a.clear()

    Return={}
    ReturnCounter=0
    if detections is not None:
            a.extend(detections)
            b=len(a)
            if len(a)  :
                for detections in a:
                    if detections is not None:
                        detections = rescale_boxes(detections, 416, PILimg.shape[:2])
                        unique_labels = detections[:, -1].cpu().unique()
                        n_cls_preds = len(unique_labels)
                        for x1, y1, x2, y2, conf, cls_conf, cls_pred in detections:
                            box_w = x2 - x1
                            box_h = y2 - y1
                            color = [int(c) for c in colors[int(cls_pred)]]
                            img = cv2.rectangle(img, (x1, y1 + box_h), (x2, y1), color, 2)
                            cv2.putText(img, classes[int(cls_pred)], (x1, y1),     cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
                            cv2.putText(img, str("%.2f" % float(conf)), (x2, y2 - box_h), cv2.FONT_HERSHEY_SIMPLEX, 0.5,color, 2)
                            Return[ReturnCounter]=    [x1.item(),y1.item(),x2.item(),y2.item(),conf.item(),cls_conf.item(),classes[int(cls_pred)]]
                            ReturnCounter+=1
                        cv2.imwrite("Temp2.jpg",img)
                        return Return
                

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# Set up model
model = Darknet("config/yolov3.cfg", img_size=416).to(device)

model.load_darknet_weights("weights/yolov3.weights")

model.eval()  # Set in evaluation mode

classes = load_classes("data/coco.names")  # Extracts class labels from file
colors = np.random.randint(0, 255, size=(len(classes), 3), dtype="uint8")
Tensor = torch.cuda.FloatTensor if torch.cuda.is_available() else torch.FloatTensor

a=[]
app.run(threaded=True)