前言
前段时间,在微信朋友圈内看到有朋友在打比赛,然后,我就抱着尝试的心态去参加了一把;一个人成队,就报名参加了。
比赛截止到7月26号,本人被其他参赛队伍吊打!哈哈哈哈!
这篇文章主要是分享一下本人参赛时用于数据预处理的脚本,自己记录一下,也供大家学习参考![本人被各位大佬吊打之后,最终的成绩如下图,由于工作比较忙(zi ji lan),就只提交了两次成绩]

- 比赛中,数据处理的步骤
- 数据共计三大类,alpah、beta、betax,并且原始数据量不算很多,因此,首先想到的就是进行数据增强操作;
- 在三大类别里面,还分了很多的不同的子观测对象,因此,为了适当的让数据均衡,那么就先将大类中的数据按照不同观测对象统一分离好;
- 子类分离好后,然后再进行数据增强;数据增强方法采用水平镜像旋转、顺时针90度旋转以及缩放比例不是很大的图像缩放;
- 子类数据增强后,先进行训练、测试、验证数据集的划分;然后再把所有子类数据合并,合并成一个大类;
- 合并好后,就直接train起来! (本人在比赛中,使用的是resnet50网络进行的训练,网络未做任何调整,训练策略为常规操作)
(这里要是本人没有描述不清楚,欢迎留言进行交流!!互相学习)
- 接下来直接上代码,代码应该更加能表达清楚上文的描述
[请注意,为了让更加清楚的描述过程,本文中的代码只是针对一个类别的文件夹进行的操作,若是想一步到位三个文件夹都搞定,将代码简单修改一下即可]
首先是将天文观测图.fits数据格式转换为.jpg数据格式
"""
fits图片转jpg图片
"""
import os
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from astropy.io import fits
matplotlib.use('Agg')
def transfer(fits_folder, jpg_folder):
files = os.listdir(fits_folder)
for file in files:
jpg_name = file + '.jpg'
file_full_path = os.path.join(fits_folder, file)
datas = fits.open(file_full_path, cache=True)
datas.verify('fix')
img_data_aia = np.flipud(datas[1].data)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.axis('off')
plt.imshow(img_data_aia, cmap='gray')
plt.savefig(os.path.join(jpg_folder, jpg_name), bbox_inches='tight', dpi=300, pad_inches=0.0)
plt.close()
if __name__ == '__main__':
transfer('./continuum',
'./continuum_jpg')
然后进行子类的分离
"""
根据观测对象来归类数据集;
"""
import os
import shutil
def split_dataset(ori_datafloder):
files = os.listdir(ori_datafloder)
for file in files:
object_name = file.split('.')[2]
dir_name = object_name
jpg_full_path = os.path.join(ori_datafloder, file)
if not os.path.exists(os.path.join(ori_datafloder, object_name)):
os.mkdir(os.path.join(ori_datafloder, object_name))
if object_name == dir_name:
shutil.copy(jpg_full_path, os.path.join(os.path.join(ori_datafloder, object_name), file))
if __name__ == '__main__':
split_dataset('./continuum/alpha_jpg')
子类分离好后就开始数据集数据增强,数据增强采用第三方package实现–augmentor
"""
使用第三方库: augmentor
数据增强的脚本;
"""
import os
import time
import Augmentor
def dataAug(img_folder):
operate = Augmentor.Pipeline(img_folder)
operate.flip_left_right(probability=1)
operate.process()
operate.rotate90(probability=1)
operate.process()
operate.zoom(probability=1, min_factor=1.4, max_factor=1.5)
operate.process()
def do_operate(datasets_path):
folder_names = os.listdir(datasets_path)
for folder in folder_names:
folder_full_path = os.path.join(datasets_path, folder)
dataAug(folder_full_path)
return
if __name__ == '__main__':
s = time.time()
print("开始数据增强操作...")
do_operate('continuum/alpha_jpg')
print("数据增强操作结束,共计耗时:{:.3f}s".format(time.time()-s))
数据增强完后就接着进行train、test、val数据集的划分
"""
生成训练数据集;
将数据集按照6:3:1的比例划分训练、验证和测试集;
"""
import os
import random
import time
import shutil
train_rate = 0.6
val_rate = 0.3
test_rate = 0.1
train_data = 'train'
test_data = 'test'
val_data = 'val'
def create_dir(folder_name):
if not os.path.exists(folder_name):
os.mkdir(folder_name)
return
def split_datasets(object_folder):
folder_names = os.listdir(object_folder)
for folder in folder_names:
folder_full_path = os.path.join(object_folder, folder)
img_names = os.listdir(folder_full_path)
img_nums = len(img_names)
train_nums = int(img_nums * train_rate)
val_nums = int(img_nums * val_rate)
test_nums = img_nums - train_nums - val_nums
for i in range(train_nums):
randIndex = int(random.uniform(0, len(img_names)))
create_dir(train_data)
shutil.copy(os.path.join(folder_full_path, img_names[randIndex]),
os.path.join(train_data, img_names[randIndex]))
del (img_names[randIndex])
for i in range(val_nums):
randIndex_0 = int(random.uniform(0, len(img_names)))
create_dir(val_data)
shutil.copy(os.path.join(folder_full_path, img_names[randIndex_0]),
os.path.join(val_data, img_names[randIndex_0]))
del (img_names[randIndex_0])
for name in img_names:
create_dir(test_data)
shutil.copy(os.path.join(folder_full_path, name),
os.path.join(test_data, name))
print("--{}--Train {} pics, Test {} pics, Val {} pics!". \
format(folder, str(train_nums), str(test_nums), str(val_nums)))
print('--训练数据集共计:{} 张'.format(str(len(os.listdir(train_data)))))
print('--验证数据集共计:{} 张'.format(str(len(os.listdir(val_data)))))
print('--测试数据集共计:{} 张'.format(str(len(os.listdir(test_data)))))
if __name__ == '__main__':
s = time.time()
print('---正在准备数据集---')
split_datasets(' ')
print('---数据集划分共计耗时:{:.3f}s'.format(time.time() - s))
最后,数据集全部处理好后,就可以将所有子类归并到一起,作为一个大类使用了
"""
数据增强后将数据集从output目录中move出来;
"""
import os
import shutil
def copy_file(dataset_folder):
folders = os.listdir(dataset_folder)
for folder in folders:
folde_full_path = os.path.join(dataset_folder, folder + '/' + 'output')
pics = os.listdir(folde_full_path)
for pic in pics:
pic_full_path = os.path.join(folde_full_path, pic)
shutil.move(pic_full_path, os.path.join(dataset_folder, folder))
os.removedirs(folde_full_path)
if __name__ == '__main__':
copy_file('continuum/alpha_jpg')
最后的最后,我们可以train起来;【附上本人训练完后测试的结果图,测试下来很美好,实际一提交很打脸,只是为了让过程美好一点,自己骗自己,哈哈! 这个图看看就好,只想表达本文的训练过程是一个正儿八经的完整过程,哈哈】

- 文末总结
- 本文供大家参考学习,不足之处还请度多谅解,互相学习;
- 其实要是有能力,弄个度量学习,使用triplet-loss,应该最终的效果还是会有不错的提升;(yy出来的,哈哈)
- 训练过程增加一点小策略也是ok的,学习率的调整、early-stop、多阶段训练等;
- 数据量还可以扩充一点,哈哈!!