Mac 使用VS Code 通过cmake 配置 OpenCV和Pytorch C++ API

Mac 使用VS Code 通过cmake 配置 OpenCV和Pytorch C++ API

个人博客:https://www.whoiscaesarbao.com/2019/03/05/Deep-Learning-Starting

前情

由于pytorch的1.0正式版发布不久,同时较为稳定的c++的API也是在正式版中提供支持,网上的教程不多,因此可供参考的资料只有官方文档和零零散散的博客。不过由于Mac和Linux本身相差不大,一些Linux的配置教程同样值得参考。
以下给出链接:

官方文档
Oldpan的个人博客(特别感谢Oldpan老哥的帖子给我的巨大帮助):
利用Pytorch的C++前端(libtorch)读取预训练权重并进行预测
blockquote Pytorch源码编译简明指南

开始

所需安装的工具有:
1.VS Code:这个官网下载即可
2.OpenCV 4.0.1:终端输入

brew install opencv

即可安装
3.Pytorch1.0:可参考上面给出的Pytorch源码编译简明指南,首先在终端输入

git clone --recursive https://github.com/pytorch/pytorch

获取最新源码,然后通过编译得到Mac可以读取的.dylib文件(注意:在官方文档中下载的libtorch-shared-with-deps-latest.zip文件解压后所得到的文件夹里的动态库文件是以.so结尾,是Linux下的动态库文件,Mac识别不了)编译时应该先进入到刚刚下载好的Pytorch文件夹(默认的路径应该是/Users/用户名/pytorch)下,然后终端执行

   mkdir build
    cd build
    python ../tools/build_libtorch.py

进行libtorch(即c++ API)的编译,时间较长。
4.编译好之后打开VS Code新建一个工程,在这里我引用Oldpan老哥的例子

工程名叫simnet,然后在simnet文件夹下新建一个CMakeLists.txt和一个test.cpp(build先不建),CMakeLists.txt中的代码为:

cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
project(simnet)

find_package(Torch REQUIRED)        # 查找libtorch
find_package(OpenCV REQUIRED)       # 查找OpenCV

if(NOT Torch_FOUND)
message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)

message(STATUS "Pytorch status:")
message(STATUS "    libraries: ${TORCH_LIBRARIES}")

message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

add_executable(simnet test.cpp)
target_link_libraries(simnet ${TORCH_LIBRARIES} ${OpenCV_LIBS}) 
set_property(TARGET simnet PROPERTY CXX_STANDARD 11)

test.cpp中的代码为:

#include <opencv2/opencv.hpp>
#include "torch/script.h"
#include "torch/torch.h"

#include <iostream>
#include <memory>

using namespace std;

// resize并保持图像比例不变
cv::Mat resize_with_ratio(cv::Mat& img)   
{
cv::Mat temImage;
int w = img.cols;
int h = img.rows;

float t = 1.;
float len = t * std::max(w, h);
int dst_w = 224, dst_h = 224;
cv::Mat image = cv::Mat(cv::Size(dst_w, dst_h), CV_8UC3, cv::Scalar(128,128,128));
cv::Mat imageROI;
if(len==w)
{
float ratio = (float)h/(float)w;
cv::resize(img,temImage,cv::Size(224,224*ratio),0,0,cv::INTER_LINEAR);
imageROI = image(cv::Rect(0, ((dst_h-224*ratio)/2), temImage.cols, temImage.rows));
temImage.copyTo(imageROI);
}
else
{
float ratio = (float)w/(float)h;
cv::resize(img,temImage,cv::Size(224*ratio,224),0,0,cv::INTER_LINEAR);
imageROI = image(cv::Rect(((dst_w-224*ratio)/2), 0, temImage.cols, temImage.rows));
temImage.copyTo(imageROI);
}

return image;
}


