【Kaggle】Global Wheat Detection

news2024/9/24 1:17:08

代码链接

实验目的

  • 小麦来自世界各地。密度的小麦植株经常重叠;风会使得照片模糊;外观会因成熟度,颜色,基因型和头部方向而异。
  • 使用图像处理和目标检测完成小麦头的位置的标定。
  • 完成训练并现场验证后上传指定的输出文件进行验证评分。

实验环境

WIN10、pytorch、anaconda3+jupyter notebook、Kaggle官方服务器

实验过程

分析数据集的数据分布和特征

在这里插入图片描述

  • Test:包含22张的测试图片,不公开,用于评分。
  • Train:包含3400张的来自世界各地的小麦图像。
  • Train.csv:训练集的标签信息,第1列为图像id,第2、3列分别为图像宽高,第4列为标签框的左上角x、y轴坐标以及宽高,形如:b6ab77fd7,1024,1024,[834.0, 222.0, 56.0, 36.0]。
    • csv中的字段:

image_id - 唯一的图像 ID

width, height - 图像的宽度和高度

bbox - 一个边界框,格式化为 [xmin, ymin, width, height] 的 Python 样式列表。
在这里插入图片描述

  • 输出文件(形如下图):提交CSV文件, 第1列为图像id,第2列为标定信息字符串(信任值confidence用于排序计算指标顺序,左上角x、y轴坐标,目标框的宽高)。
    在这里插入图片描述

把数据拷下来命名文件夹为wheatdata:
在这里插入图片描述

读取内容:
在这里插入图片描述

训练数据大小:
在这里插入图片描述

Image_id的数量(不重复):
在这里插入图片描述

Train图片数量:
在这里插入图片描述

与文件描述一致,数据集没下错。

图片大小:
在这里插入图片描述

查看数据标注的分布:
在这里插入图片描述

一张图中标注数的范围为1-116。

相应的数据处理

这里写了一个读入图片的类WheatDataset。通过该类的初始化可以方便的读取图片。

类函数init:
在这里插入图片描述

赋值,分别为图片id、对应图片、图片地址和图片转换。

类函数getitem:

获取所有训练图像的标签,imgs_label_dict字典键、值分别为图像以及图像中小麦头对应的bounding box, 同一个图像中可能含有多个小麦头,因此键值为列表,每个元素格式为[xmin, ymin, width, height]
在这里插入图片描述

先是将图片id进行赋值,记录下对应的id是否对等,然后将图片通过地址读入,并进行图片的处理,具体原理如下图:
在这里插入图片描述

imshow是用来显示图片的,如

I = imread(‘XX’));

figure,imshow(I);

而有时为了数据处理,要把读取的图片信息转化为更高的精度,

I = double(imread(‘XX’));

为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0-1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。

有两个解决方法:

1> imshow(I/256); -----------将图像矩阵转化到0-1之间

2> imshow(I,[]); -----------自动调整数据的范围以便于显示.

从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些。

然后返回其他参数:
在这里插入图片描述

这里把bbox换成了x,y,w,h。试验更换结果如下:
在这里插入图片描述

Train与valid的transform转换定义函数:
在这里插入图片描述

训练集将图片一半旋转,一半不旋转;然后转换为tensor,并归一化至[0-1]。

测试集只将图片转换为tensor并归一化至[0-1]。

选择合适的模型进行训练

将数据集分为训练集与验证集,比例8:2。
在这里插入图片描述

创建train_data与valid_data:
在这里插入图片描述

这里选择的是faster R-CNN模型。直接创建一个Faster R-CNN预训练模型:
在这里插入图片描述

需要将模型调整至合适训练的大小,先输出模型最后一层看看:
在这里插入图片描述

可以看到,最后一层的线性层输出特征数量需要更改。将这层替换成输出特征大小为2:
在这里插入图片描述

再输出最后一层看看:
在这里插入图片描述

可以用了。

使用pytorch的dataloader进行训练模型:
在这里插入图片描述

含义:
在这里插入图片描述

创建参数:
在这里插入图片描述

使用的SGD进行回归。 步长设的0.005,动量设置的0.9,L2正则化项系数设为0.0005。

我的电脑用的是arm的显卡,所以只能用cpu进行训练。但实在是太慢了,最后使用的kaggle官方的服务器,使用 GPU 加速深度学习训练,特别快。

