【Intel oneAPI实战】使用英特尔套件解决杂草-农作物检测分类的视觉问题

news/发布时间2024/5/15 4:10:26

目录

  • 一、简介:计算机视觉挑战——检测并清除杂草
  • 二、基于YOLO的杂草-农作物检测分类
    • 2.1、YOLO简介
    • 2.2、基于YOLO的杂草-农作物检测分类解决方案
  • 三、基于YOLO的杂草-农作物检测分类系统设计
    • 3.1、基于flask框架的demo应用程序后端
    • 3.2、基于Vue框架的demo应用程序前端
  • 四、Intel oneAPI工具包使用
  • 五、后续待完善的部分

科技是人类历史发展最具革命性的关键力量,而科技创新将是赢得未来发展主动权的必然选择。

如今,新一轮科技革命和产业革命正蓬勃兴起。它不再是单一科学领域、技术领域的突破,而是在信息技术、人工智能、新能源、新材料、生物医药等多领域、多赛道竞相迸发。

在这里插入图片描述

前段时间,我荣幸参加了英特尔和C站官方联合举办的[oneAPI的人工智能黑客松活动,并且第一次使用英特尔的官方套件来解决了杂草-农作物检测分类的问题,本篇博客将分享下解决方案和心得体会。

一、简介:计算机视觉挑战——检测并清除杂草

在这里插入图片描述

杂草是农业经营中不受欢迎的入侵者,它们通过窃取营养、水、土地和其他关键资源来破坏种植,这些入侵者会导致产量下降和资源部署效率低下。一种已知的方法是使用杀虫剂来清除杂草,但杀虫剂会给人类带来健康风险。

参赛者需运用英特尔® oneAPI AI分析工具包构建一个模型。该模型可以自动检测杂草的存在,并在杂草上而不是在作物上喷洒农药,同时使用针对性的修复技术将其从田地中清除,从而最小化杂草对环境的负面影响。

二、基于YOLO的杂草-农作物检测分类

2.1、YOLO简介

YOLO是一种基于深度学习的目标检测算法,全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。由Joseph Redmon等人于2016年提出。相比于传统的目标检测算法,如RCNNFast RCNNFaster RCNN等,YOLO算法具有更快的检测速度和更高的准确率,因此在目标检测领域得到了广泛的应用。
在这里插入图片描述

因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region

也就是说,一个典型的Region-base方法的流程是这样的:先通过计算机图形学(或者深度学习)的方法,对图片进行分析,找出若干个可能存在物体的区域,将这些区域裁剪下来,放入一个图片分类器中,由分类器分类。

YOLO算法的核心思想是将目标检测问题转化为一个回归问题,即通过一个神经网络直接预测目标的类别和位置。具体来说,YOLO算法将输入图像分成S×S个网格,每个网格预测B个边界框和每个边界框的置信度和类别概率。在预测时,YOLO算法将每个边界框的置信度和类别概率相乘,得到每个边界框的最终得分,然后根据得分进行非极大值抑制,得到最终的目标检测结果。

YOLO算法的优点在于它可以在一个神经网络中同时完成目标检测和分类,而且检测速度非常快,可以达到实时检测的要求。此外,YOLO算法还可以处理多个目标的检测,而且对于小目标的检测效果也比较好。

2.2、基于YOLO的杂草-农作物检测分类解决方案

基于YOLO,可以设计一种杂草-农作物的分类解决方案,具体来说,基于YOLO的杂草-农作物分类解决方案包括以下几个步骤:

  1. 数据采集和处理。首先,需要采集大量的杂草和农作物的图像数据,并对这些数据进行处理和标注,以便后续的模型训练和测试。
  2. 模型训练和测试。在进行杂草-农作物的分类时,需要使用YOLO算法来训练分类模型,并对模型进行测试和评估,以确定其准确率和鲁棒性。
  3. 应用和优化。在进行杂草-农作物的分类时,需要将训练好的模型应用到实际场景中,并优化精度和速度。

数据采集部分:赛道主办方已经为我们准备好了杂草-农作物数据集:https://filerepo.idzcn.com/hack2023/Weed_Detection5a431d7.zip

每张图片还包括一个指示类别和标记框的txt,其中第一个数值表示分类,0表示农作物,1表示杂草,如下所示:

在这里插入图片描述
在这里插入图片描述

模型的训练部分:我们参考ravirajsinh45大佬的代码作为baseline,这是一个深度学习模型Darknet,其中包含了多个卷积层、上采样层、shortcut层、route层和yolo层。其中,卷积层用于提取特征,上采样层用于将特征图的尺寸扩大,shortcut层用于实现跨层连接,route层用于将多个层的特征图拼接在一起,yolo层用于目标检测。模型的前向传播过程中,根据不同的层类型,对输入进行相应的处理,最终输出目标检测结果。模型的参数可以通过load_weights函数加载预训练的权重。

将赛题方提供的数据集导入其中,并进行简单配置,进行训练。

应用和优化:在训练成功后,我们将模型使用后端flask框架部署到服务器中,并写一个前端demo部署到客户端,模拟实际应用场景。

三、基于YOLO的杂草-农作物检测分类系统设计

3.1、基于flask框架的demo应用程序后端

后台需要设计两种功能,一种是上传图片,一种是分析图片

  • /upload:用于上传文件,接收 POST 请求,从请求中获取上传的文件,保存到服务器的 upload 目录下,并返回上传成功的信息。
  • /analyze:用于分析上传的图片,接收 POST 请求,调用 detection 函数(detection函数为调用之前训练好的模型)对上传的图片进行分析,将结果保存为 PNG 图像,并将 PNG 图像转换为 Base64 编码,最后将分析结果和 Base64 编码作为 JSON 格式的响应返回给客户端。

if __name__ == '__main__': 语句中,使用 app.run() 启动 Flask 应用程序,监听本地的 3031 端口,等待客户端的请求。

将其设计如下:

@app.route('/upload', methods=['POST'])
def upload():# 获取上传的文件if 'file' not in request.files:return '请选择文件'file = request.files['file']# 保存文件file.save('upload/'+'image.jpeg')# 返回成功信息return '文件上传成功'@app.route('/analyze', methods=['POST'])
def analyze():res_cls_name, res_cls_conf = detection('upload/image.jpeg')# 打开结果PNG图像with open('result.png', 'rb') as f:image_data = f.read()# 将PNG图像转换为Base64编码base64_data = base64.b64encode(image_data).decode('utf-8')print(res_cls_name)print(res_cls_conf)response = {'message': 'File uploaded successfully','res_cls_name': res_cls_name,'res_cls_conf': str(res_cls_conf.item()),'base64_data' : base64_data}return json.dumps(response), 200if __name__ == '__main__':app.run(host='0.0.0.0', port=3031)

3.2、基于Vue框架的demo应用程序前端

构建一个基于 Vue.js 框架的前端页面,使用 Element Plus 组件库中的 el-upload 组件进行图片上传,分析结果会显示在页面的下侧,包括图片的分类名称、可信度和图片本身。其中,分类名称和可信度是通过调用后端 API 获取的,图片则是通过将后端返回的 Base64 编码转换为图片显示出来的,运行效果如下

在这里插入图片描述

运行效果:

运行后:

在这里插入图片描述

部分核心代码如下:

<template><div class="content-main"><h1>Crop And Weed Detection</h1><el-uploadref="upload"class="upload-demo"action="/api/upload":on-preview="handlePreview":on-remove="handleRemove":on-exceed="handleExceed"list-type="picture":limit=1><template #trigger><el-button type="primary">select file</el-button></template><!-- <el-button type="primary">Click to upload</el-button> --><el-button type="success" :onclick="analyze">Click to Analyze</el-button><template #tip><div class="el-upload__tip">Only one image with a size less than 500kb can be uploaded at a time.</div><div class="el-upload__tip">Click to Analyze and wait for a while.</div></template></el-upload></div><div class="content-result"><div><h1>判断结果</h1></div><div><p>{{ "该图像为:" + classname }}</p></div><div><p>{{ "可信度为:" + classconf }}</p></div><el-image style="width: 600px" :src="'data:image/png;base64,'+ classurl"/></div></template><script lang="ts" setup>
import { ref } from 'vue'
import { analyzeApi } from '../api/analyzeApi';
import { genFileId } from 'element-plus'
import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'const upload = ref<UploadInstance>()let classname = ref("Waiting Analyze");
let classconf = ref("Waiting Analyze");
let classurl = ref();const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => {console.log(uploadFile, uploadFiles)classname.value = "Waiting Analyze";classconf.value = "Waiting Analyze";classurl.value = "";}
const handleExceed: UploadProps['onExceed'] = (files) => {upload.value!.clearFiles()const file = files[0] as UploadRawFilefile.uid = genFileId()upload.value!.handleStart(file)upload.value!.submit()classname.value = "Waiting Analyze";classconf.value = "Waiting Analyze";classurl.value = "";
}
const handlePreview: UploadProps['onPreview'] = (file) => {console.log(file)
}const analyze = (): number => {analyzeApi().then(function (result) {console.log(result.data);classname.value = result.data.res_cls_name;classconf.value = result.data.res_cls_conf;classurl.value = result.data.base64_data;});return 0;
} 
</script>

四、Intel oneAPI工具包使用

在算法实现过程中,我们使用到了oneAPI工具包,
在这里插入图片描述

英特尔相关软件具体使用如下:

  • Intel Optimization for PyTorch:使用到了英特尔优化过的PyTorch深度学习框架,以最少的代码更改应用 PyTorch 中尚未应用的最新性能优化,并自动混合 float32bfloat16 之间的运算符数据类型精度,以减少计算工作量和模型大小。
  • Interl Nerual Compressor:使用Nerual Compressor自动执行流行的模型压缩技术,例如跨多个深度学习框架的量化、修剪和知识蒸馏。并通过自动精度驱动的调优策略快速收敛量化模型

在这里插入图片描述
检测部分的代码如下:

import torch
import torch.nn as nn
import intel_extension_for_pytorch as ipex
import numpy as np
import cv2# 设置设备为GPU
device = torch.device("gpu")# 使用 Intel PyTorch 扩展库优化模型
ipex.enable_auto_dnnl()# 加载 YOLO 模型
model = ...  # YOLO 模型的加载代码,此处省略
model = model.to(device)
model.eval()# 定义 COCO 类别标签
classes = [...]  # ,此处省略# 加载图像
image_path = "test.jpg"  # 替换为自己的图像路径
image = cv2.imread(image_path)# 预处理图像
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (416, 416))
image = np.transpose(image, (2, 0, 1))
image = image.astype(np.float32) / 255.0
image = torch.from_numpy(image).unsqueeze(0).to(device)# 执行目标检测
with torch.no_grad():detections = model(image)# 后处理检测结果
# 此处省略

模型优化部分代码:

from neural_compressor.experimental import Quantization
quantizer = Quantization("./conf.yaml")
quantizer.model = model
quantizer.calib_dataloader = test_loader
quantizer.eval_dataloader = test_loader
q_model = quantizer()
q_model.save('./output')

在其中,Intel PyTorch 扩展库被用于优化模型的性能,通过ipex.enable_auto_dnnl()导入 Intel PyTorch 扩展库并启用了自动 DNNL(Deep Neural Network Library)优化可以帮助我们更高效地进行深度学习模型的训练和推理,提高模型的性能和效率。 Intel Neural Compressor 被使用来对模型进行量化,减小模型的大小并提高在低功耗设备上的推理速度,同时保持相对较高的准确率

同时,也可以帮助我们减少模型的大小和计算工作量,从而更好地适应不同的硬件和场景需求。

五、后续待完善的部分

系统集成:原型中只实现了模型训练和测试的基本功能,未能实现完整的系统集成。计划通过系统集成技术,将模型集成到完整的杂草检测系统中,实现端到端的杂草检测功能。

模型优化:原型中使用的模型精度和推理速度还有提升空间。计划继续深入学习Interl Optimization for PyTorch,优化模型计算工作量和模型大小,并继续深入学习Interl Nerual Compressor提高在 CPU 或 GPU 上部署的深度学习推理的速度

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

如若内容造成侵权/违法违规/事实不符,请联系编程老四网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

iOS App冷启动优化:Before Main阶段

iOS应用冷启动时&#xff0c;在 UIApplicationMain(argc, argv, nil, appDelegateClassName)方法执行前&#xff0c;主要经历以下阶段&#xff1a; 1. 执行exec&#xff08;&#xff09;启动应用程序进程 2. 加载可执行文件&#xff0c;即将应用程序的Mach-O文件加载到内存…

【Unity】实现从Excel读取数据制作年份选择器

效果预览&#xff1a; 此处利用Excel来读取数据来制作年份选择器&#xff0c;具体步骤如下。 如果只是制作年份选择器可以参考我这篇文章&#xff1a;构建简单实用的年份选择器&#xff08;简单原理示范&#xff09; 目录 效果预览&#xff1a; 一、 Excel准备与存放 1.1 …

【MATLAB GUI】 5. 图像处理菜单(菜单编辑器)

看B站up主freexyn的freexyn编程实例视频教程系列36Matlab GUI的学习笔记 任务要求设计一个图像处理菜单&#xff0c;实现图像的打开导入、灰度处理、存储等功能 修改过文件名&#xff0c;所以运行的时候会有一点点报错&#xff0c;但是不影响运行 打开工具栏下边的菜单编辑器…

Python的报错类型

在编写python代码时&#xff0c;当不当使用时&#xff0c;python会给出错误提示&#xff0c;常见的错误类型有如下几种&#xff1a; 1.TpyeError类型错误 ① 传入的参数数量不对&#xff1a;如调abs()有且仅有1个参数&#xff0c;但给出了两个时&#xff0c;python会给出提示…

pwa应用打开自动跳转到某个网页网址,并且全屏不显示网址url,就像这个网页也具备了pwa功能

问题描述 如果是只要在同一个域名下配置了pwa功能&#xff0c;那么当从桌面上打开这个pwa软件时&#xff0c;就会像真正的app运行一样&#xff0c;全屏显示&#xff0c;并且不显示网址的&#xff0c;但是如果要动态配置打开pwa时动态加载不同的网址&#xff0c;使用 window.lo…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Recolor)

Recolor&#xff0c;顾名思义就是重上色的意思&#xff0c;很明显能想到的用法就是老照片上色&#xff0c;也就是老照片修复&#xff0c;看下效果吧&#xff08;左边为老旧照片&#xff0c;右边为重上色效果&#xff09;&#xff1a; 当然除了这种玩法&#xff0c;也可以局部修…

Vue3列表触底请求(上手体验hooks新特性)

今天我们来聊一聊业务开发中的触底请求&#xff0c;其实就是分页的一种&#xff0c;只不过传统的分页感觉很丑而已&#xff0c;正好我的小博客最近在做触底分页&#xff0c;借此机会来说一说具体怎么实现的&#xff0c;以及来带领大家使用一下Vue3中的新特性hooks函数。 案例和…

unity Android包安装运行后提示:此要用与最新版Android不兼容。

问题 unity 打包apk&#xff0c;安装运行后提示**“此要用与最新版Android不兼容。…” 解决办法 参考文献 https://blog.csdn.net/liweidecsdn/article/details/135997780

如何将实景三维倾斜模型叠加到三维地球上?

​ 通过以下方法可以将实景三维倾斜模型叠加到三维地球上。 方法/步骤 下载三维地图浏览器 http://www.geosaas.com/download/map3dbrowser.exe&#xff0c;安装完成后桌面上出现”三维地图浏览器“图标。 2、双击桌面图标打开”三维地图浏览器“ 3、点击“倾斜模型”…

JS api基础初学

轮播图随机版 需求&#xff1a;当我们刷新页面&#xff0c;页面中的轮播图会显示不同图片以及样式 分析&#xff1a;①&#xff1a;准备一个数组对象&#xff0c;里面包含详细信息&#xff08;素材包含&#xff09; ②&#xff1a;随机选择一个数字&#xff0c;选出数组对应…

Java项目:30 基于SpringBoot自习室座位预定系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 功能设计 管理员 1、用户管理 管理员可以新增、删除管理员 管理员可以删除学生 2、自习室管理 管理员可以新增自习室、设置自习室的座位数量、开…

lnmp安装

一、安装lnmp 第一步&#xff1a;将MySQL 、论坛的安装包拖进shell 环境准备 lnmp 需要 安装 nginx mysql php 软件 第二步&#xff1a;解压nginx&#xff0c;再安装依赖包&#xff08;注意装在源配置文件下&#xff09;&#xff0c;关闭防火墙 systemctl disable --now fir…

map和set的简单介绍

由于博主的能力有限&#xff0c;所以为了方便大家对于map和set的学习&#xff0c;我放一个官方的map和set的链接供大家参考&#xff1a; https://cplusplus.com/ 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque&#x…

Redis 在 Linux 系统下安装部署的两种方式详细说明

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 Redis安装和配置 1、首先在官网下载好redis-6.0.9.tar.gzhttp://redis.io/ 或者使用 wget 命令下载&#xff1a;wget http://download.redis.io/releases/redis-6.0.9.tar.gz 2、下载使用上传到阿里…

【小沐学QT】QT学习之信号槽使用

文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法2.7 QSignalMapper方法 结语 1、简介 在GUI编程中&#xff0c;当我们更改一个小部件时&#xff0c;我们通常希望…

[SpringDataMongodb开发游戏服务器实战]

背景&#xff1a; xdb其实足够完美了&#xff0c;现在回想一下&#xff0c;觉得有点复杂&#xff0c;我们不应该绑定语言&#xff0c;最好有自己的架构思路。 七号堡垒作为成功的商业项目&#xff0c;告诉我&#xff1a;其实数据是多读少写的&#xff0c;有修改的时候直接改库也…

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

前端 基础标签

!回车在vscode中可以生成简单的代码模板 注释 ctrl/ <h1></h1> 类似的数字越大字体越小 <p></p>表示一个段落 注:这里的回车会被解析成空格 <br> 单标签 表示换行 格式化标签 加粗标签 <strong></strong> <b></b> …

常用对象的遍历方法

var obj [{name: 1111,account: {01: { name: 1.1 },02: { name: 1.2 },03: { name: 1.3 },04: { name: 1.4 },05: { name: 1.5 },}} ]var nowObj obj[0].account;1、for…in 任意顺序遍历对象所有的可枚举属性&#xff08;包括对象自身的和继承的可枚举属性&#xff0c;不含…

前端-Vue3递归组件自定义Tree

需求 PS&#xff1a;写在前面&#xff0c;需求想要一个Tree 形结构展示当前的组织机构&#xff0c;最末层节点可以选择&#xff0c;层级明确。第一选择网上npm官网或者github 找找成型的东西 element-ui Tree 没有组织结构线js-tree 好看&#xff0c;但是适配Vue3 有点费劲&a…
推荐文章