当前位置: 首页 > news >正文

外贸产品网站建设广西壮族自治区成立于哪一年

外贸产品网站建设,广西壮族自治区成立于哪一年,wordpress更换中文,响应式网站和自适应网站区别前言#xff1a; onnx是microsoft开发的一个中间格式#xff0c;而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程#xff1a; main函数#xff1a; if __name__ __main__:session onn…前言 onnx是microsoft开发的一个中间格式而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程 main函数 if __name__ __main__:session onnxruntime.InferenceSession(workspace/yolov5s.onnx, providers[CPUExecutionProvider])#建立一个InferenceSession塞进去的是onnx的路径实际运算image cv2.imread(workspace/car.jpg)image_input, M, IM preprocess(image)pred session.run([output], {images: image_input})[0]boxes post_process(pred, IM)for obj in boxes:left, top, right, bottom map(int, obj[:4])confidence obj[4]label int(obj[6])cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)cv2.putText(image, f{label}: {confidence:.2f}, (left, top20), 0, 1, (0, 0, 255), 2, 16)cv2.imwrite(workspace/python-ort.jpg, image) session onnxruntime.InferenceSession(workspace/yolov5s.onnx, providers[CPUExecutionProvider])建立一个InferenceSession塞进去的是onnx的路径实际运算的后端选用的是CPU 也可以选用cuda等等 image cv2.imread(workspace/car.jpg)image_input, M, IM preprocess(image)之后就是预处理 pred session.run([output], {images: image_input})[0]boxes post_process(pred, IM) session.run就是运行的inference过程  输入第一个是output的name决定了哪几个节点作为输出就将这个名字传递给他 第二个是input的dict这个意思就是如果有好多个输入那应该是将名字与输入进行一一对应比如input1 :input1  ,   input2:input2.... 那么在这里output就是一个输出的list然后我们取第0项 就是这个样子。 预处理 def preprocess(image, input_w640, input_h640):scale min(input_h / image.shape[0], input_w / image.shape[1])ox (-scale * image.shape[1] input_w scale - 1) * 0.5oy (-scale * image.shape[0] input_h scale - 1) * 0.5M np.array([[scale, 0, ox],[0, scale, oy]], dtypenp.float32)IM cv2.invertAffineTransform(M)image_prep cv2.warpAffine(image, M, (input_w, input_h), flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue(114, 114, 114))image_prep (image_prep[..., ::-1] / 255.0).astype(np.float32)image_prep image_prep.transpose(2, 0, 1)[None]return image_prep, M, IM后处理 def nms(boxes, threshold0.5):keep []remove_flags [False] * len(boxes)for i in range(len(boxes)):if remove_flags[i]:continueib boxes[i]keep.append(ib)for j in range(len(boxes)):if remove_flags[j]:continuejb boxes[j]# class mismatch or image_id mismatchif ib[6] ! jb[6] or ib[5] ! jb[5]:continuecleft, ctop max(ib[:2], jb[:2])#例子#将 ib 的前两个元素 [2, 3] 与 jb 的前两个元素 [4, 1] 进行比较并取其中较大的值。所以结果是 [4, 3]。cright, cbottom min(ib[2:4], jb[2:4])cross max(0, cright - cleft) * max(0, cbottom - ctop)union max(0, ib[2] - ib[0]) * max(0, ib[3] - ib[1]) max(0, jb[2] - jb[0]) * max(0, jb[3] - jb[1]) - crossiou cross / unionif iou threshold:remove_flags[j] Truereturn keepdef post_process(pred, IM, threshold0.25):# b, n, 85boxes []for image_id, box_id in zip(*np.where(pred[..., 4] threshold)):item pred[image_id, box_id]cx, cy, w, h, objness item[:5]label item[5:].argmax()confidence item[5 label] * objnessif confidence threshold:continueboxes.append([cx - w * 0.5, cy - h * 0.5, cx w * 0.5, cy h * 0.5, confidence, image_id, label])boxes np.array(boxes)lr boxes[:, [0, 2]]tb boxes[:, [1, 3]]boxes[:, [0, 2]] lr * IM[0, 0] IM[0, 2]boxes[:, [1, 3]] tb * IM[1, 1] IM[1, 2]# left, top, right, bottom, confidence, image_id, labelboxes sorted(boxes.tolist(), keylambda x:x[4], reverseTrue)return nms(boxes) 我们可以发现真正的onnxruntime只有两行一个onnxruntime.InferenceSession,一个run就结束了。其余的都是和之前一样的这是非常好用便捷的所以如果有模型需要作测试是非常推荐用onnxruntime的 CPP接口推理过程 Inference 在main函数中只有一个inference int main(){inference();return 0; } 所以我们直接来到inference的解读中 auto engine_data load_file(yolov5s.onnx); //读onnx文件Ort::Env env(ORT_LOGGING_LEVEL_INFO, onnx); //设置打印的日志级别 Ort::SessionOptions session_options; //定义sessionoptions 类似于python中的 session onnxruntime.InferenceSession(workspace/yolov5s.onnx, providers[CPUExecutionProvider])auto mem Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); //设置MemoryInfosession_options.SetIntraOpNumThreads(1);session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED); //启动一些扩展Ort::Session session(env, yolov5s.onnx, session_options);//创建session将选项传进去auto output_dims session.GetOutputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape();//获取output的shapeconst char *input_names[] {images}, *output_names[] {output};int input_batch 1;int input_channel 3;int input_height 640;int input_width 640;int64_t input_shape[] {input_batch, input_channel, input_height, input_width};int input_numel input_batch * input_channel * input_height * input_width;float* input_data_host new float[input_numel];auto input_tensor Ort::Value::CreateTensor(mem, input_data_host, input_numel, input_shape, 4);//创建一个Tensor引用input_data_host中的数据 预处理 ///// letter boxauto image cv::imread(car.jpg);float scale_x input_width / (float)image.cols;float scale_y input_height / (float)image.rows;float scale std::min(scale_x, scale_y);float i2d[6], d2i[6];i2d[0] scale; i2d[1] 0; i2d[2] (-scale * image.cols input_width scale - 1) * 0.5;i2d[3] 0; i2d[4] scale; i2d[5] (-scale * image.rows input_height scale - 1) * 0.5;cv::Mat m2x3_i2d(2, 3, CV_32F, i2d);cv::Mat m2x3_d2i(2, 3, CV_32F, d2i);cv::invertAffineTransform(m2x3_i2d, m2x3_d2i);cv::Mat input_image(input_height, input_width, CV_8UC3);cv::warpAffine(image, input_image, m2x3_i2d, input_image.size(), cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar::all(114));cv::imwrite(input-image.jpg, input_image);int image_area input_image.cols * input_image.rows;unsigned char* pimage input_image.data;float* phost_b input_data_host image_area * 0;float* phost_g input_data_host image_area * 1;float* phost_r input_data_host image_area * 2;for(int i 0; i image_area; i, pimage 3){// 注意这里的顺序rgb调换了*phost_r pimage[0] / 255.0f;*phost_g pimage[1] / 255.0f;*phost_b pimage[2] / 255.0f;}///制作输出矩阵并运行 // 3x3输入对应3x3输出int output_numbox output_dims[1];int output_numprob output_dims[2];int num_classes output_numprob - 5;int output_numel input_batch * output_numbox * output_numprob;float* output_data_host new float[output_numel];int64_t output_shape[] {input_batch, output_numbox, output_numprob};auto output_tensor Ort::Value::CreateTensor(mem, output_data_host, output_numel, output_shape, 3);Ort::RunOptions options;session.Run(options, (const char* const*)input_names, input_tensor, 1, (const char* const*)output_names, output_tensor, 1); //指定输入输出的nametensor和个数传入tensor进行推理 后处理 // decode boxvectorvectorfloat bboxes;float confidence_threshold 0.25;float nms_threshold 0.5;for(int i 0; i output_numbox; i){float* ptr output_data_host i * output_numprob;float objness ptr[4];if(objness confidence_threshold)continue;float* pclass ptr 5;int label std::max_element(pclass, pclass num_classes) - pclass;float prob pclass[label];float confidence prob * objness;if(confidence confidence_threshold)continue;float cx ptr[0];float cy ptr[1];float width ptr[2];float height ptr[3];float left cx - width * 0.5;float top cy - height * 0.5;float right cx width * 0.5;float bottom cy height * 0.5;float image_base_left d2i[0] * left d2i[2];float image_base_right d2i[0] * right d2i[2];float image_base_top d2i[0] * top d2i[5];float image_base_bottom d2i[0] * bottom d2i[5];bboxes.push_back({image_base_left, image_base_top, image_base_right, image_base_bottom, (float)label, confidence});}printf(decoded bboxes.size %d\n, bboxes.size());// nmsstd::sort(bboxes.begin(), bboxes.end(), [](vectorfloat a, vectorfloat b){return a[5] b[5];});std::vectorbool remove_flags(bboxes.size());std::vectorvectorfloat box_result;box_result.reserve(bboxes.size());auto iou [](const vectorfloat a, const vectorfloat b){float cross_left std::max(a[0], b[0]);float cross_top std::max(a[1], b[1]);float cross_right std::min(a[2], b[2]);float cross_bottom std::min(a[3], b[3]);float cross_area std::max(0.0f, cross_right - cross_left) * std::max(0.0f, cross_bottom - cross_top);float union_area std::max(0.0f, a[2] - a[0]) * std::max(0.0f, a[3] - a[1]) std::max(0.0f, b[2] - b[0]) * std::max(0.0f, b[3] - b[1]) - cross_area;if(cross_area 0 || union_area 0) return 0.0f;return cross_area / union_area;};for(int i 0; i bboxes.size(); i){if(remove_flags[i]) continue;auto ibox bboxes[i];box_result.emplace_back(ibox);for(int j i 1; j bboxes.size(); j){if(remove_flags[j]) continue;auto jbox bboxes[j];if(ibox[4] jbox[4]){// class matchedif(iou(ibox, jbox) nms_threshold)remove_flags[j] true;}}}printf(box_result.size %d\n, box_result.size());for(int i 0; i box_result.size(); i){auto ibox box_result[i];float left ibox[0];float top ibox[1];float right ibox[2];float bottom ibox[3];int class_label ibox[4];float confidence ibox[5];cv::Scalar color;tie(color[0], color[1], color[2]) random_color(class_label);cv::rectangle(image, cv::Point(left, top), cv::Point(right, bottom), color, 3);auto name cocolabels[class_label];auto caption cv::format(%s %.2f, name, confidence);int text_width cv::getTextSize(caption, 0, 1, 2, nullptr).width 10;cv::rectangle(image, cv::Point(left-3, top-33), cv::Point(left text_width, top), color, -1);cv::putText(image, caption, cv::Point(left, top-5), 0, 1, cv::Scalar::all(0), 2, 16);}cv::imwrite(image-draw.jpg, image);delete[] input_data_host;delete[] output_data_host; } 小结 可以看到这个与我们之前yolov5后处理没什么太大的区别关键只在于对于output_tensor和output作关联input_tensor和input作关联。
http://www.dnsts.com.cn/news/251431.html

