| 131 | } |
| 132 | } |
| 133 | void yolo::YOLO::copy(const std::vector<cv::Mat>& imgsBatch) |
| 134 | { |
| 135 | #if 0 |
| 136 | cv::Mat img_fp32 = cv::Mat::zeros(imgsBatch[0].size(), CV_32FC3); // todo |
| 137 | cudaHostRegister(img_fp32.data, img_fp32.elemSize() * img_fp32.total(), cudaHostRegisterPortable); |
| 138 | float* pi = m_input_src_device; |
| 139 | for (size_t i = 0; i < imgsBatch.size(); i++) |
| 140 | { |
| 141 | imgsBatch[i].convertTo(img_fp32, CV_32FC3); |
| 142 | CHECK(cudaMemcpy(pi, img_fp32.data, sizeof(float) * 3 * m_param.src_h * m_param.src_w, cudaMemcpyHostToDevice)); |
| 143 | pi += 3 * m_param.src_h * m_param.src_w; |
| 144 | } |
| 145 | cudaHostUnregister(img_fp32.data); |
| 146 | #endif |
| 147 | |
| 148 | #if 0 // for Nvidia TX2 |
| 149 | cv::Mat img_fp32 = cv::Mat::zeros(imgsBatch[0].size(), CV_32FC3); // todo |
| 150 | float* pi = m_input_src_device; |
| 151 | for (size_t i = 0; i < imgsBatch.size(); i++) |
| 152 | { |
| 153 | std::vector<float> img_vec = std::vector<float>(imgsBatch[i].reshape(1, 1)); |
| 154 | imgsBatch[i].convertTo(img_fp32, CV_32FC3); |
| 155 | CHECK(cudaMemcpy(pi, img_fp32.data, sizeof(float) * 3 * m_param.src_h * m_param.src_w, cudaMemcpyHostToDevice)); |
| 156 | pi += 3 * m_param.src_h * m_param.src_w; |
| 157 | } |
| 158 | #endif |
| 159 | |
| 160 | // update 20230302, faster. |
| 161 | // 1. move uint8_to_float in cuda kernel function. For 8*3*1920*1080, cost time 15ms -> 3.9ms |
| 162 | // 2. Todo |
| 163 | unsigned char* pi = m_input_src_device; |
| 164 | for (size_t i = 0; i < imgsBatch.size(); i++) |
| 165 | { |
| 166 | CHECK(cudaMemcpy(pi, imgsBatch[i].data, sizeof(unsigned char) * 3 * m_param.src_h * m_param.src_w, cudaMemcpyHostToDevice)); |
| 167 | pi += 3 * m_param.src_h * m_param.src_w; |
| 168 | } |
| 169 | |
| 170 | #if 0 // cuda stream |
| 171 | cudaStream_t streams[32]; |
| 172 | for (int i = 0; i < imgsBatch.size(); i++) |
| 173 | { |
| 174 | CHECK(cudaStreamCreate(&streams[i])); |
| 175 | } |
| 176 | unsigned char* pi = m_input_src_device; |
| 177 | for (size_t i = 0; i < imgsBatch.size(); i++) |
| 178 | { |
| 179 | CHECK(cudaMemcpyAsync(pi, imgsBatch[i].data, sizeof(unsigned char) * 3 * m_param.src_h * m_param.src_w, cudaMemcpyHostToDevice, streams[i])); |
| 180 | pi += 3 * m_param.src_h * m_param.src_w; |
| 181 | } |
| 182 | CHECK(cudaDeviceSynchronize()); |
| 183 | #endif |
| 184 | } |
| 185 | |
| 186 | void yolo::YOLO::preprocess(const std::vector<cv::Mat>& imgsBatch) |
| 187 | { |