首页 > 分享 > 目标检测YOLOv3实战:叶病虫害检测(5)

目标检测YOLOv3实战:叶病虫害检测(5)

(解释在代码中)

计算精度指标

目标检测计算精度指标的作用是评估模型在检测图像中目标位置和标签方面的性能。这些指标通常用于比较不同算法或模型的性能,以确定哪种方法最好地解决了特定的目标检测问题。

以下是常见的目标检测计算精度指标:

精确度(Precision):指被正确检测出的正样本占所有被检测出的样本的比例。即 TP / (TP + FP),其中 TP 表示真正例数,FP 表示假正例数。

召回率(Recall):指被正确检测出的正样本占所有正样本的比例。即 TP / (TP + FN),其中 TP 表示真正例数,FN 表示假负例数。

F1 分数:综合考虑了精确度和召回率,是精确度和召回率的调和平均数,即 2 * Precision * Recall / (Precision + Recall)。

平均精度(Average Precision,AP):是一种常用的目标检测计算精度指标,它综合考虑了精确度和召回率,并对不同类别的目标进行加权平均。AP 值越高,表示模型检测效果越好。

这些指标可以帮助我们评估目标检测模型的性能,并根据需要进行调整和改进。下面是具体实现

#os用于操作文件路径,json用于读取JSON文件,numpy用于数值计算和数组操作,

#xml.etree.ElementTree用于解析XML文件,map_utils.DetectionMAP是一个自定义的目标检测评估类。

import os

import json

import numpy as np

import xml.etree.ElementTree as ET

from map_utils import DetectionMAP

# 存放测试集标签的目录

annotations_dir ="/home/aistudio/work/insects/val/annotations/xmls"

# 存放预测结果的文件

pred_result_file = "pred_results.json"

# pred_result_file 中保存着测试结果,是包含所有图片预测结果的list,其构成如下

# [[img_name, [[label, score, x1, x2, y1, y2],..., [label, score, x1, x2, y1, y2]]],

# [img_name, [[label, score, x1, x2, y1, y2],..., [label, score, x1, x2, y1, y2]]],

# ...

# [img_name, [[label, score, x1, x2, y1, y2],..., [label, score, x1, x2, y1, y2]]]]

# list中的每一个元素是一张图片的预测结果,list的总长度等于图片的数目

# 每张图片预测结果的格式是: [img_name, [[label, score, x1, x2, y1, y2],..., [label, score, x1, x2, y1, y2]]]

# 其中第一个元素是图片名称image_name,第二个元素是包含所有预测框的列表

# 预测框列表中每个元素[label, score, x1, x2, y1, y2]描述了一个预测框,

# label是预测框所属类别标签,score是预测框的得分

# x1, x2, y1, y2对应预测框左上角坐标(x1, y1),右下角坐标(x2, y2)

# 每张图片可能有很多个预测框,则将其全部放在预测框列表中

#overlap_thresh是重叠阈值,用于判断预测框和真实框是否匹配。map_type是mAP的计算方式,可以是'11point'或'Integral'。

overlap_thresh = 0.5

map_type = '11point'

#目标类别的列表。

insect_names = ['Boerner', 'Leconte', 'Linnaeus', 'acuminatus', 'armandi', 'coleoptera', 'linnaeus']

if __name__ == '__main__':

#创建类别标签与类别ID的映射关系。cname2cid是一个空字典

#通过遍历insect_names列表并使用enumerate函数获取索引和值,将类别名称作为键,索引作为值,存储在cname2cid中。

cname2cid = {}

for i, item in enumerate(insect_names):

cname2cid[item] = i

#读取保存预测结果的JSON文件,并将结果存储在变量results中。

filename = pred_result_file

results = json.load(open(filename))

#计算目标类别的数量,并使用这些参数初始化DetectionMAP类的实例detection_map。

num_classes = len(insect_names)

detection_map = DetectionMAP(class_num=num_classes,

overlap_thresh=overlap_thresh,

map_type=map_type,

is_bbox_normalized=False,

evaluate_difficult=False)

#遍历每个预测结果,对于每个结果:

#提取图像名称和预测框列表。

#根据图像名称构建相应的XML文件路径,并解析该XML文件。

#获取XML文件中的物体标签,并提取真实框的信息。

#将真实框信息和预测框信息转换为NumPy数组,并传入detection_map.update方法进行更新。

for result in results:

image_name = str(result[0])

