科大讯飞AI大赛:玉米雄穗识别挑战赛
赛题名称:
玉米雄穗识别挑战赛
赛题类型:
计算机视觉、物体检测
赛题任务:
通过田间图像正确识别植株雄穗,并进行标注。
赛事背景
随着中国经济发展和人口增长,对农业生产的需求不断增加,玉米作为重要的粮食作物之一,一直处于国家粮食安全和生态保护的重要位置。玉米制种产业是玉米生产的基础保障。随着玉米制种技术的不断发展,不育系生产由于无需去雄,节省劳动力,已经越来越普及。在玉米种子生产过程中,母本去雄作为种子纯度保障至关重要的环节,准确识别母本去雄后残留雄穗并去除是提升种子质量的重要手段。
赛事任务
在玉米花期,通过田间图像正确识别植株雄穗,并进行标注。
数据说明
本次比赛将会为选手提供玉米处于花期阶段的图片作为数据集,选手需要根据训练集进行训练,对测试集数据进行标定。
数据集已上传至资源。
样本标注
评估指标
部分代码
import os
import glob
import shutil
# 创建验证集目录
os.makedirs('val', exist_ok=True)
os.makedirs('val/labels', exist_ok=True)
os.makedirs('val/images', exist_ok=True)
# 获取训练集标签和图像路径
labels = glob.glob('./train/labels/*')
images = glob.glob('./train/images/*')
# 排序路径列表
labels.sort()
images.sort()
# 移动最后 50 个样本到验证集
for x, y in zip(labels[-50:], images[-50:]):
shutil.move(x, 'val/labels/') # 移动标签文件
shutil.move(y, 'val/images/') # 移动图像文件
import os
import warnings
from pathlib import Path
from ultralytics import YOLO
if __name__ == '__main__':
# 忽略警告
warnings.filterwarnings('ignore')
# 取消设置 CUDA_VISIBLE_DEVICES
os.environ.pop("CUDA_VISIBLE_DEVICES", None)
# 初始化模型
model_path = Path('yolov8m.pt')
# 确保路径正确
if not model_path.exists():
raise FileNotFoundError(f"Model path {model_path} does not exist.")
model = YOLO(str(model_path))
# 创建必要的目录
project_dir = Path('runs/train/yolov8m_finetuned')
project_dir.mkdir(parents=True, exist_ok=True)
# 开始训练
results = model.train(
data="./yolo.yaml",
epochs=200, # 增加训练轮数
device="cuda:0",
batch=16,
lr0=0.01, # 初始学习率
lrf=0.001, # 最终学习率
optimizer='AdamW',
augment=True, # 启用数据增强
save_period=10, # 每 10 轮保存一次模型
patience=20, # 早停法,连续 20 轮没有提升则停止训练
cache=True, # 使用缓存加速数据加载
workers=8, # 增加数据加载线程数
project=str(project_dir), # 保存结果的目录
name='yolov8m_finetuned' # 保存的模型名称
)
import os
import glob
from ultralytics import YOLO
# 加载最优模型
## model = YOLO("runs/detect/train/weights/best.pt")
model = YOLO("runs/train/yolov8m_finetuned/yolov8m_finetuned2/weights/best.pt")
# 创建提交目录
os.makedirs('submit', exist_ok=True)
# 获取测试图片路径
test_paths = glob.glob('test/*')
# 遍历测试图片路径
for path in test_paths:
# 进行预测
results = model(path, save_txt=False) # 确保不保存预测结果为文本文件
predictions = results[0]
# 打开文件以写入预测结果
output_path = "./submit/" + os.path.basename(path).split('.')[0] + '.txt'
with open(output_path, 'w') as file:
boxes = predictions.boxes
for box in boxes:
cls = int(box.cls.item())
xywhn = box.xywhn[0].tolist()
# Write line to file in YOLO label format: cls x y w h
file.write(f"{cls} {xywhn[0]} {xywhn[1]} {xywhn[2]} {xywhn[3]}\n")
结束
仅仅提供思路,完整需要学习整体架构