流水线视频识别
支持功能
- opencv 软解码
- nvcuvid 硬解码
- yolov5/v8/11 检测、关键点、分割模型识别
- depth-adnything 深度模型识别
- bytetrack 目标追踪
- 结果绘制
- 识别后的视频保存
- 识别结果http推送
- 逻辑判断节点
- 根据配置文件创建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();
}