YOLO中的Python语句

本文涵盖Python中路径操作、数据类型转换、图像处理、深度学习框架TensorFlow的使用技巧,包括路径拼接、色彩空间转换、数据类型管理、模型训练、日志记录等功能详解。

路径拼接os.path.join()函数
os.path.join()函数用于路径拼接文件路径。 os.path.join(path1[, path2[, …]]) 把目录和文件名合成一个路径

os.path.join()函数中可以传入多个路径:

os.path.isfile(path) 判断路径是否为文件

os.path.isdir(path) 判断路径是否为目录

os.path.exists(path) 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。

os.makedirs() 方法用于递归创建目录。像 mkdir(), 但创建的所有intermediate-level文件夹需要包含子目录。

np.random.shuffle(x) 现场修改序列,改变自身内容。(类似洗牌,打乱顺序)

图像处理中有多种色彩空间,例如 RGB、HLS、HSV、HSB、YCrCb、CIE XYZ、CIE Lab等,经常要遇到色彩空间的转化,以便生成mask图等操作.
OpenCV 颜色转换 - cv2.cvtColor() 函数

Python中与数据类型相关函数及属性有如下三个:type/dtype/astype
type() 返回参数的数据类型
dtype 返回数组中元素的数据类型
astype() 对数据类型进行转换

s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符

pickle.dump(obj, file[, protocol])
  序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。

text.lower(): 返回一个被转换为全小写字母的字符串副本。

tf.losses.add_loss() : 为loss集合添加额外定义的loss

tf.summary()的各类方法,能够保存训练过程以及参数分布图并在tensorboard显示。
tf.summary有诸多函数:
1、tf.summary.scalar
用来显示标量信息,其格式为:

tf.summary.scalar(tags, values, collections=None, name=None)

例如:tf.summary.scalar(‘mean’, mean)
一般在画loss,accuary时会用到这个函数。
2、tf.summary.histogram
用来显示直方图信息,其格式为:

tf.summary.histogram(tags, values, collections=None, name=None)

例如: tf.summary.histogram(‘histogram’, var)
一般用来显示训练过程中变量的分布情况

argparse介绍
是python的一个命令行解析包,非常编写可读性非常好的程序

tf.global_variables():使用global_variables获取全局变量

TensorFlow使用 tf.train.Saver()保存模型

tf.summary.merge_all
merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
格式:tf.summaries.merge_all(key=‘summaries’)

tf.summary.FileWriter
指定一个文件用来保存图。
格式:tf.summary.FileWritter(path,sess.graph)

flush_secs:: Number. How often, in seconds, to flush the pending events and summaries to disk.

tf.train.create_global_step(graph=None)
Defined in tensorflow/python/training/training_util.py.
Create global step tensor in graph.

通过tf.train.exponential_decay函数实现指数衰减学习率

slim在learning.py中提供了一个简单而有用的训练模型的工具。我们只需调用slim.learning.create_train_op 和slim.learning.train就可以完成优化过程。
slim.learning.train函数被用来训练神经网络,函数定义如下:

def slim.learning.train(train_op,
logdir,
train_step_fn=train_step,
train_step_kwargs=_USE_DEFAULT,
log_every_n_steps=1,
graph=None,
master=’’,
is_chief=True,
global_step=None,
number_of_steps=None,
init_op=_USE_DEFAULT,
init_feed_dict=None,
local_init_op=_USE_DEFAULT,
init_fn=None,
ready_op=_USE_DEFAULT,
summary_op=_USE_DEFAULT,
save_summaries_secs=600,
summary_writer=_USE_DEFAULT,
startup_delay_steps=0,
saver=None,
save_interval_secs=600,
sync_optimizer=None,
session_config=None,
trace_every_n_steps=None):
其中部分参数的说明如下:
train_op: A Tensor that, when executed, will apply the gradients and return the loss value.
logdir: The directory where training logs are written to. If None, model checkpoints and summaries will not be written.检查点文件和日志文件的保存路径。
number_of_steps: The max number of gradient steps to take during training,as measured by ‘global_step’: training will stop if global_step is greater than ‘number_of_steps’. If the value is left as None, training proceeds indefinitely.默认是一致循环训练。
save_summaries_secs: How often, in seconds, to save summaries.
summary_writer: SummaryWriter to use. Can be None to indicate that no summaries should be written. If unset, we create a SummaryWriter.
startup_delay_steps: The number of steps to wait for before beginning. Note that this must be 0 if a sync_optimizer is supplied.
saver: Saver to save checkpoints. If None, a default one will be created and used.
save_interval_secs: How often, in seconds, to save the model to logdir.

