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;
}