imagenet val 按类别分类
有时候想看imagenet下某个类别的效果,但它又没划分… 之前看了这篇文章,但不是很清楚那代码。本文基于它的代码去做更改把这个下下来 https://raw.githubusercontent.com/soumith/imagenetloader.torch/master/valprep.sh其实这就是个sh了,只是不方便控制路径,这里用python写写本文有另一个作用就是存储一下代码,不然某天
·
前言
有时候想看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)
更多推荐

所有评论(0)