语义分割混淆矩阵、 mIoU、mPA计算

一、操作

#vx:桔子code / juzicode.com
import cv2 
img_gray = cv2.imread("nezha.jpg",cv2.IMREAD_GRAYSCALE)
for i in range(22):dst = cv2.applyColorMap(img_gray,i) cv2.imshow('map',dst) cv2.waitKey(500)cv2.imwrite("map-"+str(i)+".jpg",dst)

需要会调试代码的人自己改,小白直接运行会出错

这是我从自己的大文件里摘取的一部分代码,可以运行,只是要改的文件地址path比较多,遇到双引号“”的地址注意一下,不然地址不对容易出错

 把 calculate.py和 utiles_metrics.py放在同一文件夹下,然后运行 calculate.py。

二、理解

test_mIou,test_mPA,test_miou,test_mpa=compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes,weight_name)  # 执行计算mIoU的函数

gt_dir 真实标签文件夹

pred_dir 预测结果文件夹

主要是这两个变量设置,后面的可以选择性修改

image_ids 文件名称 dirList(pred_dir,path_list) saveList(path_list) 这两个函数得到

num_classes 类别数

name_classes 类别名称

weight_name 权重名称

hist为混淆矩阵,mIoU为交并比

三、代码 

 calculate.py

# -*- coding: utf-8 -*-
import torch
import osfrom time import time
# from PIL import Image
from utils_metrics import compute_mIoU
def saveList(pathName):for file_name in pathName:#f=open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/real/gt.txt", "x")with open("./dataset/gt.txt", "a") as f:f.write(file_name.split(".")[0] + "\n")f.closedef dirList(gt_dir,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))data_path  = './dataset/'f=open("./dataset/gt.txt", 'w')
gt_dir      = os.path.join(data_path, "real/")
pred_dir    = "./submits/log01_Dink101_five_100/test_iou/iou_60u/"
path_list = os.listdir(pred_dir)
path_list.sort()
dirList(pred_dir,path_list)
saveList(path_list)
num_classes=2
name_classes    = ["nontarget","target"]
weight_name='log01_Dink101_five_100'
image_ids   = open(os.path.join(data_path, "gt.txt"),'r').read().splitlines() test_mIou,test_mPA,test_miou,test_mpa=compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes,weight_name)  # 执行计算mIoU的函数
print('  test_mIoU:  '+str(test_miou))

 utiles_metrics.py

