我正在尝试使用以下存储库-https://github.com/render-examples/fastai-v3部署深度学习模型。我能够将其部署到Internet上,但是经过修改后,它不起作用。
这是两个文件: Client.js
var el = x => document.getElementById(x);
function showPicker() {
el("file-input").click();
}
function showPicked(input) {
el("upload-label").innerHTML = input.files[0].name;
var reader = new FileReader();
reader.onload = function(e) {
el("image-picked").src = e.target.result;
el("image-picked").className = "";
};
reader.readAsDataURL(input.files[0]);
}
function analyze() {
var uploadFiles = el("file-input").files;
if (uploadFiles.length !== 1) alert("Please select a file to analyze!");
el("analyze-button").innerHTML = "Finding out...";
var xhr = new XMLHttpRequest();
var loc = window.location;
xhr.open("POST", `${loc.protocol}//${loc.hostname}:${loc.port}/analyze`,
true);
xhr.onerror = function() {
alert(xhr.responseText);
};
xhr.onload = function(e) {
if (this.readyState === 4) {
var response = JSON.parse(JSON.stringify(e.target.responseText));
el("result-label").innerHTML = `inf = ${response["inf"]}`;
}
el("analyze-button").innerHTML = "Analyze";
};
var fileData = new FormData();
fileData.append("file", uploadFiles[0]);
xhr.send(fileData);
}
和Server.py
import aiohttp
import asyncio
import uvicorn
from fastai import *
from fastai.vision import *
from io import BytesIO
from starlette.applications import Starlette
from starlette.middleware.cors import CORSMiddleware
from starlette.responses import HTMLResponse, JSONResponse
from starlette.staticfiles import StaticFiles
export_file_url = 'https://www.googleapis.com/drive/v3/files/1-6ACEO2XCVWtHDM84fCAmspkx99zpKbA?alt=media&key=AIzaSyCZRHQRQoWYvCCzyax5lxAdrNyfP-nibSo'
export_file_name = 'New_P100.pkl'
classes = ['dipstation', 'Battle', 'BenchPress', 'InclineBenchPress', 'HammerStrengthmachine', 'LatPullDownMachine', 'PecDeckMachine', 'PullupBar', 'DumbBells', 'tricepbars', 'PreacherBench', 'HandgripExerciser', 'reversehyper', 'Plyometric', 'airresistance', 'Stair', 'Ankle', 'LegCurlMachine', 'LegPressMachine', 'LegExtensionMachine', 'HackSquatMachine', 'CalfMachines', 'LegAbductionAbductionMachine', 'prowler', 'Mini', 'Inversion', 'Vibration', 'PowerRack', 'MaxiClimber', 'StretchingMachine', 'SmithMachine', 'Suspension', 'CablesandPulleys', 'KettleBells', 'Roman', 'AbdominalBench', 'AbCoaster', 'Stationary', 'CruiserBikes', 'FixieBikes', 'MountainBike', 'RecumbentBikes', 'RoadBikes', 'SpinBikes', 'Comfort', 'Treadmill', 'Mini_Exercise_\ufeffBikes', 'metalplates', 'Medicine', 'Pedometers', 'Pull', 'BloodGlucoseMeter', 'GPSWatches', 'GymnasticsGrips&Gloves', 'hoverboard', 'JumpRope', 'ResistanceBand', 'YogaMat', 'Fitness', 'barbells', 'WallBall', 'FoamRoller', 'Stabilityball', 'AgilityLadder', 'BalanceBoards', 'BalanceBoards']
path = Path(__file__).parent
info = { "KettleBells" : "Kettle Balls are used for the muscles"}
app = Starlette()
app.add_middleware(CORSMiddleware, allow_origins=['*'], allow_headers=['X-Requested-With', 'Content-Type'])
app.mount('/static', StaticFiles(directory='app/static'))
async def download_file(url, dest):
if dest.exists(): return
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.read()
with open(dest, 'wb') as f:
f.write(data)
async def setup_learner():
await download_file(export_file_url, path / export_file_name)
try:
learn = load_learner(path, export_file_name)
return learn
except RuntimeError as e:
if len(e.args) > 0 and 'CPU-only machine' in e.args[0]:
print(e)
message = "\n\nThis model was trained with an old version of fastai and will not work in a CPU environment.\n\nPlease update the fastai library in your training environment and export your model again.\n\nSee instructions for 'Returning to work' at https://course.fast.ai."
raise RuntimeError(message)
else:
raise
loop = asyncio.get_event_loop()
tasks = [asyncio.ensure_future(setup_learner())]
learn = loop.run_until_complete(asyncio.gather(*tasks))[0]
loop.close()
@app.route('/')
async def homepage(request):
html_file = path / 'view' / 'index.html'
return HTMLResponse(html_file.open().read())
@app.route('/analyze', methods=['POST'])
async def analyze(request):
img_data = await request.form()
img_bytes = await (img_data['file'].read())
img = open_image(BytesIO(img_bytes))
prediction = learn.predict(img)[0]
prediction = learn.predict(img)[0]
result = info[str(prediction)]
return JSONResponse({'inf': str(result)})
if __name__ == '__main__':
if 'serve' in sys.argv:
uvicorn.run(app=app, host='0.0.0.0', port=5000, log_level="info")
我相信,这就是问题所在:
result = info[str(prediction)]
return JSONResponse({'inf': str(result)})
现在,当我部署模型时,得到以下结果:
inf =未定义
应该是: inf =肌肉使用水壶球
我不知道为什么会出错。感谢您的帮助!
PS:您也可以在此处查看代码:https://github.com/cabhijith/Gym-Trainer/tree/master/app 另外,这是在线应用程序。通常,您可以在此处查看错误- https://gym-trainer.onrender.com/
PPS:我知道我不应该在SO上发布整个代码,但是由于我不知道错误发生在哪里,所以我无法发布代码以产生特定错误:)