A题:农田害虫图像识别

赛题描述

一、问题背景

病虫害一直是农业生产中无法避免的问题,每年都会由此造成巨大的经济损失。为了对农田病虫害进行有效的预防和控制,需要收集有害生物信息,在此基础上进行虫情分析。由于农田害虫的多样性和信息类型的复杂性,通过人工观察统计的传统害虫监测方式已经难以满足现代大规模农业生产对虫害预防工作的需要。近年来出现的虫情测报灯是虫情信息采集的智能设备,可以在无人监管的情况下,实现自动诱集、杀虫、虫体分散、拍照等作业,并实时地将虫情信息上传至云平台。虫情测报灯的投入使用可帮助植保人员高效地进行虫情分析,提高测报工作效率和准确率,避免农药的滥用和误用,减少农产品的农药残留,改善农田生态环境。

二、解决问题

1. 利用附件1和附件2的信息,建立确定害虫位置及种类的模型和算法。

2. 应用问题1所建立的模型和算法对附件3中提及的图像进行识别,并确定害虫的位置,将结果存放在“result2.csv”文件中(模板文件见附件4中的result2.csv)。

3. 根据问题2得到的结果,对附件3中提及的图像文件中不同种类的害虫数量进行统计,将统计结果存放在“result3.csv”文件中(模板文件见附件4中的result3.csv)。

这种图像处理的问题解法基本都是一样,准备数据,选择模型,训练,预测,完事。

数据准备

在给定的数据中有部分杂乱的数据,我们手动剔除掉了这部分数据,然后对剩余的数据,依据其给定的目标位置信息,对图像进行随机裁剪,作为训练图像。

随机裁剪图像的代码如下:

