重新调试好代码,使用Dinknet34模型对数据集进行训练
数据集大小为1480张图片
运行时间为2022年1月12日16:00
记录下该模型训练时间

但如何评估模型的精度也是一个问题,因此作如下总结

模型精度评估

评价指标:
  准确率 (Accuracy),混淆矩阵 (Confusion Matrix),精确率(Precision),召回率(Recall),平均正确率(AP),mean Average Precision(mAP),交除并(IoU),ROC + AUC,非极大值抑制(NMS)。

IoU

IoU这一值,可以理解为系统预测出来的框与原来图片中标记的框的重合程度。 计算方法即检测结果Detection Result与 Ground Truth 的交集比上它们的并集,即为检测的准确率。
  是模型结果和标签作比较,但标签不一定是最后的道路真实数据

准确率 (Accuracy)

分对的样本数除以所有的样本数 ,即:准确(分类)率 = 正确预测的正反例数 / 总数。
准确率一般用来评估模型的全局准确程度,不能包含太多信息,无法全面评价一个模型性能。

精确率(Precision)与召回率(Recall)

一些相关的定义。假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,假设你的分类系统最终的目的是:能取出测试集中所有飞机的图片,而不是大雁的图片。
True positives : 正样本被正确识别为正样本,飞机的图片被正确的识别成了飞机。
True negatives: 负样本被正确识别为负样本,大雁的图片没有被识别出来,系统正确地认为它们是大雁。
False positives: 假的正样本,即负样本被错误识别为正样本,大雁的图片被错误地识别成了飞机。 False negatives: 假的负样本,即正样本被错误识别为负样本,飞机的图片没有被识别出来,系统错误地认为它们是大雁。
  Precision其实就是在识别出来的图片中,True positives所占的比率。也就是本假设中,所有被识别出来的飞机中,真正的飞机所占的比例。
  Recall 是测试集中所有正样本样例中,被正确识别为正样本的比例。也就是本假设中,被正确识别出来的飞机个数与测试集中所有真实飞机的个数的比值。
  
 Precision-recall 曲线:改变识别阈值,使得系统依次能够识别前K张图片,阈值的变化同时会导致Precision与Recall值发生变化,从而得到曲线。
  如果一个分类器的性能比较好,那么它应该有如下的表现:在Recall值增长的同时,Precision的值保持在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡。
  有道路真实数据后就可以把提取结果和道路真值作比较,计算准确率召回率

OSM

获取OpenStreetMap(OSM)
https://zhuanlan.zhihu.com/p/25889246
实在没有真实数据就只能自己下osm之类的自己改


2022年1月13日11:00训练完成

接下来运行测试程序
test.py
输出结果

现在尝试训练3005个样本集
3005个样本集从2022年1月13日16:00开始跑
2022年1月15日16:30跑完

PyTorch绘制训练过程的accuracy和loss曲线

import绘制库

import matplotlib.pyplot as plt

绘制代码

Loss_list = []
Accuracy_list = []Loss_list.append(train_loss)
Accuracy_list.append(100 * train_acc / (len(train_dataset)))x1 = range(0, 200)
x2 = range(0, 200)
y1 = Accuracy_list
y2 = Loss_list
plt.subplot(2, 1, 1)
plt.plot(x1, y1, 'o-')
plt.title('Test accuracy vs. epoches')
plt.ylabel('Test accuracy')
plt.subplot(2, 1, 2)
plt.plot(x2, y2, '.-')
plt.xlabel('Test loss vs. epoches')
plt.ylabel('Test loss')
plt.show()
plt.savefig("accuracy_loss.jpg")

我这里修改之后的代码是这样的:

x1 = range(0, len(Loss_list))
y1 = Loss_list
plt.plot(x1, y1, 'o-')
plt.title('Model loss vs. epoches')
plt.ylabel('Model loss')
plt.savefig("model_loss.jpg")
plt.show()
mylog.write('Finish!')
print ('Finish!')
mylog.close()

这里要注意
一定要在 plt.show() 之前调用 plt.savefig();
如果在 plt.show() 后调用了plt.savefig() ,在 plt.show() 后实际上已经创建了一个新的空白的图片,这时候你再 plt.savefig() 就会保存这个新生成的空白图片
所以保存的图片将会是一片空白!!!!注意这两者的位置!!!
保存的结果:

PyTorch计算mIou(mean intersection over union)和pa(pixel accuracy)

miou计算需要使用到compute_mIoU函数
相关叙述这篇博文解释的很好

如果只输出miou那么可以查看这个代码来实现
这里需要用到头文件utils

