Tidak Ada Deskripsi

leon f3f74777ec 修改main函数 2 minggu lalu
.vscode 35d7955e75 添加分类模块 3 minggu lalu
src f3f74777ec 修改main函数 2 minggu lalu
workspace ecf9b28c82 添加从yaml中获取配置 2 minggu lalu
Makefile f3f74777ec 修改main函数 2 minggu lalu
README.md 35a59ad885 update readme 3 minggu lalu

README.md

流水线视频识别

支持功能

  1. opencv 软解码
  2. nvcuvid 硬解码
  3. yolov5/v8/11 检测、关键点、分割模型识别
  4. depth-adnything 深度模型识别
  5. bytetrack 目标追踪
  6. 结果绘制
  7. 识别后的视频保存
  8. 识别结果http推送
  9. 逻辑判断节点
  10. 根据配置文件创建pipeline

配置文件示例

{
    "models": {
        "yolo_model_main": {
            "model_path": "model/model1.engine",
            "model_type": "YOLO11SEG",
            "names": [
                "person",
                "bicycle",
                "car",
                "motorcycle",
                "airplane",
                "bus",
                "train",
                "truck",
                "boat",
                "traffic light",
                "fire hydrant",
                "stop sign",
                "parking meter",
                "bench",
                "bird",
                "cat",
                "dog",
                "horse",
                "sheep",
                "cow",
                "elephant",
                "bear",
                "zebra",
                "giraffe",
                "backpack",
                "umbrella",
                "handbag",
                "tie",
                "suitcase",
                "frisbee",
                "skis",
                "snowboard",
                "sports ball",
                "kite",
                "baseball bat",
                "baseball glove",
                "skateboard",
                "surfboard",
                "tennis racket",
                "bottle",
                "wine glass",
                "cup",
                "fork",
                "knife",
                "spoon",
                "bowl",
                "banana",
                "apple",
                "sandwich",
                "orange",
                "broccoli",
                "carrot",
                "hot dog",
                "pizza",
                "donut",
                "cake",
                "chair",
                "couch",
                "potted plant",
                "bed",
                "dining table",
                "toilet",
                "tv",
                "laptop",
                "mouse",
                "remote",
                "keyboard",
                "cell phone",
                "microwave",
                "oven",
                "toaster",
                "sink",
                "refrigerator",
                "book",
                "clock",
                "vase",
                "scissors",
                "teddy bear",
                "hair drier",
                "toothbrush"
            ],
            "gpu_id": 1,
            "confidence_threshold": 0.25,
            "nms_threshold": 0.45
        }
    },
    "pipelines": [
        {
            "pipeline_id": "pipeline_0",
            "description": "处理摄像头0的视频流",
            "nodes": [
                {
                    "node_id": "src_0",
                    "node_type": "Source",
                    "params": {
                        "stream_url": "rtsp://admin:lww123456@172.16.22.16:554/Streaming/Channels/101",
                        "gpu_id": 1,
                        "decode_type": "GPU",
                        "skip_frame": 1
                    }
                },
                {
                    "node_id": "infer_0",
                    "node_type": "Inference",
                    "params": {
                        "model_id": "yolo_model_main"
                    }
                },
                {
                    "node_id": "track_0",
                    "node_type": "Tracker",
                    "params": {
                        "track_name": "person",
                        "track_frame": 30,
                        "track_distance": 30
                    }
                },
                {
                    "node_id": "analyze_0",
                    "node_type": "Analyzer",
                    "params": {}
                },
                {
                    "node_id": "draw_0",
                    "node_type": "Drawer",
                    "params": {}
                },
                {
                    "node_id": "record_0",
                    "node_type": "Recorder",
                    "params": {
                        "record_path": "result/result_pipeline0.mp4"
                    }
                }
            ]
        },
        {
            "pipeline_id": "pipeline_1",
            "description": "处理摄像头1的视频流",
            "nodes": [
                {
                    "node_id": "src_1",
                    "node_type": "Source",
                    "params": {
                        "stream_url": "rtsp://admin:lww123456@172.16.22.16:554/Streaming/Channels/101",
                        "gpu_id": 1,
                        "decode_type": "GPU",
                        "skip_frame": 1
                    }
                },
                {
                    "node_id": "infer_1",
                    "node_type": "Inference",
                    "params": {
                        "model_id": "yolo_model_main"
                    }
                },
                {
                    "node_id": "track_1",
                    "node_type": "Tracker",
                    "params": {
                        "track_name": "person",
                        "track_frame": 30,
                        "track_distance": 30
                    }
                },
                {
                    "node_id": "analyze_1",
                    "node_type": "Analyzer",
                    "params": {}
                },
                {
                    "node_id": "draw_1",
                    "node_type": "Drawer",
                    "params": {}
                },
                {
                    "node_id": "record_1",
                    "node_type": "Recorder",
                    "params": {
                        "record_path": "result/result_pipeline1.mp4"
                    }
                }
            ]
        }
    ]
}

使用示例

void test_yolo()
{
    OverflowStrategy stage = OverflowStrategy::Block;
    int max_size = 100;

    // std::vector<std::string> names = { "person", "clothes", "vest" };
    std::vector<std::string> names = { "person", "car", "close", "open" };
    // std::shared_ptr<GNode::StreamNode> src_node0   = std::make_shared<GNode::StreamNode>("src0", "rtsp://admin:lww123456@172.16.22.16:554/Streaming/Channels/201", 0, GNode::DecodeType::GPU);
    std::shared_ptr<GNode::StreamNode> src_node0   = std::make_shared<GNode::StreamNode>("src0", "carperson.mp4", 0, GNode::DecodeType::GPU);
    src_node0->set_skip_frame(1);

    std::shared_ptr<Infer> yolo_model = load("model/carperson.engine", ModelType::YOLOV5, names, 0, 0.25, 0.45);
    std::shared_ptr<GNode::InferNode> infer_node   = std::make_shared<GNode::InferNode>("yolov5");
    infer_node->set_model_instance(yolo_model, ModelType::YOLO11);

    std::shared_ptr<GNode::TrackNode> track_node     = std::make_shared<GNode::TrackNode>("tracker", "person", 30, 30);

    std::shared_ptr<GNode::DrawNode> draw_node     = std::make_shared<GNode::DrawNode>("draw_track");
    std::shared_ptr<GNode::RecordNode> record_node = std::make_shared<GNode::RecordNode>("record");
    record_node->set_record_path("result/result.mp4");
    record_node->set_fps(25);
    record_node->set_fourcc(cv::VideoWriter::fourcc('X', '2', '6', '4'));
    
    GNode::LinkNode(src_node0, infer_node, max_size, stage);
    GNode::LinkNode(infer_node, track_node, max_size, stage);
    GNode::LinkNode(track_node, draw_node, max_size, stage);
    GNode::LinkNode(draw_node, record_node, max_size, stage);
    record_node->start();
    draw_node->start();
    track_node->start();
    infer_node->start();
    src_node0->start();
    getchar();
}