# -*- coding: utf-8 -*-
import os
import shutil
import cv2
import time
import codecs
import xml.etree.ElementTree as ET
from tqdm import tqdm
import shutil
from tqdm import trange              from multiprocessing import Pool
import numpy as npdef setDir(filepath):'''如果文件夹不存在就创建,如果文件存在就清空!:param filepath:需要创建的文件夹路径:return:'''if not os.path.exists(filepath):os.mkdir(filepath)else:shutil.rmtree(filepath)os.mkdir(filepath)
def bbox_iou(box1, box2):""":param box1: = [xmin1, ymin1, xmax1, ymax1]:param box2: = [xmin2, ymin2, xmax2, ymax2]:return: """xmin1, ymin1, xmax1, ymax1 = box1xmin2, ymin2, xmax2, ymax2 = box2# 计算每个矩形的面积s1 = (xmax1 - xmin1) * (ymax1 - ymin1)  # b1的面积s2 = (xmax2 - xmin2) * (ymax2 - ymin2)  # b2的面积# 计算相交矩形xmin = max(xmin1, xmin2)ymin = max(ymin1, ymin2)xmax = min(xmax1, xmax2)ymax = min(ymax1, ymax2)w = max(0, xmax - xmin)h = max(0, ymax - ymin)a1 = w * h  # C∩G的面积a2 = s2# + s2 - a1iou = a1 / a2 #iou = a1/ (s1 + s2 - a1)return iou
def exist_objs_iou(list_1, list_2):# 根据iou判断框是否保留,并返回bboxreturn_objs=[]s_xmin, s_ymin, s_xmax, s_ymax = list_1[0], list_1[1], list_1[2], list_1[3]for single_box in list_2:xmin, ymin, xmax, ymax, category=int(single_box[0]),int(single_box[1]),int(single_box[2]),int(single_box[3]),int(single_box[4])iou = bbox_iou(list_1, [xmin, ymin, xmax, ymax])if iou > 0.9:if iou == 1:x_new=xmin-s_xminy_new=ymin-s_yminreturn_objs.append([x_new, y_new, x_new+(xmax-xmin), y_new+(ymax-ymin),category])  # 保存新的坐标else:xlist = np.sort([xmin, xmax, s_xmin, s_xmax])  # 默认从小到大排序ylist = np.sort([ymin, ymax, s_ymin, s_ymax])return_objs.append([xlist[1] - s_xmin, ylist[1] - s_ymin, xlist[2] - s_xmin, ylist[2] - s_ymin, category])return return_objs  # 返回新的裁剪图片的坐标和类别def read_txt(ann_path):with open(ann_path, 'r') as f:object_lists = []info = f.readlines()for object_list in info:object_lists.append(object_list.split())return object_listsdef write_txt(outpath,exiset_obj_list):m=1200with open(outpath+".txt", 'a+') as f:for obj in exiset_obj_list:cl=obj[4]x_c=(obj[2]+obj[0])/(m*2)y_c = (obj[1] + obj[3]) / (m * 2)w=(obj[2]-obj[0])/mh=(obj[3]-obj[1])/m# o1 = [str(obj[0]), str(obj[1]),str(obj[2]),str(obj[3]),str(obj[4])]o=[str(cl),str(x_c),str(y_c),str(w),str(h)]f.write(" ".join(o) + "\n")# with open(outpath+"re.txt", 'a+') as f:#     for obj in exiset_obj_list:#         o = [str(obj[0]), str(obj[1]),str(obj[2]),str(obj[3]),str(obj[4])]#         f.write(" ".join(o) + "\n")def slice_im(List_subsets, outdir, raw_images_dir, raw_ann_dir, clip_ann_dir, sliceHeight=640, sliceWidth=640,zero_frac_thresh=0.2, overlap=0.2, verbose=True):cnt = 0for per_img_name in tqdm(List_subsets):o_name, _ = os.path.splitext(per_img_name) # 分离文件路径与拓展名,00001.jpg->('00001','.jpg')out_name = str(o_name) + '_' + str(cnt) # 00001_0image_path = os.path.join(raw_images_dir, per_img_name)# image/00001.jpgann_path = os.path.join(raw_ann_dir, per_img_name[:-4] + '.txt') # labels/00001.txt,里面包含了左上、右下坐标和类别#print(ann_path)image0 = cv2.imread(image_path, 1)  # colorext = '.' + image_path.split('.')[-1] # .jpgobject_list = read_txt(ann_path) # 00001.txtindex = np.argwhere(image0[:, :, 0]) # 蓝色分量图像for i in range(500):random_idx = np.random.choice(len(index)) # 随机截取slice_idx = index[random_idx]#x = slice_idx[0],y = slice_idx[1]if slice_idx[0]+sliceWidth<=image0.shape[1] and slice_idx[1]+sliceHeight<=image0.shape[0]:exiset_obj_list = exist_objs_iou([slice_idx[0], slice_idx[1],slice_idx[0]+sliceWidth,slice_idx[1]+sliceHeight],object_list)if exiset_obj_list!=[]:  # 如果为空,说明切出来的这一张图不存在目标window_c = image0[slice_idx[1]:slice_idx[1] + sliceHeight, slice_idx[0]:slice_idx[0] + sliceWidth]outpath = os.path.join(outdir, out_name + '_' +str(slice_idx[0]) + '_' + str(slice_idx[1]) + '_' + str(sliceHeight) + ext)cnt += 1cv2.imwrite(outpath, window_c)outpath_ann =  os.path.join(clip_ann_dir, out_name + '_' +str(slice_idx[0]) + '_' + str(slice_idx[1]) + '_' + str(sliceHeight))write_txt(outpath_ann,exiset_obj_list)if __name__ == "__main__":# 筛选附件1过后所有有虫子的图片的位置raw_images_dir = './img1'# 对应虫子的位置信息转化为TXT文件后的位置raw_ann_dir = './label1'# 保存裁剪图片的位置slice_voc_dir = './img11'# 保存裁剪图片位置信息的TXT文件的位置clip_ann_dir = './label11'if not os.path.exists(slice_voc_dir):os.makedirs(slice_voc_dir)if not os.path.exists(clip_ann_dir):os.makedirs(clip_ann_dir)List_imgs = os.listdir(raw_images_dir)slice_im(List_imgs, slice_voc_dir, raw_images_dir, raw_ann_dir, clip_ann_dir, sliceHeight=1200, sliceWidth=1200)

模型选择和训练

我们选择的YOLOv5s模型来训练,然后在训练参数中启用了数据增强的操作,如随机旋转,水平翻转,垂直翻转等等。我们按照8:2的比例来划分训练集和验证集,最终的mAP@.5=0.98左右,结果非常不错,其中的混淆矩阵也非常完成,模型学习到了很好的特征。

图像推理

直接用YOLOv5的检测程序来做就行,最后我们的预测结果也很好。