int main(int argc, const char* argv[])
{
if (argc != 2) {
std::cerr << "usage: example-app <path-to-exported-script-module>\n";
return -1;
}

cv::VideoCapture stream(0);
cv::namedWindow("Gesture Detect", cv::WINDOW_AUTOSIZE);

std::shared_ptr<torch::jit::script::Module> module = torch::jit::load(argv[1]);
module->to(at::kCUDA);

cv::Mat frame;
cv::Mat image;
cv::Mat input;

while(1)
{
stream>>frame;
image = resize_with_ratio(frame);

imshow("resized image",image);    //显示摄像头的数据
cv::cvtColor(image, input, cv::COLOR_BGR2RGB);

// 下方的代码即将图像转化为Tensor,随后导入模型进行预测
torch::Tensor tensor_image = torch::from_blob(input.data, {1,input.rows, input.cols,3}, torch::kByte);
tensor_image = tensor_image.permute({0,3,1,2});
tensor_image = tensor_image.toType(torch::kFloat);
tensor_image = tensor_image.div(255);
tensor_image = tensor_image.to(torch::kCUDA);
torch::Tensor result = module->forward({tensor_image}).toTensor();

auto max_result = result.max(1, true);
auto max_index = std::get<1>(max_result).item<float>();
if(max_index == 0)
cv::putText(frame, "paper", {40, 50}, cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(0, 255, 0), 2);
else if(max_index == 1)
cv::putText(frame, "scissors", {40, 50}, cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(0, 255, 0), 2);
else
cv::putText(frame, "stone", {40, 50}, cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(0, 255, 0), 2);

imshow("Gesture Detect",frame);    //显示摄像头的数据
cv::waitKey(30);
}

保存。

5.终端cd进入simnet工程文件夹,然后执行

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/pytorch ..
make

其中/absolute/path/to/pytorch是pytorch文件夹的绝对路径,一般是/Users/用户名/pytorch
这样就编译完成了
可以执行

./simnet

来运行你的工程了!

后记

由于这是我第一次写教程,很多地方可能有所疏漏,并且配置的过程中踩了无数的坑,可能很多地方起了效果但是我根本没有注意到,还有前期的一些准备工作我也没有提及(比如说anaconda的安装,pip、conda、brew的安装和更新),这些网上有很多大佬写的非常详尽的教程,大家可以多多参考,我这里只是提供了一个自己的思路,如果没有安装成功还望见谅!

转载注明出处!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在VS Code使用CMake配置OpenCV C++项目,可以按照以下步骤进行操作: 1. 确保已经安装了Visual Studio CodeCMake,并将它们添加到系统的环境变量中。 2. 创建一个新的文件夹作为您的项目文件夹,并在其中创建一个CMakeLists.txt文件。在CMakeLists.txt中,输入以下内容: ```cmake cmake_minimum_required(VERSION 3.0) project(YourProjectName) find_package(OpenCV REQUIRED) add_executable(YourExecutableName main.cpp) target_link_libraries(YourExecutableName ${OpenCV_LIBS}) ``` 这个CMakeLists.txt文件指定了项目的最低CMake版本、项目名称以及要使用OpenCV库。 3. 在项目文件夹中创建一个main.cpp文件,并编写您的OpenCV C++代码。 4. 打开Visual Studio Code,选择“文件”->“打开文件夹”,并选择您的项目文件夹。 5. 安装CMake Tools插件。在Visual Studio Code的扩展面板中搜索"CMake Tools"并安装。 6. 在Visual Studio Code的底部状态栏,找到一个齿轮图标,点击它以打开CMake Tools。 7. 在CMake Tools的侧边栏中,选择您的项目文件夹并点击“配置”。 8. 在弹出的对话框中,选择一个构建目录(可以是您项目文件夹下的子文件夹),然后选择CMake工具链。 9. 在弹出的对话框中,输入以下参数并保存: - "cmake.configureOnOpen": false - "cmake.buildDirectory": "build" 这些参数将配置CMake Tools以在打开项目时不自动运行CMake,并将生成的文件放在名为"build"的文件夹中。 10. 回到CMake Tools的侧边栏,点击“配置”按钮,然后选择“生成”按钮。这将运行CMake生成您的项目。 11. 在CMake Tools的侧边栏中,点击“构建”按钮来编译您的项目。 12. 您可以在Visual Studio Code的终端中运行您的可执行文件,或者根据需要进行调试。 这样,您就可以在VS Code使用CMake配置OpenCV C++项目了。记得根据您的具体项目情况修改CMakeLists.txt和main.cpp文件。祝您成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值