yolo 源码与模型
YOLOv8 官方源码、预训练模型.pt、导出 ONNX 模型、以及 ROS2 C 部署源码含检测框输出全部是可直接用的工业级版本。一、YOLOv8 官方源码Ultralytics1. GitHub 源码地址最新plaintexthttps://github.com/ultralytics/ultralytics2. 克隆源码bash运行git clone https://github.com/ultralytics/ultralytics.git cd ultralytics pip install -e .3. 核心结构ultralytics/models/yolo/detect/检测模型结构ultralytics/nn/网络层、损失函数ultralytics/engine/训练 / 推理 / 导出逻辑二、预训练模型.pt直接下载1. 官方预训练权重推荐yolov8n.pt最快下载地址自动下载python运行from ultralytics import YOLO model YOLO(yolov8n.pt) # 自动下载手动下载https://docs.ultralytics.com/models/yolov8/#pretrained-models常用模型yolov8n.ptnano最快适合实时伺服yolov8s.ptsmall平衡速度 / 精度yolov8m.ptmedium精度更高2. 模型大小640x640yolov8n.pt约 3.8 MByolov8s.pt约 14 MByolov8m.pt约 42 MB三、导出 ONNX 模型给 ROS2 C 用1. 导出代码固定 640x640CPU 友好python运行from ultralytics import YOLO # 加载预训练模型 model YOLO(yolov8n.pt) # 导出 ONNX关键参数opset12、simplify、固定尺寸 model.export( formatonnx, imgsz640, opset12, simplifyTrue, dynamicFalse, devicecpu )执行后生成yolov8n.onnx约 7.6 MB2. 验证 ONNXpython运行import onnxruntime as ort import numpy as np sess ort.InferenceSession(yolov8n.onnx) print(ONNX 加载成功)四、ROS2 C 源码单目 YOLO 框 中心输出下面是可直接编译运行的 ROS2 节点功能订阅/image_raw→ YOLO ONNX 推理 → 输出检测框 (x,y,w,h)中心 (u,v)→ 可视化。1. CMakeLists.txtcmakecmake_minimum_required(VERSION 3.8) project(yolo_onnx_ros2) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(sensor_msgs REQUIRED) find_package(cv_bridge REQUIRED) find_package(OpenCV REQUIRED) find_package(onnxruntime REQUIRED) add_executable(yolo_node src/yolo_node.cpp) ament_target_dependencies(yolo_node rclcpp sensor_msgs cv_bridge OpenCV onnxruntime ) install(TARGETS yolo_node DESTINATION lib/${PROJECT_NAME}) ament_package()2. package.xmlxml?xml version1.0? package format3 nameyolo_onnx_ros2/name version0.0.0/version descriptionYOLOv8 ONNX ROS2 Node/description maintainer emailuserexample.comuser/maintainer licenseApache-2.0/license buildtool_dependament_cmake/buildtool_depend dependrclcpp/depend dependsensor_msgs/depend dependcv_bridge/depend dependOpenCV/depend dependonnxruntime/depend /package3. src/yolo_node.cpp核心含框 中心输出cpp运行#include rclcpp/rclcpp.hpp #include sensor_msgs/msg/image.hpp #include cv_bridge/cv_bridge.h #include opencv2/opencv.hpp #include onnxruntime_cxx_api.h #include vector #include string using namespace std; using namespace cv; // YOLOv8 输出解析1个框 [x, y, w, h, conf, cls0, cls1,...] const int COCO_CLASSES 80; const int OUTPUT_ROWS 8400; const int OUTPUT_COLS 5 COCO_CLASSES; // 5: x,y,w,h,conf class YoloONNXNode : public rclcpp::Node { public: YoloONNXNode() : Node(yolo_onnx_node) { // 订阅相机 img_sub_ create_subscriptionsensor_msgs::msg::Image( /image_raw, 10, bind(YoloONNXNode::imageCallback, this, placeholders::_1)); // ONNX 初始化 string model_path /home/yourname/yolov8n.onnx; // 改你的路径 Ort::Env env(ORT_LOGGING_LEVEL_WARNING, YOLO); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); session_ make_uniqueOrt::Session(env, model_path.c_str(), session_options); // 输入输出名 input_name_ session_-GetInputNameAllocated(0, allocator_).get(); output_name_ session_-GetOutputNameAllocated(0, allocator_).get(); RCLCPP_INFO(this-get_logger(), YOLOv8 ONNX 加载成功); } private: rclcpp::Subscriptionsensor_msgs::msg::Image::SharedPtr img_sub_; unique_ptrOrt::Session session_; Ort::AllocatorWithDefaultOptions allocator_; char* input_name_; char* output_name_; // 预处理BGR → RGB、640×640、归一化、NCHW Mat preprocess(const Mat img, vectorfloat input_tensor) { Mat resized; resize(img, resized, Size(640,640)); cvtColor(resized, resized, COLOR_BGR2RGB); resized.convertTo(resized, CV_32F, 1.0/255.0); input_tensor.assign(resized.data, resized.data 640*640*3); return resized; } // 后处理解析框 非极大值抑制 void postprocess(Mat img, const vectorfloat output) { vectorRect boxes; vectorfloat confs; vectorint class_ids; float scale_x img.cols / 640.0f; float scale_y img.rows / 640.0f; // 遍历 8400 个候选框 for (int i0; iOUTPUT_ROWS; i) { float conf output[i*OUTPUT_COLS 4]; if (conf 0.5f) continue; // 取最高概率类别 float max_cls 0; int cls_id 0; for (int j0; jCOCO_CLASSES; j) { float prob output[i*OUTPUT_COLS 5 j]; if (prob max_cls) { max_cls prob; cls_id j; } } if (max_cls 0.5f) continue; // 框坐标640尺度 float x output[i*OUTPUT_COLS 0]; float y output[i*OUTPUT_COLS 1]; float w output[i*OUTPUT_COLS 2]; float h output[i*OUTPUT_COLS 3]; // 转原图坐标 int left (x - w/2) * scale_x; int top (y - h/2) * scale_y; int width w * scale_x; int height h * scale_y; boxes.emplace_back(left, top, width, height); confs.push_back(conf); class_ids.push_back(cls_id); } // NMS vectorint indices; dnn::NMSBoxes(boxes, confs, 0.5f, 0.45f, indices); // 画框 输出中心 for (int idx : indices) { Rect bbox boxes[idx]; float u bbox.x bbox.width/2.0f; float v bbox.y bbox.height/2.0f; // 打印框(x,y,w,h) 中心(u,v) RCLCPP_INFO(this-get_logger(), BBox: x%d y%d w%d h%d | Center: u%.1f v%.1f, bbox.x, bbox.y, bbox.width, bbox.height, u, v); // 可视化 rectangle(img, bbox, Scalar(0,255,0), 2); circle(img, Point(u,v), 5, Scalar(0,0,255), -1); } } void imageCallback(const sensor_msgs::msg::Image::SharedPtr msg) { cv_bridge::CvImagePtr cv_ptr; try { cv_ptr cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8); } catch (...) { return; } Mat img cv_ptr-image; vectorfloat input_tensor; // 预处理 preprocess(img, input_tensor); // 推理 vectorint64_t input_shape {1,3,640,640}; vectorint64_t output_shape {1,OUTPUT_COLS,OUTPUT_ROWS}; Ort::Value input_tensor_ort Ort::Value::CreateTensorfloat( allocator_, input_tensor.data(), input_tensor.size(), input_shape.data(), input_shape.size()); vectorOrt::Value output_tensors session_-Run( Ort::RunOptions{nullptr}, input_name_, input_tensor_ort, 1, output_name_, 1); // 后处理 float* output_data output_tensors[0].GetTensorMutableDatafloat(); postprocess(img, vectorfloat(output_data, output_data OUTPUT_COLS*OUTPUT_ROWS)); imshow(YOLOv8 ONNX, img); waitKey(1); } }; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node make_sharedYoloONNXNode(); rclcpp::spin(node); rclcpp::shutdown(); return 0; }五、编译与运行bash运行# 1. 放入 ROS2 工作空间 src cd ~/ros2_ws/src # 放入上面的 yolo_onnx_ros2 包 # 2. 编译 cd ~/ros2_ws colcon build --packages-select yolo_onnx_ros2 source install/setup.bash # 3. 运行确保相机发布 /image_raw ros2 run yolo_onnx_ros2 yolo_node输出内容终端plaintextBBox: x120 y80 w200 h300 | Center: u220.0 v230.0窗口显示绿色框红色中心点六、下一步对接视觉伺服IBVS你之前的 IBVS 代码只需要把cpp运行// 替换原来的简单阈值检测 // 从 YOLO 回调里拿到 u, v即可完成单目 YOLO 框 中心 IBVS 闭环。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2635242.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!