bboxes = np.array(result[1]).astype('float32')

anno_file = os.path.join(annotations_dir, image_name + '.xml')

tree = ET.parse(anno_file)

objs = tree.findall('object')

im_w = float(tree.find('size').find('width').text)

im_h = float(tree.find('size').find('height').text)

gt_bbox = np.zeros((len(objs), 4), dtype=np.float32)

gt_class = np.zeros((len(objs), 1), dtype=np.int32)

difficult = np.zeros((len(objs), 1), dtype=np.int32)

for i, obj in enumerate(objs):

cname = obj.find('name').text

gt_class[i][0] = cname2cid[cname]

_difficult = int(obj.find('difficult').text)

x1 = float(obj.find('bndbox').find('xmin').text)

y1 = float(obj.find('bndbox').find('ymin').text)

x2 = float(obj.find('bndbox').find('xmax').text)

y2 = float(obj.find('bndbox').find('ymax').text)

x1 = max(0, x1)

y1 = max(0, y1)

x2 = min(im_w - 1, x2)

y2 = min(im_h - 1, y2)

gt_bbox[i] = [x1, y1, x2, y2]

difficult[i][0] = _difficult

detection_map.update(bboxes, gt_bbox, gt_class, difficult)

#累积评估结果,并计算目标检测模型的mAP值。

print("Accumulating evaluatation results...")

detection_map.accumulate()

map_stat = 100. * detection_map.get_map()

print("mAP({:.2f}, {}) = {:.2f}".format(overlap_thresh,

map_type, map_stat))

模型预测

目标检测模型的预测流程通常包括以下步骤:

准备模型和权重:首先,需要选择适合任务的目标检测模型,如SSD、Faster R-CNN、YOLO等,并下载相应的预训练权重。这些模型通常通过深度学习框架(如TensorFlow、PyTorch)提供。

加载模型和权重:使用深度学习框架加载目标检测模型和预训练权重。这将创建一个模型实例,并将预训练权重加载到模型中。

图像预处理:对待检测的图像进行预处理,以满足模型的输入要求。这通常包括图像大小调整、归一化、通道顺序调整等操作。

模型推理:将预处理后的图像输入目标检测模型,获取模型的输出。输出通常是一组边界框(bounding boxes),每个边界框表示检测到的物体及其位置。

后处理:对模型输出的边界框进行后处理,以提取最相关的物体检测结果。这可能包括去除重复边界框、应用置信度阈值、非极大值抑制(NMS)等操作。

可视化或使用结果:根据需求,可以将最终的检测结果进行可视化展示,或者将结果用于后续的应用场景,如目标跟踪、自动驾驶等。

绘制预测框的画图函数

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.patches as patches

from matplotlib.image import imread

import math

# 定义画图函数

INSECT_NAMES = ['Boerner', 'Leconte', 'Linnaeus',

'acuminatus', 'armandi', 'coleoptera', 'linnaeus']

# 定义画矩形框的函数

def draw_rectangle(currentAxis, bbox, edgecolor = 'k', facecolor = 'y', fill=False, linestyle='-'):

# currentAxis,坐标轴,通过plt.gca()获取

# bbox,边界框,包含四个数值的list, [x1, y1, x2, y2]

# edgecolor,边框线条颜色

# facecolor,填充颜色

# fill, 是否填充

# linestype,边框线型

# patches.Rectangle需要传入左上角坐标、矩形区域的宽度、高度等参数

rect=patches.Rectangle((bbox[0], bbox[1]), bbox[2]-bbox[0]+1, bbox[3]-bbox[1]+1, linewidth=1,

edgecolor=edgecolor,facecolor=facecolor,fill=fill, linestyle=linestyle)

currentAxis.add_patch(rect)

# 定义绘制预测结果的函数

def draw_results(result, filename, draw_thresh=0.5):

plt.figure(figsize=(10, 10))

im = cv2.imread(filename)

plt.imshow(im)

currentAxis=plt.gca()

colors = ['r', 'g', 'b', 'k', 'y', 'c', 'purple']

for item in result:

#对于每个检测到的目标,提取其边界框坐标box和类别label

box = item[2:6]

label = int(item[0])

#INSECT_NAMES字典将其转换为类别名称name

name = INSECT_NAMES[label]

if item[1] > draw_thresh:

draw_rectangle(currentAxis, box, edgecolor = colors[label])

#添加类别标签

