defconvert(imageSize, boxCoor):
x =(boxCoor[0]+ boxCoor[1])/2.0/ imageSize[0]
y =(boxCoor[2]+ boxCoor[3])/2.0/ imageSize[1]
w =(boxCoor[1]- boxCoor[0])*1.0/ imageSize[0]
h =(boxCoor[3]- boxCoor[2])*1.0/ imageSize[1]return x, y, w, h
classDataSet():def__init__(self, imagePath, xmlPath):
self.train, self.val, self.text =None,None,None
self.imagePath = imagePath
self.xmlPath = xmlPath
imageFiles = os.listdir(self.imagePath)
self.imageData =[name.split(".")[0]for name in imageFiles if name.endswith("jpg")or name.endswith("jpeg")]
xmlFiles = os.listdir(self.xmlPath)
self.xmlData =[name.split(".")[0]for name in xmlFiles if name.endswith("xml")]
self.dataSet =[data for data in self.imageData if data in self.xmlData]defgetDatas(self):return self.dataSet
defgetOutliers(self):return{"NoXML":[data for data in self.imageData if data notin self.xmlData],"NoImage":[data for data in self.xmlData if data notin self.imageData]}# ......省略部分内容......
classDataSet():# ......省略部分内容......defsplitSet(self, trainval_per =0.8, train_per =0.8):
total =len(self.dataSet)
trainval_total =int(trainval_per * total)
train_total =int(train_per * trainval_total)
trainval_temp = random.sample(self.dataSet, trainval_total)
train_temp = random.sample(trainval_temp, train_total)
self.trainval =[data for data in self.dataSet if data in trainval_temp]
self.train =[data for data in self.trainval if data in train_temp]
self.val =[data for data in self.trainval if data notin self.train]
self.text =[data for data in self.dataSet if data notin self.trainval]return self.train, self.val, self.text
# 省略各种get方法def__writeSetToFile(self, datas, filename, suffix =False, path =False):withopen(filename,'w')as outfile:if path:for data in datas:if os.path.exists(os.path.join(self.imagePath, data +".jpg")):
outfile.write(self.imagePath +'/'+ data +".jpg\n")elif os.path.exists(os.path.join(self.imagePath, data +".jpeg")):
outfile.write(self.imagePath +'/'+ data +".jpeg\n")elif suffix:for data in datas:if os.path.exists(os.path.join(self.imagePath, data +".jpg")):
outfile.write(data +".jpg\n")elif os.path.exists(os.path.join(self.imagePath, data +".jpeg")):
outfile.write( data +".jpeg\n")else:for data in datas:
outfile.write(data +'\n')defwriteTrainToFile(self, filename, suffix =False, path =False):
self.__writeSetToFile(self.train, filename, suffix, path)defwriteValToFile(self, filename, suffix =False, path =False):
self.__writeSetToFile(self.val, filename, suffix, path)defwriteTrainValToFile(self, filename, suffix =False, path =False):
self.__writeSetToFile(self.trainval, filename, suffix, path)defwriteTextToFile(self, filename, suffix =False, path =False):
self.__writeSetToFile(self.text, filename, suffix, path)defwriteAllToFile(self, filename, suffix =False, path =False):
self.__writeSetToFile(self.dataSet, filename, suffix, path)defwriteSetToFile(self, pathname, suffix =False, path =False):
self.writeAllToFile(os.path.join(pathname,'all.txt'), suffix, path)
self.writeTextToFile(os.path.join(pathname,'test.txt'), suffix, path)
self.writeValToFile(os.path.join(pathname,'val.txt'), suffix, path)
self.writeTrainToFile(os.path.join(pathname,'train.txt'), suffix, path)
self.writeTrainValToFile(os.path.join(pathname,'trainval.txt'), suffix, path)
处理入口
之后调用上诉函数对数据集进行处理。
if __name__ =="__main__":
datas = DataSet("E:/data/images","E:/data/tagXml")print(datas.getOutliers())
train, val, text = datas.splitSet(0.8,0.8)# print(len(train), len(val), len(text))
datas.writeSetToFile("E:/data",True,True)
datas.writeAnnotationsToFile("E:/data/labels")
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]train: data\\train.txt
val: data\\val.txt
test: data\\test.txt
# number of classesnc:1# class namesnames:['car']
打开models/yolov5s.yaml,更改nc为自己的类别数,如下:
# parametersnc:1 # number of classesdepth_multiple:0.33 # model depth multiplewidth_multiple:0.50 # layer channel multiple# ......省略后面其他内容......
if __name__ =='__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--weights',type=str, default='models/yolov5s.pt',help='initial weights path')
parser.add_argument('--cfg',type=str, default='models/yolov5s.yaml',help='model.yaml path')# 存储模型结构的配置文件
parser.add_argument('--data',type=str, default='data/car.yaml',help='data.yaml path')# 存储训练、测试数据的文件
parser.add_argument('--hyp',type=str, default='',help='hyperparameters path, i.e. data/hyp.scratch.yaml')
parser.add_argument('--epochs',type=int, default=30)# 指的就是训练过程中整个数据集将被迭代多少次
parser.add_argument('--batch-size',type=int, default=5,help='total batch size for all GPUs')# 一次看完多少张图片才进行权重更新,梯度下降的mini-batch,
parser.add_argument('--img-size', nargs='+',type=int, default=[640,640],help='train,test sizes')# 输入图片宽高
parser.add_argument('--rect', action='store_true',help='rectangular training')# 进行矩形训练
parser.add_argument('--resume', nargs='?', const='get_last', default=False,help='resume from given path/last.pt, or most recent run if blank')# 恢复最近保存的模型开始训练
parser.add_argument('--nosave', action='store_true',help='only save final checkpoint')# 仅保存最终checkpoint
parser.add_argument('--notest', action='store_true',help='only test final epoch')# 仅测试最后的epoch
parser.add_argument('--noautoanchor', action='store_true',help='disable autoanchor check')
parser.add_argument('--evolve', action='store_true',help='evolve hyperparameters')# 进化超参数
parser.add_argument('--bucket',type=str, default='',help='gsutil bucket')# gsutil bucket
parser.add_argument('--cache-images', action='store_true',help='cache images for faster training')# 缓存图像以加快训练速度
parser.add_argument('--name', default='',help='renames results.txt to results_name.txt if supplied')# 重命名results.txt to results_name.txt
parser.add_argument('--device', default='0',help='cuda device, i.e. 0 or 0,1,2,3 or cpu')# cuda device, i.e. 0 or 0,1,2,3 or cpu
parser.add_argument('--multi-scale', action='store_true',help='vary img-size +/- 50%%')# 多尺度训练,img-size +/- 50%
parser.add_argument('--single-cls', action='store_true',help='train as single-class dataset')# 单类别的训练集
parser.add_argument('--adam', action='store_true',help='use torch.optim.Adam() optimizer')# 使用adam优化
parser.add_argument('--sync-bn', action='store_true',help='use SyncBatchNorm, only available in DDP mode')
parser.add_argument('--local_rank',type=int, default=-1,help='DDP parameter, do not modify')
parser.add_argument('--logdir',type=str, default='runs/',help='logging directory')
spring
【控制反转(IOC)/依赖注入(DI)】:
由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
简单的说:对象的创建又容器(比如spring容器)来执行,程序里不直接new对象。
Web
【单点登录(SSO)】:SSO的定义是在多个应用系统中,用户
Bellman-Ford算法(根据发明者 Richard Bellman 和 Lester Ford 命名)是求解单源最短路径问题的一种算法。单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore zu 也为这个算法的发展做出了贡献。
与迪科
Microsoft .NET Framework 3.5 Service Pack 1(完整软件包)
http://www.microsoft.com/zh-cn/download/details.aspx?id=25150
Microsoft .NET Framework 3.5 Service Pack 1 是一个累积更新,包含很多基于 .NET Framewo
public final class ViewStub extends View
java.lang.Object
android.view.View
android.view.ViewStub
类摘要: ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当 ViewSt