import os
from PIL import Imagefrom tqdm import tqdm
from deeplab import DeeplabV3from utils.utils_metrics import compute_mIoU'''进行指标评估需要注意以下几点:1、该文件生成的图为灰度图,因为值比较小,按照PNG形式的图看是没有显示效果的,所以看到近似全黑的图是正常的。2、该文件计算的是验证集的miou,当前该库将测试集当作验证集使用,不单独划分测试集'''if __name__ == "__main__":
#---------------------------------------------------------------------------#    #   miou_mode用于指定该文件运行时计算的内容    #   miou_mode为0代表整个miou计算流程,包括获得预测结果、计算miou。    #   miou_mode为1代表仅仅获得预测结果。    #   miou_mode为2代表仅仅计算miou。    #---------------------------------------------------------------------------#miou_mode       = 2#------------------------------#    #   分类个数+1、如2+1    #------------------------------#num_classes     = 2#   区分的种类,和json_to_dataset里面的一样# name_classes    = ["background","aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]    name_classes    = ["nonroad","road"]#   指向VOC数据集所在的文件夹    #   默认指向根目录下的VOC数据集VOCdevkit_path  = 'G:/Feng/TMP/Semantic segmentation/daima/VOCdevkit'image_ids   = open(os.path.join(VOCdevkit_path, "VOC2007/ImageSets/Segmentation/val.txt"),'r').read().splitlines()     gt_dir      = os.path.join(VOCdevkit_path, "VOC2007/SegmentationClass/")    pred_dir    = "G:/Feng/TMP/Semantic segmentation/daima/VOCdevkit/miou_out"if miou_mode == 0 or miou_mode == 1:        if not os.path.exists(pred_dir):            os.makedirs(pred_dir)                    print("Load model.")        deeplab = DeeplabV3()        print("Load model done.")print("Get predict result.")        for image_id in tqdm(image_ids):            image_path  = os.path.join(VOCdevkit_path, "VOC2007/JPEGImages/"+image_id+".jpg")            image       = Image.open(image_path)            image       = deeplab.get_miou_png(image)            image.save(os.path.join(pred_dir, image_id + ".png"))        print("Get predict result done.")if miou_mode == 0 or miou_mode == 2:        print("Get miou.")        compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes)  # 执行计算mIoU的函数        print("Get miou done.")

这里对于compute_mIoU函数的参数进行一些解释
gt_dir:VOCdevkit/VOC2007/SegmentationClass/ 是分割的png标签图片目录
pred_dir:miou_out是输出miou结果的目录,没有时会创建
png_name_list:是读取的验证集的png图片的名称序列
这里得获取png_name_list
相关方法如下

Python 利用os 获取文件夹中每一张图片的名字 并保存至 txt

查看这篇博文


带图片整个路径:

 data_path  = 'C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/'image_ids   = open(os.path.join(data_path, "real/gt.txt"),'r').read().splitlines()     gt_dir      = os.path.join(data_path, "real/")    pred_dir    = "C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/submits/log01_dink34"    for files in os.listdir(gt_dir):print(files)        img_path = gt_dir+ fileswith open("gt.txt", "a") as f:            f.write(str(img_path) + '\n')

这样写的结果是图片的路径

不带后缀:

 data_path  = 'C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/'image_ids   = open(os.path.join(data_path, "real/gt.txt"),'r').read().splitlines()     gt_dir      = os.path.join(data_path, "real/")    pred_dir    = "C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/submits/log01_dink34"    path_list = os.listdir(gt_dir)    path_name = []    def saveList(pathName):for file_name in pathName:            with open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/real/gt.txt", "a") as f:                f.write(file_name.split(".")[0] + "\n")def dirList(path_list):for i in range(0, len(path_list)):            path = os.path.join(gt_dir, path_list[i])        if os.path.isdir(path):            saveList(os.listdir(path))dirList(path_list)    saveList(path_list)

这样写的结果是图片的前缀

open(“gt.txt”, “a”)
刚才打开文件过程中用到了‘r’这个参数,在文件打开过程中还会用到很多操作方法,都有不同的参数来表示。'r’读模式、'w’写模式、'a’追加模式、‘b’二进制模式、’+'读/写模式。
这里有个问题就是‘a’模式如果没有txt文件存在就会报错,他不会自己创建,因此这里最好换成w

with open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/real/gt.txt", "w") as f:

很奇怪这样改了还是出现问题

No such file or directory: ‘C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/gt.txt’

f=open(“C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/gt.txt”, ‘w’)
一直报错,但是我的代码确实是创建txt文档呀
不知道为什么没法创建

之后才发现我先写了这个语句

 image_ids   = open(os.path.join(data_path, "gt.txt"),'r').read().splitlines()

然后才是创建txt文档

f=open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/gt.txt", 'w')

