精华内容
下载资源
问答
  • 以我下面讲解的数据集为例子,我是在网上找的关于的苹果的病虫害,我简单的了三个分类,分别是Alternaria_Boltch(斑点落叶病)、Grey_spot(灰斑病)、Rust( 锈病)。我的文件结构如下: 每个文件下放着我的...

    第一步、制作自己的数据集

    第一步是制作自己的数据集(照片),可以是网络找的,也可以是自己拍的,甚至可以是自己p的。
    以我下面讲解的数据集为例子,我是在网上找的关于的苹果的病虫害,我简单的做了三个分类,分别是Alternaria_Boltch(斑点落叶病)、Grey_spot(灰斑病)、Rust( 锈病)。我的文件结构如下:
    在这里插入图片描述
    每个文件下放着我的数据集照片:

    在这里插入图片描述

    就不一一展示了,反正就是有几个类就创几个文件夹,再把各个类别的照片放进对应的文件夹中,这样我们的数据集就初步制作完毕了。

    第二步、为自己的数据集打标签

    这一步是很重要的一步。现在市面上常用的打标签工具有labelme和labelimg两种,我这里就以labelimg为例,介绍一下打标签的过程。

    首先,如果没装过labelimg的朋友需要先装一下labelimg插件。步骤是先打开Anaconda Prompt(直接用cmd也行),选择一下把插件装在哪个环境:

    指令:activate 环境名

    在这里插入图片描述
    也可以自己用Anaconda自己创一个环境,具体创环境步骤我就不写了,网上好多教程,可以学下。
    然后就安装labelimg插件:

    指令:pip install labelimg

    在这里插入图片描述

    这里显示我装过了,反正输入指令一般是可以装成功的。
    再打开labelimg

    指令:labelimg

    在这里插入图片描述
    之后系统就会打开labelimg插件,插件GUI界面如下:
    在这里插入图片描述

    注意:打开labelimg的时候,你的Anaconda Prompt/cmd不能叉掉,必须同时运行

    再下面点击 Open Dir 打开自己的数据集某个类别的文件夹
    在这里插入图片描述
    如图我选择打开我的第一个分类Alternaria_Boltch,显示:
    在这里插入图片描述

    1. 右下角的File List是该目录下的所有图片,可以直接在这里选择对应的图片;
    2. 右上角的可以自己设置默认的标签,并勾选Use default label一般我们打开某个文件夹(某种种类),就可以把默认标签设为该文件名;还可以点击左侧的 Next Image 和 Prev Image 选择图片;
    3. 左侧的Pascal VOC那里可以选择自己的打便签的类型(有VOC(xml)、YOLO(txt)等)我这里选择的是VOC的格式(以后可能我会直接用YOLO的格式,应该会更简便);
    4. 一般来说我们不用Change Save Dir,因为把生成 xml 文件和图片文件放在一起我们可以随时观看我们每张图片的打标签的状态,如果觉得哪张照片便签没打好,也可以随时重新打;
    5. 如果目标太小,点击 ctrl and 鼠标滑动选择相应的图片尺度,放大图片或缩小图片,方便我们打标签;
    6. 点击Create RectBox我们就可以开始打标签了,如下图,点击后鼠标左键拖拽,开始打标签。
      在这里插入图片描述
    7. 打完这张图的标签如下图,点击打好的标签(框框处)可以观看标签的状态,右侧列表显示当前框框的label,写错label也可以点击右上方的 Edit Label 进行修改。
    8. 打完这张图片,点击 ctrl and =,将图片回复为原来的大小,再点击 ctrl and s 保存当前图片的标签文件(xml名不需要改变,默认就好,图片名.xml)
      在这里插入图片描述
      依次打完当前类别文件下的所有图片,再点击Open Dir切换到下个类别继续进行

    注意:在切换到下一个类别的时候,别忘了把右上角的默认标签也改成相应的标签名,不然就会发现白打了…

    OK,打标签的步骤就说到这里,做到这里你应该把你的所有类别文件下的所有图片都打好了标签,并在同一个文件下生成了所有图片对应的xml标签文件,如下图:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    以上是我打的三个类别(文件)下的所有图片和他们一一对应的标签(xml)。

    第三步、制作VOC格式的数据集

    我们应该都很熟悉voc的文件格式的,VOC的目录格式如下:

    -VOC

    • Annotations
    • Images
    • ImagesSet

    现在我们将自己的数据集制作成VOC的格式。

    3.1、生成classes.json文件

    把自己的种类排一个序(想怎么排怎么排),写成如下字典的格式:
    在这里插入图片描述

    3.2、生成Annotations和Images

    这里我写了一个移动文件的脚本,就是原本xml和image混在一起放在各个类别文件下的,现在我将他们全部区分开,将所有的xml放入Annotations文件中,将所有的图片放入Images文件中。需要使用的话只需注意检测代码中的全局地址变量要改成你电脑的地址就可以执行了。

    move_image_xml.py

    """
    这个脚本是将打完标签的图片和xml文件以voc的格式存储起来 运行结果最终生成Annotations和Images两个文件
    """
    import os
    import shutil
    import json
    
    
    # --------------------------全局地址变量--------------------------------#
    xml_save_root = "F:\yolov3-my\data\ApplePest\Annotations"   # Annotations的地址
    images_save_root = "F:\yolov3-my\data\ApplePest\Images"     # Images的地址
    
    class_path = "F:\yolov3-my\data\\apple_pest_classes.json"   # classes.json文件的地址
    data_path = "F:\dataset"                                    # 你打标签的源地址 它的子目录就是你的所有类别文件(存放xml和jpg)
    assert os.path.exists(class_path), "class_path not exist!"
    assert os.path.exists(data_path), "data_path not exist!"
    
    if not os.path.exists(xml_save_root):
        os.makedirs(xml_save_root)
    if not os.path.exists(images_save_root):
        os.makedirs(images_save_root)
    # --------------------------全局变量--------------------------------#
    
    
    
    def move_image_xml(cla_path, xml_root, images_root, data_path):
        class_path = cla_path
        with open(class_path) as f:  # 读取label/json文件
            json_list = json.load(f)
        labels = list(json_list.keys())
    
        for i in range(len(labels)):
            open_root = os.path.join(data_path, labels[i])
            xml_save_root = xml_root
            images_save_root = images_root
            for file_full_name in os.listdir(open_root):
                file_name, file_type = os.path.splitext(file_full_name)[0], os.path.splitext(file_full_name)[1]
                if file_type == '.xml':
                    open_path = os.path.join(open_root, file_full_name)
                    save_path = os.path.join(xml_save_root, file_full_name)
                    shutil.move(open_path, save_path)
                if file_type == '.jpg':
                    open_path = os.path.join(open_root, file_full_name)
                    save_path = os.path.join(images_save_root, file_full_name)
                    shutil.move(open_path, save_path)
    
    if __name__ == '__main__':
        move_image_xml(class_path, xml_save_root, images_save_root, data_path)
    

    执行完,所有类别文件对应的文件清空:
    在这里插入图片描述
    在指定xml_save_root 、images_save_root 位置生成了两个文件,分别是Annotations(存放所有种类的xml)和Images(存放所有种类的图片):
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.3、生成ImagesSet

    生成ImagesSet的过程其实就是划分训练集和验证集(可能还要测试集)的过程。

    下面是我写的一个脚本,可以从Annotations中随机划分训练集和测试集,最终生成ImagesSet/train.txt和val.txt。

    split_train_val.py

    """这个脚本从Annotations中随机划分训练集和测试集,最终生成ImagesSet/train.txt和val.txt"""
    import os
    import random
    from os.path import *
    
    
    # --------------------------全局地址变量--------------------------------#
    dir_path = dirname(dirname(abspath(__file__)))
    xml_path = os.path.join(dir_path, "ApplePest", "Annotations")
    assert os.path.exists(xml_path), "xml_path not exist!"
    
    ImageSets_path = os.path.join(dir_path, "ApplePest", "ImageSets")
    
    if not os.path.exists(ImageSets_path):
        os.makedirs(ImageSets_path)
    
    traintxt_path = os.path.join(dir_path, "ApplePest", "ImageSets", "train.txt")
    valtxt_path = os.path.join(dir_path, "ApplePest", "ImageSets", "val.txt")
    
    if os.path.exists(traintxt_path):
        os.remove(traintxt_path)
    if os.path.exists(valtxt_path):
        os.remove(valtxt_path)
    # --------------------------全局地址变量--------------------------------#
    
    
    
    def create_imagesets(xml_full_path, traintxt_full_path, valtxt_full_path):
        train_percent = 0.8  # 需要改变比例就改这里
        val_percent = 0.2
        # test_percent = 0.1  
        xml_path = xml_full_path
        total_xml = os.listdir(xml_path)
    
        num = len(total_xml)
        lists = list(range(num))
    
        num_train = int(num * train_percent)
    
        train_list = random.sample(lists, num_train)
        for i in train_list:
            lists.remove(i)
        val_list = lists
    
        ftrain = open(traintxt_full_path, 'w')
        fval = open(valtxt_full_path, 'w')
    
        for i in range(num):
            name = total_xml[i][:-4] + '\n'
            if i in train_list:
                ftrain.write(name)
            else:
                fval.write(name)
    
        ftrain.close()
        fval.close()
    
    
    
    if __name__ == '__main__':
        create_imagesets(xml_path, traintxt_path, valtxt_path)
    

    效果如下:
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    第四步、将VOC格式转为YOLO格式

    voc2yolo.py

    """
    本脚本有两个功能:
    1.根据train.txt和val.txt将voc数据集标注信息(.xml)转为yolo标注格式(.txt),生成dataset文件(train+val)
    2.根据json标签文件,生成对应names标签(my_data_label.names)
    """
    import os
    from tqdm import tqdm
    from lxml import etree
    import json
    import shutil
    from os.path import *
    
    # --------------------------全局地址变量--------------------------------#
    # 拼接出voc的images目录,xml目录,txt目录
    dir_path = dirname(dirname(abspath(__file__)))
    images_path = os.path.join(dir_path, "ApplePest", "images")
    xml_path = os.path.join(dir_path, "ApplePest", "Annotations")
    train_txt_path = os.path.join(dir_path, "ApplePest", "ImageSets", "train.txt")
    val_txt_path = os.path.join(dir_path, "ApplePest", "ImageSets", "val.txt")
    # label标签对应json文件
    label_json_path = os.path.join(dir_path, "apple_pest_classes.json")
    
    save_file_root = os.path.join(dir_path, "dataset")
    
    # 检查文件/文件夹都是否存在
    assert os.path.exists(images_path), "images path not exist..."
    assert os.path.exists(xml_path), "xml path not exist..."
    assert os.path.exists(train_txt_path), "train txt file not exist..."
    assert os.path.exists(val_txt_path), "val txt file not exist..."
    assert os.path.exists(label_json_path), "label_json_path does not exist..."
    
    if os.path.exists(save_file_root) is False:
        os.makedirs(save_file_root)
    # --------------------------全局地址变量--------------------------------#
    
    
    
    
    def parse_xml_to_dict(xml):
        """
        将xml文件解析成字典形式,参考tensorflow的recursive_parse_xml_to_dict
        Args:
            xml: xml tree obtained by parsing XML file contents using lxml.etree
    
        Returns:
            Python dictionary holding XML contents.
        """
    
        if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息
            return {xml.tag: xml.text}
    
        result = {}
        for child in xml:
            child_result = parse_xml_to_dict(child)  # 递归遍历标签信息
            if child.tag != 'object':
                result[child.tag] = child_result[child.tag]
            else:
                if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里
                    result[child.tag] = []
                result[child.tag].append(child_result[child.tag])
        return {xml.tag: result}
    
    
    def translate_info(file_names: list, save_root: str, class_dict: dict, train_val='train'):
        """
        将对应xml文件信息转为yolo中使用的txt文件信息
        :param file_names:
        :param save_root:
        :param class_dict:
        :param train_val:
        :return:
        """
        save_txt_path = os.path.join(save_root, train_val, "labels")
        if os.path.exists(save_txt_path) is False:
            os.makedirs(save_txt_path)
        save_images_path = os.path.join(save_root, train_val, "images")
        if os.path.exists(save_images_path) is False:
            os.makedirs(save_images_path)
    
        for file in tqdm(file_names, desc="translate {} file...".format(train_val)):
            # 检查下图像文件是否存在
            img_path = os.path.join(images_path, file + ".jpg")
            assert os.path.exists(img_path), "file:{} not exist...".format(img_path)
    
            # 检查xml文件是否存在
            xml_full_path = os.path.join(xml_path, file + ".xml")
            assert os.path.exists(xml_full_path), "file:{} not exist...".format(xml_full_path)
    
            # read xml
            with open(xml_full_path) as fid:
                xml_str = fid.read()
            xml = etree.fromstring(xml_str)
            data = parse_xml_to_dict(xml)["annotation"]
            img_height = int(data["size"]["height"])
            img_width = int(data["size"]["width"])
    
            # write object info into txt
            with open(os.path.join(save_txt_path, file + ".txt"), "w") as f:
                assert "object" in data.keys(), "file: '{}' lack of object key.".format(xml_full_path)
                for index, obj in enumerate(data["object"]):
                    # 获取每个object的box信息
                    xmin = float(obj["bndbox"]["xmin"])
                    xmax = float(obj["bndbox"]["xmax"])
                    ymin = float(obj["bndbox"]["ymin"])
                    ymax = float(obj["bndbox"]["ymax"])
                    class_name = obj["name"]
                    class_index = class_dict[class_name] - 1  # 目标id从0开始
    
                    # 将box信息转换到yolo格式
                    xcenter = xmin + (xmax - xmin) / 2
                    ycenter = ymin + (ymax - ymin) / 2
                    w = xmax - xmin
                    h = ymax - ymin
    
                    # 绝对坐标转相对坐标,保存6位小数
                    xcenter = round(xcenter / img_width, 6)
                    ycenter = round(ycenter / img_height, 6)
                    w = round(w / img_width, 6)
                    h = round(h / img_height, 6)
    
                    info = [str(i) for i in [class_index, xcenter, ycenter, w, h]]
    
                    if index == 0:
                        f.write(" ".join(info))
                    else:
                        f.write("\n" + " ".join(info))
    
            # copy image into save_images_path
            shutil.copyfile(img_path, os.path.join(save_images_path, img_path.split(os.sep)[-1]))
    
    
    def create_class_names(class_dict: dict):
        keys = class_dict.keys()
        with open("../dataset_classes.names", "w") as w:
            for index, k in enumerate(keys):
                if index + 1 == len(keys):
                    w.write(k)
                else:
                    w.write(k + "\n")
    
    
    def main():
        # read class_indict
        json_file = open(label_json_path, 'r')
        class_dict = json.load(json_file)
    
        # 读取train.txt中的所有行信息,删除空行
        with open(train_txt_path, "r") as r:
            train_file_names = [i for i in r.read().splitlines() if len(i.strip()) > 0]
        # voc信息转yolo,并将图像文件复制到相应文件夹
        translate_info(train_file_names, save_file_root, class_dict, "train")
    
        # 读取val.txt中的所有行信息,删除空行
        with open(val_txt_path, "r") as r:
            val_file_names = [i for i in r.read().splitlines() if len(i.strip()) > 0]
        # voc信息转yolo,并将图像文件复制到相应文件夹
        translate_info(val_file_names, save_file_root, class_dict, "val")
    
        # 创建my_data_label.names文件
        create_class_names(class_dict)
    
    
    if __name__ == "__main__":
        main()
    
    

    生成yolo格式的数据集dataset,并分train和val存放,分别存储images和labels,存放划分好的训练集的图片和标签,并生成dataset_classes.names文件,效果如下:
    在这里插入图片描述

    第五步、生成一系列其他数据文件

    calculate_dataset.py

    """
    1.统计训练集和验证集的数据并生成相应train_path.txt和val_path.txt文件
    2.创建data.data文件,记录classes个数, train以及val数据集文件(.txt)路径和label.names文件路径
    """
    import os
    from os.path import *
    
    dir_path = dirname(dirname(abspath(__file__)))
    train_annotation_dir = os.path.join(dir_path, "dataset", "train", "labels")
    val_annotation_dir = os.path.join(dir_path, "dataset", "val", "labels")
    classes_label = os.path.join(dir_path, "dataset_classes.names")
    
    assert os.path.exists(train_annotation_dir), "train_annotation_dir not exist!"
    assert os.path.exists(val_annotation_dir), "val_annotation_dir not exist!"
    assert os.path.exists(classes_label), "classes_label not exist!"
    
    # 保存地址
    train_path_txt = os.path.join(dir_path, "train_path.txt")
    val_path_txt = os.path.join(dir_path, "val_path.txt")
    dataset_data = os.path.join(dir_path, "dataset.data")
    
    
    def calculate_data_txt(txt_path, dataset_dir):
        # create my_data.txt file that record image list
        with open(txt_path, "w") as w:
            for file_name in os.listdir(dataset_dir):
                if file_name == "classes.txt":
                    continue
    
                img_path = os.path.join(dataset_dir.replace("labels", "images"),
                                        file_name.split(".")[0]) + ".jpg"
                line = img_path + "\n"
                assert os.path.exists(img_path), "file:{} not exist!".format(img_path)
                w.write(line)
    
    
    def create_dataset_data(create_data_path, label_path, train_path, val_path, classes_info):
        # create my_data.data file that record classes, train, valid and names info.
        # shutil.copyfile(label_path, "./data/my_data_label.names")
        with open(create_data_path, "w") as w:
            w.write("classes={}".format(len(classes_info)) + "\n")  # 记录类别个数
            w.write("train={}".format(train_path) + "\n")           # 记录训练集对应txt文件路径
            w.write("valid={}".format(val_path) + "\n")             # 记录验证集对应txt文件路径
            w.write("names={}".format(classes_label) + "\n")        # 记录label.names文件路径
    
    def main():
        # 统计训练集和验证集的数据并生成相应txt文件
        calculate_data_txt(train_path_txt, train_annotation_dir)
        calculate_data_txt(val_path_txt, val_annotation_dir)
    
        classes_info = [line.strip() for line in open(classes_label, "r").readlines() if len(line.strip()) > 0]
        # dataset.data文件,记录classes个数, train以及val数据集文件(.txt)路径和label.names文件路径
        create_dataset_data(dataset_data, classes_label, train_path_txt, val_path_txt, classes_info)
    
    
    if __name__ == '__main__':
        main()
    
    

    生成train_path.txt(存放训练集所有图片的地址)和val_path.txt(存放验证集所有图片的地址),效果如下:
    在这里插入图片描述
    在这里插入图片描述
    并生成dataset.data(存放数据集的一些有用的信息:类别数量,训练文件train.txt的地址,训练文件val.txt的地址,dataset_classes.names的地址等),效果如下:
    在这里插入图片描述
    到这里我们项目关于数据集的制作与格式处理就全部完成了,数据集的文件目录如下:
    在这里插入图片描述

    展开全文
  • 第一篇文章提取了label,后面实验发现还是不够用,这里用10:1的比例划分训练集验证集,可以基本保证发生类别平衡的情况。原图片结构依然同第一篇: ./256_ObjectCategories/001.ak47/001_0001.jpg … … ./...

    Caltech-256数据集在PyTorch中的处理:
    Caltech-256 数据集处理(一) label提取
    Caltech-256 数据集处理(二) 训练集和测试集的制作
    Caltech-256 数据集处理(三) 训练集和验证集载入Dateloader

    第一篇文章提取了label,后面做实验发现还是不够用,这里用10:1的比例划分训练集和验证集,可以基本保证不发生类别不平衡的情况。原图片结构依然同第一篇:
    ./256_ObjectCategories/001.ak47/001_0001.jpg
    … …
    ./256_ObjectCategories/257.clutter/257_0827.jpg

    import os
    
    datasetpath="/media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories"
    
    dirs=os.listdir(datasetpath)
    dirs.sort()
    with open(r'label.txt','w',encoding='utf-8') as f:
        for i in dirs:
            f.write(i)
            f.write('\n')
    
    #print(dirs)
    it=0
    Matrix = [[] for x in range(257)]                # all filenames under DATA_PATH
    for d in dirs:
        for _, _, filename in os.walk(os.path.join(datasetpath,d)):
            for i in filename:
                Matrix[it].append(os.path.join(os.path.join(datasetpath,d),i))  # filename is a list of pic files under the fold
        it = it + 1
    
    #print(Matrix)
    with open(r'dataset-val.txt','w',encoding='utf-8') as f:
        for i in range(len(Matrix)):
            for j in range(10):
                f.write(os.path.join(datasetpath,Matrix[i][j]))
                f.write(' ')
                f.write(str(i))
                f.write('\n')
    with open(r'dataset-trn.txt','w',encoding='utf-8') as f:
        for i in range(len(Matrix)):
            for j in range(10,len(Matrix[i])):
                f.write(os.path.join(datasetpath,Matrix[i][j]))
                f.write(' ')
                f.write(str(i))
                f.write('\n')
    

    生成的带标签的训练集和验证集部分如下:
    dataset-trn.txt

    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0010.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0040.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0091.jpg 0
    ... ...
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0056.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0030.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0011.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0052.jpg 1
    ... ...
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0774.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0233.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0013.jpg 256
    

    dataset-val.txt

    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0070.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0060.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0076.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0062.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0035.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0092.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0015.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0098.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0024.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/001.ak47/001_0003.jpg 0
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0078.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0093.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0037.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0065.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0055.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0069.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0002.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0012.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0096.jpg 1
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/002.american-flag/002_0032.jpg 1
    ... ...
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0061.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0365.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0543.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0530.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0556.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0310.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0531.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0305.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0135.jpg 256
    /media/this/02ff0572-4aa8-47c6-975d-16c3b8062013/256_ObjectCategories/257.clutter/257_0116.jpg 256
    
    展开全文
  • 注意:如果文本框输入的不是数值型的数据或除法运算时除数为0,则要对程序异常处理。 仅供学习 package day01; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; impo...

    编写程序,如下所示。设计一个计算两个数的四则运算的GUI程序,操作符用菜单项表示,输入值和运算结果用文本框表示。注意:如果文本框输入的不是数值型的数据或做除法运算时除数为0,则要对程序作异常处理。
    仅供学习

    package day01;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class Text4 extends JFrame {
        public static class cannian extends JFrame {
            MenuBar menuBar;
            Menu m1, m2;
            MenuItem menuItem1, menuItem2, menuItem3, menuItem4, menuItem5;
            JLabel a1;
            JLabel a2;
            JLabel a3;
            JLabel a4;
            JTextField b1, b2;
    
            public cannian() {
                menuBar = new MenuBar();
                //设置菜单栏
                this.setMenuBar(menuBar);
                //创建菜单
                m1 = new Menu("运算", true);
                //向菜单栏中添加菜单
                menuBar.add(m1);
                //创建选项
                menuItem1 = new MenuItem("加+");
                menuItem2 = new MenuItem("减-");
                menuItem3 = new MenuItem("乘");
                menuItem4 = new MenuItem("除/");
                //创建菜单
                m2 = new Menu("程序", true);
                menuBar.add(m2);
                //创建选项
                menuItem5 = new MenuItem("退出");
                m2.add(menuItem5);
                //添加二级菜单
                m1.add(menuItem1);
                m1.add(menuItem2);
                m1.add(menuItem3);
                m1.add(menuItem4);
                m2.add(menuItem5);
                //创建无文本标签和文本框
                a1 = new JLabel("数值一:");
                a2 = new JLabel("数值二:");
                a3 = new JLabel("运算结果");
                a4 = new JLabel("");
                b1 = new JTextField();
                b2 = new JTextField();
                this.setLayout(null);
                a1.setBounds(60, 60, 70, 30);
                b1.setBounds(180, 60, 70, 30);
                a3.setBounds(60, 360, 70, 30);
                a4.setBounds(200, 360, 70, 30);
                a2.setBounds(60, 200, 70, 30);
                b2.setBounds(180, 200, 70, 30);
                a1.setForeground(Color.BLUE);
                a2.setForeground(Color.BLUE);
                a3.setForeground(Color.RED);
                a4.setForeground(Color.RED);
                this.add(a1);
                this.add(a2);
                this.add(a3);
                this.add(a4);
                this.add(b1);
                this.add(b2);
                ButtonListener ac = new ButtonListener();
                menuItem1.addActionListener(ac);
                menuItem2.addActionListener(ac);
                menuItem3.addActionListener(ac);
                menuItem4.addActionListener(ac);
                menuItem5.addActionListener(ac);
                this.setSize(600, 600);
                this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            }
    
            public class ButtonListener implements ActionListener {
                //重写ActionListener接口中的事件处理方法actionPerformed()
                public void actionPerformed(ActionEvent e) {
                    String str1 =b1.getText();//与后面的setText对比记忆
                    String str2 =b2.getText();
                    int num1 = Integer.parseInt(str1);
                    int num2 = Integer.parseInt(str2);
                    Object source = e.getSource();
                    if (source == menuItem1) {//+
                        int value1 = Integer.parseInt(b1.getText());
                        int value2 = Integer.parseInt(b2.getText());
                        a4.setText(Integer.toString(value1+value2));
    
                    } else if (source == menuItem2) {//-
                        int value1 = Integer.parseInt(b1.getText());
                        int value2 = Integer.parseInt(b2.getText());
                        a4.setText(Integer.toString(value1-value2));
                    } else if (source == menuItem3) {//*
                        int value1 = Integer.parseInt(b1.getText());
                        int value2 = Integer.parseInt(b2.getText());
                        a4.setText(Integer.toString(value1*value2));
                    } else if (source == menuItem4) {///
    
                        try {
                            int value1 = Integer.parseInt(b1.getText());
                            int value2 = Integer.parseInt(b2.getText());
                            a4.setText(Integer.toString(value1/value2));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            System.out.println("除数不能为0");
                        }
                    } else if (source == menuItem5) {//exit
                        System.exit(0);
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            cannian a = new cannian();
            a.setVisible(true);
        }
    }
    
    
    展开全文
  • 如何处理不均衡数据

    2020-01-31 21:22:19
    方法2:正样本分成十分,每一份负样本训练,十个分类器bagging 问题2: 低频次聚合成一列高频测one-hot 问题3: one-hot以后出现大量稀疏信息,会影响什么? 1)内存不够用 2) 预测质量高...

    问题1:

    正样本:负样本=100:10

    方法1: 取十分之一正样本和负样本

    方法2:正样本分成十分,每一份和负样本训练,十个分类器作bagging

     

    问题2:

    低频次聚合成一列和高频测做one-hot

     

    问题3:

    one-hot以后出现大量稀疏信息,会影响什么? 

    1)内存不够用

    2)  预测质量不高(不准)

    展开全文
  •        一切问题的起源在于我需要向数据库里拿信息,并且...首先仅仅使用jsp是不行的,说实在java代码我觉得就应该多写在html网页中,他html代码js代码是能相互处理赋...
  •  · 用大面积铜层地线,在印制板上把没被用上的地方都与地相连接作为地线用,或是成多层板,电源地线各占用一层。  .规则的检查  布线设计完成后,需认真检查布线设计是否符合设计者所制定的规则,同时...
  • 平常一样,逛电子市场都是这儿看看哪儿看看,碰着没见过的还喜欢问问,多年的习惯改掉的…… 一家柜台上摆着“低价处理 LCD 模块”的牌子,对于像我这样的穷学生来说,价格往往是考虑的主要因素。我径直走了...
  • 使用Keras处理和识别医学图像

    千次阅读 2018-10-09 19:33:19
    最近在医学图像的处理,简单的记录一下。 预处理 已知的数据集是通过labelimg工具打好标签的图片(如下图所示),总共区分三种病例。但标签框的大小一致,必须要统一大小,以满足后期制作统一格式的数据集(*.npz...
  • 后期的制作,除了简单的视频剪辑之外,对于我们的项目来说,很关键的一点...由于我不是原画的,所以我就给大家讲解我们原画创作的部分,我来讲一下片头的制作过程。首先,在原画师设计完我们的画面之后,我们需...
  • 首先了解这个概念,我一开始也是理解掌握基本的概念,再去程序的开发。Identity框架是微软自己提供,基于.net core平台,可拓展、轻量 级、面向多个数据库的身份验证框架。IdentityServer4是基于asp.net core ...
  • 特此免费授予获得此软件相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但限于使用,复制,修改,合并的权利,发布,分发,再许可/或出售本软件的副本,并允许具备软件的人员这样,但须...
  •  · 用大面积铜层地线,在印制板上把没被用上的地方都与地相连接作为地线用,或是成多层板,电源地线各占用一层。  .规则的检查  布线设计完成后,需认真检查布线设计是否符合设计者所制定的规则,同时...
  • ​进行数据分析的时候,我们会根据分析的数据内容选择合适的图表来进行数据可视化分析展示,对较大数据进行汇总分析时,我们常常会用到数据透视表,但是,excel里数据透视表很复杂,总是记了步骤,也经常点错...
  • 这里需要强调的是,当一张图中存在两个相同目标时,能对相同目标相同的label 比如说一张图有两只狗,需要给的标签是dog1dog2 原因在于labelme生成的标签为一个label.png文件,这个文件只有一通道,在你...
  • 我是一名数据分析师,每天需要各种各样的数据表格打交道,是一名名副其实的“表哥”,不仅需要制作更新公司里的日报、周报月报,有时候也要为公司的会议准备各种数据材料。由于公司的业务量非常大,每天会...
  • <div><p>有时我们会忽略错误处理和堆栈追踪的一些细节, 但是这些细节对于写与测试或错误处理相关的库来说是非常有用的. 例如这周, 对于 Chai 就有一个非常棒的PR, 该PR极大地改善了我们处理堆栈的方式, 当用户的断言...
  • 用户点击屏幕后产生的一个触摸事件,经过一些列的传递过程后,会找到最合适的视图控件来处理这个事件,找到最合适的视图控件后,就会调用控件的touches方法来具体的事件处理,事件包括(不做详解): touchesBegan...
  • 它基于FBSnapshotTestCase库,实际上,它同样的事情-它记录视图的参考图像,并在每次启动测试时对其进行验证。 但是,在所有可能的设备所有可能的方向上进行测试需要花费多少时间? 这个资料库可让您减少所需的...
  • 以前收集、处理、分析数据可能是IT部门数据库员的专属,现在很多业务都急切的开始用数据分析的思维来分析业务问题,催着IT、DBA要数据,求分析。 如果企业要数据分析,那么在诸多业务当中,财务数据分析...
  • 您是否曾经想过朋友一起一个艺术项目? 钴帆布适合您。 我们提供了一个协作艺术平台,使您可以制作艺术作品并与您的朋友分享。 您的朋友可以进行编辑并将其发送回去。 虽然我们现在能在一起,但我们可以一起...
  • Flink流处理过程的部分原理分析

    万次阅读 2018-12-19 23:20:07
    文章目录前言 前言 ...笔者为一个研究存储模块出身的人,最近在研读Flink流处理的部分原理,小小番总结。很多时候,以存储的眼光来看待计算过程中的处理过程,还是有很多一样的地方的。 ...
  • 由编写的库,用于处理结合页面位置时间的动画。 有关60fps的完整演示,请访问: ,或更简单的演示,请查看。 安装 $ npm install --save transform-when 特征 模糊React式动画基于时间的动画之间的界限,使您...
  • 前提:AB在同一个分支上对同一份代码仓库中的同一个文件修改,A变更了文件名,B在知道的情况下,基于原来的文件名对文件内容了变更,此时合并出现问题应该怎么解决? 首先对操作前的状态以同步,分别在...
  • 1.Tomcat 中设置URL区分大小写 ...这样的原因可能是因为tomcat支持jspServlet,而Java语言是区分大小写的。一般来说这样是没有问题的。但是如果某些网站程序或者页面制作过程中忽略了大小写问题,则就会导致...
  • (转)UnicodePython的中文处理

    万次阅读 2009-09-10 22:23:00
    ——由于最近在有关网页搜索的项目,涉及到一些编码方面的知识,小弟在网上偶然地发现了这么一篇文章,很易懂,晦涩,为了方便自己也同时能方便大家,就转了过来,以参考…… 文章出处:...
  • 为了使构建过程保持相似,此存储库包括React Native演示。 如果您对使用React Native感兴趣,请查看以获取更多信息。 随意浏览代码,以了解如何使用Houndify Web SDK。 如果您想为自己的启用语音的项目一些...
  • 这两天挤时间仔细了轮播图效果。并且刚刚搞了个制作动图的小工具,刚好试用一下,来看看效果→_→ 感觉很好玩的样子,哈哈哈哈~ 话说csdn是否考虑在写博客的里面加个表情包,感觉会更好玩啦~(来自一个表情包控...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,657
精华内容 1,062
关键字:

不做处理和不作处理