前言

有时候想看imagenet下某个类别的效果,但它又没划分… 之前看了这篇文章将ImageNet的验证集val数据分类到不同文件夹中,但不是很清楚那代码。

本文基于它的代码去做更改

把这个下下来 https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh
其实这就是个sh了,只是不方便控制路径,这里用python写写

本文有另一个作用就是存储一下代码,不然某天也不知道代码放哪去了, 又得去网上找找然后去改

至于路径自己改改就好了


代码

首先把那个sh另存为txt文本,复制前1000行保存为classes.txt


create_dir.py

"""
https://blog.csdn.net/qq_33328642/article/details/122073200
"""
import os
def mkdir(path):
    folder = os.path.exists(path)
    if not folder:
        os.makedirs(path)
        print(path + "---OK---")
    else:
        print(path + "---There is this folder!---")

if __name__ == '__main__':
    data = []
    # 设置文件对象并读取每一行文件,这个文件夹中保存了对应的验证数据集图像名和图像的标签
    for line in open("txt/classes.txt", "r"):  
        data.append(line)
    for a in data:
            # folder=file+line
        a = a.strip()
        folder = a[9:]
            # strip()方法移除字符串头尾指定的字符
        #folder = folder.strip()
        mkdir('val_imagenet_classes/{}'.format(folder))



复制1001行到最后,保存为 file.txt



copy_file_to_dir.py

"""
https://blog.csdn.net/qq_33328642/article/details/122073200
"""
import sys
import cv2
import matplotlib.pyplot as plt
import re,os
from PIL import Image
import numpy as np
from tqdm import tqdm


data = []
for line in open("txt/file.txt", "r"):  
# 设置文件对象并读取每一行文件
    data.append(line)
print(data[2][3:31])#这个显示的是每个图像的名称
print(data[2][32:41])#这个显示的时该图像的类,我们也是用这个类创建文件夹的

#显示图像

#img = Image.open('D:/Dateset/Alldataset/Imagenet/ILSVRC2012_img_val/{}'.format(data[2][3:31]))
#plt.figure("dog")
#plt.imshow(img)
#plt.show()

for a in tqdm(data):
    a = a.strip()
    nameimage = a[3:31]#获取该图像的名称
    from_img_path = '../ILSVRC2012_img_val/{}'.format(nameimage) # 原来的图片地址
    # print('from_img_path: ', from_img_path)
    im = Image.open(from_img_path)  
    #这个时获取原始验证集ILSVRC2012_img_val中每个图像,因为data中每一行存储一个图像的名称和标签
    path1 = 'val_imagenet_classes/{}'.format(a[32:-1])
    #ILSVRC2012_img_val1时新的验证集,ILSVRC2012_img_val1里面有很多以图像类命名的子文件夹
    im.save(os.path.join(path1, nameimage))#把图像保存在文件中
    im.close()

划分训练测试

by the way, 这里放下划分训练集测试集的代码

import os
import random
from tqdm import tqdm
import shutil


def copy_path_lt2dir(img_path_lt, output_dir):
    os.makedirs(output_dir, exist_ok=True)
    print('copy to {}'.format(output_dir))

    for img_path in tqdm(img_path_lt):
        img_name = os.path.basename(img_path)
        output_img_path = '{}/{}'.format(output_dir, img_name)
        shutil.copy(img_path, output_img_path)


def split_test(input_dir, output_dir):
    os.makedirs(output_dir, exist_ok=True)
    img_lt = list(os.listdir(input_dir))
    random.shuffle(img_lt)
    total_num = len(img_lt)
    # print(total_num)

    train_total_ratio = 0.9
    train_num = int(total_num * train_total_ratio)
    test_num = total_num - train_num
    print('total num: {}, train num: {}, test num: {}'.format(total_num, train_num, test_num))
    train_lt = img_lt[:train_num]
    test_lt = img_lt[train_num:]

    train_path_lt = ['{}/{}'.format(input_dir, item) for item in train_lt]
    test_path_lt = ['{}/{}'.format(input_dir, item) for item in test_lt]

    copy_path_lt2dir(train_path_lt, '{}/train'.format(output_dir))
    copy_path_lt2dir(test_path_lt, '{}/test'.format(output_dir))



if __name__ == '__main__':
    input_dir = 'data_256/a/airfield'
    output_name = input_dir.split('/')[-1]
    output_dir = '{}_train_test'.format(output_name)
    split_test(input_dir, output_dir)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