前に書いてある
背景:
Paddle は、PaddleX デプロイメントの例を公式に提供しています。以下のプロセスは、paddleX と paddleseg を参照しており、対応するドキュメントは、github リポジトリにあります。あくまで学習記録用です。
1. 環境
- CUDA10.1 カドン 7.6
- opencv バージョン 3.4.6
- PaddleInference の予測ライブラリの C++ バージョン
- TensorRT 6.0.1.5
- cmake 3.22.3
- VS2019 Community Edition (vs2019 の使用をお勧めします。他のバージョンでは問題が発生します。vs2022 を使用すると騙されました)
2. 準備する
- PaddleX コードと PaddleInference 予測ライブラリをダウンロードする
- Tensorrt をダウンロードし、システム環境変数を設定します。このプロジェクトで使用されている cuda のバージョンは 10.2 です。対応する trt バージョンをダウンロードしてください。
- プロジェクト管理を容易にするために、すべてのファイルを 1 つのフォルダーにまとめます
- OpenCV システム環境変数を設定する
3. コードのコンパイル
3.1 GPU+TRT バージョン
3.2 CPUバージョン
3.3 解決策
最後に、.sln ファイルが out フォルダーに表示されます。これは、ソリューションが cmake によって正常に生成されたことを意味します。
vs2019でプロジェクトを開きます。
4. ファイルを変更する
①CMakeLists.txtを修正する
121行目あたりを修正
# add_executable(model_infer model_infer.cpp ${SRC} ${ENGINE_SRC} ${DETECTOR_SRC} ${ENCRYPTION_SRC})
add_library(model_infer SHARED model_infer.cpp ${SRC} ${ENGINE_SRC} ${DETECTOR_SRC} ${ENCRYPTION_SRC})
②model_infer.cppを修正する
paddleX の github リポジトリでpaddleX/deploy/cpp/docs/csharp_deploy/model_infer.cpp
このファイルを見つけて、ローカル プロジェクトに置き換えます。PaddleX/deploy/cpp/demo/model_infer.cpp
③独自のプロジェクトのニーズに応じてmodel_infer.cppを変更します。
例えばここでは画像検出座標を取得する関数を作りたいと思います。Seg_ModelPredict
関数を修正します
(特別な要件がなければ、model_infer.cppのソースコードを修正する必要はありません)
extern "C" __declspec(dllexport) void Seg_ModelPredict(const unsigned char* img, int nWidth, int nHeight, int nChannel, unsigned char* output, unsigned int* tar_pos)
{
// prepare data
std::vector<cv::Mat> imgs;
std::deque<int> value_1_pos; // 记录当X=256时,Y对应的位置的值=1的坐标位置
int indexSrc = 0;
unsigned char color_id = 0;
int nType = 0;
if (nChannel == 3)
{
nType = CV_8UC3;
}
else
{
std::cout << "Only support 3 channel image." << std::endl;
return;
}
cv::Mat input = cv::Mat::zeros(cv::Size(nWidth, nHeight), nType);
memcpy(input.data, img, nHeight * nWidth * nChannel * sizeof(uchar));
imgs.push_back(std::move(input));
// predict
std::vector<PaddleDeploy::Result> results;
model->Predict(imgs, &results, 1);
std::vector<uint8_t> result_map = results[0].seg_result->label_map.data; // vector<uint8_t> -- Result Map
// Copy output result to the output back -- from vector<uint8_t> to unsigned char *
memcpy(output, &result_map[0], result_map.size() * sizeof(uchar));
for (int i = 0; i < 512; i++) {
// height
indexSrc = i * 512 + 256;
color_id = (int)output[indexSrc] % 256; // Pixel category ID
if (color_id == 1) {
value_1_pos.push_back(i);
}
}
if (value_1_pos.begin() != value_1_pos.end()) {
*tar_pos = round((value_1_pos.back() - value_1_pos.front()) / 2) + value_1_pos.front();
}
else {
*tar_pos = 0;
}
}
④DLLの生成
何も予期せぬことが起こった場合は
、Release にあるファイルをコピーすることF:\edge_download\px\PaddleX-2.0.0\deploy\cpp\out\paddle_deploy
がわかります。合計 7 つのファイルがあり、これらが必要な DLL のすべてです。CPU バージョンにはファイルが 5 つしかありません
model_infer.dll
5. 質問
1. 見つかりません。G:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib\x64\cudnn.lib
インストール中にcuda
、ディレクトリ内のファイルをディレクトリcudnn
にコピーします。lib
cudnn.lib
....CUDA\v10.1\lib\x64
2. たとえば、次のような問題が発生した場合:
- 型指定子がありません - int が想定されます。注: C++ はデフォルトの int をサポートしていません。
- …未定義
- ステートメントが見つかりません
このような問題が発生した場合は、すべてのファイルを削除して最初からやり直すことをお勧めします。ステップ 3 から開始して、ファイルを解凍し、コードをコンパイルします。。。。。。
6. C++ 呼び出し
[C++] DLL の呼び出し (PaddleX デプロイメントに基づいて生成された DLL)