from os.path import joinimport numpy as np
import torch
import torch.nn.functional as F
from PIL import Image
import os
import cv2# from matplotlib import pyplot as plt
import shutil
import numpy as np
# from matplotlib.pyplot import MultipleLocatordef f_score(inputs, target, beta=1, smooth = 1e-5, threhold = 0.5):n, c, h, w = inputs.size()nt, ht, wt, ct = target.size()if h != ht and w != wt:inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)temp_target = target.view(n, -1, ct)#--------------------------------------------##   计算dice系数#--------------------------------------------#temp_inputs = torch.gt(temp_inputs, threhold).float()tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])fp = torch.sum(temp_inputs                       , axis=[0,1]) - tpfn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tpscore = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)score = torch.mean(score)return score# 设标签宽W,长H
def fast_hist(a, b, n):#--------------------------------------------------------------------------------##   a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的预测结果,形状(H×W,)#--------------------------------------------------------------------------------#k = (a >= 0) & (a < n)#--------------------------------------------------------------------------------##   np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)#   返回中,写对角线上的为分类正确的像素点#--------------------------------------------------------------------------------#return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n)  def per_class_iu(hist):return np.diag(hist) / np.maximum((hist.sum(1) + hist.sum(0) - np.diag(hist)), 1) def per_class_PA(hist):return np.diag(hist) / np.maximum(hist.sum(1), 1) def compute_mIoU(gt_dir, pred_dir, png_name_list, num_classes, name_classes,weight_name):  # print('Num classes', num_classes)  #-----------------------------------------##   创建一个全是0的矩阵,是一个混淆矩阵#-----------------------------------------#hist = np.zeros((num_classes, num_classes))#------------------------------------------------##   获得验证集标签路径列表,方便直接读取#   获得验证集图像分割结果路径列表,方便直接读取#------------------------------------------------#gt_imgs     = [join(gt_dir, x + ".png") for x in png_name_list]  pred_imgs   = [join(pred_dir, x + ".png") for x in png_name_list]  # building_iou=[]# background_iou=[]m_iou=[]# building_pa=[]# background_pa=[]m_pa=[]#------------------------------------------------##   读取每一个(图片-标签)对#------------------------------------------------#for ind in range(len(gt_imgs)): #------------------------------------------------##   读取一张图像分割结果,转化成numpy数组#------------------------------------------------#pred = np.array(Image.open(pred_imgs[ind]))#------------------------------------------------##   读取一张对应的标签,转化成numpy数组#------------------------------------------------#label = np.array(Image.open(gt_imgs[ind]))  # 如果图像分割结果与标签的大小不一样,这张图片就不计算if len(label.flatten()) != len(pred.flatten()):  print('Skipping: len(gt) = {:d}, len(pred) = {:d}, {:s}, {:s}'.format(len(label.flatten()), len(pred.flatten()), gt_imgs[ind],pred_imgs[ind]))continue#------------------------------------------------##   对一张图片计算21×21的hist矩阵,并累加#------------------------------------------------#a=label.flatten()a//=254b=pred.flatten()b//=254hist += fast_hist(a, b,num_classes)  # # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值# mIoUs   = per_class_iu(hist)# mPA     = per_class_PA(hist)# m_iou.append(100 * np.nanmean(mIoUs[1]))# m_pa.append(100 * np.nanmean(mPA[1]))# # if ind > 0 and ind % 10 == 0:  # #     print('{:d} / {:d}: mIou-{:0.2f}; mPA-{:0.2f}'.format(ind, len(gt_imgs),# #                                             100 * np.nanmean(mIoUs[1]),# #                                             100 * np.nanmean(mPA[1])))mIoUs   = per_class_iu(hist)mPA     = per_class_PA(hist)print(mIoUs)# plt.figure()# x=np.arange(len(m_iou))# plt.plot(x,m_iou)# plt.plot(x,m_pa)# plt.grid(True)# y_major_locator=MultipleLocator(10)#把y轴的刻度间隔设置为10,并存在变量里# ax = plt.gca()# ax.yaxis.set_major_locator(y_major_locator)# ax.set_ylim(0,100)# plt.xlabel('Order')# plt.ylabel('mIOU & mPA')# plt.legend(['mIOU','mPA'],loc="upper right")# targ=os.path.join(pred_dir,os.path.pardir)# plt.savefig(os.path.join(targ, weight_name[:-3]+"_sin_miou.png"))return m_iou,m_pa,str(round(mIoUs[1] * 100, 2)),str(round(mPA[1] * 100, 2))

调试

个人使用