创建一个new notebook:
在这里插入图片描述

添加wheat-detection的数据集:
在这里插入图片描述

设置为GPU加速:
在这里插入图片描述

开始训练:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置的epoch为10,等一段时间可以看到训练结束。

画图查看损失函数loss:
在这里插入图片描述
在这里插入图片描述

最后保存模型:
在这里插入图片描述

可以在运行文件夹下看到保存的pth文件。

然后需要把pth文件导出来用来预测,如下:
在这里插入图片描述

只要输入上面的代码就会返回一个网址,点击网址就可以下载文件了。

这里找了两张图片看了看预测结果:
在这里插入图片描述
如下面这个:

在这里插入图片描述

还有这个:
在这里插入图片描述

甚至还有连一个都识别不出来的……还是很玄学。

验证测试集,提交输出文件

读入模型:
在这里插入图片描述

将已给的结果csv读入,用于进行预测比较。
在这里插入图片描述

定义test的模型定义:
在这里插入图片描述

设置test的模型:
在这里插入图片描述

使用dataloader进行测试网络配置:
在这里插入图片描述

进行预测模型载入:
在这里插入图片描述
在这里插入图片描述

开始预测:
在这里插入图片描述

通过图片看看预测结果:
在这里插入图片描述

对结果进行保存:
在这里插入图片描述
在这里插入图片描述

将最终的结果csv保存:
在这里插入图片描述

将该csv进行评分即可。

根据评判指标对输出进行评分

通过使用老师给的eval.py文件进行评分。

评分标准:

  • IoU(如右图上):预测框为蓝色,正确标定框为

橘黄色,IoU等于两个框交集面积与并集面积的

比值。

  • Threshold(阈值):表示标定命中的评判分界线,

如阈值为0.5时,IoU > 0.5则表示命中。

  • Precision(精度):真阳性(TP)为检测命中的目标(小麦头)的数目,假阳性(FP)为检

测未命中的目标的数目,假阴性(FN)为检测未命中的非目标的数目。

  • Average precision(平均精度如右图下):符合阈值条件下的上述精度下

计算得到单张图像的平均精度。

实验问题

1、IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/

首先很多博客说是jupyter的版本过低了,但是卸载再重装也不行:

pip uninstall jupyter

pip install jupyter

因为报错也说了可能和ipywidgets有关,就下载这个包后还是不行:

pip install ipywidgets

找出终极绝招,jupyer官方文档:https://ipywidgets.readthedocs.io/en/stable/user_install.html

就是说如果你的jupyter和你运行代码的kernel不是一个环境的话:
在这里插入图片描述

conda install -n base -c conda-forge widgetsnbextension

conda install -n py36 -c conda-forge ipywidgets

首先进入base环境运行:

conda install -c conda-forge widgetsnbextension

然后在自己的虚拟环境中运行(如虚拟环境名为myconda):

source activate myconda

conda install -c conda-forge ipywidgets

2、DataLoader worker (pid(s) 19728, 20240, 13828, 16776) exited unexpectedly

我所使用的CPU运行,最初是batchsize为10,同时使用4线程进行读取,此时会报错。

查阅网上的回答,说最可能的原因是:

  • cuda 虚拟环境的共享内存不足,解决办法是,要么改成更小的batchsize,
  • 将numworkers = 4注释掉,不用多进程。

解决过程:

1、只将batchsize改小,变为2,依旧报错

2、将进程num_workers=get_dataloader_workers()改为0、1、2可以使用

2、BrokenPipeError: [Errno 32] Broken pipe

原因:

在训练过程中,设置的num_workers过大
在这里插入图片描述

修改为 num_workers=0 即可。(后面用kaggle服务器就不需要修改了)

  • num_worker参数理解

下面作者讲的很详细,大致就是设置参数大的话,例如参数为10,就可以有10个线程来加载batch到内存。当然参数设置过大,而自己内存不够的情况下,就会出现线程管道破裂,即broken pipe ,所以一般默然设置为0.

当然:如果num_worker设为0,意味着每一轮迭代时,dataloader不再有自主加载数据到RAM这一步骤(因为没有worker了),而是在RAM中找batch,找不到时再加载相应的batch。缺点当然是速度更慢。

具体参考以下链接。

https://blog.csdn.net/qq_24407657/article/details/103992170

__3、UserWarning: torch.meshgrid: __in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at ..\aten\src\ATen\native\TensorShape.cpp:2157.) return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]

解决方法:

应该是torch版本不匹配。将return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]

修改为return _VF.meshgrid(tensors, **kwargs, indexing = ‘ij’) # type: ignore[attr-defined],警告解除。

4、Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

在Python中,使用 matplotlib 的函数:plt.imshow(ndarray) 将输入数组显示为彩色 ( RGB ) 图像时。而且,只在处理彩色图像时出现错误提示,显示为空白图像;处理灰度图像时函数运行正常、显示图像。

原因:

plt.imshow() 函数设置:

对于二维数组(灰度图像),函数会自动将输入数据归一化变换至[0,1],然后显示。

对于三维数组(彩色图像),plt.imshow() 函数并不会自动对输入数据归一化处理,而是对数据取值范围提出要求:如果是float型数据,取值范围应在[0,1];如果是int型数据,取值范围应在[0,255]。

我遇到的情况是:在之前的数据处理步骤有一些矩阵运算,数据类型变为 float64 型。输入二维数组(显示为灰度图像)时,因为函数会进行归一化处理,不受影响。输入三维数组(显示为彩色图像)时,就需要先转换到相应的数据类型和取值范围,才能在 plt.imshow() 函数中正常显示。

解决方法

方法一:plt.imshow(ndarray.astype(‘uint8’))

将 float 型数据截短转换成 uint8 型数据。

方法二:plt.imshow(ndarray/255)

将数据缩放到[0,1]。

本实验选择的是第二种方法。

5、使用评分py文件进行测试的时候,报错:
在这里插入图片描述

实验总结

这次实验感觉不是很偏向图像处理的方面了,而像使用机器学习进行图像的识别及训练,对基础的图像知识不需要太多的了解。不过也从这次实验,对机器学习及fast R-CNN模型有了更深层次的了解。也通过这次实验,了解了kaggle这个平台,用服务器真的方便很多,还不用配环境,以后有机会也会试着参加一下kaggle的比赛。本次课程也圆满的结束了,感谢老师。

参考网址

https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html

https://www.kaggle.com/c/global-wheat-detection

https://www.kaggle.com/code/pestipeti/pytorch-starter-fasterrcnn-train/notebook

https://www.kaggle.com/code/kaushal2896/global-wheat-detection-starter-eda/notebook

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据NiFi(三):NiFi关键特性

文章目录 NiFi关键特性 一、​​​​​​​​​​​​​​流管理

人工智能轨道交通行业周刊-第28期(2022.12.26-2023.1.1)

本期关键词:NOCC、车站闸机、雾闪、2022年度盘点、智慧园区 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通Rai…

安全—01day

DNS 域名解析过程: 1.浏览器首先查询浏览器的缓存,因为浏览器会按照一定的频率缓存 DNS 记录 2.若浏览器无缓存,那么查询操作系统的 HOST 文件,查询是否有 DNS 记录。 3.若还没有命中域名,就请求本地域名服务器该服务器一般都会缓…

Qt音视频开发07-合并音视频文件

一、前言 之前已经把音视频分开存储了对应的文件,因为这个需求特别少,当然确实有部分用户是需要把音视频分开存储,但是毕竟是很少数,绝大部分的用户都是音视频合并到一个MP4文件,所以如果要合并到一个文件&#xff0c…

二进制与十六进制的相互转换;按位操作:与() 和 或(|)

目录 一、二进制转换十六进制 二、十六进制转换二进制 三、按位操作:与(&) 和 或(|) 1、按位与(&)操作 2、按位或(|)操作 得出结论:清0用与&am…

【金猿案例展】海尔集团——追光AI-AOI赋能PCBA缺陷检测

‍数之联案例本项目案例由数之联投递并参与“数据猿年度金猿策划活动——《2022大数据产业年度创新服务企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业AOI(Automated Optical Inspection缩写)的中文全称是自动光学检测。通过…

className 还能这么用,你学会了吗

抛出问题 className大家都用过吧,用它在react项目中设置样式。它的用法很简单,除了可以设置一个样式外,react中也可以使用className引入多个类样式。 这次在写项目的时候,碰到一个非常小但是当时却一直解决不了的问题。后面在复…

python基础语法25-进程理论

