介绍
Jetson Orin Nano开发板介绍
Jetson Orin Nano 是 NVIDIA 推出的新一代入门级开发套件,专为边缘 AI 应用设计。相比上一代 Jetson Nano,Orin Nano 提供了高达 80 倍的性能提升。


-
技术规格
Jetson Orin Nano 搭载了 8GB 内存的 Orin Nano 模组,另有 4GB 版本单独出售。Orin SoC 的 CPU 基于 Cortex-A78AE 架构,具有 6 个核心,最大频率 1.5 GHz。GPU 方面为 Ampere 架构的 GA10B,搭载了 1024 个 CUDA 核心和 32 个 Tensor 核心,最大频率为 625MHz。Orin Nano 的单精度浮点性能为 1.28 TFLOPs,深度学习算力高达 20 TOPs 的 INT8 稠密算力。
-
硬件接口
Orin Nano 开发套件的模组和载板与前代尺寸相同,但有一些改进。新载板的摄像头接口换成了 15-pin 的连接器,Micro USB 接口换成了 Type C,显示输出取消了 HDMI,只保留 DisplayPort 1.2 接口。Orin Nano 有 7 条 PCIe Gen 3 通道,载板底部增加了一个 M.2 Key M 接口。
-
AI 性能测试
NVIDIA 提供了一套测试工具用来比较不同 Jetson 设备上的 AI 推理性能。测试结果显示,Orin Nano 在所有模型上都比 Jetson Nano 有数十倍提升,部分模型上甚至比 Xavier NX 都有明显优势。
Yolo V8介绍
YOLO V8介绍 YOLOv8 于2023年1月10日由Ultralytics发布,在准确性和速度方面实现了顶尖性能。基于之前的YOLO版本,YOLOv8带来了新功能和优化,成为各类任务的理想选择。相关代码仓库和文档网站如下:
YOLOv8的主要特点
- 先进的主干与颈部架构: YOLOv8采用了最新设计的主干与颈部架构,提升了特征提取能力及目标检测效果。
- 无锚点分割头: YOLOv8使用了独特的无锚点分割头设计,相比传统的基于锚点的方法,能够提供更高的检测精度和效率。
- 优化的精度与速度平衡: YOLOv8专注于在保持高精度的同时实现快速检测,适用于需要实时处理的各种应用场景。
- 多种预训练模型: 提供一系列预训练模型,以适应不同的任务需求和性能指标,方便用户根据具体应用选择最合适的模型。
支持的任务和模式 YOLOv8系列为计算机视觉中的不同任务提供了多样化的模型支持,包括但不限于物体检测、实例分割、姿态/关键点检测、定向物体检测以及分类等复杂任务。 每个YOLOv8变体都针对其特定任务进行了优化,确保高性能和高准确性。此外,这些模型还支持多种操作模式,如推理、验证、训练和输出,便于在项目开发的不同阶段灵活运用。
环境安装
由于这块开发板目前仅供个人使用,因此不打算安装Conda或Mini Conda等Python环境管理工具。当然,如果有需要的话,大家可以根据自己的情况选择安装。😎
根据作者在开源仓库中提供的软件库版本要求,我们只需运行pip install -r requirements.txt
命令即可完成环境的配置。
此外,官方仓库也提供了如何安装YOLO的指南。不过,小编想对对源码进行一些修改,所以这部分内容对于环境安装来说并不是必须的。

