云南做网站要多少钱,房价网查询官网,在线网页服务器,辽宁地矿建设集团有限公司网站C# YOLOv5目标检测代码详细分析
概述
使用C#和OpenCvSharp库部署YOLOv5目标检测模型#xff0c;可以对静态图像和视频流(包括摄像头和视频文件)进行目标检测。 进行目标检测。 功能流程
使用 CvDnn.ReadNetFromOnnx() 加载ONNX格式的YOLOv5模型从文本文件中逐行读取类别名称异常处理确保加载过程的稳定性
注意事项
模型文件必须是ONNX格式类别文件每行一个类别名称顺序对应模型输出的类别索引
图像检测方法
Detect 方法是核心的目标检测功能
输入验证和预处理
Mat srcImage BitmapConverter.ToMat(inputBmp);
if(srcImage.Channels() 1)
{Cv2.CvtColor(srcImage, srcImage, ColorConversionCodes.GRAY2BGR);
}将Bitmap转换为OpenCV的Mat格式确保图像为3通道BGR格式
图像尺寸调整
Mat resizeMat ResizeImage(srcImage, out newHeight, out newWidth, out paddingHeight, out paddingWidth);调用自定义的 ResizeImage 方法保持长宽比的同时调整到模型输入尺寸。
创建输入Blob
Mat blob CvDnn.BlobFromImage(resizeMat, 1/255.0, new OpenCvSharp.Size(detParam.modelWidth, detParam.modelHeight), new Scalar(0, 0, 0), true, false);参数说明
1/255.0: 像素值归一化到[0,1]范围true: 交换R和B通道BGR转RGBfalse: 不进行图像裁剪
模型推理
net.SetInput(blob);
Mat[] outBlobs new Mat[3] { new Mat(), new Mat(), new Mat() };
string[] outBlobNames net.GetUnconnectedOutLayersNames().ToArray();
net.Forward(outBlobs, outBlobNames);设置网络输入获取输出层名称执行前向推理
输出处理和解析
int numProposal outBlobs[0].Size(0);
int nout outBlobs[0].Size(1);
if (outBlobs[0].Dims 2)
{numProposal outBlobs[0].Size(1);nout outBlobs[0].Size(2);outBlobs[0] outBlobs[0].Reshape(0, numProposal);
}适配不同版本YOLOv5的输出格式。
候选框提取核心算法
unsafe
{float* pdata (float*)outBlobs[0].Data;for (int n 0; n numProposal; n){float boxScore pdata[4]; // 目标存在概率if (boxScore detParam.confidenceThreshold){// 获取类别概率Mat scores outBlobs[0].Row(rowIndex).ColRange(5, nout);Cv2.MinMaxLoc(scores, out minVal, out maxVal, out minLoc, out maxLoc);maxVal maxVal * boxScore; // 最终置信度if (maxVal detParam.confidenceThreshold){// 坐标还原float cx (pdata[0] - paddingWidth) * Math.Max(ratiow, ratioh);float cy (pdata[1] - paddingHeight) * Math.Max(ratiow, ratioh);float w pdata[2] * Math.Max(ratiow, ratioh);float h pdata[3] * Math.Max(ratiow, ratioh);int left (int)(cx - 0.5 * w);int top (int)(cy - 0.5 * h);// 保存检测结果confidences.Add((float)maxVal);boxes.Add(new Rect(left, top, (int)w, (int)h));classIds.Add(classIndex);}}pdata nout; // 指针移动到下一个候选框}
}YOLOv5输出格式解析
pdata[0], pdata[1]: 中心点坐标 (cx, cy)pdata[2], pdata[3]: 宽度和高度 (w, h)pdata[4]: 目标存在概率 (objectness score)pdata[5:]: 各类别概率分布
非极大值抑制NMS
float nmsThreshold 0.5f;
CvDnn.NMSBoxes(boxes, confidences, (float)detParam.confidenceThreshold, nmsThreshold, out indices);消除重叠的检测框保留最优结果。
结果可视化
if(detParam.outResultBmp)
{Cv2.Rectangle(resultImage, /* 绘制边界框 */);Cv2.PutText(resultImage, /* 添加标签文本 */);
}视频检测方法
DetectVedio 方法与图像检测基本相同主要区别
输入参数为 Mat 而非 Bitmap输出为 Mat 类型的结果图像适用于视频流的实时处理
图像预处理方法
ResizeImage 方法实现保持长宽比的图像缩放
核心算法
float hw_scale (float)srch / srcw;
if (hw_scale 1) // 图像高度大于宽度
{newh inpHeight;neww (int)(inpWidth / hw_scale);// 左右填充left (int)((inpWidth - neww) * 0.5);Cv2.CopyMakeBorder(dstimg, dstimg, 0, 0, left, inpWidth - neww - left, BorderTypes.Constant);
}
else // 图像宽度大于高度
{newh (int)(inpHeight * hw_scale);neww inpWidth;// 上下填充top (int)((inpHeight - newh) * 0.5);Cv2.CopyMakeBorder(dstimg, dstimg, top, inpHeight - newh - top, 0, 0, BorderTypes.Constant);
}填充策略
计算长宽比例按比例缩放到合适尺寸使用黑色像素填充剩余区域确保输出尺寸符合模型要求
使用示例
// 初始化检测器
CvDet detector new CvDet();// 加载模型
bool success detector.ReadModel(yolov5s.onnx, coco.names);// 设置检测参数
DetParam param new DetParam
{modelWidth 640,modelHeight 640,confidenceThreshold 0.5,outResultBmp true
};// 执行检测
Bitmap inputImage new Bitmap(test.jpg);
ListDetResult results detector.Detect(inputImage, param, out Bitmap resultImage);// 处理检测结果
foreach(var result in results)
{Console.WriteLine($类别: {result.label}, 置信度: {result.confidence:F2});
}关键技术要点
1. 坐标变换
代码实现了从模型输出坐标到原图坐标的正确变换考虑了
图像缩放比例填充偏移量中心点坐标转换为左上角坐标
2. 内存安全
使用 unsafe 代码块直接操作内存指针提高了数据访问效率。
3. 异常处理
在模型加载和推理过程中都有适当的异常处理机制。
4. 性能优化
使用指针直接访问输出数据避免不必要的数据拷贝合理的内存管理
后续优化
批处理支持: 当前实现为单张图像处理可扩展支持批量处理GPU加速: 可配置使用CUDA或OpenCL后端加速推理多线程: 对于视频处理场景可实现多线程并行处理动态模型尺寸: 支持运行时调整模型输入尺寸更多后处理选项: 添加跟踪、计数等高级功能
总结
上述代码提供了一个完整、高效的YOLOv5 C#部署方案适用于Windows平台的目标检测应用。代码结构清晰功能完整。 文章转载自: http://www.morning.zlxrg.cn.gov.cn.zlxrg.cn http://www.morning.zrpbf.cn.gov.cn.zrpbf.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.smj78.cn.gov.cn.smj78.cn http://www.morning.lnrhk.cn.gov.cn.lnrhk.cn http://www.morning.cnvlog.cn.gov.cn.cnvlog.cn http://www.morning.dmzzt.cn.gov.cn.dmzzt.cn http://www.morning.qtryb.cn.gov.cn.qtryb.cn http://www.morning.kmwsz.cn.gov.cn.kmwsz.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.sbrrf.cn.gov.cn.sbrrf.cn http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn http://www.morning.zmtrk.cn.gov.cn.zmtrk.cn http://www.morning.wgbsm.cn.gov.cn.wgbsm.cn http://www.morning.nkjkh.cn.gov.cn.nkjkh.cn http://www.morning.wblpn.cn.gov.cn.wblpn.cn http://www.morning.sfnr.cn.gov.cn.sfnr.cn http://www.morning.hhrpy.cn.gov.cn.hhrpy.cn http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.fbzdn.cn.gov.cn.fbzdn.cn http://www.morning.pynzj.cn.gov.cn.pynzj.cn http://www.morning.fyxtn.cn.gov.cn.fyxtn.cn http://www.morning.kpcjl.cn.gov.cn.kpcjl.cn http://www.morning.tndhm.cn.gov.cn.tndhm.cn http://www.morning.gnkbf.cn.gov.cn.gnkbf.cn http://www.morning.hflrz.cn.gov.cn.hflrz.cn http://www.morning.hmqwn.cn.gov.cn.hmqwn.cn http://www.morning.jklns.cn.gov.cn.jklns.cn http://www.morning.errnull.com.gov.cn.errnull.com http://www.morning.gbpanel.com.gov.cn.gbpanel.com http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.lkhfm.cn.gov.cn.lkhfm.cn http://www.morning.tcpnp.cn.gov.cn.tcpnp.cn http://www.morning.ywqw.cn.gov.cn.ywqw.cn http://www.morning.tsqpd.cn.gov.cn.tsqpd.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.lkkkf.cn.gov.cn.lkkkf.cn http://www.morning.nktxr.cn.gov.cn.nktxr.cn http://www.morning.hjrjr.cn.gov.cn.hjrjr.cn http://www.morning.qfcnp.cn.gov.cn.qfcnp.cn http://www.morning.mggwr.cn.gov.cn.mggwr.cn http://www.morning.fphbz.cn.gov.cn.fphbz.cn http://www.morning.dtlqc.cn.gov.cn.dtlqc.cn http://www.morning.hwzzq.cn.gov.cn.hwzzq.cn http://www.morning.sffwz.cn.gov.cn.sffwz.cn http://www.morning.nwtmy.cn.gov.cn.nwtmy.cn http://www.morning.mqwnz.cn.gov.cn.mqwnz.cn http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.zcnfm.cn.gov.cn.zcnfm.cn http://www.morning.nkqrq.cn.gov.cn.nkqrq.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.cbchz.cn.gov.cn.cbchz.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.pjzcp.cn.gov.cn.pjzcp.cn http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn http://www.morning.lqynj.cn.gov.cn.lqynj.cn http://www.morning.rfmzs.cn.gov.cn.rfmzs.cn http://www.morning.rgpy.cn.gov.cn.rgpy.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.gkfwp.cn.gov.cn.gkfwp.cn http://www.morning.rstrc.cn.gov.cn.rstrc.cn http://www.morning.mqfhy.cn.gov.cn.mqfhy.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.dongyinet.cn.gov.cn.dongyinet.cn http://www.morning.rfgkf.cn.gov.cn.rfgkf.cn http://www.morning.dndjx.cn.gov.cn.dndjx.cn http://www.morning.hcrxn.cn.gov.cn.hcrxn.cn http://www.morning.sftpg.cn.gov.cn.sftpg.cn http://www.morning.nlygm.cn.gov.cn.nlygm.cn http://www.morning.lkfhk.cn.gov.cn.lkfhk.cn