yolov模型数据集介绍,以及将数据集转.npy格式,可用于自建数据集,用yolov训练自己的数据集

ILSVRC2015_VID数据集说明_咸咸咸虾的博客-CSDN博客_ilsvrc2015

由于我下载的数据集中Data与Annotations中的数据不对等,也就是说数据集中的数据标签缺失,如data的train中有ILSVRC2015_train_00001006这个数据,而Annotations的train中没有ILSVRC2015_train_00001006这个xml标签,这就需要对官网提供的train_seg.npy和val_seg.npy重新构造。

本代码也可以用来构造自己的数据集形成.npy文件放入yolov模型中训练,但自建数据集应与ILSVRC2015数据集结构相同。

 先读取.npy文件看一下它里面的结构,他其实就是一个个list,每一个lis代表一个视频文件,里面是一张张图片也就是帧。

import numpy as np

file = np.load(r'D:\Aware_model\YOLOV-master\data\val_seq.npy',allow_pickle=True)
print(file)
np.savetxt(r'D:\Aware_model\YOLOV-master\data\val_seq.txt',file,delimiter=',' ,fmt = '%s')

 知道.npy文件里面是什么格式后我们就可以根据现有数据构建自己的数据集配置文件也就是.npy文件。先看Annotations文件中那些视频有标注文件,形成视频文件名list;然后计算data中的视频文件名,判断data的文件名Annotations是否在,存在的话就说明他有标注。

import os
import numpy as np


# 获取标签判断数据是否存在,有的data存在,可是没有标签
list_train=[]
list_val=[]
path1 = r"D:\Aware_model\ILSVRC2015\Annotations\VID\train\ILSVRC2015_VID_train_0000"
path2 = r"D:\Aware_model\ILSVRC2015\Annotations\VID\train\ILSVRC2015_VID_train_0001"
path3 = r"D:\Aware_model\ILSVRC2015\Annotations\VID\train\ILSVRC2015_VID_train_0002"
path4 = r"D:\Aware_model\ILSVRC2015\Annotations\VID\train\ILSVRC2015_VID_train_0003"
path_val = r'D:\Aware_model\ILSVRC2015\Annotations\VID\val'
f1 = os.listdir(path1)  # 获取ILSVRC2015_VID_train_0000下所有文件夹的名字
f2 = os.listdir(path2)
f3 = os.listdir(path3)
f4 = os.listdir(path4)
f_val = os.listdir(path_val)
list_train.append(f1)
list_train.append(f2)
list_train.append(f3)
list_train.append(f4)
list_val.append(f_val)


list_train = [item for list in list_train for item in list]   #所有train文件下的文件名trian ['ILSVRC2015_train_00084001', 'ILSVRC2015_train_00085000', 'ILSVRC2015_train_00085001',。。。】
list_val = [item for list in list_val for item in list]
print('trian',list_train)
print('val',list_val)




# def list_txt(path, list=None):
#     '''
#
#     :param path: 储存list的位置
#     :param list: list数据
#     :return: None/relist 当仅有path参数输入时为读取模式将txt读取为list
#     当path参数和list都有输入时为保存模式将list保存为txt
#     '''
#     if list != None:
#         file = open(path, 'a')
#         file.write(str(list))
#         file.close()
#         return None
#     else:
#         file = open(path, 'r')
#         rdlist = eval(file.read())
#         file.close()
#         return rdlist

#获取文件数据的路径形成npy文件
def get_path(id,path,sava_path):
    paths2=[]
    if id=='val': #path:'D:\Aware_model\ILSVRC2015\Data\VID\val'
        for dirname, _, filenames in os.walk(path):  # dirname:D:\Aware_model\ILSVRC2015\Data\VID\val\ILSVRC2015_val_00000000
            # print(dirname," ......" ,filenames)      # filenames:['000000.JPEG', '000001.JPEG', '000002.JPEG', '000003.JPEG', '000004.JPEG'...]
            name = dirname.split('\\')[-1]           #ILSVRC2015_val_00000000
            # print(name)
            # 由于我下载的文件中JPG与xml不对应 比如图像的train中有ILSVRC2015_train_00084001 而xml的train的文件中没有
            # 也就是数据与标签不对应,因此将标签作为一个list判断数据在不在标签的list中
            if name in list_val:  #如果在的话
                # print(name)
                paths = []
                for filename in filenames:
                    paths.append(os.path.join(dirname, filename).replace('\\','/').replace('D:/Aware_model/',''))  #图像的路径
                # print(paths)
                if len(paths) >0:
                    paths2.append(paths)
            np.save(sava_path, paths2, allow_pickle=True, fix_imports=True)
    else:
        for dirname, _, filenames in os.walk(path):
            name = dirname.split('\\')[-1]
            # print(name,list_train)
            if name in list_train:
                print(name)
                paths = []
                for filename in filenames:
                    paths.append(os.path.join(dirname, filename).replace('\\', '/').replace('D:/Aware_model/', ''))
                # print(paths)
                if len(paths) > 0:
                    paths2.append(paths)
            np.save(sava_path, paths2, allow_pickle=True, fix_imports=True)


