该方案针对碎米识别挑战赛,选用UNet模型,通过水平/垂直翻转、随机缩放等数据增强,输入尺寸设为1024×1024。以Adam优化器结合余弦退火学习率,用BCELoss与LovaszSoftmaxLoss组合损失函数训练,最佳模型mIou约0.724,得分0.68997,可通过增大输入尺寸等优化。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

美亚光电在光电色选领域深耕多年,秉承着绿色设计、绿色生产、绿色管理的发展理念,并基于人工智能和大数据技术,助力传统农业数字化转型。
我国是世界上最大的稻米生产国,而稻米品质问题已经成为制约我国大米生产、销售和出口的瓶颈。大米的碎米率是影响大米质量和售价的重要指标,同时也是反映稻米种植水平、大米加工水平的重要指标。从整米中识别、分割出碎米,并提高碎米的识别率是提高大米品质的关键性问题。
本次大赛提供纯色背景下的整米和碎米数据作为训练样本,参赛选手需基于提供的样本构建模型,对碎米进行分割识别。
本次比赛为参赛选手提供了两类数据:训练数据、测试数据。训练数据及测试数据皆为分辨率1024×500、位深度24位纯色背景下的整米和碎米png图片其中仅训练数据包含标注信息(分割结果的0/1二值化图,碎米值为1,其余部分为0)。出于数据安全保证的考虑,所有数据均为脱敏处理后的数据。
其中训练数据有120例,测试数据30例
训练数据(rice_1)及其label(已转换为0-255):
1.碎米识别挑战赛数据
2.碎米识别挑战赛提交样例
现在应该是不能下载了的,直接在公开数据集中搜索添加即可
深度学习框架: paddlepaddle 2.2.0
python版本: python 3.7
硬件信息: CPU:4, RAM:32GB, GPU:v100, 显存:32GB, 磁盘:100GB
本团队的训练皆在Ai Studio深度学习平台上进行
尝试过UNet、BiSeNetV2等网络,虽然BiSeNetV2是轻量级网络,但是精度一直提高不了,所以选择了经典的UNet作为本次比赛的分割网络。
水平翻转,垂直翻转,随机扭曲,随机缩放,图像标准化。碎米图分辨率为1024×500,所以输入尺寸我设置为1024×1024
可优化点:
我只使用了经典的UNet网络进行训练
可优化点:可以尝试使用ResNet、EfficientNet等网络作为主干网络
对于分割项目,我都是使用CosineAnnealingDecay + Adam进行训练,这样模型收敛的很快,节省一些时间。
可优化点:可以AdamW作为优化器,该优化器用来解决Adam优化器中L2正则化失效的问题,现在使用的比较多的是AdamW。
我尝试过使用一些轻量级的网络进行训练,但是精度都没有UNet的高,甚至在后面选手们都冲分的时候我都进不了前十,所以最后使用了经典的UNet网络训练出的模型作为最后的成绩。
可优化点:可以减少UNet的filter个数达到减少模型大小的效果,但是相应的,精度可能会降低。
在测试时可以使用TTA。
#解压数据集!unzip -oq /home/aistudio/data/data105383/碎米识别挑战赛_数据集.zip -d /home/aistudio/work/
想要深入了解PaddleSeg源码,可参考PaddleSeg代码解读
# 下载PaddleSeg包,使用PaddleSeg高层API进行训练!pip install paddleseg
因为数据稀少,所以按照9:1的比例划分训练集与验证集,但是通过不断训练得出,8:2比例精度更高。
若是需要更改比例,更改下方代码中的ratio数值即可
注:选手可以额外增补试题数据集以及其它辅助数据,但所用的数据必须是无违法、敏感等信息的可公开数据。此外,前十名的参赛选手需要在项目文件中将额外的数据一并提供。
0.9最高为0.673,0.8最高为0.68997,在优化模型的时候,最好使用相同的训练集、验证集进行训练。
# import random# import os# random.seed(2021)# mask_dir = '/home/aistudio/work/rice/train/labels'# img_dir = '/home/aistudio/work/rice/train/images'# path_list = list()# for img in os.listdir(img_dir):# img_path = os.path.join(img_dir,img)# mask_path = os.path.join(mask_dir,img.replace('jpg', 'png'))# path_list.append((img_path, mask_path))# random.shuffle(path_list)# ratio = 0.8# train_f = open('/home/aistudio/work/rice/train/train.txt','w') # val_f = open('/home/aistudio/work/rice/train/val.txt' ,'w')# for i ,content in enumerate(path_list):# img, mask = content# text = img + ' ' + mask + '\n'# if i < len(path_list) * ratio:# train_f.write(text)# else:# val_f.write(text)# train_f.close()# val_f.close()训练数据及测试数据皆为分辨率1024×500,再加上训练数据数量少的特点,将输入size设为1024×1024,让网络学习到更多特征
size设为1024×1024,加上水平翻转与垂直翻转即可到达0.68+,其他的数据增强可小幅提升成绩
可对照PaddleSeg代码解读项目设计数据增强策略
高层API真好用,可以偷懒哈哈
import paddleseg.transforms as Tfrom paddleseg.datasets import Dataset
train_transforms = [
T.RandomHorizontalFlip(0.5),# 水平翻转
T.RandomVerticalFlip(0.5),# 垂直翻转
T.RandomDistort(0.6),
T.RandomScaleAspect(min_scale=0.8,aspect_ratio=0.5),# 随机缩放
T.Resize(target_size=(1024,1024)),
T.Normalize() # 图像标准化]
val_transforms = [
T.Resize(target_size=(1024,1024)),
T.Normalize()
]dataset_root = '/home/aistudio/work/rice/train'train_path = '/home/aistudio/work/rice/train/train.txt'val_path = '/home/aistudio/work/rice/train/val.txt'# 构建训练集train_dataset = Dataset(
dataset_root=dataset_root,
train_path=train_path,
transforms=train_transforms,
num_classes=2,
mode='train'
)#验证集val_dataset = Dataset(
dataset_root=dataset_root,
val_path=val_path,
transforms=val_transforms,
num_classes=2,
mode='val'
)优化器:Adam
class paddle.optimizer. Adam ( learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, parameters=None, weight_decay=None, grad_clip=None, name=None, lazy_mode=False )
参数:
import paddlefrom paddleseg.models import UNetfrom paddleseg.models.losses import MixedLoss,BCELoss,LovaszSoftmaxLoss
base_lr =0.0025 #初始学习率iters = 4000unet_model = UNet(num_classes=2)#使用unet进行训练#自动调整学习率lr =paddle.optimizer.lr.CosineAnnealingDecay(base_lr, T_max=(iters // 3), last_epoch=0.5) #使用余弦退火调整学习率u_optimizer = paddle.optimizer.Adam(lr, parameters=unet_model.parameters())#构建损失函数mixtureLosses = [BCELoss(),LovaszSoftmaxLoss() ]
mixtureCoef = [0.7,0.3]
losses = {}
losses['types'] = [MixedLoss(mixtureLosses, mixtureCoef)]
losses['coef'] = [1]#进行训练from paddleseg.core import train
train(
model = unet_model,
train_dataset=train_dataset,
val_dataset=val_dataset,
optimizer=u_optimizer,
save_dir='output/RICE_model_1',
iters=iters,
batch_size=2,
save_interval=40,
log_iters=10,
num_workers=0,
losses=losses,
use_vdl=True
)训练日志:
保存mIou最高的模型为best_model
学习率下降到0.24就开始收敛,到达0.14左右,mIou就到达0.70+
使用BCELoss,LovaszSoftmaxLoss组合损失函数,iters到达400左右,mIou即可到达0.70+,在训练半个周期或者一个半周期之后,mIou将到达最高(接近0.72)
最优的几个模型皆在迭代一个半周期之后达到最高。
最好模型 UNet_0.68997.pdparams:
RICE_model_17 mIou到达0.7202,score就可以拿到0.68571
RICE_model_19 mIou到达0.7221,score就可以拿到0.6887(调整了 RandomDistort 参数)
RICE_model_21 mIou到达0.7240,score就可以拿到0.68997(调整了 水平翻转和垂直翻转 参数, 将默认数值改为0.5)
from paddleseg.core import evaluatefrom paddleseg.models import UNet#设置模型model = UNet(num_classes=2)#模型路径model_path = 'UNet_0.68997.pdparams'para_state_dict = paddle.load(model_path) model.set_dict(para_state_dict) evaluate(model,val_dataset)
%cd ~import randomimport os
test_path = r"work/rice/test/images"test_lst=[]for test in os.listdir(test_path):
test_lst.append(test)
with open('work/rice/test.txt', 'w') as f: for line in test_lst:
f.write(line)
f.write('\n')import osfrom paddleseg.models import UNetfrom paddleseg.core import predictimport paddleseg.transforms as T
transforms = T.Compose([
T.Resize(target_size=(1024, 1024)),
T.Normalize()
])
model = UNet(num_classes=2)#生成图片列表image_list = []with open('work/rice/test.txt' ,'r') as f: for line in f.readlines():
image_list.append(os.path.join('work/rice/test/images/',line.split()[0]))
predict(
model, #模型路径文件
model_path = 'UNet_0.68997.pdparams',
transforms=transforms,
image_list=image_list,
save_dir='result',
)提交预测结果:
!mkdir results#采取的方法是将RGB图转换为0/255import osimport reimport os.pathimport numpy as npfrom PIL import Image#将RGB图转为0/255#Pixels higher than this will be 255. Otherwise 0.image_path = "result/pseudo_color_prediction"results_path = "results"image_arr=[]for image in os.listdir(image_path):
image_arr.append(image)
for i in range(len(image_arr)):#Load image and convert to greyscale
img = Image.open(image_path + "/"+image_arr[i])
img = img.convert("L")
imgData = np.asarray(img)
imgData = ((imgData-np.min(imgData))/(np.max(imgData)-np.min(imgData))*255).astype('uint8')
im = Image.fromarray(imgData)
im.save(results_path + "/"+image_arr[i])将打包好的results.zip下载即可提交
# 压缩当前路径所有文件,输出zip文件path='results'import zipfile,os
zipName = 'results.zip' #压缩后文件的位置及名称f = zipfile.ZipFile( zipName, 'w', zipfile.ZIP_DEFLATED )for dirpath, dirnames, filenames in os.walk(path): for filename in filenames: print(filename)
f.write(os.path.join(dirpath,filename))
f.close()以上就是2021 iFLYTEK A.I 开发者大赛 碎米识别挑战赛-初赛榜三的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号