【嵌入式-TensorRT】TensorPriv代码解读

纵览

- cfgs //保存yaml
- data //保存数据
- docs //说明文档
- tasks //各任务
 |- cls
 |- f-track
 |- fairmot
 |- fcos
 |- yolov5
- tensorrt // 工具包和接口
main.cpp
CMakeLists.txt

CMakeLists.txt

几个命令:

cmake_minimum_required() // 检查cmake的版本
project(tensor_priv) // 设置工程名
include()
set() // 用于设定变量 variable 的值为 value
file() // 把路径保存在变量中
message() // 输出信息
check_language()
add_executable(<name> source1 source2 … sourceN) // 指定从一组源文件 source1 source2 … sourceN 使用gcc编译出一个可执行文件且命名为 name
cuda_add_executable() // 类似,不过是用cuda编译器编译

find_package(<VAR> name1 [path1 path2 …])
find_library(<VAR> name1 [path1 path2 …])
find_path(<VAR> name1 [path1 path2 …]) // 用于查找包含包/库/文件 name1 的路径放入VAR
include_directories($PATH) // 将PATH加入包含目录列表
link_directories($PATH) // 将PATH加入编译器链接阶段的搜索目录列表

target_link_libraries() //  将若干库文件链接到目标tensor_priv中,target_link_libraries里的库文件的顺序符合gcc/g++链接顺序的规则,即被依赖的库放在依赖它的库的后面,如果顺序有错,链接时会报错。
  • Set variable for different ENV
  • Package
  • Set architecture and CUDA
  • TensorRT
  • Project source(Common sources/Tasks sources)
  • Library and Executable(CUDA Compile/G++ Compile)

main.cpp

  1. 分块
    分为三个代码块:初始化、不同任务开关设置参数、跑模型

  2. 代码解读
    2.1 初始化

// 在yaml-cpp包中的YAML命名空间的Node类型
namespace YAML {
Node Clone(const Node& node) {
  NodeEvents events(node);
  NodeBuilder builder;
  events.Emit(builder);
  return builder.Root();
}
}  // namespace YAML

YAML::Node main_cfg = YAML::LoadFile("../cfgs/tasks.yaml");
YAML::Node task = main_cfg["tasks"];
YAML::Node f_track_cfg, fcos_cfg, fairmot_cfg, cls_cfg, yolo_cfg;
类似python的:
main_cfg = cfgNode("../cfgs/tasks.yaml")
task = cfgNode(main_cfg["tasks"])
f_track_cfg, ... = cfgNode(), ...

// 为各任务指派一个指针
F_track* f_track = nullptr;
Fcos*    fcos    = nullptr;
FairMOT* fairmot = nullptr;
CLS*     cls     = nullptr;
YOLOV5*  yolo    = nullptr;

工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace,可以更好地控制标识符的作用域。类比python不同类的同名成员变量/函数/子类。

2.2 不同任务参数设置

if (task["fcos"] && task["fcos"].as<bool>()){
        // 提取对应main cfg的关键字cfg_file
        string cfg_file = main_cfg["fcos"]["cfg_file"].as<string>();
        fcos_cfg = YAML::LoadFile(cfg_file);
        // 加载后建立Fcos类型的对象
        fcos = new Fcos(fcos_cfg);
    }

2.3 跑模型

if(main_cfg["misc"]["multithreading"].as<bool>()) //是否开启多线程

auto thread_func_0 = [&](){
                cv::Mat frame = imread(fairmot_cfg["inputs"]["img_path"].as<string>()); // 读取图片
                int im_w = fairmot_cfg["inputs"]["width"].as<int>();
                int im_h = fairmot_cfg["inputs"]["height"].as<int>();
                cv::resize(frame, frame, cv::Size(im_w, im_h)); // 根据设置resize
                int batch_size = fairmot_cfg["engine"]["bchw"].as<vector<int>>()[0];
                vector<cv::Mat> imgs; // 创造一个装图的vector
                for(int i = 0; i < batch_size; i++){
                    imgs.emplace_back(frame); // 按batchsize插入
                }
                auto fairmot_results = fairmot->run(imgs); // 调用任务类对象的内部函数
            };

TrackRes FairMOT::run(const vector<Mat>& imgs){
    data_timer->start();
    if (!prepareInputs(imgs)){
        mLogger.logger("Prepare Input Data Failed!", logger::LEVEL::ERROR);
    } // 使用tasks预定义的函数处理
    data_timer->click();

    infer_timer->start();
    mNet->ForwardAsync(mStream); // 调用RTengine跑前项
    infer_timer->click();

    post_timer->start();
    auto results = processOutputs(); // 收集结果
    post_timer->click();

    mLogger.logger("Data time: ", data_timer->getTime(), logger::LEVEL::INFO);
    mLogger.logger("Infer time: ", infer_timer->getTime(), logger::LEVEL::INFO);
    mLogger.logger("Post time: ", post_timer->getTime(), logger::LEVEL::INFO);

    return results;
}
全部评论

相关推荐

缓解焦虑的最好方法是回家。鼠鼠昨天上午考完了本科阶段的最后一场考试,大概率考得稀烂,但是没多想,考完立马收拾行李,坐上了提前约好的顺风车飞奔回家。虽然家和学校很近,只有一百多公里的路程,但距离上次回家也已经有三四个月了。每次想回家,期间总有考试、毕业设计、面试、实习等等各种各样的原因,没办法回去,待在学校和公司的每一天也都充斥着无形的压力和焦虑。现在终于完成了答辩,考完了试,公司那边也请了假,是时候回去一趟了。没有提前通知爸妈,想给他们一个惊喜。下午提前到了家,他俩还在上班,只好让外公外婆来给我开门。因为我的回家,晚上外婆在厨房格外忙碌,做了满满一大桌子菜,填饱了我天天吃外卖的肚子。晚上也没空...
梦想是成为七海千秋:取决于家庭吧?其实回家更焦虑了,每天起床父母都问实习找好了没简历投递了没今天有没有面试,但是又没有什么结果,玩两下手机父母就会说你看你啥也没找到为什么天天就知道刷手机,怎么不去学习…我现在就希望我能永远在外面实习,报喜不报忧,等拿到一个好offer再回家
点赞 评论 收藏
分享
05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务