deepstream的车牌识别在lpr,而属性分类是在test2,故对比学习两个代码。
代码用pipeline贯通:
pipeline = gst_pipeline_new ("pipeline");
然后往pipeline中加数据,方法一(先添加streammux,再添加source和解码等):
gst_bin_add (GST_BIN(pipeline), streammux);
gst_bin_add_many (GST_BIN (pipeline), source[src_cnt], mp4demux[src_cnt],
h264parser[src_cnt], parsequeue[src_cnt], decoder[src_cnt], NULL);
往pipeline中加数据,方法二(先添加source和解码,再添加streammux等):
gst_bin_add_many (GST_BIN (pipeline), source, h264parser, decoder, streammux, pgie, nvtracker, sgie1, sgie2, sgie3,
nvvidconv, nvosd, transform, sink, NULL);
往pipeline中加模型:
gst_bin_add_many (GST_BIN (pipeline), primary_detector, secondary_detector,
tracker, nvdsanalytics, queue1, queue2, queue3, queue4, queue5, queue6,
queue7, queue8, secondary_classifier, nvvidconv, nvosd, nvtile, sink, NULL);
如果需要报错模型,往pipeline中加:
gst_bin_add_many (GST_BIN (pipeline), nvvidconv1, nvh264enc, capfilt,
queue9, queue10, NULL);
运行之前给pipeline传参GST_STATE_PLAYING:
gst_element_set_state (pipeline, GST_STATE_PLAYING);
运行:
g_main_loop_run (loop);
运行完之后给pipeline传参GST_STATE_NULL并释放:
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
模型对比
lpr中:两个检测模型(一个是4类,机动车,两轮车,人,交通标志;另一个是1类),一个字符识别ctc模型(车牌识别)
//定义两个检测模型*primary_detector, *secondary_detector,一个字符识别模型*secondary_classifier
GstElement *pipeline = NULL,*streammux = NULL, *sink = NULL,
*primary_detector = NULL, *secondary_detector = NULL,
*nvvidconv = NULL, *nvosd = NULL, *nvvidconv1 = NULL,
*nvh264enc = NULL, *capfilt = NULL,
*secondary_classifier = NULL, *nvtile=NULL;
GstElement *tracker = NULL, *nvdsanalytics = NULL;
GstElement *queue1 = NULL, *queue2 = NULL, *queue3 = NULL, *queue4 = NULL,
*queue5 = NULL, *queue6 = NULL, *queue7 = NULL, *queue8 = NULL,
*queue9 = NULL, *queue10 = NULL;
GstElement *h264parser[128], *source[128], *decoder[128], *mp4demux[128],
*parsequeue[128];
test2中:一个检测模型(4类,机动车,两轮车,人,交通标志),3个属性分类模型(车辆的颜色,。。)
//定义一个检测模型*pgie,三个分类模型*sgie1, *sgie2, *sgie3
GstElement *pipeline = NULL, *source = NULL, *h264parser = NULL,
*decoder = NULL, *streammux = NULL, *sink = NULL, *pgie = NULL, *nvvidconv = NULL,
*nvosd = NULL, *sgie1 = NULL, *sgie2 = NULL, *sgie3 = NULL, *nvtracker = NULL;
lpr中第一个检测模型:
GstElement *primary_detector = NULL;
primary_detector = gst_element_factory_make ("nvinfer", "primary-infer-engine1");
g_object_set (G_OBJECT (primary_detector), "config-file-path","trafficamnet_config.txt", "unique-id", PRIMARY_DETECTOR_UID, NULL);
gst_bin_add_many (GST_BIN (pipeline), primary_detector, secondary_detector,
tracker, nvdsanalytics, queue1, queue2, queue3, queue4, queue5, queue6,
queue7, queue8, secondary_classifier, nvvidconv, nvosd, nvtile, sink, NULL);
test2中第一个检测模型:
GstElement *pgie = NULL;
pgie = gst_element_factory_make ("nvinfer", "primary-nvinference-engine");
g_object_set (G_OBJECT (pgie), "config-file-path", PGIE_CONFIG_FILE, NULL);
gst_bin_add_many (GST_BIN (pipeline),
source, h264parser, decoder, streammux, pgie, nvtracker, sgie1, sgie2, sgie3,
nvvidconv, nvosd, transform, sink, NULL);
lpr中第二个检测模型:
GstElement *secondary_detector = NULL;
secondary_detector = gst_element_factory_make ("nvinfer", "secondary-infer-engine1");
g_object_set (G_OBJECT (secondary_detector), "config-file-path", "lpd_us_config.txt", "unique-id", SECONDARY_DETECTOR_UID, "process-mode", 2, NULL);
gst_bin_add_many (GST_BIN (pipeline), primary_detector, secondary_detector,
tracker, nvdsanalytics, queue1, queue2, queue3, queue4, queue5, queue6,
queue7, queue8, secondary_classifier, nvvidconv, nvosd, nvtile, sink, NULL);
test2中第二个模型:
GstElement *sgie1 = NULL;
sgie1 = gst_element_factory_make ("nvinfer", "secondary1-nvinference-engine");
g_object_set (G_OBJECT (sgie1), "config-file-path", SGIE1_CONFIG_FILE, NULL);
gst_bin_add_many (GST_BIN (pipeline),
source, h264parser, decoder, streammux, pgie, nvtracker, sgie1, sgie2, sgie3,
nvvidconv, nvosd, transform, sink, NULL);
剩下的模型类似。总结出:每个模型都是这样的应用。
数据流对比
lpr中的数据流:
GstElement *pipeline = NULL;
pipeline = gst_pipeline_new ("pipeline");
gst_bin_add (GST_BIN(pipeline), streammux); //多一个add
gst_bin_add_many (GST_BIN (pipeline), source[src_cnt], mp4demux[src_cnt],
h264parser[src_cnt], parsequeue[src_cnt], decoder[src_cnt], NULL);
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bin_add_many (GST_BIN (pipeline), primary_detector, secondary_detector,
tracker, nvdsanalytics, queue1, queue2, queue3, queue4, queue5, queue6,
queue7, queue8, secondary_classifier, nvvidconv, nvosd, nvtile, sink,
NULL);
if (atoi(argv[2]) == 1) {
g_object_set (G_OBJECT (sink), "location", argv[argc-1],NULL);
gst_bin_add_many (GST_BIN (pipeline), nvvidconv1, nvh264enc, capfilt,
queue9, queue10, NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
test2中的数据流
GstElement *pipeline = NULL;
pipeline = gst_pipeline_new ("dstest2-pipeline");
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bin_add_many (GST_BIN (pipeline),
source, h264parser, decoder, streammux, pgie, nvtracker, sgie1, sgie2, sgie3,
nvvidconv, nvosd, transform, sink, NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("Deleting pipeline\n");
gst_object_unref (GST_OBJECT (pipeline));
lpr中的streammux:
GstElement *streammux = NULL;
streammux = gst_element_factory_make ("nvstreammux", "stream-muxer");
gst_bin_add (GST_BIN(pipeline), streammux); //这里的add对应test2中的add_many
sinkpad = gst_element_get_request_pad (streammux, pad_name_sink);
g_object_set (G_OBJECT (streammux), "width", MUXER_OUTPUT_WIDTH, "height",
MUXER_OUTPUT_HEIGHT, "batch-size", src_cnt, "batched-push-timeout", MUXER_BATCH_TIMEOUT_USEC, NULL);
gst_element_link_many (streammux, queue1, primary_detector, queue2,
tracker, queue3, secondary_detector, queue5,
secondary_classifier, queue6, nvtile, queue7, nvvidconv, queue8,
nvosd, NULL)
test2中的streammux:
GstElement *streammux = NULL;
streammux = gst_element_factory_make ("nvstreammux", "stream-muxer");
g_object_set (G_OBJECT (streammux), "batch-size", 1, NULL);
g_object_set (G_OBJECT (streammux), "width", MUXER_OUTPUT_WIDTH, "height",
MUXER_OUTPUT_HEIGHT, "batched-push-timeout", MUXER_BATCH_TIMEOUT_USEC, NULL);
gst_bin_add_many (GST_BIN (pipeline),
source, h264parser, decoder, streammux, pgie, nvtracker, sgie1, sgie2, sgie3,
nvvidconv, nvosd, transform, sink, NULL); //这里的add_many对应lpr中的add
sinkpad = gst_element_get_request_pad (streammux, pad_name_sink);
gst_element_link_many (streammux, pgie, nvtracker, sgie1,
sgie2, sgie3, nvvidconv, nvosd, transform, sink, NULL)