使用Yolov4实现简单的图片标注

一、前言
YOLOv4(You Only Look Once version 4)是一种先进的目标检测系统,于2020年推出。它是对之前版本YOLO的改进,后者是一种广泛使用的基于深度学习的目标检测算法。YOLOv4基于深度卷积神经网络,可以高精度实时检测图像中的目标。它使用单个神经网络,输入图像并输出所有目标的边界框和类别概率。YOLOv4相对于其前身YOLOv3的一些主要改进包括:

  • 增加网络的深度和宽度,以获得更好的特征表示
  • 使用先进的数据增强技术,以提高模型的泛化能力
  • 整合多种先进的目标检测技术,如空间金字塔池化、Mish激活函数和交叉阶段部分网络。

YOLOv4是一个开源项目,在GitHub上免费提供。它已成为许多计算机视觉应用程序的流行选择,包括自动驾驶汽车、安全系统和监控系统。论文 ,代码。

本实验基于代码Github开源代码:

项目首页 - yolov4-pytorch - GitCodeicon-default.png?t=N7T8https://gitcode.com/bubbliiiing/yolov4-pytorch/overview?utm_source=csdn_github_accelerator&isLogin=1

 二、运行环境准备

运行文件前,需要的主要的库(依赖)我们都可以在requirements.txt中找到。

我们直接运行下面这个代码就可以安装所需要的库(如果下载太慢可以在后面加一个源,只要是国内的,什么源都可以)。如果下面代码运行不成功,那只能辛苦一下自己,一个一个下载。总之,没有什么库就下什么库。

pip install -r requirements.txt
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

在这里如果条件允许的话,下载torch的时候选择cuda版本,这样训练模型的时候会快一点。因为我的是集显的笔记本,而且安装cuda版本的话很麻烦,所以我的是cpu版本的torch,训练的时候真的是很久。

如何正确下载PyTorch、CUDA版本!!_cuda12.0下载-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_61497715/article/details/130060959?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171422624916800226557485%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171422624916800226557485&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-130060959-null-null.142^v100^pc_search_result_base8&utm_term=pytorch%E4%B8%8B%E8%BD%BDcuda&spm=1018.2226.3001.4187

安装pytorch(cpu版)用清华资源快速下载_pytorchcpu版本怎么下载-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_41739298/article/details/131365988?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171422674816800225563175%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171422674816800225563175&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-131365988-null-null.142^v100^pc_search_result_base8&utm_term=%E4%B8%8B%E8%BD%BDcpu%E7%89%88%E6%9C%AC%E7%9A%84pytorch&spm=1018.2226.3001.4187

三、数据准备

1、准备数据集

因为我自己的数据集不好,质量也不咋地,所以我就拿了一个数据集来用(当然你们也可以自己准备一个数据集),我的数据集是猫、狗、狐狸的数据。数据集链接:下载

动物照片_数据集-飞桨AI Studio星河社区 (baidu.com)icon-default.png?t=N7T8https://aistudio.baidu.com/datasetdetail/154928

 有了数据集后,我们需要借助labellmg_exe来对我们的数据图像标记来得到标签数据。

 

下面链接是labellmg_exe工具的安装和使用: 

 Windows下深度学习标注工具LabelImg安装和使用指南_windows安装labelimg-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_67647321/article/details/134749209?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171419190916800213066493%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171419190916800213066493&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-134749209-null-null.142%5Ev100%5Epc_search_result_base8&utm_term=labelimg%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4187

 图片格式为jpg,标签为xml。

在labellmg使用中可以选择PascalVOC和YOLO两种,我们标注时选择PascalVOC,这样得到的标签文件就是xml格式。

 

 在图像和标签处理好之后,我们需要把yolov4里的yolov4-pytorch-master\VOCdevkit\VOC2007文件夹下的Annotations和JPEGImages替换成我们自己的标签和图像(标签和图像时一一对应的)。

Annotations文件夹放的是标签数据

JPEGImages文件夹放的是图像数据

2、划分数据集

找到我们的voc_annotation.py文件,这个文件是对数据集划分训练集和测试集。在运行voc_annotation.py前我们只要改一个参数classes_path。

我这里的cls_classes.txt是自己新建立的txt文件,放到model_data文件夹下,内容就是图片对应的名字,或者也可以在coco_classes.txt文件中改(这样上面一步就不用改)。

 

 运行voc_annotation.py,我们可以得到以下结果,对我们的数据集进行了划分。

四、训练数据

第一次训练

(1)、train.py文件

