Linux下运行目标检测yolo26步骤(包含环境配置+模型运行)

q 话不多说直接上步骤;最终目的就是在全新的电脑上安装和使用Pytorch ,在GPU上训练YOLO26

1.确保安装NVIDIA 驱动 < nvidia-smi >

   如果知道显卡类型(RTX 5090 )下载 NVIDIA 官方驱动 | NVIDIA 官网直接下载驱动  

   若不清楚,运行以下命令查看显卡类型 

lspci | grep -i nvidia

输出如下内容,其中 Device  2b87 代表设备号 

01:00.0 VGA compatible controller: NVIDIA Corporation Device 2b87 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 22e8 (rev a1)

安装成功后 执行

nvidia-smi

 查看驱动版本,得到CUDA Version ,在下一步有用。

2. 安装CUDA Toolkit  < nvcc -V >

    CUDA是NVIDIA开发的并行计算平台。

    已知 CUDA Version ,cuda toolkit 需要小于或等于此版本 ,通过官方地址进行下载安装配置环境变量 。    

 参考     Linux下安装cuda和对应版本的cudnn 

  官网 CUDA Toolkit 13.1 Update 1 Downloads | NVIDIA Developer

  通过 nvcc --version  或者  nvcc -V 验证是否成功

3. 安装cuDNN

    cuDNN是深度学习优化的库,选择合适的版本且与CUDA版本适配,官网下载

     参考     Linux下安装cuda和对应版本的cudnn 

Support Matrix — NVIDIA cuDNN Backend

   cuDNN 9.19.1 Downloads | NVIDIA Developer

法一:手动安装,下载合适的版本包

  解压缩,将cudnn内相应文件复制到cuda的安装路径,并修改权限。

  cudnn-linux-x86_64-9.19.1.2_cuda13-archive/为解压缩后的文件路径

  /usr/local/cuda/为cuda的安装路径,按照自己的实际情况替换

 tar -xvf cudnn-linux-x86_64-9.19.1.2_cuda13-archive.tar.xz cd cudnn-linux-x86_64-9.19.1.2_cuda13-archive/ sudo cp ./include/cudnn* /usr/local/cuda/include sudo cp ./lib/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn* /usr/local/cuda/lib64/libcudnn* 
# 验证 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2 # 若没有输出执行下面这个 cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

法二:根据apt-get 命令自动安装

  根据cuda12 /13 选择不同的安装命令

cat /usr/include/x86_64-linux-gnu/cudnn_version.h | grep CUDNN_MAJOR -A 2 输出 #define CUDNN_MAJOR 9 # 主版本号:9 #define CUDNN_MINOR 6 # 次版本号:6 #define CUDNN_PATCHLEVEL 0 # 补丁级别:0

后续也可通过pytorch验证

4. 安装conda 选择miniforge < conda --version >

   参考 在ubuntu中安装miniforge并配置-ZEEKLOG博客

      Miniforge:Anaconda 的理想替代品-ZEEKLOG博客 

   验证是否成功 并创建环境

source ~/.bashrc conda --version 创建环境,可指定python版本 conda create -n yolo26 python=3.12 为了后续安装速度快 添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes

5.在新建conda环境中安装pytorch

   激活conda 环境: conda activate  yolo26 

    根据cuda toolkit 版本选择合适的pytorch版本

    Get Started

    如果没有开代理,安装可能会很慢,可以将 --index-url 换成清华源

--index-url https://mirrors.tuna.tsinghua.edu.cn/pytorch-wheels/cu128

  在终端输入python ,执行以下代码进行验证

import torch print("PyTorch 版本:", torch.__version__) print("CUDA 是否可用:", torch.cuda.is_available()) print("CUDA 版本:", torch.version.cuda) print("GPU 数量:", torch.cuda.device_count()) print("cuDNN 是否可用:", torch.backends.cudnn.enabled) print("cuDNN 版本:", torch.backends.cudnn.version())

6. 下载YOLO26 并配置环境运行

  ultralytics/ultralytics: Ultralytics YOLO 🚀

   6.1 安装 ultralytics

    可加后缀使用清华源

pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple 

  其他库函数,后续执行的时候缺少哪些就pip install  安装。

   6.2 下载yolo26n.pt

    6.3 预测测试

     使用yolo26官方模型进行预测进行测试。

     在主文件下创建 predict.py ,修改source图片路径,并执行 python  predict.py                  

