YOLOv5 tensorRT C++-Code, detaillierte Erläuterung des Engine-Lesens

In TensorRT ist das Motormodell das Ergebnis der Yolov5-Serialisierung. Für Schlussfolgerungen während der Argumentation ist eine Deserialisierung erforderlich. Dann besteht der erste Schritt darin, die Engine-Datei zu lesen.

ifstream-Einführung

Das Lesen von Engine-Dateien erfordert die Verwendung von ifstream und die Header-Dateien müssen importiert werden #include <iostream>, #include <fstream>. Drei Hauptklassen werden bereitgestellt:

ifstream – aus einer vorhandenen Datei lesen
ofstream – Inhalt in eine Datei schreiben
fstream – eine Datei zum Lesen und Schreiben öffnen

Dateiöffnungsmodus:
ios::in schreibgeschützt
ios::out schreibgeschützt
ios::app schreibt vom Ende der Datei, um den Verlust des ursprünglichen Inhalts in der Datei zu verhindern
ios::binary Binärmodus
ios::nocreate Beim Öffnen Wenn die Datei nicht vorhanden ist, erstellen Sie die Datei nicht
. ios::noreplace Wenn Sie eine Datei öffnen und nicht vorhanden sind, erstellen Sie die Datei
ios::trunc. Öffnen Sie eine Datei und leeren Sie dann den Inhalt
. ios::ate Schwanz

Verwendung der Dateizeigerposition in C++:
ios::beg Dateikopf
ios::end Dateiende
ios::cur aktuelle Position

Engine-Dateien lesen

Lesen Sie die trt-Datei mit dem Namen „yolov5s.engine“ und lesen Sie sie im Binärformat.

std::string engine_name = "yolov5s.engine";
std::ifstream file(engine_name, std::ios::binary);

Sie können feststellen, ob die Auslesung erfolgreich war:

if (!file.good())
	{
		std::cerr<<"read" <<engine_name <<"error!"<<std::endl;
		return -1;
	}

Wenn es erfolgreich gelesen werden kann, erhalten wir den vollständigen Dateninhalt:

Lesen Sie den gesamten Dateiinhalt und verwenden Sie file.tellg(), um die Position des Dateizeigers zurückzugeben und die Dateigröße zu ermitteln.

size_t size = 0;
file.seekg(0, file.end);
size = file.tellg();

Größe = 20355643 

Definieren Sie ein leeres Netzwerk

char* trtModel = nullptr; //trtmodel指针初始化
trtModel = new char[size];
assert(trtModel);

Sie können sehen, dass das zu diesem Zeitpunkt definierte trtModel ein Zeiger vom Typ char ist und auf einen Nullzeiger initialisiert wird. Tatsächlich besteht dieser Schritt darin, einen Speicherplatz im Speicher zum Speichern des Motormodells zu schaffen.

Schreiben Sie die Engine in das erstellte trtModel

    //将engine读入定义trt的内存空间中
	file.read(trtModel, size);
	file.close();

Fügen Sie die Engine-Datei in das zuvor definierte trtModel ein.

Vollständiger Code

#include <stdio.h>
#include <string>
#include <fstream>
#include <iostream>
#include <assert.h>

int main()
{	
	std::string engine_name = "yolov5s.engine";
	std::ifstream file(engine_name, std::ios::binary);
	if (!file.good())
	{
		std::cerr<<"read " <<engine_name <<" error!"<<std::endl;
		return -1;
	}
	/*std::string line;
	while (std::getline(file, line))
	{
		std::cout << line << std::endl;
	}*/
	
	//如果可以成功读取文件名
	size_t size = 0;
	file.seekg(0, file.end);
	size = file.tellg();
	//定义trt网络
	char* trtModel = nullptr; //trtmodel指针初始化
	trtModel = new char[size];
	assert(trtModel);

	//将engine读入定义trt的内存空间中
	file.read(trtModel, size);
	file.close();
	
	return 0;
}

Guess you like

Origin blog.csdn.net/z240626191s/article/details/132389768