YoloV4实战:手把手教物体检测——YOLOV4(pytorch)

简介: YoloV4实战:手把手教物体检测——YOLOV4(pytorch)

目录


摘要


训练


下载代码


下载权重文件


制作数据集


安装运行需要的包


修改类别


修改配置文件cfg.py


修改models.py


修改train.py文件


测试


摘要

    YOLOV4在coco上面达到了43.5%AP ,在Tesla V100 上达到了65FPS。相比今年的其它模型,得分不算高,但是它不是通过提高输入图像的分辨率来提高得分的,而是改进网络结构。创新点主要有一下几个方面:


(1)输入端:这里指的创新主要是训练时对输入端的改进,主要包括Mosaic数据增强、cmBN、SAT自对抗训练。


(2)BackBone主干网络:将各种新的方式结合起来,包括:CSPDarknet53、Mish激活函数、Dropblock


(3)Neck:目标检测网络在BackBone和最后的输出层之间往往会插入一些层,比如Yolov4中的SPP模块、FPN+PAN结构


(4)Prediction:输出层的锚框机制和Yolov3相同,主要改进的是训练时的损失函数CIOU_Loss,以及预测框筛选的nms变为DIOU_nms


训练

 本地环境:


  Ubuntu20.04


  pytorch1.5.1


  CUDA10.1


  Python3.7


下载代码

本文使用的代码是:https://github.com/Tianxiaomo/pytorch-Yolov4

训练和测试推理代码都已经完成。

下载权重文件

yolov4.conv.137.pth

链接一:https://pan.baidu.com/s/1ovBie4YyVQQoUrC3AY0joA 提取码:kcel

链接二:

https://drive.google.com/open?id=1fcbR0bWzYfIEdLJPzOsn4R5mlvR6IQyA

将下载的权重文件放到data文件夹下面

tt.png

制作数据集

数据集地址:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/14003627

将Labelme数据集复制到pytorch-YOLOv4-master文件夹下面,如图:

tt.png


然后用pycharm新建labelme2txt.py文件。写入生成训练集和验证集的代码。

tt.png

labelme2txt.py代码:


from os import getcwd

from sklearn.model_selection import train_test_split

import json

import glob

wd = getcwd()

"labelme标注的json 数据集转为pytorch版yolov4的训练集"

classes = ["aircraft","oiltank"]


image_ids = glob.glob(r"LabelmeData/*jpg")

print(image_ids)

train_list_file = open('data/train.txt', 'w')

val_list_file = open('data/val.txt', 'w')

def convert_annotation(image_id, list_file):

   jsonfile=open('%s.json' % (image_id))

   in_file = json.load(jsonfile)


   for i in range(0,len(in_file["shapes"])):

       object=in_file["shapes"][i]

       cls=object["label"]

       points=object["points"]

       xmin=int(points[0][0])

       ymin=int(points[0][1])

       xmax=int(points[1][0])

       ymax=int(points[1][1])

       if cls not in classes:

           print("cls not in classes")

           continue

       cls_id = classes.index(cls)

       b = (xmin, ymin, xmax, ymax)

       list_file.write(" " + ",".join([str(a) for a in b]) + ',' + str(cls_id))

   jsonfile.close()


def ChangeData2TXT(image_List,dataFile):

   for image_id in image_List:

       dataFile.write('%s' % (image_id.split('\\')[-1]))

       convert_annotation(image_id.split('.')[0], dataFile)

       dataFile.write('\n')

   dataFile.close()

trainval_files, test_files = train_test_split(image_ids, test_size=0.2, random_state=55)

ChangeData2TXT(trainval_files,train_list_file)

ChangeData2TXT(test_files,val_list_file)



安装运行需要的包

参照requirements.txt安装本机没有的包,版本不一定要保持一致,只要后期不报错就没有事。


修改类别

将coco.names和voc.names里面的类别修改为自己数据集的类别(默认是coco.names,都改了肯定没有错。),顺序和labelme2txt.py中的classes顺序保持一致。

修改配置文件cfg.py

Cfg.use_darknet_cfg = False


Cfg.batch = 2(根据自己的显卡修改,我的显卡是8G的最多可以训练里2个batch)。


Cfg.subdivisions = 1


修改models.py

将51行和53行的inplace=True改为inplace=False。如果不修改,训练的时候会报个错误。


修改train.py文件

找到526行,这个方法的参数是对cfg.py里面参数的更新。


主要修改的参数如下:


parser.add_argument('-g', '--gpu', metavar='G', type=str, default='0',

                   help='GPU', dest='gpu')#设置GPU使用的GPU


parser.add_argument('-dir', '--data-dir', type=str, default="LabelmeData",

                   help='dataset dir', dest='dataset_dir')#图片所在的文件夹。


                 parser.add_argument('-pretrained', type=str, default="data/yolov4.conv.137.pth", help='pretrained yolov4.conv.137')#设置预训练权重文件的路径。


                 parser.add_argument('-classes', type=int, default=80, help='dataset classes')#物体类别数。


