垃圾分类目标检测数据集准备

数据集背景:

参加全国大学生工程训练综合能力竞赛智能生活垃圾分类赛道时深感采集制作数据集过分彰显“有多少人工,就有多少智能”的惨痛,为了不辛苦麻烦身边小伙伴放暑假也要被邀请来做枯燥的快捷键+“拉枪”操作(此处再次对为我们参赛提供支持与帮助以及提出建议的小伙伴大伙伴们表示深沉的感谢~),自动化乃大势所趋。

新手小白,代码实现有许多不足,参考了许多文章,欢迎指点

主要思路

​ 1.录视频采集目标物体视频

​ 2.视频抽帧获得命名好的jpg图片

​ 3.使用opencv找到目标物体在图片中的xy坐标框位置

​ 4.将xy坐标框、名字、物体类别等信息按voc格式写入xml文件,文件命名与图片相同

采集数据集

1.录制目标物体的视频

拍摄场景

​ 尽量还原应用场景的背景、光照、高度

采集设备

​ 手机或相机什么的都可以

采集方式

​ 需要多角度多亮度拍摄

​ 我们采用的是黑绒布作为背景进行目标物体的数据集采集,因为应用场景固定为黑绒布下检测目标物体,故我们主要考虑降低光照、清晰度、部分遮挡带来的影响。在采集期间不断点击手机相机对焦,随机对焦到物体或绒布上,对焦黑绒布时可以带来过曝效果,对接物体可以得到更清晰的物体图片,以此增加数据集的情况多样性,从而提高训练出来的模型的稳定性。

举例子:

2.视频抽帧获得命名好的jpg图片(图片命名开头要带数字)

使用python代码抽帧获取图片

