yolov7运行VOC格式数据集

  • 代码下载
  • 测试开发环境
  • 使用自己的VOC格式数据集训练
    • 修改配置文件yolov7.yaml
    • 修改配置文件voc.yaml
    • VOC格式数据集转换COCO格式
  • 开始训练
    • 重头开始
    • fine-train
  • BUG
    • wandb模块
    • 常见报错1
    • 常见报错2
    • 常见报错3
    • 常见报错 4
  • 成功训练网络
  • 评价指标
  • 可视化

代码下载


地址:yolov7

测试开发环境

去官网下载yolov7的权重文件,放入weights目录下,运行detec.py文件测试是否安装成功,官网地址:权重下载

python detect.py --weights weights/yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg


使用自己的VOC格式数据集训练

修改配置文件yolov7.yaml

首先修改cfg下training下的yolov7.yaml文件。


修改修改nc并设置为自己训练的类别个数

修改配置文件voc.yaml

关键点在于,这得是一个文件夹的路径,不能是txt文件的路径。。。。。。
如果设置txt文件的路径,很容易报BUG:

assertionerror:no labels found in //*/JPEGImages.cache can not train without labels

这个BUG搞了我很久
因为v7结构和原始的v5一样,v5官方就是给的文件夹:

v5的coco.yaml文件如下

# download command/URL (optional)
download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../coco/images/train2017/
val: ../coco/images/train2017/# number of classes
nc: 80# class names
names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow','elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard','tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']

可以看出,yaml文件中的训练集和验证集数据地址都是为一个装图像数据的文件夹(…/coco/images/train2017/ …/coco/images/train2017/),而不是我之前使用VOC2yolo代码转换生成的train.txt和val.txt。

VOC格式数据集转换COCO格式


官方代码是COCO格式的,就涉及到VOC数据集格式转COCO格式问题。
(这个.sh代码是项目找不到数据集的时候,就会调用他下载COCO…一定要把他注释掉。。。)

