垃圾分类目标检测数据集准备
数据集背景:
参加全国大学生工程训练综合能力竞赛智能生活垃圾分类赛道时深感采集制作数据集过分彰显“有多少人工,就有多少智能”的惨痛,为了不辛苦麻烦身边小伙伴放暑假也要被邀请来做枯燥的快捷键+“拉枪”操作(此处再次对为我们参赛提供支持与帮助以及提出建议的小伙伴大伙伴们表示深沉的感谢~),自动化乃大势所趋。
新手小白,代码实现有许多不足,参考了许多文章,欢迎指点
主要思路
1.录视频采集目标物体视频
2.视频抽帧获得命名好的jpg图片
3.使用opencv找到目标物体在图片中的xy坐标框位置
4.将xy坐标框、名字、物体类别等信息按voc格式写入xml文件,文件命名与图片相同
采集数据集
1.录制目标物体的视频
拍摄场景
尽量还原应用场景的背景、光照、高度
采集设备
手机或相机什么的都可以
采集方式
需要多角度多亮度拍摄
我们采用的是黑绒布作为背景进行目标物体的数据集采集,因为应用场景固定为黑绒布下检测目标物体,故我们主要考虑降低光照、清晰度、部分遮挡带来的影响。在采集期间不断点击手机相机对焦,随机对焦到物体或绒布上,对焦黑绒布时可以带来过曝效果,对接物体可以得到更清晰的物体图片,以此增加数据集的情况多样性,从而提高训练出来的模型的稳定性。
举例子:
2.视频抽帧获得命名好的jpg图片(图片命名开头要带数字)
使用python代码抽帧获取图片
import cv2
import os.path
from tqdm import tqdm
file_path = r"D:\\SE\\program\\garbagedetection\\dataset\\datavediotopicture\\workplace\\"
path_dir = os.listdir(file_path) # 返回文件夹中的文件名
save_path = r"D:\\SE\\program\\garbagedetection\\dataset\\datavediotopicture\\raw_corn\\"
count = 1
name_count = 1
for allDir in tqdm(path_dir):
video_path = file_path + allDir
video = cv2.VideoCapture(video_path) # 读入视频文件
if video.isOpened(): # 判断是否正常打开
rval, frame = video.read()
else:
rval = False
timeF = 4 # 视频帧计数间隔频率
while rval: # 循环读取视频帧
rval, frame = video.read()
if (count % timeF == 0): # 每隔timeF帧进行存储操作
# cv2.imshow('pic',frame)
cv2.imwrite(save_path+allDir.split('.')[0]+'_'+str(name_count) + '.jpg', frame) # imwrite在py3中无法保存中文路径
# cv2.imencode('.jpg', frame)[1].tofile(save_path + str(count) + '.jpg') # 存储为图像
# print('E:\Dataset\file\数据\image/' + '%06d' % c + '.jpg')
name_count = name_count + 1
count = count + 1
cv2.waitKey(1)
得到的图片诸如
yolo目标检测单调无遮挡背景下单个目标数据集处理
任务分解:
1.得到目标检测框的xmin、ymin、xmax、ymax
2.能够生成xml文件
3.代码合并
4.批量化
1.采用opencv的数据采集
此处源码参考一位csdn博主的文章
# coding=utf-8
import cv2
erodenum=5#腐蚀,清除小白点
dilatenum=20#膨胀,把想要连起来的线连起来方便框取
# step1:加载图片,转成灰度图
import numpy as np
image = cv2.imread("D:\SE\program\garbagedetection\dataset\mydataadd\\0cell194\\2cell_27_21.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# step2:用Sobel算子计算x,y方向上的梯度,之后在x方向上减去y方向上的梯度,通过这个减法,我们留下具有高水平梯度和低垂直梯度的图像区域。
gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)
# subtract the y-gradient from the x-gradient
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imshow('gradient', gradient)
# step3:去除图像上的噪声。首先使用低通滤泼器平滑图像(9 x 9内核),这将有助于平滑图像中的高频噪声。低通滤波器的目标是降低图像的变化率。如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。
# 然后,对模糊图像二值化。梯度图像中不大于90的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)。
# blur and threshold the image
blurred = cv2.blur(gradient, (9, 9))
(_, thresh) = cv2.threshold(blurred, 90, 255, cv2.THRESH_BINARY)
cv2.imshow('blurred', blurred)
# step4:在上图中我们看到蜜蜂身体区域有很多黑色的空余,我们要用白色填充这些空余,使得后面的程序更容易识别昆虫区域,这需要做一些形态学方面的操作。
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (25, 25))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closed', closed)
# step5:从上图我们发现图像上还有一些小的白色斑点,这会干扰之后的轮廓检测,要把它们去掉。分别执行4次形态学腐蚀与膨胀。
# perform a series of erosions and dilations
closed = cv2.erode(closed, None, iterations=erodenum)
closed = cv2.dilate(closed, None, iterations=dilatenum)
cv2.imshow('closed2'