玩一玩yolov5 自己训练模型识别马克杯

news/2024/11/15 7:10:49/文章来源:https://www.cnblogs.com/abyssdawn/p/18299305

python 虚拟环境搭建

conda create -n yolo python==3.8

yolov5下载

git clone https://github.com/ultralytics/yolov5
cd yolov5
activate yolo
pip install -r requirements.txt

准备数据集

官方介绍:https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data

建立文件夹

  • yolov5/yolo_A/images - 存放样本图片
  • yolov5/yolo_A/labels - 存储标注信息
  • yolov5/yolo_A/A.yaml - 存放一些目录信息和标志物分类。

这里注意,Ultralytics推荐的数据集结构是这样的

datasets
├── images
│   ├── train
│      ├── 00001.jpg
│      ├── ...
│   ├── val
│   ├── test
├── labels
│   ├── train
│      ├── 00001.txt
│      ├── ...
│   ├── val
│   ├── test
├── data.yaml

这里面是一个数据集文件夹,包含imageslabels两个文件夹和一个data.yaml配置文件:

  • images文件夹放图像,labels文件夹放标注文件,图像和标注文件的名称要一一对应
  • imageslabels文件夹下分别放train、val、test三个子文件夹,作为训练集、验证集和测试集
  • data.yaml的格式如下:
path:  path/to/datasets # 这里填写你数据集所在的绝对路径
train: images/train
val: images/train
test: images/test# 标签和对应的类别
names:0: cat1: dog

这里只是为了测试,就不按这个标准来了。

这次测试的检测马克杯的图片,我采集了50张马克杯的样本,放到images文件夹下。

素材来源:https://pixabay.com/

爬取素材的python脚本。脚本由AI提供:https://mgb.abyssdawn.com/#/experiments/chat

import os
import requestsapi_key = "YOUR_PIXABAY_API_KEY"
search_url = f"https://pixabay.com/api/?key={api_key}&q=马克杯&image_type=photo&per_page=50&lang=zh"proxies = {'http': 'http://127.0.0.1:7890','https': 'http://127.0.0.1:7890',
}
response = requests.get(search_url, proxies=proxies)
response.raise_for_status()
search_results = response.json()if not os.path.exists('images'):os.makedirs('images')for i, img in enumerate(search_results["hits"]):try:img_url = img["webformatURL"]img_response = requests.get(img_url, proxies=proxies)img_response.raise_for_status()with open(f"images/mug_{i + 1}.jpg", 'wb') as f:f.write(img_response.content)print(f"Downloaded mug_{i + 1}.jpg")except Exception as e:print(f"Could not download image {i + 1}: {e}")print("Done downloading images.")

运行脚本下载图片

2024-07-12T07:50:08.png

标记数据集

接下来我们就要进行图片的标注工作了,图片标注我们用到了一个名为labelimg的工具:https://github.com/tzutalin/labelImg

下载解压之后,首先要做的是删除labelImg-master\data\predefined_classes.txt文件中的内容,不然等会标记的时候会自动添加一些奇怪的类别。

删除后填入mug

然后在labelImg-master文件夹下打开cmd,进入我们的yolo环境中,然后我们还需要在yolo环境中安装一些labelimg运行需要的依赖,依次输入

conda install pyqt=5
conda install -c anaconda lxml
pyrcc5 -o libs/resources.py resources.qrc

现在,我们已经在yolo环境中安装好labelimg的依赖环境了,输入

python labelimg.py

即可进入我们的界面中来。

如果出现TypeError: expected str, bytes or os.PathLike object, not NoneType Aborted (core dumped)错误,可通过如下方法解决:

I resolved this problem by changing line 1309 to "self.show_bounding_box_from_annotation_file(str(self.file_path))" to force it to a string.

解决方法参考:https://github.com/HumanSignal/labelImg/issues/917#issuecomment-1225812830

进入之后,首先我们先把一些选项勾上,便于我们标记。

2024-07-12T08:03:29.png

之后我们点击Open dir选择我们图片所在的images文件夹,选择之后会弹窗让你选择labels所在的文件夹。当然如果选错了,也可以点change save dir进行修改。

然后软件右上角我们打开这个选项,当我们标记图片后,就会自动帮我们归类到mug

2024-07-12T08:16:22.png

现在我们就可以开始进行标记了,常用的快捷键,用主要wad三个键

Ctrl + u	Load all of the images from a directory
Ctrl + r	Change the default annotation target dir
Ctrl + s	Save
Ctrl + d	Copy the current label and rect box
Ctrl + Shift + d	Delete the current image
Space	Flag the current image as verified
w	Create a rect box
d	Next image
a	Previous image
del	Delete the selected rect box
Ctrl++	Zoom in
Ctrl--	Zoom out
↑→↓← | Keyboard arrows to move selected rect box

通过鼠标拖拽框选即可标注:

2024-07-12T08:20:51.png

所有图片标注好之后,关闭软件,再来看我们的labels文件夹,可以看到很多xml文件。每个文件都对应着我们标记的类别和框的位置:

2024-07-12T08:32:09.png

最后编辑A.yaml文件,文件里面内容如下,其中train和val都是我们images的目录,labels的目录不用写进去,会自动识别。nc代表识别物体的种类数目,names代表种类名称,如果多个物体种类识别的话,可以自行增加。

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../yolo_A/images/
val: ../yolo_A/images/
# number of classes
nc: 1# class names
names: ['mug']

到目前,我们的训练的材料就已经准备好了。

yolov5模型训练

直接运行

python train.py --img 640 --batch 50 --epochs 100 --data ./yolo_A/A.yaml --weights yolov5s.pt --nosave -cache

2024-07-12T08:39:24.png

运行的时候报错

AssertionError: train: No labels found in D:\TempD\Python\YOLOLearn\yolo_A\labels.cache, can not start training. See https://docs.ultralytics.com/yolov5/tutorials/train_custom_data

排查发现是格式问题,需要把labimg生成的xml转换成yolov5支持的.txt格式

转换脚本(AI提供)

import os
import xml.etree.ElementTree as ET# 目录路径
input_dir = './yolo_A/labels/'
output_dir = './yolo_A/labels_yolov5/'# 创建输出目录(如果不存在)
if not os.path.exists(output_dir):os.makedirs(output_dir)def convert_to_yolov5_format(xml_file, output_file):tree = ET.parse(xml_file)root = tree.getroot()size = root.find('size')width = int(size.find('width').text)height = int(size.find('height').text)with open(output_file, 'w') as f:for obj in root.findall('object'):name = obj.find('name').textclass_id = get_class_id(name)  # 根据需要实现这个函数映射类别到IDbndbox = obj.find('bndbox')xmin = float(bndbox.find('xmin').text)ymin = float(bndbox.find('ymin').text)xmax = float(bndbox.find('xmax').text)ymax = float(bndbox.find('ymax').text)# 转换成YOLOv5的格式 (class_id, x_center, y_center, width, height)x_center = (xmin + xmax) / 2 / widthy_center = (ymin + ymax) / 2 / heightbbox_width = (xmax - xmin) / widthbbox_height = (ymax - ymin) / heightf.write(f"{class_id} {x_center:.6f} {y_center:.6f} {bbox_width:.6f} {bbox_height:.6f}\n")def get_class_id(class_name):# 映射类别名称到类别ID,请根据实际情况修改classes = {'mug': 0}  # 示例类映射return classes[class_name]# 遍历输入目录中的所有XML文件并进行转换
for filename in os.listdir(input_dir):if filename.endswith('.xml'):xml_file = os.path.join(input_dir, filename)txt_filename = filename.replace('.xml', '.txt')output_file = os.path.join(output_dir, txt_filename)convert_to_yolov5_format(xml_file, output_file)print("转换完成!")

转换完成后再次运行命令。

发现跑的很慢,这里我该为使用gpu运行,重新安装torch:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

安装命令:https://pytorch.org/get-started/locally/

训练完成后,我们可以看到训练结果保存的位置

2024-07-12T09:32:13.png

现在我们用训练出来的结果找一张网图做测试(文件名和导出预测文件地址不一定相同,但是相似,大家自行寻找)

python detect.py --weights runs\train\exp6\weights\last.pt --img 640 --conf 0.25 --source C:\Users\admin\Downloads\OIP-C.jpg

好了,基本上就完成了。接下来为了提高识别的精确度还需要继续学习yolov5的实现原理和相关参数的设定技巧。

2024-07-12T11:47:19.png

Gradio推理Demo-app.py

import gradio as gr
import torchmodel = torch.hub.load("./", "custom", path="runs/train/exp6/weights/last.pt", source="local")def predict_image(img, conf_threshold, iou_threshold):model.conf = conf_thresholdmodel.iou = iou_thresholdreturn model(img).render()[0]# 定义 Gradio 接口
demo = gr.Interface(fn=predict_image,inputs=[gr.Image(type="pil", label="Upload Image"),gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold"),gr.Slider(minimum=0, maximum=1, value=0.45, label="IoU threshold"),],outputs=gr.Image(type="pil", label="Result"),title="马克杯检测Demo",description="传一张带有马克杯的图像来进行推理。",
)# 启动 Gradio 应用
if __name__ == "__main__":demo.launch()

运行后点开链接,出现马克杯检测的Demo网页:

2024-07-12T12:01:21.png

效果很完美!如果有帮助,请点个赞和收藏吧~

参考

  • https://blog.csdn.net/qq_45701791/article/details/113992622
  • https://juejin.cn/post/7373859431081197579
  • https://blog.csdn.net/weixin_68922189/article/details/134448330
  • https://juejin.cn/post/7373859431081197579

破晓魔王(https://blog.abyssdawn.com/archives/381.html)

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

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

相关文章

web渗透——信息收集

切记:未经授权,禁止对任何网站进行渗透测试whois查询 常用网址: 爱站:https://www.aizhan.com/ 站长之家:https://whois.chinaz.com/ bugscaner:http://whois.bugscaner.com/ 端口扫描 常用工具: Nmap工具Masscan CMS识别 常用网址: TideFinger潮汐:http://finger.tides…

记一次处理挖矿程序xmrig的过程

现象 挖矿xmrig占用100%CPU处理过程 kill掉进程,后会立即启动# kill pid # kill 14527通过pid找到病毒文件地址 # ls -l /proc/PID/exe找到病毒文件夹目录为 /root/c3pool使用rm删除文件会报权限错误 使用lsattr查看隐藏权限为e表示可以追加 # lsattr miner.sh -------------…

Algorithm notes and references

Algorithm notes and references Version:2024/02/03 Data Structure 1. Segment Tree Beats (segb) from 题解 P4314 【CPU监控】 - He_Ren 的博客 - 洛谷博客 (luogu.com.cn) lazy tag 实际上可以看作是对于该节点表示的区间的操作序列,这也是线段树的精髓所在 push_down 操…

浅谈HTTP中Get与Post的区别

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有…

ExtJS中layout的12种布局风格

extjs的容器组件都可以设置它的显示风格,它的有效值有 absolute, accordion, anchor, border, card, column, fit, form and table. 一共9种。 另外几种见: http://www.sencha.com/deploy/dev/examples/layout-browser/layout-browser.html 里面有详细的例子。 absolute …

extjs中treepanel例子

:TreePanel继承自Panel,在ExtJS中使用树控件含有丰富的属性和方法实现复杂的功能。其中Ext.tree.TreeNode代表一个树节点,比较常用的属性包括text、id、icon、checked等、异步树Ext.tree.AsyncTreeNode、树加载器Ext.tree.TreeLoader。下面介绍几个extjs中treepanel例子一、…

全球单体容量最大漂浮式风电平台“明阳天成号”正式亮相

7月12日,全球单体容量最大的16.6MW漂浮式风电平台“明阳天成号”启航仪式在中船黄埔文冲造船厂举办,中山市委书记、市人大常委会主任郭文海主礼启航仪式。“明阳天成号”于7月3日完成吊装,经过各项调试准备工作后正式亮相,并将择日拖航至广东阳江海域。据测算,“明阳天成号…

从程序员的角度来看为什么我们需要工作流

每一个程序员,在接触到工作流的时候,都会有这么一个疑问——我用一般的方法可以实现,为什么还要用工作流?我曾经也问过这个问题,不过现在稍微有点明白了。别着急要答案,看过下面的例子,或许你也就明白一些了。这是一个简单的业务——订货流程:客户提交采购订单 业务员执…

003_python3 解释器 注释 运算符

Python3 解释器 1.Linux设置环境变量 $ PATH=$PATH:/usr/local/python3/bin/python3 # 设置环境变量 2.交互式编程 $ python # 启动Python解释器 3.脚本式编程 Windows中写入脚本xx.py文件,执行 python xx.py # cmd 当中直接执行 Linux中文件顶部写入 #! /usr/bin/env py…

2024暑假集训测试4

前言比赛链接这次和高中一起打的,排名一次比一次低了,差点出前一半了…… 主要是 T1 \(dijkstra\) 唐氏复杂度打假了,T2 挂分,T3 没想出来压位,T4 题都没看。 T1 最短路原题:luogu P2966 [USACO09DEC] Cow Toll Paths G。本题考察对 \(Floyed\) 的理解,\(Floyed\) 数组在…

Bootstrap图片样式使用方法

在Bootstrap中自带了几种图片样式,能够让你很快地对其进行使用,这几种样式使用起来相当简单,让我们一起来看看怎么快速调用Bootstrap图片样式。Bootstrap图片圆角样式 在现今的网站建设中,由于扁平化设计的趋势,我们经常会用用到一些CSS3的特性,例如圆角、渐变、阴影等。…

SQL中“ ` ”的作用是什么?

避免和 mysql 的本身的关键字 冲突 所以 用这个符号括起来 虽然有时候不影响 查询 但是最好是要 加上的