get_path('val',r'D:\Aware_model\ILSVRC2015\Data\VID\val',r'D:\Aware_model\YOLOV-master\data\val_seq.npy')
get_path('train',r'D:\Aware_model\ILSVRC2015\Data\VID\train',r'D:\Aware_model\YOLOV-master\data\train_seq.npy')

我在给大家简单介绍一下yolov怎么读取.npy文件的。以vid_train文件中的读取val_seg.npy为例,点击他会跳到vid.py文件中,主要的操作就是按照每一个视频读取,然后batch为一个长度,在每一个视频中截取,比如第一个视频有300个图片,按照10个一组,就是30x10,然后在所有视频组合在一起,比如有视频1000个,那就有30000x10组,然后对其打乱,你在选取前200个作为测试集。

 

 def photo_to_sequence(self,dataset_path,lframe,gframe):
        '''

        Args:
            dataset_path: list,every element is a list contain all frames in a video dir
        Returns:
            split result
        '''
        res = []

        dataset = np.load(dataset_path,allow_pickle=True).tolist()
        for element in dataset:
            # id=element[0].split('/')[-2].split('_')[-1]
            ele_len = len(element)
            if ele_len < lframe + gframe :
                # TODO fix the unsolved part
                continue
                #TODO fix the unsolved part

            else:
                # else:
                if self.mode == 'random':  # 打乱图片按帧的长度获取
                    split_num = int(ele_len / (gframe))
                    random.shuffle(element)
                    for i in range(split_num):
                        res.append(element[i * gframe:(i + 1) * gframe])
                elif self.mode == 'uniform':
                    split_num = int(ele_len / (gframe))
                    all_uniform_frame = element[:split_num * gframe]
                    for i in range(split_num):
                        res.append(all_uniform_frame[i::split_num])
                elif self.mode == 'gl':
                    split_num = int(ele_len / (lframe))
                    all_local_frame = element[:split_num * lframe]
                    for i in range(split_num):
                        g_frame = random.sample(element[:i * lframe] + element[(i + 1) * lframe:], gframe)
                        res.append(all_local_frame[i * lframe:(i + 1) * lframe] + g_frame)
                else:
                    print('unsupport mode, exit')
                    exit(0)

        # test = []
        # for ele in res:
        #     test.extend(ele)
        # random.shuffle(test)
        # i = 0
        # for ele in res:
        #     for j in range(gframe):
        #         ele[j] = test[i]
        #         i += 1

        if self.val:
            random.seed(42)
            random.shuffle(res)
            if self.tnum == -1:
                return res
            else:
                return res[:200]#[1000:1250]#[2852:2865]   :self.tnums
        else:
            random.shuffle(res)
            return res[:3000]    #15000

最后介绍一下,他怎么将图片和xml文件对应的,简单来说,比如你图片的路径为ILSVRC2015/Data/VID/val/ILSVRC2015_val_00000000/000000.JPEG,他会将Data、JPEG、改成Annotations和xml这样就是对应的标签了。代码也是在vid.py中,他的跳转是运行vid_train.py文件中的self.prefetcher = DataPrefetcher(self.train_loader) #迭代器 获取picture对应的label   这个时会获取图片的label。

    def get_annotation(self,path,test_size):
        path = path.replace("Data","Annotations").replace("JPEG","xml")
        if os.path.isdir(path):  # 判断某一路径是否为目录
            files = get_xml_list(path)

        else:
            files = [path]
        files.sort()
        anno_res = []
        for xmls in files:
            # if os.path.exists(path) is False:
            #     continue
            photoname = xmls.replace("Annotations","Data").replace("xml","JPEG")
            file = minidom.parse(xmls)
            root = file.documentElement
            objs = root.getElementsByTagName("object")
            width = int(root.getElementsByTagName('width')[0].firstChild.data)
            height = int(root.getElementsByTagName('height')[0].firstChild.data)
            tempnode = []
            for obj in objs:
                nameNode = obj.getElementsByTagName("name")[0].firstChild.data
                xmax = int(obj.getElementsByTagName("xmax")[0].firstChild.data)
                xmin = int(obj.getElementsByTagName("xmin")[0].firstChild.data)
                ymax = int(obj.getElementsByTagName("ymax")[0].firstChild.data)
                ymin = int(obj.getElementsByTagName("ymin")[0].firstChild.data)
                x1 = np.max((0,xmin))
                y1 = np.max((0,ymin))
                x2 = np.min((width,xmax))
                y2 = np.min((height,ymax))
                if x2 >= x1 and y2 >= y1:
                    #tempnode.append((name_num[nameNode],x1,y1,x2,y2,))
                    tempnode.append(( x1, y1, x2, y2,name_num[nameNode],))
            num_objs = len(tempnode)
            res = np.zeros((num_objs, 5))
            r = min(test_size[0] / height, test_size[1] / width)
            for ix, obj in enumerate(tempnode):
                res[ix, 0:5] = obj[0:5]
            res[:, :-1] *= r
            anno_res.append(res)
        return anno_res


    def pull_item(self,path):
        """
                One image / label pair for the given index is picked up and pre-processed.

                Args:
                    index (int): data index

                Returns:
                    img (numpy.ndarray): pre-processed image
                    padded_labels (torch.Tensor): pre-processed label data.
                        The shape is :math:`[max_labels, 5]`.
                        each label consists of [class, xc, yc, w, h]:
                            class (float): class index.
                            xc, yc (float) : center of bbox whose values range from 0 to 1.
                            w, h (float) : size of bbox whose values range from 0 to 1.
                    info_img : tuple of h, w.
                        h, w (int): original shape of the image
                    img_id (int): same as the input index. Used for evaluation.
                """
        path = os.path.join(self.dataset_pth,path)
        annos = self.get_annotation(path, self.img_size)[0]  # 获取图像的标签 (左上角 右下角 类别)  1x5

        img = cv2.imread(path)
        height, width = img.shape[:2]
        img_info = (height, width)
        r = min(self.img_size[0] / img.shape[0], self.img_size[1] / img.shape[1])
        img = cv2.resize(      # 图像大小调整
            img,
            (int(img.shape[1] * r), int(img.shape[0] * r)),
            interpolation=cv2.INTER_LINEAR,
        ).astype(np.uint8)
        return img, annos, img_info, path

    def __getitem__(self, path):

        img, target, img_info, path = self.pull_item(path)
        if self.preproc is not None:
            img, target = self.preproc(img, target, self.input_dim)   #变成中心点长宽
        return img, target, img_info,path

