一文多图搞定制作自己的VOC数据集+使用yolov4训练自己的数据集+封装video测试脚本(基于ubuntu)

  • 制作VOC数据集
    • 标注自己的数据集
    • 整理数据集路径格式
  • 训练数据集
    • 环境
    • 在Linux上编译
    • 制作yolov4需要的label以及txt
    • 修改配置文件
    • 开始训练自己的数据集
    • 预测
  • 封装video测试脚本
  • 迁移学习

制作VOC数据集

目前大多数的神经网络都是采用VOC的数据格式来进行训练的,yolo系列亦是如此。

标注自己的数据集

首先用labelImg生成的是xml格式标记文件
下载
方式一:labelimg下载网站:https://github.com/tzutalin/labelImg
下载后将labelImg-master.zip移动至home主文件夹下解压,得到LabelImg-master文件,打开后如下图所示。
方式二:使用git命令

git clone https://github.com/tzutalin/labelImg

下载后是自动在home目录下解压好的,文件名为LabelImg,里面的内容同上图。
安装方式:

$ sudo apt-get install pyqt4-dev-tools # 安装PyQt4$ sudo pip install lxml # 安装lxml,如果报错,可以试试下面语句$ sudo apt-get install python-lxml

然后打开终端,进入LabelImg目录后使用make编译

cd LabelImgmake all

使用:在labelImg目录下使用终端执行

python labelImg.py

快捷键:

Ctrl + u 加载目录中的所有图像,鼠标点击Open dir同功能
Ctrl + r 更改默认注释目标目录(xml文件保存的地址)
Ctrl + s 保存
Ctrl + d 复制当前标签和矩形框
space 将当前图像标记为已验证
w 创建一个矩形框
d 下一张图片
a 上一张图片
del 删除选定的矩形框
Ctrl++ 放大
Ctrl-- 缩小
↑→↓← 键盘箭头移动选定的矩形框

整理数据集路径格式

建立文件夹层次为 darknet / data/VOCdevkit / VOC2020,voc2020下面有三个文件夹:
先按照上面格式准备好数据
Annotations是存放标签xml文件
JPEGImage 存放图片
ImageSets 里面新建Main文件夹,在Main下新建3个txtImageSets/Main 里面txt按行存放着图片名字(只含文件名不带文件名后缀),如:
000001
000002
000003…
生成train.txt的教程:
自己制作数据集,一个类别的图片标记完了需要做成一个train.txt,包含所有的训练图片的名称,实现过程如下:

1、在包含训练图片的文件夹中新建TXT文件。

2、在TXT文件中输入 DIR ./B>train.txt (DIR命令后须有一空格)

3、保存后将后缀名改为BAT。

4、双击该文件即可生成一个train.txt。

5、打开再根据自己要求修改即可(将文件后缀等多余信息删除)。

训练数据集

yolov4:
论文
代码

环境

Ubuntu 18.04
Python3.7
cuda 10
首先把代码下载下来,可以在终端用下面命令下载,也可以直接点击上面代码链接下载。

git clone https://github.com/AlexeyAB/darknet.git

在Linux上编译

make在darknet目录中,由于底层是C++写的,所以要先通过Cmake编译,才能通过python运行。如果需要使用GPU加速,那么得先打开项目里面的makefile文件修改一些参数的值。修改完成之后再通过终端直接make。

GPU=1
CUDNN=1
CUDNN_HALF=1
OPENCV=1
OPENMP=1
LIBSO=1
DEBUG=1

make命令如下:

# cd到darknet-master目录下
make
或者 make -j8

测试一下源权重(所有测试命令可以在.sh文件里查看)

# 测试图片,结果保存在darknet-master/predictions.jpg
./darknet detect cfg/yolov4.cfg yolov4.weights data/dog.jpg

制作yolov4需要的label以及txt

在上文中VOCdevkit文件中进行以下操作:
这个时候只用voc数据集的格式是不满足我们这里需要的格式。首先打开路径下/home/alex/darknet/scripts/voc_label.py,修改voc_label.py里面的相应内容如下。

