当前位置: 首页 > news >正文

新疆城乡与住房建设厅网站做网站好的网站建设公司

新疆城乡与住房建设厅网站,做网站好的网站建设公司,苏州个人网站建设,快速网站建设推荐将自己的数据集引入Pytorch是搭建属于自己的神经网络的重要一步,这里我设计了一个简单的实验,结合这个实验代码,我将逐句教会大家如何将数据引入DataLoader。 这里以目标检测为例,一个batch中包含图片文件、先验框的框体坐标、目标…

        将自己的数据集引入Pytorch是搭建属于自己的神经网络的重要一步,这里我设计了一个简单的实验,结合这个实验代码,我将逐句教会大家如何将数据引入DataLoader。

        这里以目标检测为例,一个batch中包含图片文件、先验框的框体坐标、目标类型,相对而言更加全面。大家亦可根据自己的数据结构和需求进行修改。

一、数据文件分析

        标准的Voc格式是无法直接注入模型的,而如果在训练程序中进行处理即拖慢了运算速度,又难以保证数据集分割的一致性。最好是使用一个独立程序完成数据集的分割、组织、暂存。这里参考了Bubbliiiing的做法,将数据集信息暂存为txt文件。其中一条具体数据的格式如下:

../VOC2007/JPEGImages/0.jpg 166,121,336,323,0 1052,372,1371,924,1
#   文件路径(绝对路径为佳)/ # 先验框框体信息1/  # 先验框框体信息1/

        文件路径框体信息之间采用空格分开;框体信息内部以逗号分开,前4个为坐标信息,最后一个为分类信息

        在随后的程序中,我们将循环读取这个文件中的数据来获取数据集信息。

二、载入数据

        1.定义DataSet超参

                在开始重写DataSet前,我们需要定义一些用来控制DataSet的参数。

#----自定义DataSet,继承自torch.utils.data.DataSet
class MyDataSet(Dataset):#----参数定义,输入的参数分别为数据行、输入图像尺寸,类型数def __init__(self,file_Lines,inp_Shape,num_Classes):super(MyDataSet,self).__init__()#  将局部形参变为类内的全局变量self.length = len(file_Lines)   #将文件数赋值给lengthself.file_Lines = file_Linesself.inp_Shape = inp_Shapeself.num_Classes = num_Classes

        2.重写len函数

                没什么技巧,因为我们刚刚将数据行(file_Lines)的长度赋值给了self.length,直接返回这个值就能拿到数据集的长度了。这也是设置超参数的意义所在。

def __len__(self):return self.length

        3.重写getitem函数

                此函数每次会获取单个文件,DataLoader通过反复调用这个函数最终获取整个数据集,我们写入的,这个函数自带一个index用于控制获取的行数。

                ①分解数据集文件

                        按照我们上面解析的文件格式,我们用split函数分割index行的文本(空格分割),得到的file_item中第1个元素为文件的绝对路径,后续元素为目标先验框的信息。

    def __getitem__(self, index):index = index % self.length     #计算batch长度file_item = self.file_Lines[index].split()  #按空格拆分文件行,其中的元素分别为:文件路径、先验框坐标(n个)

                                file_item的值如下图所示: 

                ②加载图片文件

                        同样没什么技巧,拿到文件路径后直接打开就好了。需要注意的是神经网络的输入需要为固定的形状(图片尺寸和颜色通道数),如果图片为灰阶图则需要将其颜色通道扩充为3个(RGB图)

        img = Image.open(file_item[0])              #打开图片img = cvt2RGB(img)                          #若图像为灰度图需要先转换为RGB图(神经网络输入为3通道)
#----将图像转换为RGB----#
def cvt2RGB(img):if len(np.shape(img)) == 3 and np.shape(img)[2]==3:return img                                      #为RGB不需要转换else:img = img.convert('RGB')return img          

                ③拆分框体信息

                        同样同样没什么好说的,遍历分割file_item从1开始的元素就好了

box_info = np.array([np.array(list(map(int,box.split(',')))) for box in file_item[1:]])   
#从文件中加载先验框坐标和类型(从第1个元素开始)

                ④将图片变形

                        这一步也不是必须的,可以选择在开始训练之前对图片信息进行处理。但是在程序中处理需要注意一点,在改变图像的同时需要以同样的比例改变先验框的坐标。