一、简介 服务器为了能够同时为多个客户端服务,则需要能够同时处理多个网络连接的方法。python提供了3个主要的方法来实现这个目的,multiprocessing、threading和异步I/O。 今天主要说一下进程multiprocessing。 multiprocessing是一个和threading(多线程)类似的库,这个多…

【MVC和三层架构】联系、区别以及简单实践

MVC架构模式MVC架构模式概述引入MVCMVC和三层架构之间的联系和区别三层架构与MVC联系和区别银行转账小项目实践MVC架构模式概述 MVC架构模式是软件架构中的一个架构模式。 M(Model:数据/业务) V(View:视图/展示&#x…

深入xJavaFxTool的插件开发模式

背景 时光华丽丽的来到了2023年,首先在这里祝大家新年快乐,希望大家在新的一年里都能心想事成,万事如意,最重要的是身体健康。过去的2022年里,大家一定都是收获满满。不论是技术的,家庭的,事业的…

【C++】map 与 set 的介绍与使用

目录 一、关联式容器 二、键值对 三、set 3.1 set 的介绍 3.2 set 的使用 3.3. set 的使用举例 四、map 4.1 map的介绍 3.2 map 的使用 4.3 map的使用举例 五、经典练习题 1.set的使用 2.map的使用 思路一(稳定排序): 思路二(priority_queue)&#x…

LabVIEW使用共享变量在两台计算机之间进行通信

LabVIEW使用共享变量在两台计算机之间进行通信 需要选择一台计算机作为服务器并发布变量,而另一台计算机作为客户端接收变量。然后,按照以下步骤设置服务器和客户端计算机。 服务器机器: 创建LabVIEW项目并通过右键单击“我的电脑”并选择…

opencv-python常用函数解析及参数介绍(六)——图像梯度

图像梯度前言Sobel算子算子的定义Sobelx效果演示Sobely效果演示完整轮廓直接计算复杂图片的轮廓Scharr算子与laplacian算子scharr算子的定义laplacian算子定义三种算子的效果对比结尾前言 前面的文章中我们介绍了用膨胀和腐蚀得到了图像轮廓,图像梯度也是一种可以得…

五年六次

今天是 2022 年的最后一天,可算等来了。讽刺的是,就在昨天,小号写了篇文章,啥主题就不说了,然后晚上文章被删了,账号居然也被封了。2022 全年虽然我写过很多文章都被和谐了,但是最后一天喜提封号…

二、Django

Django 提示:本文根据b站黑马python课整理 链接指引 > 黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》 文章目录DjangoMVT图解项目准备1.创建项目2.创建应用3.更换python解释器4.安装应用5.本地化6.项目中匹配urls7.应用中匹配urls.py8.准备视图…

Tensorflow游乐场 在线可视化

playground.tensorflow.org Tensorflow游乐场 Tensorflow游乐场提供了一个在线可视化AI训练。A Neural Network Playgroundhttp://playground.tensorflow.org/ Tensorflow游乐场 是干啥的呢 给一堆点分出蓝色部分和橙色部分。也就是二分类。 它提供了4种数据来训练 每种数据…

致敬客户、致敬行业,知道创宇2022“宇”你并肩前行!

2022回首2022,一幅数字化、智能化升级的壮阔云图徐徐展开,顺势催生出安全技术的全新变革……这一年,中国网络安全企业代表——知道创宇,持续从技术创新、安全服务、行业融合等方面深入网络安全产业升级。我们坚守攻防博弈战场、纵…

burp suite爆破sqli-labs的 less-5

一. 使用proxy抓包,具体数据包如下图: 二. 鼠标右键,将其发送到 intruder中,具体如下图: 三.选择下图选项卡: 1.默认为sniper模式,即如果有多个变量,对每个变量依次进行破解&#xf…

【 shell 编程 】第3篇 循环

循环 文章目录循环一、for 循环1.for 语法结构二、while、until 循环1.while 语法结构2.until 语法结构三、expect一、for 循环 1.for 语法结构 for 变量名 [ in 取值列表 ] do 循环体 done例子1 需求:自动循环创建10个用户 #!/bin/bash read -p &quo…

【C++常用容器】STL基础语法学习set容器

目录 ●set构造和赋值 ●set大小和交换 ●set插入和删除 ●set查找和统计 ●set排序(改变其排序规则,仿函数的运用) ●set和multiset 1.对组(pair)的创建 2.set的验证(不可以重复插入数据&#xff…