7 sets=[('2020', 'train'), ('2020', 'val'), ('2020', 'test')]#改成自己的年份的
8
9 classes = ["0", "1", "2", "3", "4"]#改成自己的类别

给每个路径前面加个data,如下图
修改完了之后,将voc_label.py剪切到在主目录darknet下,并且执行voc_label.py,否则哪些文件会生成在build/darknet//data下面,执行完成后你会看到主目录下的data/目录下会生成几个txt。主目录darknet下的data/VOCdevkit/VOC2020/下面会生成一个label文件夹。

修改配置文件

1.cfg/目录下复制coco.data,并且重命名为obj.data。然后使用修改下面以下内容
2.cfg/目录下复制coco.names,并且重命名为obj.names。改成自己类别的名称

3.复制cfg/yolov4-custom.cfg,并且重命名为yolo-obj.cfg,同时修改一下内容(batches可以根据自己的修改)
上图中修改width和height为416,修改最大batch迭代多少个数max_batches = 6000,修改steps多久学习率下降一次,一般设置为batch个数的80%和90%。
然后三个classes的地方要修改

还有三个filters=255的地方要修改成自己的

开始训练自己的数据集

./darknet detector train cfg/obj.data cfg/yolo-obj.cfg yolov4.conv.137

预测

训练完自己的数据集生成权重后,可以通过一些测试数据来检验权重模型的效果,如下命令通过test.jpg检验了效果:

./darknet detector test ./cfg/yolo-obj.data ./cfg/obj.cfg ./yolo-obj_final.weights data/test.jpg -i 0 -thresh 0.25

封装video测试脚本

将测试video的算法封装成PY文件,打开终端CD到darknet_sanhu,运行如下命令:

python3 darknet_video.py
from ctypes import *
import math
import random
import os
import cv2
import numpy as np
import time
import darknetdef convertBack(x, y, w, h):xmin = int(round(x - (w / 2)))xmax = int(round(x + (w / 2)))ymin = int(round(y - (h / 2)))ymax = int(round(y + (h / 2)))return xmin, ymin, xmax, ymaxdef cvDrawBoxes(detections, img):color_dict = {'bottle': [0, 255, 255], 'plastic_bag': [238, 123, 158], 'leaves_branches': [24, 245, 217], 'float_plants': [224, 119, 227],'rubbish': [154, 52, 104]}count = 0for detection in detections:x, y, w, h = detection[2][0],\detection[2][1],\detection[2][2],\detection[2][3]# name_tag = str(detection[0].decode("ascii"))name_tag = str(detection[0])for name_key, color_val in color_dict.items():if name_key == name_tag:color = color_valxmin, ymin, xmax, ymax = convertBack(float(x), float(y), float(w), float(h))pt1 = (xmin, ymin)pt2 = (xmax, ymax)cv2.rectangle(img, pt1, pt2, color, 1)# python round()参数:返回四舍五入值,小数点位数cv2.putText(img,# detection[0].decode() +detection[0] +" [" + str(round(float(detection[1]))) + "% ]",(pt1[0], pt1[1] - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5,color, 2)count += 1cv2.putText(img, "Num: %s" % str(count), (25, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, [255, 255, 0], 2)return imgnetMain = None
# metaMain = None
metaMain = ['bottle', 'plastic_bag', 'leaves_branches', 'float_plants', 'rubbish']
altNames = Nonedef YOLO():global metaMain, netMain, altNamesconfigPath = "/home/alex/darknet_sanhu/cfg/yolo-obj.cfg"weightPath = "/home/alex/darknet_sanhu/backup/yolo-obj_6000.weights"metaPath = "./cfg/obj.data"if not os.path.exists(configPath):raise ValueError("Invalid config path `" +os.path.abspath(configPath)+"`")if not os.path.exists(weightPath):raise ValueError("Invalid weight path `" +os.path.abspath(weightPath)+"`")if not os.path.exists(metaPath):raise ValueError("Invalid data file path `" +os.path.abspath(metaPath)+"`")if netMain is None:netMain = darknet.load_net_custom(configPath.encode("ascii"), weightPath.encode("ascii"), 0, 1)  # batch size = 1if metaMain is None:metaMain = darknet.load_meta(metaPath.encode("ascii"))if altNames is None:try:with open(metaPath) as metaFH:metaContents = metaFH.read()import rematch = re.search("names *= *(.*)$", metaContents,re.IGNORECASE | re.MULTILINE)if match:result = match.group(1)else:result = Nonetry:if os.path.exists(result):with open(result) as namesFH:namesList = namesFH.read().strip().split("\n")altNames = [x.strip() for x in namesList]except TypeError:passexcept Exception:passcap = cv2.VideoCapture(0)      #摄像头测试#cap = cv2.VideoCapture("/home/alex/video/smoke/smoke.mp4") #路径测试#cap = cv2.VideoCapture("/home/alex/darknet-master/4.mp4")cap.set(3, 1280)cap.set(4, 720)#out = cv2.VideoWriter(#   "output.mp4", cv2.VideoWriter_fourcc(*"MJPG"), 10.0,#  (darknet.network_width(netMain), darknet.network_height(netMain)))out = cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc('M', 'P', '4', '2'), 10.0,(darknet.network_width(netMain), darknet.network_height(netMain)))print("Starting the YOLO loop...")# Create an image we reuse for each detectdarknet_image = darknet.make_image(darknet.network_width(netMain),darknet.network_height(netMain),3)while True:prev_time = time.time()ret, frame_read = cap.read()frame_rgb = cv2.cvtColor(frame_read, cv2.COLOR_BGR2RGB)frame_resized = cv2.resize(frame_rgb,(darknet.network_width(netMain),darknet.network_height(netMain)),interpolation=cv2.INTER_LINEAR)darknet.copy_image_from_bytes(darknet_image,frame_resized.tobytes())detections = darknet.detect_image(netMain, metaMain, darknet_image, thresh=0.25)for detection in detections:x, y, w, h = detection[2][0],\detection[2][1],\detection[2][2],\detection[2][3]a=x-207.5b=y-207.5c=280/hprint(a,b)print("x: %.2f mm y: %.2f mm"%(a*c,b*c))image = cvDrawBoxes(detections, frame_resized)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)print(1/(time.time()-prev_time))cv2.imshow('Demo', image)cv2.waitKey(3)cap.release()out.release()if __name__ == "__main__":YOLO()

迁移学习

有时候训练的结果不够满意,或者训练到一半突然终止了,这时候从头开始训练又很费时间,此时我们可以将自己之前保存的权重作为预训练权重。但是直接使用yolo-obj_last.weights会报错。需要做出如下转变。

#首先用第一行代码将yolo-obj_last.weights转化为olo-obj_last.conv.23
./darknet partial cfg/yolo-obj.cfg backup/yolo-obj_last.weights backup/yolo-obj_last.conv.23 23
#第二行将我们刚转化好的yolo-obj_last.conv.23作为预训练权重训练
./darknet detector train cfg/obj.data cfg/yolo-obj.cfg backup/yolo-obj_last.conv.23