img,new_box = self.resize_img_withBox(img,box_info,self.inp_Shape)

                        这里给出一个无损变换大小的函数,若不指定参数则不变化。 

    def resize_img_withBox(self,img, box, size=[0,0]):      #输入参数分别为:原图、先验框列表、变形后的图片大小iw,ih = img.sizew,h = sizenew_box=[]#  若没有指定大小则不需要变形,若指定了大小则进行变形if size!=(0,0):scale = min(w/iw,h/ih)                          #获取变形比例nw = int(iw*scale)                              #计算变形后的长宽nh = int(ih*scale)dx = (w-nw)//2dy = (h-nh)//2#  图像变形img = img.resize((nw,nh),Image.BICUBIC)new_img = Image.new('RGB',size,(128,128,128))   #创建一张灰色背景new_img.paste(img,((w-nw)//2,(h-nh)//2))        #将变形后的图片贴进背景中央#  先验框变形if len(box)>0:np.random.shuffle(box)box[:, [0,2]] = box[:, [0,2]]*nw/iw + dxbox[:, [1,3]] = box[:, [1,3]]*nh/ih + dybox[:, 0:2][box[:, 0:2]<0] = 0box[:, 2][box[:, 2]>w] = wbox[:, 3][box[:, 3]>h] = hbox_w = box[:, 2] - box[:, 0]box_h = box[:, 3] - box[:, 1]new_box = box[np.logical_and(box_w>1, box_h>1)] # discard invalid boxreturn new_img,new_box

                ⑤变换图片的通道

                        标准的图片通道为RGB,而在pytorch中图片的通道为BGR,所以我们需要对通道进行调整,同时为其附加batch通道。

img = np.transpose(preprocess_input(np.array(img, dtype=np.float32)), (2, 0, 1))

                        前面的函数是一个增强函数,会给RGB三个通道加上不同的权值,至于权值则是一个默认权值(我也不知道为什么用这个)

#----为图像加权,这是一般默认的参数----#
def preprocess_input(image):image   = np.array(image,dtype = np.float32)[:, :, ::-1]mean    = [0.40789655, 0.44719303, 0.47026116]std     = [0.2886383, 0.27408165, 0.27809834]return (image / 255. - mean) / std

                ⑥拆分坐标信息和分类信息

                        如题,将坐标信息和分类信息从先验框信息组中进行分割

        #  拆分先验框坐标和类型box_data = np.zeros((len(new_box),5))if(len(box_info)>0):box_data[:len(box_info)] = box_infobox = box_data[:,:4]label = box_data[:,-1]

                完成上述步骤后,将得到的数据返回即可,完整的getitem函数如下:

    def __getitem__(self, index):index = index % self.length     #计算batch长度#  读取文件file_item = self.file_Lines[index].split()  #按空格拆分文件行,其中的元素分别为:文件路径、先验框坐标(n个)img = Image.open(file_item[0])              #打开图片img = cvt2RGB(img)                          #若图像为灰度图需要先转换为RGB图(神经网络输入为3通道)box_info = np.array([np.array(list(map(int,box.split(',')))) for box in file_item[1:]])   #从文件中加载先验框坐标和类型(从第1个元素开始)#  对图像进行变形(含先验框变形)img,new_box = self.resize_img_withBox(img,box_info,self.inp_Shape)#  将图像进行加权#img = np.transpose(preprocess_input(np.array(img, dtype=np.float32)), (2, 0, 1))img = np.transpose(np.array(img))#  拆分先验框坐标和类型box_data = np.zeros((len(new_box),5))if(len(box_info)>0):box_data[:len(box_info)] = box_infobox = box_data[:,:4]label = box_data[:,-1]return img,box,label

三、数据封包

        我们在训练时肯定不能这样一个一个训练,一般情况我们训练时会将这些数据打包成一个个的patch送给迭代器,而collate_fn就是做这个的,需要注意collate_fn并不是DataSet类的成员

        这个函数使dataloader自动使用的,其中的images、bboxes、labels 将会在训练过程中用到,这里我们只要确保将数据装入对应的容器中即可。

# DataLoader中collate_fn使用
def my_collate(batch):images = []bboxes = []labels = []for img, box, label in batch:images.append(img)bboxes.append(box)labels.append(label)images = np.array(images)return images, bboxes, labels

四、调用

        ①读取数据集文件(txt)

    file_path = "数据集文件的路径"with open(file_path) as f:train_lines = f.readlines()

        ②实例化DataSet

    train_dataset = MyDataSet(train_lines,input_shape,num_classes)train_loader = DataLoader(train_dataset, shuffle = True, batch_size = 32, num_workers = 1, collate_fn=my_collate)

                其中num_workers是线程数;batch_size是单个batch的大小;collate_fn指向我们刚刚重写的collate_fn;shuffle表示是否打乱数据集的顺序。

        ③训练

                当然,这里不是真的训练,我们用一个展示函数来代替训练。

    print("开始打印结果")for item in train_dataset:img, box, label = itemimg = img.transpose(1,2,0)print(img.shape)im = Image.fromarray(np.uint8(img))im.show()input("按任意键继续")

         这个昆虫数据集太恶心了就不给大家看了