import os
import shutil
data_path='./submits/log01_Dink101_five_100/test_iou/'
data=open(os.path.join(data_path, "log01_Dink101_five_100_excel.txt"),'r').read().splitlines()
valid_path='./dataset/valid/'
real_path='./dataset/real/'iou_100=os.path.join(data_path,'iou_60u/')
iou_80=os.path.join(data_path,'iou_60d/')if not os.path.exists(iou_100):os.mkdir(iou_100)os.mkdir(iou_80)for n in data:name=n.split()[1]iou=float(n.split()[2])if iou>=65:img_path=os.path.join(data_path,'87.650/'+name+'.png')shutil.copy(img_path,iou_100)print(name,iou)continueelse :img_path=os.path.join(data_path,'87.650/'+name+'.png')shutil.copy(img_path,iou_80)print(name,iou)continueprint('Finish')# -*- coding: utf-8 -*-
import torch
import osfrom time import time
# from PIL import Image
from utils.utils_metrics import compute_mIoU
from utils.utils_metrics import compute_IoU
def saveList(pathName):for file_name in pathName:#f=open("C:/Users/Administrator/Desktop/DeepGlobe-Road-Extraction-link34-py3/dataset/real/gt.txt", "x")with open("./dataset/gt.txt", "a") as f:f.write(file_name.split(".")[0] + "\n")f.closedef dirList(gt_dir,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))data_path  = './dataset/'f=open("./dataset/gt.txt", 'w')
gt_dir      = os.path.join(data_path, "real/")
pred_dir    = "./submits/log01_Dink101_five_100/test_iou/iou_60u/"
path_list = os.listdir(pred_dir)
path_list.sort()
dirList(pred_dir,path_list)
saveList(path_list)
num_classes=2
name_classes    = ["nontarget","target"]
weight_name='log01_Dink101_five_100'
image_ids   = open(os.path.join(data_path, "gt.txt"),'r').read().splitlines() # compute_IoU(gt_dir, pred_dir, image_ids, num_classes, weight_name)
test_mIou,test_mPA,test_miou,test_mpa=compute_mIoU(gt_dir, pred_dir, image_ids, num_classes, name_classes,weight_name)  # 执行计算mIoU的函数
print('  test_mIoU:  '+str(test_miou))
from os.path import joinimport numpy as np
import torch
import torch.nn.functional as F
from PIL import Image
import os
import cv2# from matplotlib import pyplot as plt
import shutil
import numpy as np
# from matplotlib.pyplot import MultipleLocatordef f_score(inputs, target, beta=1, smooth = 1e-5, threhold = 0.5):n, c, h, w = inputs.size()nt, ht, wt, ct = target.size()if h != ht and w != wt:inputs = F.interpolate(inputs, size=(ht, wt), mode="bilinear", align_corners=True)temp_inputs = torch.softmax(inputs.transpose(1, 2).transpose(2, 3).contiguous().view(n, -1, c),-1)temp_target = target.view(n, -1, ct)#--------------------------------------------##   计算dice系数#--------------------------------------------#temp_inputs = torch.gt(temp_inputs, threhold).float()tp = torch.sum(temp_target[...,:-1] * temp_inputs, axis=[0,1])fp = torch.sum(temp_inputs                       , axis=[0,1]) - tpfn = torch.sum(temp_target[...,:-1]              , axis=[0,1]) - tpscore = ((1 + beta ** 2) * tp + smooth) / ((1 + beta ** 2) * tp + beta ** 2 * fn + fp + smooth)score = torch.mean(score)return score# 设标签宽W,长H
def fast_hist(a, b, n):#--------------------------------------------------------------------------------##   a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的预测结果,形状(H×W,)#--------------------------------------------------------------------------------#k = (a >= 0) & (a < n)#--------------------------------------------------------------------------------##   np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)#   返回中,写对角线上的为分类正确的像素点#--------------------------------------------------------------------------------#return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n)  def per_class_iu(hist):return np.diag(hist) / np.maximum((hist.sum(1) + hist.sum(0) - np.diag(hist)), 1) def per_class_PA(hist):return np.diag(hist) / np.maximum(hist.sum(1), 1) def compute_IoU(gt_dir, pred_dir, png_name_list, num_classes,weight_name):  # print('Num classes')  #-----------------------------------------##   创建一个全是0的矩阵,是一个混淆矩阵#-----------------------------------------## hist = np.zeros((num_classes, num_classes))#------------------------------------------------##   获得验证集标签路径列表,方便直接读取#   获得验证集图像分割结果路径列表,方便直接读取#------------------------------------------------#gt_imgs     = [join(gt_dir, x + "_mask.png") for x in png_name_list]  pred_imgs   = [join(pred_dir, x + ".png") for x in png_name_list]  m_iou=[]m_pa=[]hist_save=[] #------------------------------------------------##   读取每一个(图片-标签)对#------------------------------------------------#for ind in range(len(gt_imgs)): #------------------------------------------------##   读取一张图像分割结果,转化成numpy数组#------------------------------------------------#pred = np.array(Image.open(pred_imgs[ind]).convert('L'))# pred = pred/255#------------------------------------------------##   读取一张对应的标签,转化成numpy数组#------------------------------------------------#label = np.array(Image.open(gt_imgs[ind]).convert('L'))  # label = label/255# 如果图像分割结果与标签的大小不一样,这张图片就不计算if len(label.flatten()) != len(pred.flatten()):  print('Skipping: len(gt) = {:d}, len(pred) = {:d}, {:s}, {:s}'.format(len(label.flatten()), len(pred.flatten()), gt_imgs[ind],pred_imgs[ind]))continue#------------------------------------------------##   对一张图片计算21×21的hist矩阵,并累加#------------------------------------------------#a=label.flatten()a//=254# for i in range(len(a)):#     a[i]=a[i]/255b=pred.flatten()b//=254# for i in range(len(b)):#     b[i]=b[i]/255hist = fast_hist(a, b,num_classes)  # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值mIoUs   = per_class_iu(hist)mPA     = per_class_PA(hist)mIoU_one = 100 * np.nanmean(mIoUs[1])mPA_one = 100 * np.nanmean(mPA[1])# if mIoU_one<80:#     shutil.copy(pred_imgs[ind],lower_iou)#     count=count+1# else:#     shutil.copy(pred_imgs[ind],higher_iou)img_name= png_name_list[ind]# if ind > 0 and ind % 10 == 0:  #print('{:d}  {}: Iou-{:0.2f}; PA-{:0.2f}'.format(ind,img_name,mIoU_one,mPA_one))#print(hist)m_iou.append(100 * np.nanmean(mIoUs[1]))m_pa.append(100 * np.nanmean(mPA[1]))hist_save.append(hist)targ=os.path.join(pred_dir,os.path.pardir)if ind==0:with open(os.path.join(targ, weight_name[:-3]+'.txt'),'w') as f:f.write(str(ind) +'  '+ str(img_name) +'   ')f.write('Iou:'+str(round(mIoU_one,2))+'  '+'PA:'+str(round(mPA_one,2))+'\n')f.write('                   '+'['+str(hist[0,0])+'   '+str(hist[0,1])+'\n')f.write('                   '+' '+str(hist[1,0])+'   '+str(hist[1,1])+']'+'\n')with open(os.path.join(targ, weight_name[:-3]+'_excel.txt'),'w') as f:f.write(str(ind) +'  '+ str(img_name) +'   ')f.write(str(round(mIoU_one,2))+'  '+str(round(mPA_one,2))+'\n')else:with open(os.path.join(targ, weight_name[:-3]+'.txt'),'a') as f:f.write(str(ind) +'  '+ str(img_name) +'   ')f.write('Iou:'+str(round(mIoU_one,2))+'  '+'PA:'+str(round(mPA_one,2))+'\n')f.write('                   '+'['+str(hist[0,0])+'   '+str(hist[0,1])+'\n')f.write('                   '+' '+str(hist[1,0])+'   '+str(hist[1,1])+']'+'\n')with open(os.path.join(targ, weight_name[:-3]+'_excel.txt'),'a') as f:f.write(str(ind) +'  '+ str(img_name) +'   ')f.write(str(round(mIoU_one,2))+'  '+str(round(mPA_one,2))+'\n')'''plt.figure()x=np.arange(len(m_iou))plt.plot(x,m_iou)plt.plot(x,m_pa)plt.grid(True)plt.xlabel('Order')plt.ylabel('test mIOU & mPA')plt.legend(['mIOU','mPA'],loc="upper right")plt.savefig(os.path.join(pred_dir[0:-13], weight_name[:-3]+"_test_iou.png"))'''def compute_mIoU(gt_dir, pred_dir, png_name_list, num_classes, name_classes,weight_name):  # print('Num classes', num_classes)  #-----------------------------------------##   创建一个全是0的矩阵,是一个混淆矩阵#-----------------------------------------#hist = np.zeros((num_classes, num_classes))#------------------------------------------------##   获得验证集标签路径列表,方便直接读取#   获得验证集图像分割结果路径列表,方便直接读取#------------------------------------------------#gt_imgs     = [join(gt_dir, x + "_mask.png") for x in png_name_list]  pred_imgs   = [join(pred_dir, x + ".png") for x in png_name_list]  # building_iou=[]# background_iou=[]m_iou=[]# building_pa=[]# background_pa=[]m_pa=[]#------------------------------------------------##   读取每一个(图片-标签)对#------------------------------------------------#for ind in range(len(gt_imgs)): #------------------------------------------------##   读取一张图像分割结果,转化成numpy数组#------------------------------------------------#pred = np.array(Image.open(pred_imgs[ind]).convert('L'))#------------------------------------------------##   读取一张对应的标签,转化成numpy数组#------------------------------------------------#label = np.array(Image.open(gt_imgs[ind]).convert('L'))  # 如果图像分割结果与标签的大小不一样,这张图片就不计算if len(label.flatten()) != len(pred.flatten()):  print('Skipping: len(gt) = {:d}, len(pred) = {:d}, {:s}, {:s}'.format(len(label.flatten()), len(pred.flatten()), gt_imgs[ind],pred_imgs[ind]))continue#------------------------------------------------##   对一张图片计算21×21的hist矩阵,并累加#------------------------------------------------#a=label.flatten()a//=254b=pred.flatten()b//=254hist += fast_hist(a, b,num_classes)  # # 每计算10张就输出一下目前已计算的图片中所有类别平均的mIoU值# mIoUs   = per_class_iu(hist)# mPA     = per_class_PA(hist)# m_iou.append(100 * np.nanmean(mIoUs[1]))# m_pa.append(100 * np.nanmean(mPA[1]))# # if ind > 0 and ind % 10 == 0:  # #     print('{:d} / {:d}: mIou-{:0.2f}; mPA-{:0.2f}'.format(ind, len(gt_imgs),# #                                             100 * np.nanmean(mIoUs[1]),# #                                             100 * np.nanmean(mPA[1])))print(hist)mIoUs   = per_class_iu(hist)mPA     = per_class_PA(hist)print(mIoUs)# plt.figure()# x=np.arange(len(m_iou))# plt.plot(x,m_iou)# plt.plot(x,m_pa)# plt.grid(True)# y_major_locator=MultipleLocator(10)#把y轴的刻度间隔设置为10,并存在变量里# ax = plt.gca()# ax.yaxis.set_major_locator(y_major_locator)# ax.set_ylim(0,100)# plt.xlabel('Order')# plt.ylabel('mIOU & mPA')# plt.legend(['mIOU','mPA'],loc="upper right")# targ=os.path.join(pred_dir,os.path.pardir)# plt.savefig(os.path.join(targ, weight_name[:-3]+"_sin_miou.png"))return m_iou,m_pa,str(round(mIoUs[1] * 100, 2)),str(round(mPA[1] * 100, 2))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G全网通工业三防平板Windows移动电脑

