J'essaye de déployer une simple application Python avec le support de Conda pour Heroku."Impossible de trouver une version répondant à l'exigence cv2 == 1.0" lors du déploiement de l'application Docker avec Anaconda et OpenCV sur Heroku
Je peux déployer cet exemple simple Heroku sans problème: https://github.com/heroku-examples/python-miniconda
Mais il ne fonctionne plus lorsque j'ai ajouté une importation CV2:
Fichier d'origine app.py:
from flask import Flask, jsonify
from sklearn import datasets, svm
app = Flask(__name__)
# Load Dataset from scikit-learn.
digits = datasets.load_digits()
@app.route('/')
def hello():
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(digits.data[:-1], digits.target[:-1])
prediction = clf.predict(digits.data[-1:])
return jsonify({'prediction': repr(prediction)})
if __name__ == '__main__':
app.run(host='0.0.0.0')
Fichier app.py modifié:
from flask import Flask, jsonify, render_template, request, redirect, url_for, send_from_directory
from sklearn import datasets, svm
import os
import json
import requests
# browser the file that the user just uploaded
from werkzeug import secure_filename
from keras.models import Sequential
from keras.layers.core import Flatten, Dense, Dropout
from keras.layers.convolutional import Convolution2D, MaxPooling2D, ZeroPadding2D
from keras.optimizers import SGD
from keras.applications.resnet50 import preprocess_input, decode_predictions
from keras import applications
import cv2, numpy as np
app = Flask(__name__)
# These are the extension that we are accepting to be uploaded
app.config['ALLOWED_EXTENSIONS'] = set(['png', 'jpg', 'jpeg', 'gif'])
# For a given file, return whether it's an allowed type or not
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
@app.route('/')
def hello_world():
return 'Hello World!'
# Route that will process the file upload
@app.route('/upload', methods=['POST'])
def upload():
# Get the name of the uploaded file
file = request.files['file']
# Check if the file is one of the allowed types/extensions
if file and allowed_file(file.filename):
# Make the filename safe, remove unsupported chars
# filename = secure_filename(file.filename)
# Move the file form the temporal folder to
# the upload folder we setup
# file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
# Redirect the user to the uploaded_file route, which
# will basicaly show on the browser the uploaded file
file.save(file.filename)
im = cv2.resize(cv2.imread(file.filename), (224, 224)).astype(np.float32)
im[:,:,0] -= 103.939
im[:,:,1] -= 116.779
im[:,:,2] -= 123.68
im = im.transpose((2,0,1))
im = np.expand_dims(im, axis=0)
out = model.predict(im)
decoded = decode_predictions(out, top=3)[0]
print('Predicted:', decoded)
return str(decoded)
if __name__ == '__main__':
# Test pretrained model
model = applications.VGG19(include_top=True, weights='imagenet')
app.run()
Je vais obtenir cette erreur en poussant cette application modifiée pour Heroku:
Could not find a version that satisfies the requirement cv2==1.0 (from -r /tmp/requirements.txt (line 10)) (from versions:)
No matching distribution found for cv2==1.0 (from -r /tmp/requirements.txt (line 10))
The command '/bin/sh -c pip install -qr /tmp/requirements.txt' returned a non-zero code: 1
! Error: docker build exited with 1
Il semble donc que CV2 manque sur le conteneur Docker? J'ai ajouté cette ligne « RUN Conda installer -c Conda-forge OpenCV » dans le modèle Dockerfile du projet par exemple, mais il ne aide pas:
FROM heroku/miniconda
# Grab requirements.txt.
ADD ./webapp/requirements.txt /tmp/requirements.txt
# Install dependencies
RUN pip install -qr /tmp/requirements.txt
# Add our code
ADD ./webapp /opt/webapp/
WORKDIR /opt/webapp
RUN conda install scikit-learn
RUN conda install -c conda-forge opencv
CMD gunicorn --bind 0.0.0.0:$PORT wsgi=
Toute aide s'il vous plaît?
Merci, vous avez raison, je travaillais avec un fichier requirements.txt généré par pipreqs et ajouté par erreur cv2. – mkto