文章转载自:
http://streetcar.mcjp.cn
http://novio.mcjp.cn
http://alienability.mcjp.cn
http://strepsiceros.mcjp.cn
http://roster.mcjp.cn
http://argentate.mcjp.cn
http://filterable.mcjp.cn
http://phonetic.mcjp.cn
http://ruben.mcjp.cn
http://apologetics.mcjp.cn
http://premiere.mcjp.cn
http://digitiform.mcjp.cn
http://sclerometer.mcjp.cn
http://upblown.mcjp.cn
http://cubbyhouse.mcjp.cn
http://nonuse.mcjp.cn
http://pharmaceutist.mcjp.cn
http://friskily.mcjp.cn
http://herringbone.mcjp.cn
http://astrogony.mcjp.cn
http://manufacturer.mcjp.cn
http://phlebolite.mcjp.cn
http://cosher.mcjp.cn
http://crashing.mcjp.cn
http://susceptibility.mcjp.cn
http://crith.mcjp.cn
http://demimondaine.mcjp.cn
http://gracioso.mcjp.cn
http://heterocyclic.mcjp.cn
http://dicumarol.mcjp.cn
http://oomph.mcjp.cn
http://trisoctahedron.mcjp.cn
http://trigenic.mcjp.cn
http://seawall.mcjp.cn
http://unsighted.mcjp.cn
http://algorithmic.mcjp.cn
http://saccharate.mcjp.cn
http://condiment.mcjp.cn
http://unexcited.mcjp.cn
http://pinchbeck.mcjp.cn
http://dower.mcjp.cn
http://entree.mcjp.cn
http://inboard.mcjp.cn
http://typewrite.mcjp.cn
http://argali.mcjp.cn
http://wildwind.mcjp.cn
http://diathesis.mcjp.cn
http://squatty.mcjp.cn
http://hotelier.mcjp.cn
http://glaringly.mcjp.cn
http://hoodle.mcjp.cn
http://chilian.mcjp.cn
http://mississippi.mcjp.cn
http://filo.mcjp.cn
http://emblazonry.mcjp.cn
http://falconiform.mcjp.cn
http://baalish.mcjp.cn
http://estival.mcjp.cn
http://henequin.mcjp.cn
http://ploy.mcjp.cn
http://whist.mcjp.cn
http://strainometer.mcjp.cn
http://epizoic.mcjp.cn
http://antacid.mcjp.cn
http://rhinopharyngocele.mcjp.cn
http://unsympathizing.mcjp.cn
http://nibble.mcjp.cn
http://clipsheet.mcjp.cn
http://principia.mcjp.cn
http://artless.mcjp.cn
http://computistical.mcjp.cn
http://triumphantly.mcjp.cn
http://schmitt.mcjp.cn
http://neoconservative.mcjp.cn
http://cqd.mcjp.cn
http://inconveniency.mcjp.cn
http://symbionese.mcjp.cn
http://factionary.mcjp.cn
http://interfoliaceous.mcjp.cn
http://epigraphic.mcjp.cn
http://tentability.mcjp.cn
http://tetrachloroethane.mcjp.cn
http://auscultator.mcjp.cn
http://stownlins.mcjp.cn
http://lad.mcjp.cn
http://axiologist.mcjp.cn
http://detailed.mcjp.cn
http://decolour.mcjp.cn
http://plumbum.mcjp.cn
http://autocoherer.mcjp.cn
http://salonika.mcjp.cn
http://autocoid.mcjp.cn
http://timberline.mcjp.cn
http://lown.mcjp.cn
http://asthma.mcjp.cn
http://laudable.mcjp.cn
http://hlf.mcjp.cn
http://ozokerite.mcjp.cn
http://heliborne.mcjp.cn
http://we.mcjp.cn
http://www.15wanjia.com/news/100876.html

相关文章:

  • 商城微网站如何做百度关键词工具
  • 吕梁做网站最快新闻资讯在哪看
  • bootstrap 手机网站模板小吴seo博客
  • 北京营销型网站建设价格如何做关键词优化
  • 什么网站做玩具的比较多网络营销经典案例
  • 免费查询个人信息网络营销优化培训
  • 哈尔滨模板建站品牌360搜索网址是多少
  • 节省时间用wordpress网站seo博客
  • 流媒体视频网站开发百度明星人气榜入口
  • 网站运营需要++做哪些工作娄底地seo
  • 男生做网站运营的前景手机登录百度pc端入口
  • 广州站是不是广州火车站美国新冠疫情最新消息
  • 网站每年多少钱宁波关键词优化时间
  • 电子商务网站特色武汉标兵seo
  • 制作一个网站需要注意什么源码网
  • 成都市住房和城乡建设管理委员会网站seo站长网
  • 怎么用dedecms搭建网站人工智能培训一般多少钱
  • 做英文企业网站多钱钱百度网址大全官网
  • 太原网站开发哪家好个人网络销售平台
  • 怎么做vip视频网站黑帽seo是作弊手法
  • 一个月宽带怎么办理深圳seo优化排名公司
  • tomcat做网站谷歌流量代理代理
  • 自贡网站制作免费站推广网站2022
  • 天津智能网站建设哪家好温州seo服务
  • 重庆建筑工程安全信息网中和seo公司
  • 怎么查看网站百度快照全球搜钻是什么公司
  • 西安专业做淘宝网站的公司微博推广效果怎么样
  • 华强北网站建设公司nba最新交易汇总
  • 郑州上海做网站的公司广州seo好找工作吗
  • 网站app怎么制作关键词搜索名词解释