yolov注意力机制代码部分的讲解:

YOLOV :基于YOLOX,使静态图像对象检测器在视频对象检测方面表现出色,注意力机制的魅力_一勺汤的博客-CSDN博客

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 你可以使用 python 的 scipy 库来载入 .mat 格式数据集,然后使用 numpy 库的 save() 函数将数据保存为 .npy 格式。 例如,你可以使用以下代码将 .mat 格式数据集换为 .npy 格式: ``` import scipy.io import numpy as np # 载入 .mat 格式数据集 mat_data = scipy.io.loadmat('data.mat') # 将数据换为 numpy 数组 data = mat_data['data'] # 保存为 .npy 格式 np.save('data.npy', data) ``` 在这里,我们假设你的 .mat 格式数据集有一个叫做 'data' 的数据变量。你也可以使用其他的变量名称,只需要将它替换为你的变量名称即可。 ### 回答2: 在Python,将.mat格式的高光谱图像数据集换为.npy格式,可以使用SciPy库的io模块来处理。 首先,导入必要的库: ```python import scipy.io as sio import numpy as np ``` 接下来,加载.mat文件: ```python data = sio.loadmat('input.mat') ``` 加载后,数据将以字典的形式存储在变量`data`。可以通过键值对的方式获取数据。假设高光谱图像数据存储在键名为`image_data`的键值: ```python image_data = data['image_data'] ``` 然后,将数据换为numpy数组,并保存为.npy文件: ```python np.save('output.npy', image_data) ``` 此时,数据已经以.npy格式保存在了名为`output.npy`的文件。 完整的代码如下: ```python import scipy.io as sio import numpy as np data = sio.loadmat('input.mat') image_data = data['image_data'] np.save('output.npy', image_data) ``` 运行以上代码,就可以将.mat格式的高光谱图像数据集换为.npy格式。 ### 回答3: 要将.mat格式的高光谱图像数据集换为.npy格式,可以使用Python的SciPy库和NumPy库进行换。下面是具体的步骤: 1. 导入所需的库: ``` import numpy as np from scipy.io import loadmat ``` 2. 使用`loadmat`函数加载.mat文件,并将数据保存为一个Python字典: ``` data = loadmat('input_data.mat') ``` 3. 获取需要换的高光谱图像数据集,通常在字典有一个或多个键对应于数据集的不同字段。根据你的数据集命名来获取对应的字段数据。例如,假设高光谱图像数据集在字段‘image_data’,可以使用以下代码获取该字段数据: ``` image_data = data['image_data'] ``` 4. 将获取到的高光谱图像数据集换为NumPy数组: ``` image_data_array = np.array(image_data) ``` 5. 最后,使用NumPy库的`save`函数将NumPy数组保存为.npy文件: ``` np.save('output_data.npy', image_data_array) ``` 完成以上步骤后,你将得到一个.npy格式的高光谱图像数据集文件,该文件包含了.mat文件的数据。可以根据需要修改文件名和路径以适应你的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值