1. 程式人生 > 實用技巧 >cnstream pipeline啟動到準備資料過程的原始碼學習筆記(二):osd模組

cnstream pipeline啟動到準備資料過程的原始碼學習筆記(二):osd模組

本文是對cnstream程式碼的學習筆記

git程式碼 :https://github.com/Cambricon/CNStream

寒武紀開發者論壇: http://forum.cambricon.com/list-47-1.html

1 簡介osd模組

這個模組主要是將檢測和追蹤結果疊加在原圖上的。

2 對外介面

Osd類繼承了Module和ModuleCreate類,它的公有介面有四個。

bool Open(cnstream::ModuleParamSet paramSet) override;
void Close() override;
int Process(std::shared_ptr<CNFrameInfo> data) override
; bool CheckParamSet(const ModuleParamSet& paramSet) const override;

3 與pipeline的關係

建立了一個pipeline物件後,我們呼叫bool Pipeline::Start() 會呼叫到介面 bool Open(cnstream::ModuleParamSet paramSet) override; ,主要作用是更新osd的一些私有變數,比如變數labels_它儲存了標籤的名稱;secondary_labels_儲存了次要標籤的名稱;chinese_label_flag_設定是否有中文標籤;attr_keys_設定?;label_size_設定標籤的大小;還有text_scale_、 text_thickness_、 box_thickness_ 、logo_;

最後pipeline關閉會呼叫到 void Close() override; 介面。

4 Process介面

Osd引入了CnoSd這個類,在osd內部有一個叫osd_ctxs_的map來儲存cnosd類,也就是一個osd模組物件為每一個執行緒分配一個cnosd。

cnosd初始化主要是根據labels_的大小設定了colors_,std::vector<cv::Scalar> colors; 這是一個儲存隨機rgb顏色的陣列。具體生成隨機顏色的方法[https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/],也就是為每個labels設定一個不同的顏色。同時通過這個類可以設定文件的顏色、標籤框大小、標籤的層數和標籤框層數等等。

最重要的是這個類實現了在影象上畫標籤、畫logo的功能:

  void DrawLabel(cv::Mat *image, const CNObjsVec& objects, std::vector<std::string> attr_keys = {}) const;
  void DrawLogo(cv::Mat *image, std::string logo) const;

5 一些資料結構

  • stream_count_map_

一個全域性的map std::unordered_map<std::string, int> CNFrameInfo::stream_count_map_; 用來標識某路資料流生成了幾個CNFrameInfo。

  • CNFrameInfo

這是Module之間傳遞的資料結構,主要記錄了資料屬於哪一路視訊流,資料幀的時間戳和儲存自定義資料的map(命名為datas)等。

public:
std::string stream_id; ///< The data stream aliases where this frame is located to. int64_t timestamp = -1; ///< The time stamp of this frame. size_t flags = 0; ///< The mask for this frame, ``CNFrameFlag``. // user-defined DataFrame,InferResult etc... std::unordered_map<int, any> datas; mutable uint32_t channel_idx = INVALID_STREAM_IDX; ///< The index of the channel, stream_index

private:
SpinLock mask_lock_; /*The mask map of the module. It identifies which modules the data can already be processed by.*/ std::unordered_map<unsigned int, uint64_t> module_mask_map_; SpinLock eos_lock_; uint64_t eos_mask = 0;
  • CNDataFrame

這是上面自定義資料結構支援的一種,用於存放視訊幀資料。

  • CNInferObject

也是上面自定義資料結構支援的一種,用於存放神經網路推理結果。