<think>好的,我现在需要帮助用户解决如何使用PythonYOLO模型绘制PR曲线的问题。用户提到了他们有一些参考资料,包括引用1、2、3,我需要先理解这些引用的内容,然后结合YOLO的具体情况来给出步骤和代码示例。 首先,引用1提到保存数据的代码在pascal_voc.py的_do_python_eval函数中,不建议直接加入绘制PR曲线的代码,而是使用保存的数据进行绘制。这可能意味着用户需要先通过评估生成数据,再使用这些数据来绘图,而不是在评估过程中实时绘制。这样做的原因可能是为了确保数据保存的稳定性,避免在评估过程中出现错误导致数据丢失。 引用2是关于使用Python的matplotlib绘制PR曲线的示例代码,其中使用了plt.plot(recall, precision)这样的语句。这提示用户需要使用matplotlib库,并且需要正确组织precision和recall的数据点。 引用3涉及YOLO计算二分类目标检测的Precision、Recall的具体代码实现,包括计算TP、FP、FN的方法。这说明用户可能需要先计算这些指标,然后才能得到PR曲线所需的数据。 接下来,我需要整理绘制PR曲线的一般步骤,并结合YOLO的特点。通常步骤如下: 1. **生成预测结果和真实标签**:YOLO模型在测试集上运行,输出预测的边界框和类别概率,同时需要读取真实标注的边界框。 2. **计算TP、FP、FN**:根据预测框和真实框的IoU(交并比)以及置信度阈值,确定哪些预测是正确的(TP),哪些是错误的(FP),以及漏检的(FN)。这里可能需要使用非极大值抑制(NMS)来处理重叠的预测框。 3. **计算Precision和Recall**:根据不同的置信度阈值,计算对应的Precision和Recall值。通常需要将预测结果按置信度排序,逐步调整阈值,生成一系列的点。 4. **绘制PR曲线**:将得到的Precision和Recall值绘制成曲线,并计算AP(平均精度)作为曲线下面积的衡量指标。 现在,我需要考虑如何将这些步骤转化为具体的Python代码。根据引用3,计算TP、FP、FN的代码可能已经存在,用户需要先确保这些计算正确。然后,按照引用2的方法,使用保存的precision和recall数据绘图。 需要注意的是,YOLO的输出通常是多个边界框,每个框有置信度和类别概率。处理时需要先过滤掉低置信度的预测,应用NMS,然后与真实框匹配。这部分可能比较复杂,但用户提供的引用3可能已经包含了相关代码。 可能的示例代码结构可能包括: - 加载模型和测试数据,进行预测。 - 对每个图像处理预测结果,计算TP、FP、FN。 - 收集所有预测结果的置信度、TP、FP情况。 - 根据置信度排序,逐步计算不同阈值下的Precision和Recall。 - 使用matplotlib绘制曲线。 另外,用户可能需要保存中间数据,如各个置信度阈值下的precision和recall值,然后使用这些数据进行绘图,而不是在评估时实时绘制,这符合引用1的建议。 在编写代码示例时,需要确保正确使用YOLO的输出格式,例如处理边界框的坐标、置信度、类别等。同时,计算IoU的函数是必须的,用于确定TP和FP。 最后,可能需要提醒用户注意数据格式的正确性,比如确保预测和真实标注的格式一致,处理不同类别的AP计算(如果是多类别的话),以及如何调整代码以适应他们的具体数据集和模型配置。</think>以下是使用PythonYOLO模型生成PR曲线的分步指南,结合引用内容的技术实现细节: ### 步骤1:生成模型预测结果 首先需要保存YOLO模型在测试集上的预测结果,格式应包含: - 预测框坐标(归一化值) - 置信度分数 - 类别标签 ```python # 示例预测数据结构 predictions = [ {"image_id": "001.jpg", "bbox": [x,y,w,h], "confidence": 0.95, "class": 0}, ... ] ``` ### 步骤2:计算TP/FP/FN 参考引用[3]的实现思路,需要: ```python def calculate_metrics(gt_boxes, pred_boxes, iou_threshold=0.5): """ gt_boxes: 真实标注框列表 [[x1,y1,x2,y2], ...] pred_boxes: 预测框列表 [[x1,y1,x2,y2,confidence], ...] 返回: (tp, fp, fn) """ # 实现细节参考引用[3]的匹配逻辑 # 1. 按置信度降序排序预测框 # 2. 使用NMS过滤重叠框 # 3. 通过IoU匹配真实框 return tp, fp, fn ``` ### 步骤3:生成PR数据 在不同置信度阈值下计算指标: ```python # 收集所有预测的置信度 confidences = sorted([p['confidence'] for p in predictions], reverse=True) precision_list = [] recall_list = [] # 遍历所有可能的置信度阈值 for conf_thresh in confidences: # 过滤低于阈值的预测 filtered_preds = [p for p in predictions if p['confidence'] >= conf_thresh] # 计算全局TP/FP/FN total_tp, total_fp, total_fn = 0, 0, 0 for image in test_set: gt = load_ground_truth(image) preds = [p for p in filtered_preds if p['image_id'] == image.id] tp, fp, fn = calculate_metrics(gt, preds) total_tp += tp total_fp += fp total_fn += fn # 计算指标 precision = total_tp / (total_tp + total_fp + 1e-6) recall = total_tp / (total_tp + total_fn + 1e-6) precision_list.append(precision) recall_list.append(recall) ``` ### 步骤4:绘制PR曲线 使用引用[2]的绘图方法: ```python import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) plt.plot(recall_list, precision_list, 'b-', linewidth=2) plt.xlabel('Recall') plt.ylabel('Precision') plt.title('Precision-Recall Curve') plt.grid(True) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.show() ``` ### 关键注意事项 1. 数据存储应遵循引用[1]的建议,先将计算结果保存为`.npz`或`.json`文件 2. 需要处理类别平衡问题,多类别时应分别绘制每类的PR曲线 3. AP计算建议使用11点插值法: ```python from sklearn.metrics import average_precision_score # 假设已获得所有样本的预测概率和真实标签 ap = average_precision_score(true_labels, pred_scores) print(f'Average Precision: {ap:.3f}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值