import cv2
import os.path
from tqdm import tqdmfile_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 + allDirvideo = cv2.VideoCapture(video_path)  # 读入视频文件if video.isOpened():  # 判断是否正常打开rval, frame = video.read()else:rval = FalsetimeF = 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 + 1count = count + 1cv2.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 npimage = 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', closed)'''step6:找出轮廓。cv2.findContours()函数第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,我们在第三步用cv2.threshold()函数已经得到了二值图。第二个参数表示轮廓的检索模式,有四种:cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
第三个参数为轮廓的近似方法cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。cv2.findContours()函数返回第一个值是list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。每一个ndarray里保存的是轮廓上的各个点的坐标。我们把list排序,点最多的那个轮廓就是我们要找的轮廓。
OpenCV中通过cv2.drawContours在图像上绘制轮廓。第一个参数是指明在哪幅图像上绘制轮廓
第二个参数是轮廓本身,在Python中是一个list
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓
第四个参数是轮廓线条的颜色
第五个参数是轮廓线条的粗细
cv2.minAreaRect()函数:
主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行。'''
(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]# compute the rotated bounding box of the largest contour
rect = cv2.minAreaRect(c)
box = np.int0(cv2.boxPoints(rect))# draw a bounding box arounded the detected barcode and display the image
cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imshow("Image", image)
cv2.imwrite("contoursImage2.jpg", image)
cv2.waitKey(0)Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
xmin = min(Xs)
xmax = max(Xs)
ymin = min(Ys)
ymax = max(Ys)
print(xmin)
print(xmax)
print(ymin)
print(ymax)key = cv2.waitKey(0)
if key == 27:  # 按esc键时,关闭所有窗口print(key)cv2.destroyAllWindows()

运行可得到:

2.写xml文件:

import os
from lxml.etree import Element, SubElement, tostring
from xml.dom.minidom import parseStringdef make_xml(xmin_tuple, ymin_tuple, xmax_tuple, ymax_tuple, image_name):node_root = Element('annotation')node_folder = SubElement(node_root, 'folder')node_folder.text = 'VOC'node_filename = SubElement(node_root, 'filename')node_filename.text = image_name + '.jpg'node_object_num = SubElement(node_root, 'object_num')node_object_num.text = str(len(xmin_tuple))node_size = SubElement(node_root, 'size')node_width = SubElement(node_size, 'width')node_width.text = '512'node_height = SubElement(node_size, 'height')node_height.text = '384'node_depth = SubElement(node_size, 'depth')node_depth.text = '3'for i in range(len(xmin_tuple)):node_object = SubElement(node_root, 'object')node_name = SubElement(node_object, 'name')node_name.text = 'ship'node_difficult = SubElement(node_object, 'difficult')node_difficult.text = '0'node_bndbox = SubElement(node_object, 'bndbox')node_xmin = SubElement(node_bndbox, 'xmin')node_xmin.text = str(xmin_tuple[i])node_ymin = SubElement(node_bndbox, 'ymin')node_ymin.text = str(ymin_tuple[i])node_xmax = SubElement(node_bndbox, 'xmax')node_xmax.text = str(xmax_tuple[i])node_ymax = SubElement(node_bndbox, 'ymax')node_ymax.text = str(ymax_tuple[i])xml = tostring(node_root, pretty_print=True)dom = parseString(xml)# print xml 打印查看结果return domif __name__ == '__main__':# dom = make_xml(xmin, ymin, xmax, ymax, image_name)dom = make_xml('1', '2', '4', '5', 'xs')# xml_name = os.path.join(save_xml_path, image_name + '.xml')xml_name = os.path.join('D:\\SE\\program\\garbagedetection\\dataset\\annotation\\', 'xs' + '.xml')with open(xml_name, 'wb') as f:f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))# 'D:\\SE\\program\\garbagedetection\\dataset\\annotation'

3.把有问题的文件集合起来

期间发现会出现图片噪音过大opencv没有处理掉的情况

如下图左下两对和右下一对就是如此的情况,框取了全图,这对我们的训练会产生一些不利影响,因此我们要想办法区别出这些干扰项,整理做之后的处置。

使用移动文件的代码移动将异常图片收集到指定文件夹。

效果如下:

# srcfile 需要复制、移动的文件
# dstpath 目的地址
import os
import shutil
from glob import globdef mymovefile(srcfile, dstpath):  # 移动函数if not os.path.isfile(srcfile):print("%s not exist!" % (srcfile))else:fpath, fname = os.path.split(srcfile)  # 分离文件名和路径if not os.path.exists(dstpath):os.makedirs(dstpath)  # 创建路径shutil.move(srcfile, dstpath + fname)  # 移动文件print("move %s -> %s" % (srcfile, dstpath + fname))src_dir = 'D:\SE\program\garbagedetection\dataset\\'
dst_dir = 'D:\SE\program\garbagedetection\dataset\move\\'  # 目的路径记得加斜杠
src_file_list = glob(src_dir + '2cell_28_182.jpg')  # glob获得路径下所有文件,可根据需要修改
for srcfile in src_file_list:mymovefile(srcfile, dst_dir)  # 移动文件

4.合并代码实现批量标注

最终得到41,255/4≈1万张目标检测数据集

# coding=utf-8
import os
from lxml.etree import Element, SubElement, tostring
from xml.dom.minidom import parseString
import numpy as np
import cv2def catch_object(imag_floder_path,image_name,num):# step1:加载图片,转成灰度图image = cv2.imread(imag_floder_path+image_name+'.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-gradientgradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)# cv2.imshow('gradient', gradient)# step3:去除图像上的噪声。首先使用低通滤泼器平滑图像(9 x 9内核),这将有助于平滑图像中的高频噪声。低通滤波器的目标是降低图像的变化率。如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。# 然后,对模糊图像二值化。梯度图像中不大于90的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)。# blur and threshold the imageblurred = 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 dilationsclosed = cv2.erode(closed, None, iterations=erodenum)closed = cv2.dilate(closed, None, iterations=dilatenum)cv2.imwrite(imag_floder_path+"datacheck\\"+image_name+'closed2'+str(num)+".jpg", closed)# cv2.imshow('closed2', closed)'''step6:找出昆虫区域的轮廓。cv2.findContours()函数第一个参数是要检索的图片,必须是为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图,我们在第三步用cv2.threshold()函数已经得到了二值图。第二个参数表示轮廓的检索模式,有四种:cv2.RETR_EXTERNAL表示只检测外轮廓cv2.RETR_LIST检测的轮廓不建立等级关系cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE建立一个等级树结构的轮廓。第三个参数为轮廓的近似方法cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息cv2.findContours()函数返回两个值,一个是轮廓本身,还有一个是每条轮廓对应的属性。cv2.findContours()函数返回第一个值是list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。每一个ndarray里保存的是轮廓上的各个点的坐标。我们把list排序,点最多的那个轮廓就是我们要找的昆虫的轮廓。OpenCV中通过cv2.drawContours在图像上绘制轮廓。第一个参数是指明在哪幅图像上绘制轮廓第二个参数是轮廓本身,在Python中是一个list第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓第四个参数是轮廓线条的颜色第五个参数是轮廓线条的粗细cv2.minAreaRect()函数:主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行。'''(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]# compute the rotated bounding box of the largest contourrect = cv2.minAreaRect(c)box = np.int0(cv2.boxPoints(rect))# draw a bounding box arounded the detected barcode and display the imagecv2.drawContours(image, [box], -1, (0, 255, 0), 3)# cv2.imshow("Image", image)cv2.imwrite(imag_floder_path+"datacheck\\"+image_name+'Image'+str(num)+".jpg", image)# cv2.waitKey(0)Xs = [i[0] for i in box]Ys = [i[1] for i in box]xmin = min(Xs)xmax = max(Xs)ymin = min(Ys)ymax = max(Ys)return xmin, ymin, xmax, ymax# ===========================================def make_xml(xmin_tuple, ymin_tuple, xmax_tuple, ymax_tuple, image_name):node_root = Element('annotation')node_folder = SubElement(node_root, 'folder')node_folder.text = 'Annotations'node_filename = SubElement(node_root, 'filename')node_filename.text = image_name + '.jpg'node_path = SubElement(node_root, 'path')node_path.text = imag_path+image_name+'.jpg'node_source = SubElement(node_root, 'source')node_database = SubElement(node_source, 'database')node_database.text = 'Code_Author_HeQN'node_size = SubElement(node_root, 'size')node_width = SubElement(node_size, 'width')node_width.text = '1280'node_height = SubElement(node_size, 'height')node_height.text = '720'node_depth = SubElement(node_size, 'depth')node_depth.text = '3'node_segmented = SubElement(node_root, 'segmented')node_segmented.text = '0'# for i in range(0):node_object = SubElement(node_root, 'object')node_name = SubElement(node_object, 'name')node_name.text = tag_namenode_pose = SubElement(node_object, 'pose')node_pose.text = 'Unspecified'node_truncated = SubElement(node_object, 'truncated')node_truncated.text = '0'node_difficult = SubElement(node_object, 'difficult')node_difficult.text = '0'node_bndbox = SubElement(node_object, 'bndbox')node_xmin = SubElement(node_bndbox, 'xmin')node_xmin.text = str(xmin_tuple)node_ymin = SubElement(node_bndbox, 'ymin')node_ymin.text = str(ymin_tuple)node_xmax = SubElement(node_bndbox, 'xmax')node_xmax.text = str(xmax_tuple)node_ymax = SubElement(node_bndbox, 'ymax')node_ymax.text = str(ymax_tuple)xml = tostring(node_root, pretty_print=True)dom = parseString(xml)# print xml 打印查看结果return dom# 先读入image框取,获取xyminmax然后写入xml
def tag_more(imag_floder_path,xml_floder_path):# .jpg文件地址path = imag_floder_path# 得到文件夹下所有文件名称files = os.listdir(path)s = []num=1# 遍历文件夹for image_File in files:# 判断是否是文件夹,不是文件夹才打开if not os.path.isdir(image_File):print(image_File)pass# 原代码为: part=image_File[0:7] 只获取文件名的前7个值# 获得后缀.前的文件名num+=1image_name = os.path.splitext(image_File)[0]xmin, ymin, xmax, ymax = catch_object(imag_floder_path,image_name,num)if(xmin<0):xmin=0if(ymin<0):ymin=0if(xmax<0):xmax=0if(ymax<0):ymax=0# print(xmin)# print(xmax)# print(ymin)# print(ymax)dom = make_xml(xmin, ymin, xmax, ymax, image_name)xml_name = os.path.join(xml_floder_path, image_name + '.xml')with open(xml_name, 'wb') as f:f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))passif __name__ == '__main__':# 常用变量imag_path = "D:\SE\program\garbagedetection\dataset\mydataadd\\can615\\"xml_path = 'D:\SE\program\garbagedetection\dataset\mydataadd\\can615\Annotation\\'# erodenum腐蚀,清除小白点# dilatenum膨胀,把想要连起来的线连起来方便框取erodenum = 1  #dilatenum = 23  ## erodenum = 3  # bottle# dilatenum = 20  # bottle# erodenum = 1  # bear_peel# dilatenum = 30  # 梨子片tag_name = 'bottle'tag_more(imag_path,xml_path)

需改的参数都在main里,需要将你想要标注的图片放在一个文件夹里,即imag_path,在放了图片的文件夹中新建Annotation文件夹和datacheck文件夹。datacheck文件夹中将放有图像处理得到框取的情况,检查框取效果适当修改main中以下两个参数:

erodenum腐蚀,清除小白点

dilatenum膨胀,把想要连起来的线连起来方便框取

潜在问题:

1.物体没有被完全框取的可能原因

​ 1.边缘线被腐蚀太多,无法连在一起被识别成一整个物体

​ 解决方案:

​ 1.减小erodenum

​ 2.增大 dilatenum

​ 2.颜色和背景过于相近无法被边缘检测分辨

​ 解决方案:

​ 1.减小erodenum

2.物体框包含了不该在内的内容的原因

​ 1.与背景界限不清或和其他非目标物体的明显边缘相连

​ 解决方案:

​ 1.如果是与边界相连且图片中物体与边界存在一定距离的话,可以减小dilatenum降低膨胀度以及适度提高erodenum,可以变量唯一法试一下看看哪组参数适合这类物体的图片

​ 2.如果是如果杂质被放大太多和目标物体相连则增大erodenum。

3.如果出现如下报错IndexError: list index out of range

​ 原因是opencv处理图像时没找到合适的框取目标检查一下最后读取到的图片,如果是此问题,删除即可。如果图像纯粹因为曝光过低无法看到物体,则需要修改二值化时的阈值参数

找到step3修改

(_, thresh) = cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY)128处的参数,这是将灰度图二值化,将灰度值在128以下的像素改为黑色,参数范围在1~254,越高则被判断为黑色的区域越多

标物体的明显边缘相连

​ 解决方案:

​ 1.如果是与边界相连且图片中物体与边界存在一定距离的话,可以减小dilatenum降低膨胀度以及适度提高erodenum,可以变量唯一法试一下看看哪组参数适合这类物体的图片

​ 2.如果是如果杂质被放大太多和目标物体相连则增大erodenum。

3.如果出现如下报错IndexError: list index out of range

​ 原因是opencv处理图像时没找到合适的框取目标检查一下最后读取到的图片,如果是此问题,删除即可。如果图像纯粹因为曝光过低无法看到物体,则需要修改二值化时的阈值参数

找到step3修改

(_, thresh) = cv2.threshold(blurred, 128, 255, cv2.THRESH_BINARY)128处的参数,这是将灰度图二值化,将灰度值在128以下的像素改为黑色,参数范围在1~254,越高则被判断为黑色的区域越多

【自制数据集自动标注】yolo目标检测 voc格式 单调无遮挡背景单个物体自制数据集自动标注相关推荐

  1. Citypersons数据集转VOC标准格式(YOLO 目标检测txt格式)

    CItyscapes城市数据集包含一组不同的立体视频序列中记录来自50个不同城市的街景,高质量的进行像素级的注释.数据集下载地址(需要申请注册,通过申请才能下载)[https://www.citysc ...

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

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

  3. python实现目标检测voc格式标签数据增强

    文章目录 前言 一.显示图片(可关闭) 二.创建图像变换的类 1.增强数据代码 2.图像加噪声 3.调整图像亮度 4.添加黑色像素块 5.旋转图像 6.图像裁剪 7.平移图像 8.图像镜像 9.图像随 ...

  4. 瞬间洞察万物:YOLO目标检测算法的黑科技全揭秘

    目录 简介与背景知识: 数据集准备: 模型选择和预训练: 模型构建和训练: 目标检测与推断: 性能优化与改进: 实例应用和扩展: yolo各版本: 总结: 简介与背景知识: ​ YOLO(You On ...

  5. 数据集:Udacity Self-Driving 目标检测数据集

    转载自:http://blog.csdn.net/jesse_mx/article/details/72599220 前言 之前,博主为了得到更好的车载视频目标检测效果(偏工程实际,非刷榜),使用SS ...

  6. 90+深度学习开源数据集整理|包括目标检测、工业缺陷、图像分割等多个方向

    导读 本文整理汇总了90+深度学习各方向的开源数据集,包含了小目标检测.目标检测.工业缺陷检测.人脸识别.姿态估计.图像分割.图像识别等方向. 小目标检测 1.AI-TOD航空图像数据集 数据集下载地 ...

  7. 目标检测实战:4种YOLO目标检测的C++和Python两种版本实现

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨nihate 审稿丨邓富城 编辑丨极市平台 导读 本文作者使用C++编写一套基于OpenCV的Y ...

  8. 项目设计:基于YOLO目标检测算法的安全帽/口罩/汽车/行人/交通标志...检测

    本文将详细介绍YOLO目标检测算法,该算法支持各种目标检测,包括:安全帽.汽车.造价.交通标志......等.  其他毕业设计题目推荐参考: 毕业设计:电子/通信/计算机/物联网专业毕业设计选题参考( ...

  9. 【深度学习】目标检测实战:4种YOLO目标检测的C++和Python两种版本实现

    作者丨nihate 审稿丨邓富城 编辑丨极市平台 导读 本文作者使用C++编写一套基于OpenCV的YOLO目标检测,包含了经典的YOLOv3,YOLOv4,Yolo-Fastest和YOLObile ...

最新文章

  1. Python决策树可视化Graphviz下载地址
  2. C语言const专题
  3. DjangoFreshStore项目一
  4. 179一个错误的认识
  5. 翁同龢后人向上海博物馆捐赠两件重要家藏
  6. 为什么promise就是微队列?setTimeOut就是宏队列?
  7. mysql的gobye_Mysql學習(一)添加一個新的用戶並用golang操作Mysql
  8. android servlet乱码问题,初识 JSP---(Servlet映射 / ServletRequest / get与post区别 / 解决乱码)...
  9. linux su命令位置,Linux命令大全su详解
  10. Spring整合Quartz实现持久化、动态设定时间
  11. SAP License:ERP系统和OA系统的区别?
  12. 2018.7.18 上半年课程总结 4- 高级英语
  13. Linux 服务器上安装 Virtuoso 数据库 并导入数据(超详细)
  14. Shell脚本学习-阶段二十七-命令解释二
  15. Flutter高仿微信-第47篇-群聊-语音
  16. vue中长时间未操作就会强制退出
  17. java 解析cad文件数据开源免费jar整理
  18. 我是女生,想进入IT行业难吗?
  19. 【leetcode题解——动态规划之完全背包】518.零钱兑换II(python版本详解+表格+dp五部曲)
  20. 联芯 1860平台 icn6211 mipi to RGB 转换芯片 调试 和 st7789 LCD调试spi 9bit 模式

热门文章

  1. 天猫双十一成交额是如何预测的
  2. touchGFX综合学习六、touchGFX使用FontCache字体缓存功能实现直接从外部存储介质显示字符串
  3. 【SDL游戏编程入门第十六卷】输出中文SDL_ttf以及设置中文标题
  4. 谁能悄悄告诉我:EDG到底是啥?
  5. 腾讯视频关闭自动续费功能
  6. chkdsk 不是内部文件
  7. oracle函数集中总结
  8. (idea)the file size(2.97M) exceeds configured limit(2.56M).Code insight features are not available问题
  9. WPF TextBox 只能输入数字,并限制输入大小
  10. 秒拍恢复上架 一下科技CEO韩坤:重新出发 砥砺前行