plt.text(box[0], box[1], name, fontsize=12, color=colors[label])

多分类非极大值

import json

import paddle

ANCHORS = [10, 13, 16, 30, 33, 23, 30, 61, 62, 45, 59, 119, 116, 90, 156, 198, 373, 326] #定义一组锚框大小

ANCHOR_MASKS = [[6, 7, 8], [3, 4, 5], [0, 1, 2]] #定义了一组用于选择锚框的掩码;

VALID_THRESH = 0.01 #定义了一个阈值,用于筛选有效的目标检测结果

NMS_TOPK = 400 #定义了在非极大值抑制(NMS)之前保留的最多边界框数量

NMS_POSK = 100 #定义了NMS之后保留的最多边界框数量

NMS_THRESH = 0.45 #定义了NMS的阈值

NUM_CLASSES = 7 #定义了目标类别的数量。

#用来判断是否执行当前文件的入口

if __name__ == '__main__':

image_name = '/home/aistudio/work/insects/test/images/2642.jpeg'

params_file_path = '/home/aistudio/yolo_epoch50.pdparams'

model = YOLOv3(num_classes=NUM_CLASSES) #建了一个YOLOv3模型实例

model_state_dict = paddle.load(params_file_path) #加载模型参数

model.load_dict(model_state_dict) #加载参数到模型中

model.eval()#将模型设置为评估模式

total_results = [] #用于保存所有的检测结果

test_loader = test_data_loader(image_name, mode='test') #创建测试数据加载器

#遍历测试数据加载器,对每个图像进行预测和后处理。从test_loader中获取图像的名称、图像数据和缩放数据,并将它们转换为PaddlePaddle张量

for i, data in enumerate(test_loader()):

img_name, img_data, img_scale_data = data

img = paddle.to_tensor(img_data)

img_scale = paddle.to_tensor(img_scale_data)

#调用模型的forward()方法进行前向推理,获取模型输出。然后使用get_pred()方法根据模型输出、锚框和掩码获取边界框和置信度。

outputs = model.forward(img)

bboxes, scores = model.get_pred(outputs,

im_shape=img_scale,

anchors=ANCHORS,

anchor_masks=ANCHOR_MASKS,

valid_thresh = VALID_THRESH)

#将边界框和置信度转换为NumPy数组。

bboxes_data = bboxes.numpy()

scores_data = scores.numpy()

#调用multiclass_nms()函数对边界框和置信度进行非极大值抑制,得到最终的检测结果。

results = multiclass_nms(bboxes_data, scores_data,

score_thresh=VALID_THRESH,

nms_thresh=NMS_THRESH,

pre_nms_topk=NMS_TOPK,

pos_nms_topk=NMS_POSK)

#获取第一个图像的检测结果,并调用draw_results()函数将检测结果可视化。

result = results[0]

draw_results(result, image_name, draw_thresh=0.4)

实验总结

        在目标检测实验中,我们采用了叶病虫害数据集,实验过程中,我们对数据集进行了预处理,包括图像增强、缩放和裁剪等操作。针对实验结果,我们计算了模型在测试集上的准确率、精确率、召回率和 F1 值。整体而言,我们的模型在目标检测任务上表现良好。

        总体而言,我们的实验结果显示出模型在目标检测任务上的良好性能,但仍有一些改进的空间。未来的研究方向可以包括优化模型结构、改进数据增强策略、进一步处理小目标等。通过不断地改进和优化,我们相信目标检测模型在实际应用中将发挥更大的作用。

 

相关知识

深度学习在植物病害目标检测的科研进展
深度学习在植物叶部病害检测与识别的研究进展
AI助力智慧农田作物病虫害监测,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建花田作物种植场景下棉花作物常见病虫害检测识别系统
植物病虫害检测技术,植物病虫害检测设备,植物病虫害检测技术,植物病虫害检测设备生产厂家,植物病虫害检测技术,植物病虫害检测设备价格
智慧农业病虫害检测方法.pdf
植物病虫害检测
农作物病虫害检测关键技术问题,如何破解?
植物病虫害检测服务
使用光谱技术检测农作物病虫害
基于视觉加强注意力模型的植物病虫害检测

网址: 目标检测YOLOv3实战:叶病虫害检测(5) https://m.huajiangbk.com/newsview131669.html

所属分类:花卉
上一篇: 智能农业的植物病虫害预警系统:如
下一篇: 基于matlab的神经网络的农业