Jetson orin nano开发板启动界面
测试
图像测试
图像测试目的是检测yolo环境安装是否成功。在此我们选择训练好的yolov8n模型,任务选择检测任务。
python
from ultralytics import YOLO
yolo = YOLO("./yolov8n.pt", task="detect")
result = yolo(source="./ultralytics/assets/bus.jpg", save=True)
语句result = yolo(source="./ultralytics/assets/bus.jpg", save=True)
将得到检测结果,其中将会包含:检测到的每个目标的边界框、类别标签和置信度。
结果图片如下:
实时视频测试
在实时视频测试中,我们将会使用一个摄像头实时捕获当前环境的物体并将其输入到yolo中作检测处理。
接下来我们将实现实时视频测试目标,下述是我们撰写代码的主要逻辑与步骤:
-
日志设置:函数一开始创建了一个日志记录器logger,设置了两个处理器,一个是控制台输出(INFO级别),另一个是文件记录(DEBUG级别)。格式上,控制台输出不包括时间,而文件日志包含详细的时间戳。这有助于调试时查看更详细的信息。
-
摄像头初始化:使用cv2.VideoCapture(0)打开默认的USB摄像头。如果摄像头无法打开,记录错误信息并返回。成功的话,会记录摄像头的信息,包括分辨率,这里通过cap.get获取了宽度和高度。
-
加载YOLO模型:用YOLO类加载预训练的yolov8n.pt模型,任务设为检测。这可能是一个YOLOv8的nano版本模型,用于目标检测。
-
帧率计算准备:初始化了fps_start_time和fps_counter,用来计算每秒处理的帧数。
-
主循环:进入一个无限循环,不断读取摄像头帧。如果读取失败,记录错误并退出循环。然后,使用YOLO模型对当前帧进行检测,结果存储在results中。这里取results[0]可能是因为每帧只处理一个结果。
-
处理检测结果:从结果中提取boxes、confidences和classes。然后筛选出置信度大于0.8的检测框,并获取对应的类别和置信度。如果有符合条件的检测结果,记录到日志中,包括类别名称、数量和置信度。
-
帧率计算:每隔一秒计算当前帧率,并记录到日志里。这里通过计算时间差和帧数来得出FPS。
-
退出条件:如果用户按下'q'键,退出循环,释放摄像头资源,并关闭所有窗口。
python
from ultralytics import YOLO
import cv2
import time
import logging
from logging.handlers import RotatingFileHandler
def test_usb_camera():
# 创建日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建控制台处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_formatter = logging.Formatter("%(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)
# 创建文件处理器
file_handler = logging.FileHandler("logs/yolo.log")
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
# 初始化摄像头,0 表示默认的摄像头(通常是第一个 USB 摄像头)
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
logger.info("无法打开摄像头,请检查摄像头是否连接正确或是否有权限访问。")
return
logger.info("摄像头已成功打开!按 'q' 键退出。")
# 获取摄像头的宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
logger.info(f"摄像头分辨率: {width}x{height}")
yolo_model = YOLO("save_model/yolov8n.pt", task="detect")
# 计算帧率
fps_start_time = time.time()
fps_counter = 0
while True:
# 读取一帧图像
ret, frame = cap.read()
if not ret:
logger.info("无法读取摄像头帧。")
break
results = yolo_model(frame, verbose=False)
result = results[0]
boxes = result.boxes.to(yolo_model.device) # 将结果移动到同一设备
confidences = boxes.conf.cpu().numpy()
classes = boxes.cls.cpu().numpy().astype(int)
# 筛选
high_conf_indices = confidences > 0.8
filtered_boxes = boxes.xyxy[high_conf_indices].cpu().numpy()
filtered_classes = classes[high_conf_indices]
filtered_confidences = confidences[high_conf_indices]
if len(filtered_boxes) > 0:
class_names = [yolo_model.names[int(cls)] for cls in filtered_classes] # 类名列表
alarm_data = {
"labels": class_names,
"counts": len(filtered_boxes),
"confidences": [round(float(x), 2) for x in filtered_confidences.tolist()],
}
logger.info(f'{alarm_data}')
# 计算帧率
fps_counter += 1
if time.time() - fps_start_time >= 1:
fps = fps_counter / (time.time() - fps_start_time)
logger.info(f"当前帧率: {fps:.2f} FPS")
fps_counter = 0
fps_start_time = time.time()
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
test_usb_camera()
检测的结果日志如下:
