首页 > 其他分享 >玩一玩yolov5 自己训练模型识别马克杯

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

时间:2024-07-12 20:09:43浏览次数:17  
标签:马克杯 yolov5 -- yolo train https images 玩一玩

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: cat
  1: dog

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

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

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

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

import os
import requests

api_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').text
            class_id = get_class_id(name)  # 根据需要实现这个函数映射类别到ID
            bndbox = 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 / width
            y_center = (ymin + ymax) / 2 / height
            bbox_width = (xmax - xmin) / width
            bbox_height = (ymax - ymin) / height

            f.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 torch

model = torch.hub.load("./", "custom", path="runs/train/exp6/weights/last.pt", source="local")


def predict_image(img, conf_threshold, iou_threshold):
    model.conf = conf_threshold
    model.iou = iou_threshold
    return 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.abyssdawn.com/archives/381.html)

标签:马克杯,yolov5,--,yolo,train,https,images,玩一玩
From: https://www.cnblogs.com/abyssdawn/p/18299305

相关文章

  • 施工现场不戴安全帽抓拍 YOLOv5
    施工现场不戴安全帽抓拍利用现场已经有的摄像头,施工现场不戴安全帽抓拍运用机器视觉边缘计算和神经网络深度学习算法,对现场进出口、作业区域等人员违规行为识别、分析与预警提醒,施工现场不戴安全帽抓拍并把警报截屏和视频储存到后台。此外,施工现场不戴安全帽抓拍还可以识别现场......
  • C#实现控制台传参调用YoloV5进行人体识别
    一、项目地址 二、代码解析3、自定义人体信息类  该类用于在控制台打印人体位置信息///<summary>///人体信息///</summary>publicclassBodyInfo{publicintLeft{get;set;}=0;publicintTop{get;set;}=0;......
  • 掌握yolov5【一】
    文章目录前言一、安装miniconda二、安装pytorch三、下载yolov5源码总结前言yolov5介绍YOLOv5(YouOnlyLookOnceversion5)是一个广受欢迎的实时目标检测模型,由Ultralytics发布。它基于YOLO系列模型,旨在提供更高效和准确的目标检测解决方案。YOLOv5的设计目标是简化......
  • yoloV5实现红外海上船舶分类
     介绍Pytorch使用yoloV5实现红外海上船舶分类硬件配置实验在一台配备以下规格的机器上进行:-处理器:[i5-10200H]-GPU:[GTX1650]-内存:[16GB]软件配置-操作系统:[Windows10]-深度学习框架:PyTorch[1.10.2]-CUDA版本:[11.3]-cuDNN版本:[11.6]模型使用的是yol......
  • 主干网络篇 | YOLOv5/v7 更换主干网络之 ShuffleNetv2 | 高效CNN架构设计的实用指南(2)
    主干网络篇|YOLOv5/v7更换主干网络之ShuffleNetv2|高效CNN架构设计的实用指南概述YOLOv5和YOLOv7是目前主流的轻量级目标检测模型,在速度和精度方面取得了良好的平衡。然而,传统的YOLOv5/v7模型使用FPN和CSPNet等结构作为主干网络,在移动设备和嵌入式系统等资源受限的场景......
  • 【YOLOv5/v7改进系列】改进池化层为ASPP
    一、导言AtrousSpatialPyramidPooling(ASPP)模块是一种用于多尺度特征提取的创新技术,旨在提升深度学习模型在语义图像分割任务中的表现。ASPP模块通过在不同的采样率下应用空洞卷积,可以捕获不同大小的对象以及图像的上下文信息,从而增强模型在处理不同尺度物体时的鲁棒性......
  • 口罩佩戴检测系统 YOLOv5
    正确的佩戴口罩对现阶段有效减低人员之间感染新型冠状病毒具有重要意义。基于YOLOv5在图像识别检测领域的优异性能,本文研究基于基于YOLOv5的口罩佩自动戴检测方法。首先从网络和真实生活中中寻找并采集不同场景人群口罩佩戴的图片约500张并自建数据集,然后利用YOLOv5模型框架,修改其......
  • YOLOv5改进 | 损失函数 | EIoU、SIoU、WIoU、DIoU、FocuSIoU等多种损失函数
    秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转   ......
  • 基于YOLOv5的人脸关键点检测(附代码)
    人脸关键点检测项目说明本项目的实现主要依靠两个算法:yolov5目标检测和resnet人脸关键点算法。其中目标检测算法为人脸关键点检测算法的前置算法,使用目标检测算法将人脸信息进行提取(起到前景与背景的分离),然后再对box内的人脸信息进行关键点检测。本项目支持功能:人脸关键......
  • 海思3559 yolov5模型转wk详细笔记
    文章目录   前言   1.编译caffer       1.1安装虚拟机       1.2安装caffer       1.3编译python接口   2.适应wk的yolov5模型训练       2.1下载yolov5-6.0项目源码       2.2安装yolov5-6.0运行环境       2.3修改......