当今科技领域的快速发展为我们的生活带来了许多便利和高效性能。在这个数字化时代&#xff0c;移动设备已成为我们生活的重要组成部分。在这一领域&#xff0c;搭载全新第12代英特尔酷睿Mi5-1235U/i7-1255U处理器的工业三防平板Windows移动电脑无疑是一款引人注目的产品。 这款…

无法找到docker.sock

os环境&#xff1a;麒麟v10(申威) 问题描述&#xff1a; systemctl start docker 然后无法使用docker [rootnode2 ~]# systemctl restart docker [rootnode2 ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon r…

vue3使用下载附件功能

效果&#xff1a; 点击即可以下载打开。 代码&#xff1a; <div v-show"item.attachment.length > 0"><h3>下载附件</h3><divv-for"(doc, docIndex) in item.attachment":key"docIndex"><astyle"color: #41…

技术架构的演进-八大架构

目录&#xff1a; 常见概念评价指标单机架构应用数据分离架构应用服务集群架构读写分离 / 主从分离架构引入缓存 —— 冷热分离架构垂直分库业务拆分 —— 微服务容器化引入——容器编排架构总结 1.常见概念&#xff1a; 应用&#xff08;Application&#xff09; / 系统&am…

栈的压入、弹出序列

链接: 栈的压入、弹出序列 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pushV int整型vector * param popV int整型vector * return bool布尔型*/bool IsPopOrder(vector<int…

zeppelin的hive使用

zeppelin的hive使用 配置项 default.driver org.apache.hive.jdbc.HiveDriver default.url jdbc:hive2://192.168.xxx.xxx:10000 default.user hiveHive使用&#xff1a;点击create new note Default Interpreter选择hive

生命周期函数和wxs脚本

生命周期函数和wxs脚本 1. 生命周期函数1.1. 应用的生命周期函数1.2. 页面的生命周期函数 2. wxs脚本2.1. wxs与JavaScript的关系2.2. wxs内嵌脚本2.3. wxs外联脚本2.4. tips 1. 生命周期函数 1.1. 应用的生命周期函数 应用的生命周期函数&#xff1a;指小程序从启动 -> 运…

TCP编程流程和粘包

目录 1、TCP编程流程 2、粘包 1、TCP编程流程 socket() 是创建套接字&#xff0c;返回值为监听套接字描述符&#xff0c;有了套接字才能通过网络进行数据的传输。创建套接字的参数要指定服务类型&#xff0c;TCP协议使用的是流式服务&#xff08;SOCK_STREAM&#xff09;。 b…

数据库系统 - 家庭教育平台设计开发

目录 1.绪论 1.1项目背景 1.2家庭教育平台的发展现状与优势 1.2.1国内外发展现状 1.2.2家庭教育平台的优势 2.需求分析 2.1可行性分析 2.1.1经济可行性 2.1.2 技术可行性 2.1.3操作可行性 2.2系统功能 2.2.1 家庭教育资源 2.2.2 家庭教育指导师 2.2.3家庭教育咨询…

BUG解决Button类不能从UnityEngine.UI中引用

Button does not contain a definition for onClick and no accessible extension method onClick accepting a first argument of type Button could be found (are you missing a using directive or an assembly reference?) 一个非常奇葩的问题;突然!!!!! using UnityEn…

redis如何实现持久化

RDB快照 RDB是一种快照存储持久化方式&#xff0c;具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中&#xff0c;默认保存的文件名为dump.rdb&#xff0c;而在Redis服务器启动时&#xff0c;会重新加载dump.rdb文件的数据到内存当中恢复数据。 开启RDB持久化方式 开启…

AWS MSK集群认证和加密传输的属性与配置

通常&#xff0c;身份认证和加密传输是两项不相关的安全配置&#xff0c;在Kafka/MSK上&#xff0c;身份认证和加密传输是有一些耦合关系的&#xff0c;重点是&#xff1a;对于MSK来说&#xff0c;当启用IAM, SASL/SCRAM以及TLS三种认证方式时&#xff0c;TLS加密传输是必须的&…

Ubuntu开机自启动设置

一、创建执行脚本 这里有两个程序所以编写了两个脚本&#xff0c;第一脚本(master.sh)&#xff1a; gnome-terminal -- bash -c "source /home/zyy/anaconda3/bin/activate wood2;cd /home/zyy/pycharmProject/master_program;python main.py > /home/zyy/pycharmProj…

用于语义图像分割的弱监督和半监督学习:弱监督期望最大化方法

这时一篇2015年的论文&#xff0c;但是他却是最早提出在语义分割中使用弱监督和半监督的方法&#xff0c;SAM的火爆证明了弱监督和半监督的学习方法也可以用在分割上。 这篇论文只有图像级标签或边界框标签作为弱/半监督学习的输入。使用期望最大化(EM)方法&#xff0c;用于弱…

JavaScript--修改 HTML 元素

这些是一些用于修改 HTML 元素的常见方法&#xff1a; 1、document.createElement(element)&#xff1a;创建 HTML 元素节点。可以使用这个方法创建一个新的 HTML 元素&#xff0c; 例如 document.createElement(div) 将创建一个 <div> 元素节点。 2、document.createA…

elementUI 非表单格式的校验

在普通表单中对输入框、选择框都有校验案例。 但是在自定义非空中如何进行校验官网并没有说明 关键代码 clearValidate 方法清除校验 this.$refs.formValue.clearValidate(signinimg) 使用案例 <template><div class"stylebg"><Tabs icons"el-…

go mod 设置国内源 windows 环境 win10

启用 go module 功能 go env -w GO111MODULEon 配置 goproxy 变量 go env -w GOPROXYhttps://goproxy.cn,direct 下载包就行了&#xff0c;速度飞快 go mod tidy 检测 goproxy 是否配置好 运行 go env | findstr goproxy 查看 goproxy Go module 从 Go v1.12 版本开始存在&a…

flutter开发实战-底部bottomNavigationBar➕PageView

flutter开发实战-底部bottomNavigationBar tabbar在app中非常常见&#xff0c;底部BottomNavigationBar属性 一、BottomNavigationBar属性 BottomNavigationBar组件的常用属性&#xff1a; type&#xff1a;tabbar样式&#xff0c;默认为白色不显示&#xff1b;fixedColor:t…

S3C2440使用GPIO输入功能控制按键

文章目录 前言一、设置GPIO输入模式二、检测开关1.配置功能2.具体实现 总结 前言 由于上期分享的使用GPIO去控制引脚输出模式点亮LED&#xff0c;那么本期主要介绍一下使用GPIO设置为输入模式&#xff0c;用到的硬件有板载的按键&#xff1b;开发环境也是依赖于S3C2440开发板&…

TCP/IP网络编程 第十五章:套接字和标准I/O

标准I/O函数的优点 标准I/O函数的两个优点 将标准I/O函数用于数据通信并非难事。但仅掌握函数使用方法并没有太大意义&#xff0c;至少应该 了解这些函数具有的优点。下面列出的是标准I/O函数的两大优点: □标准I/O函数具有良好的移植性(Portability) □标准I/O函数可以利用缓…