图像分类每个标签按比例划分数据

在图像分类任务中,通过将总数据集按比例划分训练集和验证集来处理数据不平衡问题。利用Python脚本实现按标签比例划分,并统计每个标签数量,再将图像复制到对应文件夹。该方法有助于避免模型对样本多的类别过拟合,确保模型泛化能力。
摘要由CSDN通过智能技术生成

问题

在做图像分类时候,会收集一批相应的数据,这里将其称为总数据集total-data

按照一般的做法,会将总数据集划分为训练集(train-data)、验证集(valid-data)以及测试集(test-data)。这里为了方便,将总的数据集划分为训练集和验证集。

有时候使用随机分配的算法会导致每个标签下样本的个数分布不是很均匀,有的标签下样本个数很多,有的标签下样本个数很少,这就导致了一种数据不均衡问题,使得训练的模型偏向于数据样本多的标签。那么我们能不能按照相应的比例,也将每一个标签下的数据按照对应的比例进行划分呢?这其实也是比较好实现的。

解决办法

假设项目目录为dataset,下面有total-data文件夹、train-data以及test-data文件夹

在这里插入图片描述

total-data目录下存放的是所有的图像数据集,图像命名样式为label_xxxx.jpg

  • 1.获取所有的图像样本名称:

    ls total-data/ > total_data.txt
    
  • 2.按照比例将total_data.txt划分为train_data.txt以及test_data.txt:

    python split_train_test.py total_data.txt
    

    其中,split_train_test.py样式如下:

    import sys
    import random
    
    
    total_img_file = sys.argv[1]
    res = {}   # stastic label and the numbers
    ratio = 0.8  # the ratio of train and test is 8:2
    
    
    with open(total_img_file) as f:
    	for ln in f:
    		img_name = ln.rstrip('\n')
    		img_label = img_name.split('_')[0]
    		if img_label in res:
    			res[img_label].append(img_name)
    		else:
    			res[img_label] = [img_name]
    
    
    train_data = open('train_data.txt', 'w')
    test_data = open('test_data.txt', 'w')
    
    
    for k, v in res.items():
    	total_nums = len(v)
    	train_nums = int(total_nums * ratio)
    	test_nums = total_nums - train_nums  # 每个标签下都按照比例划分样本数据
    	# random choice train_nums example from img_name list
    	train_imgs = random.sample(v, train_nums)
    	test_imgs = list(set(v) - set(train_imgs))  # the reverse
    	for train_img in train_imgs:
    		print(train_img, file=train_data)
    	for test_img in test_imgs:
    		print(test_img, file=test_data)
    
    
    train_data.close()
    test_data.close()
    
  • 3.统计分析下每个标签下样本的数量

  python statistic.py

其中,statistic.py:

  import os
  import sys
  
  res = {}  # use dict to collect the nums of every labels
  
  img_file = sys.argv[1]
  with open(img_file) as f:
  	for ln in f:
  		img_name = ln.rstrip('\n')
  		img_label = img_name.split('_')[0]
  		if img_label in res:
  			res[img_label] += 1
  		else:
  			res[img_label] = 1
  
  print(res)
  • 从总数据集中复制对应的图像文件到训练集和测试集
  python cp_file.py test_data.txt

其中,cp_file.py

  import sys
  import shutil
  
  img_files = sys.argv[1]
  
  with open(img_files) as f:
  	for ln in f:
  		img_file = ln.rstrip('\n')
  		print(img_file)
  		src_path = 'total-data/' + img_file
  		dst_path = 'test-data/' + img_file
  		shutil.copy(src_path, dst_path)

或者使用shell

cat train_data.txt | xargs -i cp total_data/{} train_data/

后续就是准备标签,以及定义模型及训练了,这里不做过多介绍。上述有些功能在一些深度学习框架中有实现,但自己实现一下可以更加清楚一下整个流程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值