nfo testdir = new DirectoryInfo(testimagesFolder);
foreach (var jpgfile in testdir.GetFiles("*.jpg"))
{
ImageNetData image = new ImageNetData
{
ImagePath = jpgfile.FullName
}; var Predicted = predictionEngine.Predict(image);
PredictImage(image.ImagePath, Predicted);
}
}
代码遍历一个文件夹下面的JPG文件。对每一个文件进行转换,获得预测结果。
ImageNetPrediction类定义如下:
public class ImageNetPrediction
{
[ColumnName(TinyYoloModelSettings.ModelOutput)]
public float[] PredictedLabels;
}
输出的“grid”列数据是一个float数组,不能直接理解其含义,所以需要通过代码将其数据转换为便于理解的格式。
YoloWinMlParser _parser = new YoloWinMlParser();
IList<YoloBoundingBox> boundingBoxes = _parser.ParseOutputs(Predicted.PredictedLabels, 0.4f);
YoloWinMlParser.ParseOutputs方法将float数组转为YoloBoundingBox对象的列表,第二个参数是可信度阙值,只输出大于该可信度的数据。
YoloBoundingBox类定义如下:
class YoloBoundingBox
{
public string Label { get; set; }
public float Confidence { get; set; }
public float X { get; set; }
public float Y { get; set; }
public float Height { get; set; }
public float Width { get; set; }
public RectangleF Rect
{
get { return new RectangleF(X, Y, Width, Height); }
}
}
其中:Label为目标类型,Confidence为可行程度。
由于YOLO的特点导致对同一个目标会输出多个同样的检测结果,所以还需要对检测结果进行过滤,去掉那些高度重合的结果。
YoloWinMlParser _parser = new YoloWinMlParser();
IList<YoloBoundingBox> boundingBoxes = _parser.ParseOutputs(Predicted.PredictedLabels, 0.4f);
var filteredBoxes = _parser.NonMaxSuppress(boundingBoxes, 5, 0.6F);
YoloWinMlParser.NonMaxSuppress第二个参数表示最多保留多少个结果,第三个参数表示重合率阙值,将去掉重合率大于该值的记录。
四、资源获取
源码下载地址:https://github.com/seabluescn/Study_ML.NET
工程名称:YOLO_ObjectDetection
资源获取:https://gitee.com/seabluescn/ML_Assets (ObjectDetection)
点击查看机器学习框架ML.NET学习笔记系列文章目录
|