voc2yolov7.py代码:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
import random
from shutil import copyfile# 根据自己的数据标签修改
classes=["tumor"]def clear_hidden_files(path):dir_list = os.listdir(path)for i in dir_list:abspath = os.path.join(os.path.abspath(path), i)if os.path.isfile(abspath):if i.startswith("._"):os.remove(abspath)else:clear_hidden_files(abspath)def convert(size, box):dw = 1./size[0]dh = 1./size[1]x = (box[0] + box[1])/2.0y = (box[2] + box[3])/2.0w = box[1] - box[0]h = box[3] - box[2]x = x*dww = w*dwy = y*dhh = h*dhreturn (x,y,w,h)def convert_annotation(image_id):in_file = open('VOCdevkit/VOC2007/Annotations/%s.xml' %image_id)out_file = open('VOCdevkit/VOC2007/YOLOLabels/%s.txt' %image_id, 'w')tree=ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))bb = convert((w,h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')in_file.close()out_file.close()wd = os.getcwd()
wd = os.getcwd()
data_base_dir = os.path.join(wd, "VOCdevkit/")
if not os.path.isdir(data_base_dir):os.mkdir(data_base_dir)
work_sapce_dir = os.path.join(data_base_dir, "VOC2007/")
if not os.path.isdir(work_sapce_dir):os.mkdir(work_sapce_dir)
annotation_dir = os.path.join(work_sapce_dir, "Annotations/")
if not os.path.isdir(annotation_dir):os.mkdir(annotation_dir)
clear_hidden_files(annotation_dir)
image_dir = os.path.join(work_sapce_dir, "JPEGImages/")
if not os.path.isdir(image_dir):os.mkdir(image_dir)
clear_hidden_files(image_dir)
yolo_labels_dir = os.path.join(work_sapce_dir, "YOLOLabels/")
if not os.path.isdir(yolo_labels_dir):os.mkdir(yolo_labels_dir)
clear_hidden_files(yolo_labels_dir)
yolov5_images_dir = os.path.join(data_base_dir, "images/")
if not os.path.isdir(yolov5_images_dir):os.mkdir(yolov5_images_dir)
clear_hidden_files(yolov5_images_dir)
yolov5_labels_dir = os.path.join(data_base_dir, "labels/")
if not os.path.isdir(yolov5_labels_dir):os.mkdir(yolov5_labels_dir)
clear_hidden_files(yolov5_labels_dir)
yolov5_images_train_dir = os.path.join(yolov5_images_dir, "train/")
if not os.path.isdir(yolov5_images_train_dir):os.mkdir(yolov5_images_train_dir)
clear_hidden_files(yolov5_images_train_dir)
yolov5_images_test_dir = os.path.join(yolov5_images_dir, "val/")
if not os.path.isdir(yolov5_images_test_dir):os.mkdir(yolov5_images_test_dir)
clear_hidden_files(yolov5_images_test_dir)
yolov5_labels_train_dir = os.path.join(yolov5_labels_dir, "train/")
if not os.path.isdir(yolov5_labels_train_dir):os.mkdir(yolov5_labels_train_dir)
clear_hidden_files(yolov5_labels_train_dir)
yolov5_labels_test_dir = os.path.join(yolov5_labels_dir, "val/")
if not os.path.isdir(yolov5_labels_test_dir):os.mkdir(yolov5_labels_test_dir)
clear_hidden_files(yolov5_labels_test_dir)train_file = open(os.path.join(wd, "yolov5_train.txt"), 'w')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'w')
train_file.close()
test_file.close()
train_file = open(os.path.join(wd, "yolov5_train.txt"), 'a')
test_file = open(os.path.join(wd, "yolov5_val.txt"), 'a')
list_imgs = os.listdir(image_dir) # list image files
probo = random.randint(1, 100)
print("Probobility: %d" % probo)
for i in range(0,len(list_imgs)):path = os.path.join(image_dir,list_imgs[i])if os.path.isfile(path):image_path = image_dir + list_imgs[i]voc_path = list_imgs[i](nameWithoutExtention, extention) = os.path.splitext(os.path.basename(image_path))(voc_nameWithoutExtention, voc_extention) = os.path.splitext(os.path.basename(voc_path))annotation_name = nameWithoutExtention + '.xml'annotation_path = os.path.join(annotation_dir, annotation_name)label_name = nameWithoutExtention + '.txt'label_path = os.path.join(yolo_labels_dir, label_name)probo = random.randint(1, 100)print("Probobility: %d" % probo)if(probo < 80): # train datasetif os.path.exists(annotation_path):train_file.write(image_path + '\n')convert_annotation(nameWithoutExtention) # convert labelcopyfile(image_path, yolov5_images_train_dir + voc_path)copyfile(label_path, yolov5_labels_train_dir + label_name)else: # test datasetif os.path.exists(annotation_path):test_file.write(image_path + '\n')convert_annotation(nameWithoutExtention) # convert labelcopyfile(image_path, yolov5_images_test_dir + voc_path)copyfile(label_path, yolov5_labels_test_dir + label_name)
train_file.close()
test_file.close()

出处
运行结束

执行后的项目结构:
放图片的

放标签的:

开始训练

    parser.add_argument('--weights', type=str, default='./weights/v7.pt', help='initial weights path')parser.add_argument('--cfg', type=str, default='./cfg/training/yolov7.yaml', help='model.yaml path')parser.add_argument('--data', type=str, default='data/voc.yaml', help='data.yaml path')

重头开始

单gpu

python train.py --workers 1 --device 0 --batch-size 8 --data data/liver.yaml --img 640 640 --cfg cfg/training/yolov7-MY.yaml --weights 'weights/yolov7.pt' --name yolo
v7 --hyp data/hyp.scratch.p5.yaml

fine-train

权重下载地址:V7各种权重

python train.py --workers 8 --device 0 --batch-size 32 --data data/liver.yaml --img 512 512 --cfg cfg/training/yolov7-my.yaml --weights 'yolov7_training.pt' --name yolov7-fine-train --hyp data/hyp.scratch.p5.yaml

BUG

wandb模块

关于这个问题,见这篇博客wandb问题解决

常见报错1

subprocess.CalledProcessError: Command ‘git tag’ returned non-zero exit status 1.

出现这种情况大概率是传参有问题,参数缺失或者参数错误

这个问题最终是因为找不到yolov7.pt权重文件所以去下载了,但是其实我是有的。可能是因为编码问题。我把我下载 的yolov7.pt重命名(自己手动输一遍)就解决了

常见报错2


这是数据集找不到,执行scirpts/.sh脚本去下载数据集了。。。
liver.yaml中:修改


又报错

查看txt文件

改成绝对路径

在吧后面lable信息删除

就最终报错到,显示没有标签。。。。。。(用我上面的代码这个问题就解决了)

常见报错3

检查训练数据和验证数据是否包含所有标签

检查标签的个数和标签名是否相同。

如果用了模型结构的配置文件,检查里面标签个数改没改

常见报错 4

RuntimeError: cuDNN error: CUDNN_STATUS_INTERNAL_ERROR

torch.backends.cudnn.benchmark=True

加在开头

成功训练网络

评价指标

python test.py --data data/voc.yaml --img 512 --batch 32 --conf 0.001 --iou 0.65 --device 0 --weights runs/train/exp4/weights/best.pt --name yolov7_640_val


可视化

python detect.py --weights runs/train/exp4/weights/best.pt --conf 0.25 --img-size 512 --source inference/images/a.jpg

yolov7运行自己的VOC格式数据集相关推荐

  1. YOLOv5手把手教你制作VOC格式数据集与模型训练

    引言 2020年2月YOLO之父Joseph Redmon宣布退出计算机视觉研究领域,2020 年 4 月 23 日YOLOv4 发布,2020 年 6 月 10 日YOLOv5发布. YOLOv5源 ...

  2. 【机器学习】 - 目标检测 - VOC格式数据集介绍与自己制作

    一.VOC数据集 PASCAL VOC 挑战赛主要有 Object Classification .Object Detection.Object Segmentation.Human Layout. ...

  3. 玩转肺癌目标检测数据集Lung-PET-CT-Dx ——④转换成PASCAL VOC格式数据集

    文章目录 关于PASCAL VOC数据集 目录结构 ①创建VOC数据集的几个相关目录 XML文件的形式 ②读取dcm文件与xml文件的配对关系 ③创建VOC格式数据集 ④创建训练.验证集 本文所用代码 ...

  4. 制作VOC格式数据集的train.txt、val.txt文件

    一.前言 在以前的文章中已经聊过 VOC数据集的组织结构 和 VOC格式数据集转yolo(darknet)格式. 当我们按照组织结构将自己的图片和xml标注文件放在指定文件夹下之后,在转换时我们还需要 ...

  5. VOC格式数据集操作类构建-2.统计数据集各类别标签数目和剪裁图像中标注框并保存图片

    总目标:建立VOC格式数据集类以及操作内置函数 github项目地址(附有使用说明书): https://github.com/A-mockingbird/VOCtype-datasetOperati ...

  6. 利用COCO API测试自己数据集训练的YOLOv3模型的mAP(VOC格式数据集)

    目录 工具 前言 生成标注集的json文件 数据集准备 将voc注解格式数据集的注解转换成txt注解格式 自定义数据集的注解转换成coco的注解格式 生成结果集的json文件 安装darknet 获取 ...

  7. 基于MMDetection训练VOC格式数据集

    一 环境说明 基于前述安装MMDetection,数据集为VOC格式,主要版本如下: Python:3.7.8 CUDA:11.3 cuDNN:8.4.0 torch:1.12.0 torchvisi ...

  8. YOLOv3 ubuntu 配置及训练自己的VOC格式数据集

    官网:  http://pjreddie.com/yolo/   相关文章:  http://arxiv.org/abs/1506.02640 源代码: https://github.com/pjre ...

  9. SSD-MobileNetv2之Ubuntu18.04训练VOC格式数据集-超详细

    Ubuntu** python3.6 tensorflow1.15.0 TensorFlow Object Detection API下载 https://github.com/tensorflow/ ...

最新文章

  1. php将科学计算法得出的结果转换成原始数据
  2. 网页浏览器知道我们的哪些信息?(1)
  3. vb excel 整行删除_Excel中常用的批量处理都不掌握,那就真的Out了
  4. 逻辑综合——概述与基本概念
  5. 1-3docker commit定制镜像
  6. 查找单链表的倒数第k个节点,要求只能遍历一次链表(C语言)
  7. spring data整合elasticsearch的applicationContext.xml文件模板
  8. 重学C++语言之路:C++语言学习工具和环境
  9. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题一
  10. android自定义指针,Android实现HID鼠标的指针自定义
  11. 30岁,我从前端转型管理成功了
  12. 物联网应用领域(全)
  13. PHP京东商城爬取网页乱码问题解决
  14. job用法 Java_JOB 用法小结
  15. winscp开启ftp_Linux 之WinSCP连接FTP
  16. 果集数据:从化妆镜切入“她”赛道,Amiro如何挖掘科技美护市场新机会?
  17. 操作系统实验报告【太原理工大学】
  18. UE Gameplay实例49(高级蒙太奇动画连招)
  19. Day 1 linux系统的发展史与虚拟机的安装过程
  20. 出海解不了分众传媒的焦虑

热门文章

  1. HDU - 1431 素数回文 【素数打表】+【判断回文】
  2. 架设个人Web服务器实战(通过ADSL路由)
  3. SAP 如何打Note
  4. CF 1129 A,B
  5. 适合笔记本计算机玩的游戏,十款,笔记本电脑可以畅玩的单机游戏
  6. 决策模型(二):风险决策法
  7. 互联网的金门大桥:Cisco
  8. 互联网数据中心(Internet Data Center,IDC)
  9. Portapack应用开发教程(十一) 加入内置麦克风
  10. 组件分享之后端组件——阿里妈妈前端团队出品的开源接口管理工具RAP第二代rap2-delos...