这肯定会报错的,没有这个文件怎么访问
所以我调了一下代码的顺序
不应该太早就访问gt.txt而是应该等写入数据之后再访问
所以把它放到了最后面

 dirList(path_list)    saveList(path_list)        image_ids   = open(os.path.join(data_path, "gt.txt"),'r').read().splitlines()

问题解决!

windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(三)——模型精度评估代码完善相关推荐

  1. windows10使用cuda11搭建pytorch深度学习框架——运行Dlinknet提取道路(二)——代码运行问题解决

    运行程序 去github上下载Dlinknet的代码 https://github.com/zlckanata/DeepGlobe-Road-Extraction-Challenge 把数据集放进da ...

  2. Ubuntu20搭建pytorch深度学习框架——使用增强样本运行Dlinknet提取道路水体(五)——样本增强

    之前运行的样本是未进行过样本增强的 做出来多少样本就使用了多少样本来进行训练 这里复盘一下样本训练结果 首先是道路 使用512512分辨率的16461张标签和16461张原图进行训练 接下来是水体 使 ...

  3. 从头搭建一个深度学习框架

    从头搭建一个深度学习框架 转自:Build a Deep Learning Framework From Scratch 代码:https://github.com/borgwang/tinynn 当 ...

  4. 2021-7-26 pytorch深度学习框架学习

    1. Pytorch深度学习框架

  5. 在腾讯云主机上搭建pytorch深度学习环境

    在腾讯云主机上搭建pytorch深度学习环境 1.购置[腾讯云主机](https://cloud.tencent.com/? fromSource=gwzcw.234976.234976.234976 ...

  6. pytorch深度学习框架--gpu和cpu的选择

    pytorch深度学习框架–gpu和cpu的选择 基于pytorch框架,最近实现了一个简单的手写数字识别的程序,我安装的pytorch是gpu版(你也可以安装cpu版本的,根据个人需要),这里我介绍 ...

  7. 人工智能:PyTorch深度学习框架介绍

    目录 1.PyTorch 2.PyTorch常用的工具包 3.PyTorch特点 4.PyTorch不足之处 今天给大家讲解一下PyTorch深度学习框架的一些基础知识,希望对大家理解PyTorch有 ...

  8. pytorch深度学习框架—torch.nn模块(一)

    pytorch深度学习框架-torch.nn模块 torch.nn模块中包括了pytorch中已经准备好的层,方便使用者调用构建的网络.包括了卷积层,池化层,激活函数层,循环层,全连接层. 卷积层 p ...

  9. 构建深度学习框架运行平台

    构建深度学习框架运行平台 将为TensorFlow.PyTorch和TorchScript之外的元素构建一个简单的深度学习框架运行平台模型.将展示如何从Python和C++运行推理. 打包和推断接口还 ...

最新文章

  1. CTFshow 命令执行 web60
  2. 数据结构之树状数组(候补)
  3. 字符的用意_北辰的符号意义 阅读答案
  4. 表单的提交方式POST和GET
  5. Oracle 在 Linux 下移动控制文件步骤
  6. 工厂模式三部曲之工厂方法模式
  7. python处理pdf的第三方库_Python使用到第三方库PyMuPDF图片与pdf相互转换
  8. switchhosts以管理员身份运行后不显示故障处理
  9. OpenDrive学习笔记
  10. 安卓和win环境下扫描局域网下设备IP的工具
  11. python提取图像HOG特征
  12. js实现按钮button单击/双击操作
  13. 什么叫做罗列式_申论作文写作之案例罗列式开头
  14. (附源码)Springboot酒店会员点餐系统 毕业设计 072005
  15. 华盛顿大学华人团队进入微软Imagine Cup总决赛!
  16. 富士施乐打印机DP P355d设置说明
  17. 网络安全系列-XV: 网络异常流量的种类及特征
  18. 科普 | 数据安全与网络安全(一)概念篇
  19. 传图识字有次数限制吗_告诉你一个免费的微信小程序,可以传图识字
  20. 布斯乘法算法的流程图

热门文章

  1. SDL教程零基础入门 简单操作 day1
  2. 毕业设计-基于spring boot的智慧物业管理系统
  3. 【iot-manager】(1)IOT商业化和未来竞争、淘汰还在继续,需要折腾一个开源IOT系统,参考Rancher开源Octopus:IoT设备管理系统做一个物联网管理系统
  4. [收藏]三国时代的十大遗言
  5. 算法给小码农八大排序 八奇计只为宝儿姐
  6. [AD17] 使用元器件向导为元件绘制PCB封装
  7. Java、JSP基于Web停车场管理系统毕业设计论文
  8. java不区分大小写查找字符串
  9. 麦克尼马尔检验(McNemar test)
  10. kindle电子书横竖屏切换方法