阿里天池-太阳黑子耀斑分类(赛道一)之数据处理脚本

本文分享了作者在天文图像处理竞赛中的经验,包括数据预处理脚本、数据增强、子类分离、训练集划分及模型训练过程。采用resnet50网络,详细介绍了.fits到.jpg转换、图像旋转、缩放等增强方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

前段时间,在微信朋友圈内看到有朋友在打比赛,然后,我就抱着尝试的心态去参加了一把;一个人成队,就报名参加了。

比赛截止到7月26号,本人被其他参赛队伍吊打!哈哈哈哈!

这篇文章主要是分享一下本人参赛时用于数据预处理的脚本,自己记录一下,也供大家学习参考![本人被各位大佬吊打之后,最终的成绩如下图,由于工作比较忙(zi ji lan),就只提交了两次成绩]

- 比赛中,数据处理的步骤

  • 数据共计三大类,alpah、beta、betax,并且原始数据量不算很多,因此,首先想到的就是进行数据增强操作;
  • 在三大类别里面,还分了很多的不同的子观测对象,因此,为了适当的让数据均衡,那么就先将大类中的数据按照不同观测对象统一分离好;
  • 子类分离好后,然后再进行数据增强;数据增强方法采用水平镜像旋转、顺时针90度旋转以及缩放比例不是很大的图像缩放;
  • 子类数据增强后,先进行训练、测试、验证数据集的划分;然后再把所有子类数据合并,合并成一个大类;
  • 合并好后,就直接train起来! (本人在比赛中,使用的是resnet50网络进行的训练,网络未做任何调整,训练策略为常规操作)
    (这里要是本人没有描述不清楚,欢迎留言进行交流!!互相学习)

- 接下来直接上代码,代码应该更加能表达清楚上文的描述

[请注意,为了让更加清楚的描述过程,本文中的代码只是针对一个类别的文件夹进行的操作,若是想一步到位三个文件夹都搞定,将代码简单修改一下即可]
首先是将天文观测图.fits数据格式转换为.jpg数据格式
  • fits_to_jpg.py
# coding: utf-8
# author:hxy
"""
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')
然后进行子类的分离
  • split_sub_objects.py
# coding: utf-8
# author: hxy
"""
根据观测对象来归类数据集;
"""
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
  • data_aug.py
# coding: utf-8
# author: hxy
"""
使用第三方库: augmentor
数据增强的脚本;
"""
import os
import time
import Augmentor


def dataAug(img_folder):
    operate = Augmentor.Pipeline(img_folder)
    # 水平镜像旋转
    operate.flip_left_right(probability=1)
    operate.process()

    # 图像顺时针旋转90度
    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数据集的划分
  • create_train_datasets.py
# coding: utf-8
# author: hxy
"""
生成训练数据集;
将数据集按照6:3:1的比例划分训练、验证和测试集;
"""

import os
import random
import time
import shutil

# 保存用于训练分类的数据集的路径
train_rate = 0.6  # 60%
val_rate = 0.3  # 30%
test_rate = 0.1  # 10%

# 存储数据的路径
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
        # print(img_names)
        # 生成训练集
        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])
        # print(img_names)
        # 生成验证集
        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])
        # print(img_names)
        # 生成测试集
        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))
最后,数据集全部处理好后,就可以将所有子类归并到一起,作为一个大类使用了
  • merge_pics.py
# coding: utf-8
# author: hxy
"""
数据增强后将数据集从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、多阶段训练等;
  • 数据量还可以扩充一点,哈哈!!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值