一文多图搞定制作自己的VOC数据集+使用yolov4训练自己的数据集+封装video测试脚本(基于ubuntu)相关推荐

  1. 一文多图搞懂KITTI数据集下载及解析

    转载自一文多图搞懂KITTI数据集下载及解析-阿里云开发者社区 KITTI Dataset 1.图片下载:点击下载:https://s3.eu-central-1.amazonaws.com/avg- ...

  2. 数据结构与算法—一文多图搞懂双链表

    目录 前言 双链表介绍 与单链表区别 结构的设计 具体方法的解析 初始化 增加 空表插入: 头插入: 尾插入: 编号插入: 删除 单节点删除: 头删除: 尾删除: 普通删除: 代码与测试 总结与感悟 ...

  3. 搞定制作好看icon

    在网页开发的时候我们很多时候有可能要用到ico文件,这是一种图标格式的文件,有时候我们必须要用到.如果你是个人开发者,或者是一名不会ps的大学生又急需作业的大学生,这时候我们就需要有一个ico的制作方 ...

  4. 一文多图搞懂KITTI检测数据集下载使用(附网盘链接)

    文章目录 前言 1 下载 2 说明 2.1 devkit_object 2.2 data_object_calib 2.3 data_object_label_2 2.4 data_object_im ...

  5. 长微博工具,文转图 C#实现

    一来工作需要,而来我也一直有兴趣自己写一个长微博工具,其实思想很简单,首先文转图,然后拼图.下面来贴上自己写的文转图代码,以供大家研究参考. 下面这段是我封装的实现文转图的代码,里边对某个字体实际占的 ...

  6. AIGC周报|30秒定制一个文生图模型;60美元让AI玩转《我的世界》;手机版“文生图”模型:2秒不到出一张图

    AIGC(AI Generated Content)即人工智能生成内容.近期爆火的 AI 聊天机器人 ChatGPT,以及 Dall·E 2.Stable Diffusion 等文生图模型,都属于 A ...

  7. 从零到一,教你搭建「以文搜图」搜索服务(一)

    一图胜千言: don't waste my time, show me the image 为什么「以文搜图」如此重要?以文本的方式发出问题,再以图片的方式返回答案,这种信息获取范式,连我奶奶都说好. ...

  8. 如何查询你电脑的IP地址?一文带你搞懂IP地址

    上一章介绍了数据链路层--以太网数据帧的报文格式(你知道以太网数据帧在网络中如何发送和接收的吗?一文带你搞懂它),本章介绍下网络层--IP地址. 大家都知道计算机都会有一个IP地址,只有配置了IP地址 ...

  9. Diffusion扩散模型学习2——Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例

    Diffusion扩散模型学习2--Stable Diffusion结构解析-以文本生成图像(文生图,txt2img)为例 学习前言 源码下载地址 网络构建 一.什么是Stable Diffusion ...

最新文章

  1. rman备份脚本shell版
  2. yolt 卫星图像进行快速目标识别的新方法
  3. 再谈编程范式-程序语言背后的思想
  4. S4 exercise -- 模块
  5. python django+bootstrap4+mysql智慧交通系统构建
  6. 我们自身的认知可以改变吗?
  7. 调整Excel的打印线
  8. C语言圆周率天书简化,c语言天书__圆周率的计算及分析
  9. oracle report builder 6i下载,Report Builder 3.0
  10. spring的核心模块
  11. knx智能照明控制系统电路图_智能照明KNX灯控软件
  12. ardupilot-3.6.9 stabilize模式下(增稳模式)油门输入输出整理
  13. JAVA使用HttpURLConnection请求HTTPS网站,不需要证书验证的DEMO教程
  14. 微信分享不显示右边缩略图
  15. 字符数组与字符串的转换
  16. 支持度,置信度,提升度的区别和计算
  17. 计算机专业英语博士就业情况,计算机专业博士期刊文章参考文献 计算机专业博士英语参考文献哪里找...
  18. 新概念1 课文和单词(2022/12/24)
  19. java 课设-超级玛丽游戏
  20. Matrix Hub 矩阵运算库 C语言

热门文章

  1. 一文带你了解typeScript
  2. 计算机小白如何真正入门计算机?
  3. 【Qt象棋游戏】08_人机博弈高阶算法
  4. 弹性裸金属服务器EBM
  5. 游戏开发物语安卓!Android彻底组件化方案实践方法!快来收藏!
  6. 工作笔记:Android高德定位使用说明
  7. c# AutoCAD 操作交互
  8. 如何将CAD图块转换成外部参照?
  9. 用c语言实现打印乘法口诀表
  10. matlab crnd,谁能提供一份用藤copula(c藤和D藤)产生随机数,进而求VaR的matlab程序,谢谢...