| #include "yolov5.hpp" |
| #include "zedcam.hpp" |
| #include <csignal> |
|
|
| static volatile bool keep_running = true; |
|
|
|
|
| void keyboard_handler(int sig) { |
| |
| if (sig == SIGINT) |
| keep_running = false; |
| } |
|
|
|
|
| int main(int argc, char** argv) { |
| signal(SIGINT, keyboard_handler); |
| cudaSetDevice(DEVICE); |
| |
| |
| |
| |
| |
|
|
| std::string engine_name = "../mcnet.engine"; |
|
|
| |
| std::ifstream file(engine_name, std::ios::binary); |
| if (!file.good()) { |
| std::cerr << "read " << engine_name << " error!" << std::endl; |
| return -1; |
| } |
| char *trtModelStream = nullptr; |
| size_t size = 0; |
| file.seekg(0, file.end); |
| size = file.tellg(); |
| file.seekg(0, file.beg); |
| trtModelStream = new char[size]; |
| assert(trtModelStream); |
| file.read(trtModelStream, size); |
| file.close(); |
|
|
| |
| static float det_out[BATCH_SIZE * OUTPUT_SIZE]; |
| static int seg_out[BATCH_SIZE * IMG_H * IMG_W]; |
| static int lane_out[BATCH_SIZE * IMG_H * IMG_W]; |
| IRuntime* runtime = createInferRuntime(gLogger); |
| assert(runtime != nullptr); |
| ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size); |
| assert(engine != nullptr); |
| IExecutionContext* context = engine->createExecutionContext(); |
| assert(context != nullptr); |
| delete[] trtModelStream; |
| assert(engine->getNbBindings() == 4); |
| void* buffers[4]; |
| |
| |
| const int inputIndex = engine->getBindingIndex(INPUT_BLOB_NAME); |
| const int output_det_index = engine->getBindingIndex(OUTPUT_DET_NAME); |
| const int output_seg_index = engine->getBindingIndex(OUTPUT_SEG_NAME); |
| const int output_lane_index = engine->getBindingIndex(OUTPUT_LANE_NAME); |
| assert(inputIndex == 0); |
| assert(output_det_index == 1); |
| assert(output_seg_index == 2); |
| assert(output_lane_index == 3); |
| |
| CUDA_CHECK(cudaMalloc(&buffers[inputIndex], BATCH_SIZE * 3 * INPUT_H * INPUT_W * sizeof(float))); |
| CUDA_CHECK(cudaMalloc(&buffers[output_det_index], BATCH_SIZE * OUTPUT_SIZE * sizeof(float))); |
| CUDA_CHECK(cudaMalloc(&buffers[output_seg_index], BATCH_SIZE * IMG_H * IMG_W * sizeof(int))); |
| CUDA_CHECK(cudaMalloc(&buffers[output_lane_index], BATCH_SIZE * IMG_H * IMG_W * sizeof(int))); |
| |
| cudaStream_t stream; |
| CUDA_CHECK(cudaStreamCreate(&stream)); |
|
|
| |
| auto zed = create_camera(); |
| sl::Resolution image_size = zed->getCameraInformation().camera_configuration.resolution; |
| sl::Mat img_zed(image_size.width, image_size.height, sl::MAT_TYPE::U8_C4, sl::MEM::GPU); |
| cv::cuda::GpuMat img_ocv = slMat2cvMatGPU(img_zed); |
| cv::cuda::GpuMat cvt_img(image_size.height, image_size.width, CV_8UC3); |
|
|
| |
| cv::Mat tmp_seg(IMG_H, IMG_W, CV_32S, seg_out); |
| |
| cv::Mat tmp_lane(IMG_H, IMG_W, CV_32S, lane_out); |
| cv::Mat seg_res(image_size.height, image_size.width, CV_32S); |
| cv::Mat lane_res(image_size.height, image_size.width, CV_32S); |
|
|
| char key = ' '; |
| while (keep_running and key != 'q') { |
| |
| if (zed->grab() != sl::ERROR_CODE::SUCCESS) continue; |
| zed->retrieveImage(img_zed, sl::VIEW::LEFT, sl::MEM::GPU); |
| cudaSetDevice(DEVICE); |
| cv::cuda::cvtColor(img_ocv, cvt_img, cv::COLOR_BGRA2BGR); |
| |
| |
| preprocess_img_gpu(cvt_img, (float*)buffers[inputIndex], INPUT_W, INPUT_H); |
| |
| |
| |
| auto start = std::chrono::system_clock::now(); |
| |
| doInference(*context, stream, buffers, det_out, seg_out, lane_out, BATCH_SIZE); |
| |
| auto end = std::chrono::system_clock::now(); |
| std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl; |
|
|
| |
| std::vector<Yolo::Detection> batch_res; |
| nms(batch_res, det_out, CONF_THRESH, NMS_THRESH); |
| cv::resize(tmp_seg, seg_res, seg_res.size(), 0, 0, cv::INTER_NEAREST); |
| cv::resize(tmp_lane, lane_res, lane_res.size(), 0, 0, cv::INTER_NEAREST); |
|
|
| |
| |
| visualization(cvt_img, seg_res, lane_res, batch_res, key); |
| } |
| |
| #ifdef SHOW_IMG |
| cv::destroyAllWindows(); |
| #endif |
| |
| img_zed.free(); |
| zed->close(); |
| delete zed; |
| |
| cudaStreamDestroy(stream); |
| CUDA_CHECK(cudaFree(buffers[inputIndex])); |
| CUDA_CHECK(cudaFree(buffers[output_det_index])); |
| CUDA_CHECK(cudaFree(buffers[output_seg_index])); |
| CUDA_CHECK(cudaFree(buffers[output_lane_index])); |
| |
| context->destroy(); |
| engine->destroy(); |
| runtime->destroy(); |
| return 0; |
| } |
|
|