[PaddleX デプロイメント] paddlex デプロイメントは、C++ 呼び出しと Python 呼び出し用の DLL を生成します (paddleseg)

前に書いてある

背景:
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にコピーしますlibcudnn.lib....CUDA\v10.1\lib\x64

2. たとえば、次のような問題が発生した場合:

  • 型指定子がありません - int が想定されます。注: C++ はデフォルトの int をサポートしていません。
  • …未定義
  • ステートメントが見つかりません

このような問題が発生した場合は、すべてのファイルを削除して最初からやり直すことをお勧めします。ステップ 3 から開始して、ファイルを解凍し、コードをコンパイルします。

6. C++ 呼び出し

[C++] DLL の呼び出し (PaddleX デプロイメントに基づいて生成された DLL)

7. Python呼び出し

[Python] DLL の呼び出し (PaddleX デプロイメントに基づいて生成された DLL)

おすすめ

転載: blog.csdn.net/iiinoname/article/details/124209309
おすすめ