yolov8输出结果后处理

一、模型分析和处理:

yolov8模型输出格式为84*8400,结合网络资料和上图的网络模型分析,可以得出如下结论:

                                        84 = 边界框预测4 + 数据集类别80

搜索得知yolov8不另外对置信度预测,而是采用类别里面最大的概率作为置信度score,显然8400就是v8模型各尺度输出特征图叠加之后的结果。

综合以上信息v8的数据处理方式按照如下步骤实现:

看图上的描述,1*84*8400表示数据的大小,每84个字节为一组,总共8400组数据。解析逻辑可以按照如下逻辑,每读取输出数据的84个字节,前四个字节分别解析为【x,y,w,h】,后面80个字节是不同Class的概率大小。循环8400结束即可。

参考网址:https://blog.csdn.net/kuabiku/article/details/132083671

二、数据集

有部分模型输出没有描述自己支持的类型,可以根据矩形的大小来推测。每个网络会有自己输出的一个数据类型集合,该数据集大概率上就是目前比较流行的数据集。可以根据网络输出的类型个数来对比当前比较流行的数据集大小来确认可能得数据集。

coco数据集和yolov8的输出个数一致,内容也是一致的。

三、数据集平台

目前市场占有率非常大的数据集平台有三个:

Kaggle:爱竞赛的盆友们应该很熟悉了,Kaggle上有各种有趣的数据集,拉面评级、篮球数据、甚至西雅图的宠物许可证。

https://www.kaggle.com/

UCI机器学习库:最古老的数据集源之一,是寻找有趣数据集的第一站。虽然数据集是用户贡献的,因此具有不同的清洁度,但绝大多数都是干净的,可以直接从UCI机器学习库下载,无需注册。

http://mlr.cs.umass.edu/ml/

VisualData:分好类的计算机视觉数据集,可以搜索~

https://www.visualdata.io/

### YOLOv8 模型输出结果处理 YOLO (You Only Look Once) 是一种流行的实时目标检测算法。对于YOLOv8版本,其输出通常是一个张量(tensor),其中包含了预测边界框的位置、类别概率以及置信度分数。 为了处理YOLOv8模型的输出结果,在获取到原始输出之后,一般会经历几个主要阶段:解码边界框坐标、应用非极大值抑制(NMS)去除冗余重叠框、设定阈值过滤低质量预测等操作[^1]。 下面是一段用于解析YOLOv8模型输出并绘制检测结果的Python代码示例: ```python import torch from ultralytics import YOLO def process_yolov8_output(outputs, image_size=(640, 640), conf_threshold=0.5, iou_threshold=0.4): """ 处理YOLOv8模型输出 参数: outputs: 模型前向传播后的输出数据. image_size: 输入图片尺寸,默认(宽, 高). conf_threshold: 置信度得分阈值. iou_threshold: NMS IOU阈值. 返回: boxes: 过滤后的边界框列表 [[x_min,y_min,x_max,y_max],...]. labels: 对应于boxes的标签索引列表 [label_index,...]. scores: 各个边界的置信度得分列表 [score_value,...]. """ predictions = outputs.xyxy[0].cpu().numpy() # 将GPU上的tensor转换成CPU numpy数组 filtered_predictions = [] for pred in predictions: score = float(pred[4]) * max(float(x) for x in pred[5:]) # 计算最终得分 if score >= conf_threshold: class_id = int(torch.argmax(pred[5:], dim=-1)) box = list(map(int, pred[:4])) adjusted_box = [ max(box[0], 0), max(box[1], 0), min(box[2], image_size[0]), min(box[3], image_size[1]) ] filtered_predictions.append([adjusted_box, class_id, score]) nms_boxes = non_maximum_suppression(filtered_predictions, iou_threshold) boxes = [] labels = [] scores = [] for item in nms_boxes: boxes.append(item[0]) labels.append(item[1]) scores.append(item[2]) return boxes, labels, scores def non_maximum_suppression(predictions, threshold): """实现简单的NMS""" sorted_preds = sorted(predictions, key=lambda p:p[-1], reverse=True) keep_indices = [] while len(sorted_preds)>0: best_pred = sorted_preds.pop(0) keep_indices.append(best_pred) suppressed = [] for other in sorted_preds: if calculate_iou(best_pred[0], other[0])>threshold: suppressed.append(other) for suppr in suppressed[::-1]: sorted_preds.remove(suppr) return keep_indices def calculate_iou(boxA, boxB): """计算两个矩形之间的IOU""" xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3]) interArea = max(0, xB-xA+1)*max(0, yB-yA+1) boxAArea = (boxA[2]-boxA[0]+1)*(boxA[3]-boxA[1]+1) boxBArea = (boxB[2]-boxB[0]+1)*(boxB[3]-boxB[1]+1) iou = interArea / float(boxAArea + boxBArea - interArea) return iou ``` 上述代码实现了对YOLOv8模型输出的基本后处理逻辑,包括但不限于设置最小置信度(`conf_threshold`)来筛选有效预测;通过`non_maximum_supression()`函数执行非最大抑制以消除高度重合的目标框;最后返回调整过大小且经过筛选的有效边界框及其对应的分类标签和置信度得分。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值