from ultralytics import YOLO import warnings warnings.filterwarnings('ignore') if __name__ == "__main__": mode = YOLO("./yolo26n.pt") results = mode.predict( source='../../test_data/test.jpg', imgsz=640, # stream=True, project='runs/predict', name='yolo26n', save=True, conf=0.5, # visualize=True # visualize model features maps )

    可在 runs/predict/yolo26n/ 查看输出结果

 6.4 训练自己的数据集

  1 准备好数据集文件,按照这样的格式放置

 2 编辑dataset.yaml  修改为 rtts.yaml文件 ,并放置在  /ultralytics/ultralytics/cfg/datasets 下

 path: ./datasets/RTTS/ train: ./datasets/RTTS/images/train val: ./datasets/RTTS/images/val test: ./datasets/RTTS/images/test names: 0: person 1: car 2: biycycle 3: motorbike 4: bus nc: 5

     3  在主文件下创建 train.py ,根据自己的路径设定,并执行 python  train.py     

import sys sys.path.append(".") from ultralytics import YOLO import warnings warnings.filterwarnings("ignore") modle = YOLO("ultralytics/cfg/models/26/yolo26n.yaml") if __name__ == "__main__": modle.train(data="ultralytics/cfg/datasets/rtts.yaml", epochs=200, batch=32, imgsz=640, device='0', workers=8, project='train', name='exp', ) 

 可在runs/detect/train/exp 下查看训练输出;如果无法运行缺少函数库 执行 pip install 进行安装。

    4   为了验证测试集精度,在主文件下创建 val.py ,根据自己的路径设定,并执行 python  val.py 

from ultralytics import YOLO import warnings warnings.filterwarnings("ignore") if __name__ == "__main__": mode = YOLO("./runs/train/exp/weights/best.pt") mode.val( data = "ultralytics/cfg/datasets/rtts.yaml", split = 'test', batch = 32, imgsz = 640, device = '0', workers = 8, project = 'runs/test', name = 'exp' )

  6.5 导出onnx

       在主文件下创建 export.py ,根据自己的路径设定,并执行 python  export.py   

       可通过predict 进行onnx模型预测。

import sys sys.path.insert(0, '.') from ultralytics import YOLO import warnings warnings.filterwarnings("ignore") if __name__ == "__main__": mode = YOLO("./runs/train/exp/weights/best.pt") mode.export( format = "onnx", simplify = True, # opset = None, )

 6.6 onnx 推理

import cv2 import onnxruntime as ort from PIL import Image import numpy as np import random confidence_thres = 0.5 classes = ['person', 'car', 'biycycle', 'motorbike', 'bus'] providers = [ ('CUDAExecutionProvider', { 'device_id': 0, # 可以选择GPU设备ID,如果你有多个GPU }), 'CPUExecutionProvider', # 也可以设置CPU作为备选 ] # 图像前处理 def preprocess(img, input_width, input_height): """ 在执行推理之前预处理输入图像。 返回: image_data: 为推理准备好的预处理后的图像数据。 """ img_height, img_width = img.shape[:2] img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = cv2.resize(img, (input_width, input_height)) # (640,640) image_data = np.array(img) / 255.0 image_data = np.transpose(image_data, (2, 0, 1)) image_data = np.expand_dims(image_data, axis=0).astype(np.float32) return image_data, img_height, img_width def postprocess(un_output, input_width, input_height, img_width, img_height): """ 对模型输出进行后处理,提取过滤后的边界框、得分和类别ID。 参数: un_output (numpy.ndarray): 模型的输出。 onnx的输出为 1x300x6 input_width (int): 模型输入宽度。 input_height (int): 模型输入高度。 img_width (int): 原始图像宽度。 img_height (int): 原始图像高度。 返回: boxes,scores,labels [] [] [] """ # 计算边界框坐标的缩放因子 x_factor = img_width / input_width y_factor = img_height / input_height print(f"img_width :{img_width},x_factor:{x_factor},y_factor:{y_factor}") un_outputs = np.squeeze(un_output[0]) #300*6 [ x1 y1 x2 y2 nc_id conf ] boxes, scores, class_ids = [], [], [] for det in un_outputs: x1, y1, x2, y2, conf,class_id, = det if conf >= confidence_thres: boxes.append([ int(x1 * x_factor), int(y1 * y_factor), int(x2 * x_factor), int(y2 * y_factor) ]) scores.append(conf) class_ids.append(int(class_id)) labels = [classes[cid] for cid in class_ids] if classes is not None else [str(cid) for cid in class_ids] return boxes, scores, labels def init_detect_model(model_path): session = ort.InferenceSession(model_path, providers=providers) model_inputs = session.get_inputs() input_shape = model_inputs[0].shape input_width = input_shape[2] input_height = input_shape[3] return session, model_inputs, input_width, input_height def detect_object(image, un_session, model_inputs, input_width, input_height): if isinstance(image, Image.Image): result_image = np.array(image) else: result_image = image img_data, img_height, img_width = preprocess(result_image, input_width, input_height) un_outputs = un_session.run(None, {model_inputs[0].name: img_data}) box,score,label = postprocess(result_image, un_outputs, input_width, input_height, img_width, img_height) return box,score,label def draw_boxes(image, boxes, scores, labels, use_random_colors=True): for (x1, y1, x2, y2), score, label in zip(boxes, scores, labels): color = ( random.randint(50, 255), random.randint(50, 255), random.randint(50, 255), ) if use_random_colors else (0, 255, 0) cv2.rectangle(image, (x1, y1), (x2, y2), color, 2) text = f"{label} {score:.2f}" (text_width, text_height), _ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 1) overlay = image.copy() cv2.rectangle(overlay, (x1, y1 - text_height - 5), (x1 + text_width, y1), color, -1) image = cv2.addWeighted(overlay, 0.6, image, 0.4, 0) cv2.putText(image, text, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1, cv2.LINE_AA) return image if __name__ == '__main__': un_model_path = "./runs/detect/train/exp/weights/best.onnx" print(f"un_model_path:{un_model_path}") un_session, model_inputs, input_width, input_height = init_detect_model(un_model_path) # 读取图像文件 image_data = cv2.imread("../../test_data/g1.jpg") boxes,scores,labels= detect_object(image_data,un_session, model_inputs, input_width, input_height) # print(boxes,scores,labels) result = draw_boxes(image_data.copy(), boxes, scores, labels, use_random_colors=True) # 将检测后的图像保存到文件 cv2.imwrite("./g11.jpg", result) 

大体步骤就是这些,如有错误请批评指正。

注意事项

  • 每步操作后验证输出是否正常
  • 缺失依赖时使用pip install补充

Read more

Flutter 三方库 hashids2 基于鸿蒙安全内核的深度隐匿映射适配:数字指纹泄露防御层、生成短小精悍唯一不可逆加盐哈希,护航全链路请求 URL 隐私-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 hashids2 基于鸿蒙安全内核的深度隐匿映射适配:数字指纹泄露防御层、生成短小精悍唯一不可逆加盐哈希,护航全链路请求 URL 隐私-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 hashids2 基于鸿蒙安全内核的深度隐匿映射适配:突破高敏感数字指纹泄露防御层、生成短小精悍唯一不可逆加盐哈希,护航全链路请求 URL 隐私资产 在鸿蒙应用的高度依赖数据隐私(如隐藏数据库递增 ID、生成短网址或混淆用户主页链接)中,如何将枯燥的数字转换为非连续、看似随机且人类友好的标识符?hashids2 库提供了一套基于 Hashids 协议的工业级加密 ID 生成方案。本文将详解该库在 OpenHarmony 上的适配要点。 前言 什么是 hashids2?当你在 URL 中展示 user/123 时,攻击者很容易通过猜测 124 或 125 来爬取你的数据。hashids2 能够根据你设定的盐值(Salt)。将整数 123 转换为类似

By Ne0inhk
Flutter for OpenHarmony: Flutter 三方库 ulid 别再用杂乱的 UUID,为鸿蒙应用换上“可排序、更简洁”的唯一标识符(全局 ID 新标准)

Flutter for OpenHarmony: Flutter 三方库 ulid 别再用杂乱的 UUID,为鸿蒙应用换上“可排序、更简洁”的唯一标识符(全局 ID 新标准)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的分布式数据库设计、日志系统或任务追踪系统开发时,我们需要为每一条记录生成一个“全局唯一标识符”。 1. 传统 UUID 的痛点:UUID (v4) 是完全随机的,它破坏了数据库的 B-Tree 索引顺序,导致写入性能下降;且 36 位连字符字符串在数据库中显得过于臃肿。 2. ULID 的优势:它兼具了 128 位的全局唯一性,同时它的前 48 位是时间戳。这意味着 ULID 天然可按时间排序。 ulid 软件包为鸿蒙开发者提供了这种现代化的 ID 生成方案。它采用 Base32 编码(26 个字符),没有特殊符号,既美观又极具工程性能优势。 一、

By Ne0inhk
Flutter for OpenHarmony:built_collection 高性能不可变集合(Builder 模式实现极致内存优化) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:built_collection 高性能不可变集合(Builder 模式实现极致内存优化) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在 Flutter 开发中,State Management (状态管理) 的核心原则通常是 Immutability (不可变性)。 如果我们直接修改 List 或 Map 的内容,FrameWork 可能检测不到变化,导致 UI 不刷新。或者,因为引用传递(Reference Passing)导致多个组件共享同一个 Mutable List,产生难以追踪的副作用 Bug。 Dart 标准库的 List.unmodifiable 虽然能创建不可变列表,但每次修改都需要全量拷贝(toList()),性能开销大(O(N))。 built_collection 是 Google 维护的一个高性能不可变集合库(它是

By Ne0inhk
Flutter for OpenHarmony:injector 轻量级依赖注入库(比 GetIt 更简单的选择) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:injector 轻量级依赖注入库(比 GetIt 更简单的选择) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 依赖注入(Dependency Injection, DI)是解耦架构的核心。 在 Flutter 社区,get_it 是当之无愧的霸主,但有时候我们想要一个更简单、没有 Service Locator 模式那种“全局单例”味道的库,或者需要一个支持模块化注入的方案。 injector 是一个非常轻量的 DI 库。它不使用代码生成,提供基于构建器(Builder)的依赖注册机制。 对于 OpenHarmony 开发者,使用 DI 库可以将鸿蒙特定的实现(如 OhosPermissionService)与通用业务逻辑解耦,实现一套代码,多端运行。 一、核心原理 injector 的工作原理非常纯粹:它维护了一个 Map,

By Ne0inhk