第十届泰迪杯数据挖掘挑战赛A题解题思路附代码相关推荐

  1. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 31页省一等奖论文及代码

    相关链接 (1)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统负荷预测分析 问题一Baseline方案 (2)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统 ...

  2. 分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)

    第十届"泰迪杯" 数据挖掘挑战赛优秀作品-农田害虫图像识别--特等奖 实验结果分析 4.1.1 实验配置 本篇论文的实验都是基于 Ubuntu 系统下进行,使用 GPU 和 CPU ...

  3. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 问题二 时间突变分析 Python实现

    目录 相关链接 完整代码下载链接 1 定义绘图函数 2 通过对原始测量应用阈值来查找异常值 3 手动设置阈值 4 使用分位数设置阈值 5 3Sigma原则(IQR) 6 设定分位数 6.1 导入数据 ...

  4. 分享篇:第十届“泰迪杯”数据挖掘挑战赛-农田害虫图像识别(特等奖)一

    1.1 赛题背景 昆虫的种类浩如烟海,农田常见的昆虫是人工生态系统的重要组成部分.分辨益 虫和害虫,保留益虫,消灭害虫,对于减轻害虫对农田的生产危害有重要意义.常见 农田害虫共有 138 种,天敌昆虫 ...

  5. 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析第一问LSTM模型的建立

    1️⃣问题分析 地区负荷的中短期预测分析 根据附件中提供的某地区电网间隔15分钟的负荷数据,建立中短期负荷预测模型:

  6. 2023年泰迪杯数据挖掘挑战赛B题--产品订单数据分析与需求预测(1.数据处理)

    1. 前言 本题相对来说比较适合新手,包括针对数据的预处理,数据分析,特征提取以及模型训练等多个步骤,完整的做下来是可以学到很多东西的. 2.问题一思路分析 本题要求利用附件中的训练数据进行深入的分析 ...

  7. 2023年泰迪杯数据挖掘挑战赛B题--产品订单数据分析与需求预测(2.数据探索性分析)

    前言 继续上一片数据预处理进行续写,利用预处理之后的数据进行数据分析并且解决问题一相关的问题.问题一主要目的是让研究各种因素对于需求量的影响,然后找到确定影响需求量的主要因素并且进行数据分析和主要特征 ...

  8. 泰迪杯数据挖掘挑战赛C题 通用论坛正文提取

    参与第五届泰迪杯,侥幸获得二等奖,简单记录一下. 一.问题的背景 在当今的大数据时代里,伴随着互联网和移动互联网的高速发展,人们产生的数据总量呈现急剧增长的趋势,当前大约每六个月互联网中产生的数据总量 ...

  9. 第八届“泰迪杯”数据挖掘挑战赛C题“泰迪杯”奖论文(基于卷积神经网络及集成学习的网络问政平台留言文本挖掘与分析)

    目 录 第一章 引言 1.1挖掘背景 1.2挖掘意义 1.3问题描述 第二章 群众留言分类 2.1数据准备 2.1.1数据描述 2.1.2数据预处理 2.2特征提取 2.3建立模型 2.3.1卷积神经 ...

  10. 2022年第十四届华中杯数学建模A题解题思路附代码

    A 题 分拣系统优化问题         某电商公司配送中心的工作流程分为统计汇总.转运上架.按订单分拣.核对打包等 步骤.其中,分拣环节操作复杂,耗时较长,其效率是影响配送中心整体性能的关键因素. ...

最新文章

  1. NodeList 和 HTMLCollection
  2. 行业专业的移动广告聚合平台--KeyMob
  3. C# Color颜色对照表
  4. python加载模型包占用内存多大_加载pickle python对象会占用大量内存
  5. 那些不是秘密的微信earning方法
  6. 存款100万能退休了吗?
  7. 网络协议端口号说明(转)
  8. lol最克制诺手的英雄_LOL“英雄恐惧症”,当你上单遇到诺手时,你会用什么英雄对线...
  9. 微型计算机公众号,《互联网周刊》编辑推荐的40个微信公众号
  10. gtp怎么安装系统_UEFI+GTP模式下使用GHO文件安装Win8系统的具体操作方法
  11. 微软SQL Server BI认证专家QQ群36882826
  12. ArcGISPro通视分析之视线分析
  13. react报错解决 Rendered more fewer hooks than during the previous render
  14. DAY41:Cobalt Strike 工具使用
  15. 两招让你成为牛X的T型人才
  16. 查看Linux下的文件
  17. MISRA-C 2019
  18. 免费的聚合数据新闻头条API接口调用
  19. 亚马逊注册后,将账户改为个人账户的方法
  20. NMS by Representative Region: Towards Crowded Pedestrian Detection by Proposal Pairing论文笔记

热门文章

  1. 360n4刷android8.1,【从此,任何人都可以刷N4】关于系统降级===线刷方法,我也说两句吧。...
  2. STC宏晶单片机初始开发教程
  3. python批量转换图片格式_利用Python批量把PDF文件文件转换成图片格式
  4. select 默认选中问题
  5. 已知三角形顶点坐标,求其外接圆的公式
  6. 利用jszip压缩下载多文件
  7. python3GUI--浏览器By:PyQt5(附源码)
  8. 用户注册页面的再次确认密码的验证方式
  9. SAP生产模式和计划策略
  10. LARS算法---十折交叉验证