Move jetson deployment code
This commit is contained in:
parent
733e5f6fb6
commit
f9b2c25fe5
@ -116,11 +116,50 @@ def get_cutout(img, xmin, xmax, ymin, ymax):
|
|||||||
return cropped_image
|
return cropped_image
|
||||||
|
|
||||||
|
|
||||||
|
def export_to_onnx(yolo_path: str, resnet_path: str):
|
||||||
|
"""Export the models to onnx.
|
||||||
|
|
||||||
|
:param yolo_path: path to yolo weights
|
||||||
|
:param resnet_path: path to resnet weights
|
||||||
|
:returns: None
|
||||||
|
|
||||||
|
"""
|
||||||
|
(first, second) = load_models(yolo_path, resnet_path)
|
||||||
|
first.eval()
|
||||||
|
second.eval()
|
||||||
|
|
||||||
|
first_x = torch.randn((1, 3, 640, 640), requires_grad=True)
|
||||||
|
second_x = torch.randn((1, 3, 224, 224), requires_grad=True)
|
||||||
|
|
||||||
|
torch.onnx.export(first,
|
||||||
|
first_x,
|
||||||
|
'yolo.onnx',
|
||||||
|
export_params=True,
|
||||||
|
do_constant_folding=True,
|
||||||
|
input_names=['input'],
|
||||||
|
output_names=['output'])
|
||||||
|
|
||||||
|
torch.onnx.export(second,
|
||||||
|
second_x,
|
||||||
|
'resnet.onnx',
|
||||||
|
export_params=True,
|
||||||
|
do_constant_folding=True,
|
||||||
|
input_names=['input'],
|
||||||
|
output_names=['output'])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--source', type=str, help='image file or webcam')
|
parser.add_argument('--source', type=str, help='image file or webcam')
|
||||||
|
parser.add_argument('--onnx',
|
||||||
|
action='store_true',
|
||||||
|
dest='onnx',
|
||||||
|
help='export models to onnx')
|
||||||
opt = parser.parse_args()
|
opt = parser.parse_args()
|
||||||
|
|
||||||
if opt.source:
|
if opt.source:
|
||||||
detect(opt.source, 'runs/train/yolov7-custom7/weights/best.pt',
|
detect(opt.source, 'runs/train/yolov7-custom7/weights/best.pt',
|
||||||
'resnet.pt')
|
'resnet.pt')
|
||||||
|
if opt.onnx:
|
||||||
|
export_to_onnx('runs/train/yolov7-custom7/weights/best.pt',
|
||||||
|
'resnet.pt')
|
||||||
52
jetson-deployment/server.py
Normal file
52
jetson-deployment/server.py
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import atexit
|
||||||
|
import jetson.utils
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
from apscheduler.schedulers.background import BackgroundScheduler
|
||||||
|
|
||||||
|
from multiprocessing import Manager
|
||||||
|
|
||||||
|
from model import detect
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
scheduler = BackgroundScheduler(daemon=True)
|
||||||
|
manager = Manager()
|
||||||
|
pred = manager.dict()
|
||||||
|
|
||||||
|
|
||||||
|
@scheduler.task('interval', id='get_pred', minutes=30, misfire_grace_time=900)
|
||||||
|
def get_pred():
|
||||||
|
img = take_image('./current_image.jpg')
|
||||||
|
print('Job 1 executed')
|
||||||
|
|
||||||
|
|
||||||
|
def take_image(img_path: str):
|
||||||
|
"""Take an image with the webcam and save it to the specified
|
||||||
|
path.
|
||||||
|
|
||||||
|
:param str img_path: path image should be saved to
|
||||||
|
:returns: captured image
|
||||||
|
|
||||||
|
"""
|
||||||
|
input = jetson.utils.videoSource('csi://0')
|
||||||
|
output = jetson.utils.videoOutput(img_path)
|
||||||
|
img = input.Capture()
|
||||||
|
output.Render(img)
|
||||||
|
return img
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@app.route('/')
|
||||||
|
def index():
|
||||||
|
# TODO: call script and save initial image with bounding boxes
|
||||||
|
# TODO: get predictions and output them in JSON via API
|
||||||
|
# TODO: periodically get image from webcam and go to beginning
|
||||||
|
# TODO: JSON format: [Nr, state (1-10), timestamp, time since below 3]
|
||||||
|
return 'Server works'
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
scheduler.add_job(func=get_pred, trigger='interval', minutes=30)
|
||||||
|
scheduler.start()
|
||||||
|
atexit.register(scheduler.shutdown())
|
||||||
|
app.run()
|
||||||
Loading…
x
Reference in New Issue
Block a user