train.py文件可以根据我们提供的数据进行训练,运行得出模型的权值。第一次训练的时候,在这个文件中我们有要修改的参数,classes_path

使用cuda版本torch的这里要把False改成True,cpu版本的可以不管。我的是cpu版本的所以就没改

2、yolo.py文件

yolo.py也和train,py文件一样把参数classes_path和cuda都要改。不过yolo.py有两个类,都要改。

 

 然后就是运行train.py文件。

训练期间会输出模型性能的统计数据,包括不同类别(dragon fruit 和 snake fruit)的平均精度(AP)和平均精度均值(mAP),以及它们对应的分数阈值、F1-分数、召回率和精确率。

第一次训练可以修改参数UnFreeze_Epoch,也就是训练的总批次,我这里是100个批次这样可以减少我们训练的时间。

然后就是我们训练结束后得到的权值文件,都会保存在logs文件下,best_epoch_weights.pth文件就是我们训练得到的权值文件。

第二或三次训练

对于我们想要得到的权值文件,一次训练是不够的,所以我们需要第二、第三次训练。

第二次训练前我们需要把把logs文件best_epoch_weights.pth文件移到model_data文件下,可以换个名字方便我们区别。当然,我们可以调整参数UnFreeze_Epoch=300或者200,使得我们得到较好的权值.

在train.py文件,把参数model_path改成我们上一次得到的权值文件best_epoch_weights.pth

yolo.py文件也一样要改参数model_path,两个类的参数model_path都要改。

以此类推,第三次训练是权值文件改成第二次训练得到的权值文件。

训练多少次呢?

当平均精度均值(mAP)的值满足图片标注时就可以了(可能是80%左右)。当训练次数少了,mAP小(就像我第一次map55%,就没有标注图像),我们运行predict.py想要标注图像会发现没有标注。

3、predict.py文件

在运行predict.py文件前,把logs文件的best_epoch_weights.pth文件移到model_data文件下,需要把yolo.py文件的参数model_path的yolo4_weights.pth改成best_epoch_weights.pth。

predict.py文件不需要修改什么,实在是想改的话可以改参数fps_image_path,测试的图片路径

 运行之后,输入我们想要进行目标检测的图片的路径,就可以得到一张标注好的图片

结果展示

可以看到结果的第二张图把猫识别成狗了,这是可能是数据集或者训练的模型权值不够好,我的数据集都是怼脸的照片,这个模型把猫识别成狗了。解决的办法是多训练一两遍、增加数据集量等

在运行这个文件的时候可能会得到错误:

AttributeError: 'ImageDraw' object has no attribute 'textsize'

我的解决办法是修改Pillow的版本

到最后,对于yolov4算法还有很多的用法,我这里只是简单的实现图片标注。

  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLOv5本身并没有自动标注图片的功能,但是可以使用一些辅助工具来实现自动标注。下面是一个简单的流程: 1. 安装YOLOv5和相关依赖库。 2. 使用YOLOv5进行目标检测,生成包含目标位置信息的标注文件(如.txt文件)。 3. 使用图像处理库(如PIL)读取图像和标注文件。 4. 根据标注文件中的目标位置信息,在图像上绘制矩形框并保存。 下面是一个简单的Python代码示例: ```python import os from PIL import Image, ImageDraw # 定义目标类别 classes = ['person', 'car', 'dog'] # 定义标注文件和图像路径 label_path = './labels' image_path = './images' # 遍历标注文件 for file in os.listdir(label_path): # 读取标注文件 with open(os.path.join(label_path, file), 'r') as f: lines = f.readlines() # 读取对应的图像 image_file = os.path.join(image_path, file.replace('.txt', '.jpg')) image = Image.open(image_file) draw = ImageDraw.Draw(image) # 绘制矩形框 for line in lines: line = line.strip().split() class_id = int(line[0]) x, y, w, h = map(float, line[1:]) left = int((x - w / 2) * image.width) top = int((y - h / 2) * image.height) right = int((x + w / 2) * image.width) bottom = int((y + h / 2) * image.height) draw.rectangle((left, top, right, bottom), outline='red', width=2) draw.text((left, top), classes[class_id], fill='red') # 保存图像 image.save(os.path.join(image_path, file.replace('.txt', '.jpg'))) ``` 这个示例假设标注文件和图像文件分别存放在./labels和./images文件夹中,标注文件的格式为每行一个目标位置信息,第一个数字为类别编号(从0开始),后面四个数字分别为目标中心点的x坐标、y坐标、宽度和高度(均为相对值,范围在0到1之间)。代码会自动读取标注文件,并在对应的图像上绘制矩形框和类别名称,最后保存图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值