| #ifndef TRTX_YOLOV5_UTILS_H_ |
| #define TRTX_YOLOV5_UTILS_H_ |
|
|
| #include <dirent.h> |
| #include <opencv2/opencv.hpp> |
| #include <opencv2/cudawarping.hpp> |
| #include <opencv2/cudaimgproc.hpp> |
| #include <opencv2/cudaarithm.hpp> |
| #include <opencv2/highgui.hpp> |
| #include <iostream> |
| #include "common.hpp" |
|
|
| #define SHOW_IMG |
|
|
| static inline cv::Mat preprocess_img(cv::Mat& img, int input_w, int input_h) { |
| int w, h, x, y; |
| float r_w = input_w / (img.cols*1.0); |
| float r_h = input_h / (img.rows*1.0); |
| if (r_h > r_w) { |
| w = input_w; |
| h = r_w * img.rows; |
| x = 0; |
| y = (input_h - h) / 2; |
| } else { |
| w = r_h * img.cols; |
| h = input_h; |
| x = (input_w - w) / 2; |
| y = 0; |
| } |
| cv::Mat re(h, w, CV_8UC3); |
| cv::resize(img, re, re.size(), 0, 0, cv::INTER_LINEAR); |
| cv::Mat out(input_h, input_w, CV_8UC3, cv::Scalar(114, 114, 114)); |
| re.copyTo(out(cv::Rect(x, y, re.cols, re.rows))); |
| cv::Mat tensor; |
| out.convertTo(tensor, CV_32FC3, 1.f / 255.f); |
| |
| cv::subtract(tensor, cv::Scalar(0.485, 0.456, 0.406), tensor, cv::noArray(), -1); |
| cv::divide(tensor, cv::Scalar(0.229, 0.224, 0.225), tensor, 1, -1); |
| |
| |
| |
| |
| return tensor; |
| } |
|
|
| void preprocess_img_gpu(cv::cuda::GpuMat& img, float* gpu_input, int input_w, int input_h) { |
| int w, h, x, y; |
| float r_w = input_w / (img.cols*1.0); |
| float r_h = input_h / (img.rows*1.0); |
| if (r_h > r_w) { |
| w = input_w; |
| h = r_w * img.rows; |
| x = 0; |
| y = (input_h - h) / 2; |
| } else { |
| w = r_h * img.cols; |
| h = input_h; |
| x = (input_w - w) / 2; |
| y = 0; |
| } |
| cv::cuda::GpuMat re(h, w, CV_8UC3); |
| cv::cuda::resize(img, re, re.size(), 0, 0, cv::INTER_LINEAR); |
| cv::cuda::GpuMat out(input_h, input_w, CV_8UC3, cv::Scalar(114, 114, 114)); |
| cv::cuda::GpuMat tensor; |
| re.copyTo(out(cv::Rect(x, y, re.cols, re.rows))); |
| out.convertTo(tensor, CV_32FC3, 1.f / 255.f); |
| cv::cuda::subtract(tensor, cv::Scalar(0.485, 0.456, 0.406), tensor, cv::noArray(), -1); |
| cv::cuda::divide(tensor, cv::Scalar(0.229, 0.224, 0.225), tensor, 1, -1); |
| |
| |
|
|
| |
| std::vector<cv::cuda::GpuMat> chw; |
| for (size_t i = 0; i < 3; ++i) |
| { |
| chw.emplace_back(cv::cuda::GpuMat(tensor.size(), CV_32FC1, gpu_input + i * input_w * input_h)); |
| } |
| cv::cuda::split(tensor, chw); |
| } |
|
|
| static inline int read_files_in_dir(const char *p_dir_name, std::vector<std::string> &file_names) { |
| DIR *p_dir = opendir(p_dir_name); |
| if (p_dir == nullptr) { |
| return -1; |
| } |
|
|
| struct dirent* p_file = nullptr; |
| while ((p_file = readdir(p_dir)) != nullptr) { |
| if (strcmp(p_file->d_name, ".") != 0 && |
| strcmp(p_file->d_name, "..") != 0) { |
| |
| |
| |
| std::string cur_file_name(p_file->d_name); |
| file_names.push_back(cur_file_name); |
| } |
| } |
|
|
| closedir(p_dir); |
| return 0; |
| } |
|
|
| void PrintMat(cv::Mat &A) |
| { |
| for(int i=0; i<A.rows; i++) |
| { |
| for(int j=0; j<A.cols; j++) |
| std::cout << A.at<int>(i,j) << ' '; |
| std::cout << std::endl; |
| } |
| std::cout << std::endl; |
| } |
|
|
| void visualization(cv::cuda::GpuMat& cvt_img, cv::Mat& seg_res, cv::Mat& lane_res, std::vector<Yolo::Detection>& res, char& key) |
| { |
| static const std::vector<cv::Vec3b> segColor{cv::Vec3b(0, 0, 0), cv::Vec3b(0, 255, 0), cv::Vec3b(255, 0, 0)}; |
| static const std::vector<cv::Vec3b> laneColor{cv::Vec3b(0, 0, 0), cv::Vec3b(0, 0, 255), cv::Vec3b(0, 0, 0)}; |
| cv::Mat cvt_img_cpu; |
| cvt_img.download(cvt_img_cpu); |
|
|
| |
| for (int row = 0; row < cvt_img_cpu.rows; ++row) { |
| uchar* pdata = cvt_img_cpu.data + row * cvt_img_cpu.step; |
| for (int col = 0; col < cvt_img_cpu.cols; ++col) { |
| int seg_idx = seg_res.at<int>(row, col); |
| int lane_idx = lane_res.at<int>(row, col); |
| |
| for (int i = 0; i < 3; ++i) { |
| if (lane_idx) { |
| if (i != 2) |
| pdata[i] = pdata[i] / 2 + laneColor[lane_idx][i] / 2; |
| } |
| else if (seg_idx) |
| pdata[i] = pdata[i] / 2 + segColor[seg_idx][i] / 2; |
| } |
| pdata += 3; |
| } |
| } |
|
|
| |
| for (size_t j = 0; j < res.size(); ++j) { |
| cv::Rect r = get_rect(cvt_img_cpu, res[j].bbox); |
| cv::rectangle(cvt_img_cpu, r, cv::Scalar(0x27, 0xC1, 0x36), 2); |
| cv::putText(cvt_img_cpu, std::to_string((int)res[j].class_id), cv::Point(r.x, r.y - 1), cv::FONT_HERSHEY_PLAIN, 1.2, cv::Scalar(0xFF, 0xFF, 0xFF), 2); |
| } |
| |
| #ifdef SHOW_IMG |
| cv::imshow("img", cvt_img_cpu); |
| key = cv::waitKey(1); |
| #else |
| cv::imwrite("../zed_result.jpg", cvt_img_cpu); |
| #endif |
| } |
|
|
| #endif |