目录
这一系列的博客将会帮助我自己(和大家)认识并熟悉——如何使用YOLO训练自定义的数据集,同时如何部署到Windows以及Linux上,下面有请我的检测目标——拉拉猪!
在建立数据集之前,我从网络上收集了一些资料——关于如何建立一个有效的数据集,比如图像数据集的数量,检测目标的位置、大小、方向,甚至是光线、背景等等其他因素的影响,手机出来的资料我总结如下:
- 从不同的背景中拍摄不同角度方向的目标图像:图像数据集中,检测的对象必须至少有一个相似的差不多相同的形状、侧面的对象、相对大小、旋转角度、倾斜、照明……
- 保证采集的数据的质量,大小最好和使用场景的尺寸接近,尽量在该场景下采集数据的多样性,尽量采集自然场景下的各种各样的照片
- 数据集的数量越多越好(1000+/2000+),普遍来说,应该是有2000+,训练迭代2000+或更多
- 数据集中既要包括想要检测的物体,也要包括不想检测的物体,但是标注的话只标注想要检测的物体
- 如果是多个类检测的话,那么各个目标检测的类在你的数据中出现的次数差不多
- 目标所被标记部分是按照你希望如何被检测到的方式去标记(比如只检测一半、可重叠区域、比整个物体大一点……)
- 确保要检测的每个对象在训练集中都被标记
- 制作数据集你可以通过爬虫的方式来获取图像,也可以拍摄一段视频然后截取包含目标的图像
- 可以通过图像增强的方法来提升数据集的数量
一、拍摄收集
(一)视频拍摄
从以上的方面中考虑,我希望制作一个数据集:(由于是一个比较简单的目标——图像的数据量在600张左右)
- 背景一(桌面上):光线不太强、拍摄较近、拍摄各个角度(60s-60张)
- 背景二(拿手上):光纤适合、拍摄各个角度(60s-60张)
- 背景三(被子上):光纤不太强(有阴影)、拍摄各个角度、远近结合(60s-60张)
- 背景四(有一个差不多的物体在旁边):拍摄各个角度(60s-60张)
- 背景五:强光照射、拍摄各个角度(60s-60张)
- 背景六:弱光微射、拍摄各个角度(60s-60张)
- 背景七(稍微变形):拍摄各个角度(60s-60张)
- 背景八(粉色背景):拍摄各个角度(60s-60张)
- 背景九(键盘上):拍摄较远、拍摄各个角度(60s-60张)
于是,我用手机拍摄了拉拉猪的一系列的视频:
(二)将MP4文件截取出图片
需要注意的是:名字要从1开始一直往后,如果不是自己截取的图片,那么可以通过看图软件对文件名批量修改名称(网上说:2345看图王可以)
import cv2
import os
# 视频的帧数为30,那么60s的视频一共有1800帧,选择60张照片,则选择每隔30帧选一张
path_video = "E:/work/VOC2021/videos/拉拉猪 ("
form = ").mp4"
save_pictures = "E:/work/VOC2021/JPEGImages/"
count = 0
for num in range(1,10):
# 视频数量一共是9个
path_cv = path_video + str(num) + form
vc = cv2.VideoCapture(path_cv)
i = 0
while vc.isOpened():
rval, img = vc.read()
frame_count = vc.get(cv2.CAP_PROP_FRAME_COUNT) # 视频文件的帧数
frame_fps = vc.get(cv2.CAP_PROP_FPS) # 视频文件的帧率
if i==frame_count:
break
else:
i=i+1
if i % int(frame_count/60) == 0: #选取60照片
count = count + 1
# 图片命名及保存路径
filename=str(count)+".jpg"
cv2.imwrite(save_pictures+filename,img)
print("第{}个视频截取图片完毕!".format(num))
# 释放资源
vc.release()
cv2.destroyAllWindows()
注意:图片保存的位置不能有中文字符,否则生成的图片将找不到!!!
最后的结果如下:
然后建立如下所示的文件目录结构:
VOC:Visual Object Classes
二、数据集标注
接下来就是对541张照片进行图片标注了,这一步一张图片都不能少,我们所用的软件是LabelImg
软件分享:
链接:https://pan.baidu.com/s/1jrWfEACNLSHfscCAU6KgXw
提取码:8888
--来自百度网盘超级会员V2的分享
界面:
1、打开图片所在的文件夹
2、修改输出文件夹
3、图片标注
输入法切换为英文,按下“W”,会出现如下的十字
然后按住鼠标左键拖动,直到将目标包括在内(选取的区域尽可能包含),然后输入目标的类别:lalazhu
这个时候右上角将会产生一个类别:
然后点击:Save (保存该图片)—— Next Image (开始下一张图片的标注)
然后重复操作:按下“W”,鼠标选择,save,next image
直到标注完成!
文件夹显示如下:
其中的第一张的图片标注:
<annotation>
<folder>JPEGImages</folder>
<filename>1.jpg</filename>
<path>E:\work\VOC2021\JPEGImages\1.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>1920</width>
<height>1080</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>lalazhu</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>334</xmin>
<ymin>326</ymin>
<xmax>1623</xmax>
<ymax>855</ymax>
</bndbox>
</object>
</annotation>