parser.add_argument('-train_label_path', dest='train_label', type=str, default='data/train.txt', help="train label path")#训练集存放的路径。


注释415行到440行的代码,这段代码在验证的时候一直报错,我找不到原因。后续找到原因再更新。

tt.png

将以上的内容修改完成后就可以点击run开始训练了。

 

测试

测试主要修改models.py的代码。将下面的代码从449行替换。

 

if __name__ == "__main__":
    import sys
    import cv2
    namesfile = None
    n_classes=2
    weightfile="checkpoints/Yolov4_epoch151.pth" 
    imgfile="data/aircraft_4.jpg"#待测试的图片
    width=608
    height=608
    model = Yolov4(yolov4conv137weight=None, n_classes=n_classes, inference=True)
    pretrained_dict = torch.load(weightfile, map_location=torch.device('cpu'))
#如果使用GPU则改为:
#pretrained_dict = torch.load(weightfile, map_location=torch.device('cuda'))

   model.load_state_dict(pretrained_dict)


   use_cuda = True

   if use_cuda:

       model.cuda()


   img = cv2.imread(imgfile)


   # Inference input size is 416*416 does not mean training size is the same

   # Training size could be 608*608 or even other sizes

   # Optional inference sizes:

   #   Hight in {320, 416, 512, 608, ... 320 + 96 * n}

   #   Width in {320, 416, 512, 608, ... 320 + 96 * m}

   sized = cv2.resize(img, (width, height))

   sized = cv2.cvtColor(sized, cv2.COLOR_BGR2RGB)


   from tool.utils import load_class_names, plot_boxes_cv2

   from tool.torch_utils import do_detect


   for i in range(2):  # This 'for' loop is for speed check

                       # Because the first iteration is usually longer

       boxes = do_detect(model, sized, 0.4, 0.6, use_cuda)


   if namesfile == None:

       if n_classes == 2:

           namesfile = 'data/voc.names'

       elif n_classes == 80:

           namesfile = 'data/coco.names'

       else:

           print("please give namefile")


   class_names = load_class_names(namesfile)

   resultImg=plot_boxes_cv2(img, boxes[0], 'predictions.jpg', class_names)

   cv2.imshow("image",resultImg)

   cv2.waitKey(0);


测试结果:


tt.png

源码链接:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12821500

参考文章:

深入浅出Yolo系列之Yolov3&Yolov4核心基础知识完整讲解

https://blog.csdn.net/nan355655600/article/details/106246625?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase


tt.png

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
相关文章
|
6月前
|
机器学习/深度学习 自然语言处理 PyTorch
【PyTorch实战演练】基于AlexNet的预训练模型介绍
【PyTorch实战演练】基于AlexNet的预训练模型介绍
268 0
|
6月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】自调整学习率实例应用(附代码)
【PyTorch实战演练】自调整学习率实例应用(附代码)
233 0
|
6月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解
184 1
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
【PyTorch实战演练】AlexNet网络模型构建并使用Cifar10数据集进行批量训练(附代码)
448 0
|
5月前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
|
2月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
59 0
|
3月前
|
机器学习/深度学习 PyTorch TensorFlow
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
152 1
|
4月前
|
机器学习/深度学习 数据挖掘 TensorFlow
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
【7月更文挑战第31天】在数据驱动时代,Python凭借其简洁性与强大的库支持,成为数据分析与机器学习的首选语言。**数据分析基础**从Pandas和NumPy开始,Pandas简化了数据处理和清洗,NumPy支持高效的数学运算。例如,加载并清洗CSV数据、计算总销售额等。
58 2
|
4月前
|
机器学习/深度学习 人工智能 数据挖掘
从0到1构建AI帝国:PyTorch深度学习框架下的数据分析与实战秘籍
【7月更文挑战第30天】PyTorch以其灵活性和易用性成为深度学习的首选框架。
66 2
|
4月前
|
机器学习/深度学习 数据挖掘 PyTorch
🚀PyTorch实战宝典:从数据分析小白到深度学习高手的飞跃之旅
【7月更文挑战第29天】在数据驱动的世界里, **PyTorch** 作为深度学习框架新星, 凭借其直观易用性和高效计算性能, 助力数据分析新手成为深度学习专家。首先, 掌握Pandas、Matplotlib等工具进行数据处理和可视化至关重要。接着, 安装配置PyTorch环境, 学习张量、自动求导等概念。通过构建简单线性回归模型, 如定义 `nn.Module` 类、设置损失函数和优化器, 进行训练和测试, 逐步过渡到复杂模型如CNN和RNN的应用。不断实践, 你将能熟练运用PyTorch解决实际问题。
75 1
下一篇
无影云桌面