微信公众号:OpenCV开发者联盟
关注获取更多计算机视觉与深度学习知识
Jetson Orin Nano 介绍
JetPack5.1镜像制作
https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v3.1/sd_card_b49/jp511-orin-nano-sd-card-image.zip/
- CUDA11.4.19
- cuDNN8.6.0
- TensorRT8.5.2
- OpenCV4.5.4
https://www.balena.io/etcher#download-etcher
烧录完成以后插到Jetson Orin Nano开发板的风扇下方的卡槽中,图示如下:
安装pytorch与torchvision
https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html
sudo apt-get -y install autoconf bc build-essential g++-8 gcc-8 clang-8 lld-8 gettext-base gfortran-8 iputils-ping libbz2-dev libc++-dev libcgal-dev libffi-dev libfreetype6-dev libhdf5-dev libjpeg-dev liblzma-dev libncurses5-dev libncursesw5-dev libpng-dev libreadline-dev libssl-dev libsqlite3-dev libxml2-dev libxslt-dev locales moreutils openssl python-openssl rsync scons python3-pip libopenblas-dev;
pip3 install torch-1.14.0a0+44dac51c.nv23.02-cp38-cp38-linux_aarch64.whl
sudo apt install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
pip3 install --upgrade pillow
wget https://github.com/pytorch/vision/archive/refs/tags/v0.15.1.zip
unzip v0.15.1.zip
cd vision-0.15.1
export BUILD_VERSION=0.15.1
python3 setup.py install --user
说明一切准备工作就绪了。
说明一下,安装过程中要求输入提示的都输入 y
ONNX2ENGINE
cd /usr/src/tensorrt/bin
./trtexec --onnx=<path_to_onnx_file> --saveEngine=<path_to_save_engine_file>
这个时间大概在五分钟左右,需要等一下才可以转换好。
YOLOv8对象检测演示
1import tensorrt as trt
2from torchvision import transforms
3import torch as t
4from collections import OrderedDict, namedtuple
5import cv2 as cv
6import time
7import numpy as np
8
9img_transform = transforms.Compose([transforms.ToTensor(),
10 transforms.Resize((640, 640))
11 ])
12
13def load_classes():
14 with open("classes.txt", "r") as f:
15 class_list = [cname.strip() for cname in f.readlines()]
16 return class_list
17
18
19def format_yolov8(frame):
20 row, col, _ = frame.shape
21 _max = max(col, row)
22 result = np.zeros((_max, _max, 3), np.uint8)
23 result[0:row, 0:col] = frame
24 result = cv.cvtColor(result, cv.COLOR_BGR2RGB)
25 return result
26
27def wrap_detection(input_image, output_data):
28 class_ids = []
29 confidences = []
30 boxes = []
31 out_data = output_data.T
32 rows = out_data.shape[0]
33
34 image_width, image_height, _ = input_image.shape
35
36 x_factor = image_width / 640.0
37 y_factor = image_height / 640.0
38
39 for r in range(rows):
40 row = out_data[r]
41 classes_scores = row[4:]
42 class_id = np.argmax(classes_scores)
43 if (classes_scores[class_id] > .25):
44 class_ids.append(class_id)
45 confidences.append(classes_scores[class_id])
46 x, y, w, h = row[0].item(), row[1].item(), row[2].item(), row[3].item()
47 left = int((x - 0.5 * w) * x_factor)
48 top = int((y - 0.5 * h) * y_factor)
49 width = int(w * x_factor)
50 height = int(h * y_factor)
51 box = np.array([left, top, width, height])
52 boxes.append(box)
53
54 indexes = cv.dnn.NMSBoxes(boxes, confidences, 0.25, 0.25)
55
56 result_class_ids = []
57 result_confidences = []
58 result_boxes = []
59
60 for i in indexes:
61 result_confidences.append(confidences[i])
62 result_class_ids.append(class_ids[i])
63 result_boxes.append(boxes[i])
64
65 return result_class_ids, result_confidences, result_boxes
66def gpu_trt_demo():
67 class_list = load_classes()
68 device = t.device('cuda:0')
69 Binding = namedtuple('Binding', ('name', 'dtype', 'shape', 'data', 'ptr'))
70 logger = trt.Logger(trt.Logger.INFO)
71 with open("yolov8n.engine", 'rb') as f, trt.Runtime(logger) as runtime:
72 model = runtime.deserialize_cuda_engine(f.read())
73 bindings = OrderedDict()
74 for index in range(model.num_bindings):
75 name = model.get_binding_name(index)
76 dtype = trt.nptype(model.get_binding_dtype(index))
77 shape = model.get_binding_shape(index)
78 data = t.from_numpy(np.empty(shape, dtype=np.dtype(dtype))).to(device)
79 bindings[name] = Binding(name, dtype, shape, data, int(data.data_ptr()))
80 binding_addrs = OrderedDict((n, d.ptr) for n, d in bindings.items())
81 context = model.create_execution_context()
82
83 capture = cv.VideoCapture("test.mp4")
84 colors = [(255, 255, 0), (0, 255, 0), (0, 255, 255), (255, 0, 0)]
85 while True:
86 _, frame = capture.read()
87 if frame is None:
88 print("End of stream")
89 break
90 fh, fw, fc = frame.shape
91 start = time.time()
92 image = format_yolov8(frame)
93 x_input = img_transform(image).view(1, 3, 640, 640).to(device)
94 binding_addrs['images'] = int(x_input.data_ptr())
95 context.execute_v2(list(binding_addrs.values()))
96 out_prob = bindings['output0'].data.cpu().numpy()
97 end = time.time()
98
99 class_ids, confidences, boxes = wrap_detection(image, np.squeeze(out_prob, 0))
100 for (classid, confidence, box) in zip(class_ids, confidences, boxes):
101 if box[2] > fw * 0.67:
102 continue
103 color = colors[int(classid) % len(colors)]
104 cv.rectangle(frame, box, color, 2)
105 cv.rectangle(frame, (box[0], box[1] - 20), (box[0] + box[2], box[1]), color, -1)
106 cv.putText(frame, class_list[classid] + " " + ("%.2f"%confidence), (box[0], box[1] - 10), cv.FONT_HERSHEY_SIMPLEX, .5, (0, 0, 0))
107
108 inf_end = end - start
109 fps = 1 / inf_end
110 fps_label = "FPS: %.2f" % fps
111 cv.putText(frame, fps_label, (10, 25), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
112 cv.imshow("YOLOv8 + TensorRT8.5.x Object Detection", frame)
113 cc = cv.waitKey(1)
114 if cc == 27:
115 break
116 cv.waitKey(0)
117 cv.destroyAllWindows()
118
119
120if __name__ == "__main__":
121 gpu_trt_demo()
总结:
扫码查看OpenCV+OpenVIO+Pytorch系统化学习路线图
CS5366芯片应用电路图,CS5366设计原理图,应用TypeC转HDMI4k60HZ+USB3.0扩展芯片电路,CS5366集成DSC1.2a decoder, 不仅支持2 lane 8.1G的source, 也支持2 lane 5.4G输出4K60 video方案芯片