相关文章:

  • 什么类型的网站比较容易做WordPress修改首页文章预览
  • 浅谈企业网站建设的目标汽车销售服务东莞网站建设
  • 路由器怎么做网站wordpress模板 sky
  • 住房和城乡建设部网站监理合同常州网站优化
  • 建立一个网站需要花多少钱网络营销的发展概述
  • 佛山企业如何建网站建筑设计公司是干什么的
  • 公明 网站建设国际品牌的ui设计公司
  • 深圳画册设计网站南昌莱布网络科技有限公司
  • 哪个网站可以付费做淘宝推广seo与网站优化 pdf
  • 一般给公司做网站用什么软件wordpress留言板源码
  • 电商网站建设源代码wordpress热词标签
  • 做网站收费wordpress网站vip可看
  • 往网站添加图片吗网站建设推广代理
  • 企业如何网站建设麻将app软件开发价格
  • 网站怎么做qq微信登陆济南企业网站制
  • 慈溪做网站什么价成都设计公司尹超简历
  • 福建网站建设价格wordpress在线报名
  • 网站建设 营业执照 经营范围建工之家
  • 江苏常州网站建设ps网站首页设计
  • 公司 网站建设名城建设有限公司网站
  • 云建站微网站高端网站建设推来客网络
  • 做网站 有哪些问题仿淘宝电商网站开发报价
  • 长沙网站设计开发阿里云小程序开发
  • 做课件用这15大网站济宁网站建设优化
  • 宁波建网站找哪家有比wordpress更好的吗
  • 泉州网站建设有哪些网站搭建一般要多少钱
  • 关于加强网站建设的意见全球首个完全响应式网站自助建设平台在中国诞生
  • 网站流量分析系统品牌设计公司名称
  • 南宁百度做网站多少钱wordpress批量编辑
  • 网站注册和进入asp建网站麻烦拍照备案审核多久