应用系统定制开发目标检测标注文件yolov5(txt)格式转(json)应用系统定制开发格式详解及代码实现
Reference:
前言
应用系统定制开发正好自己做目标检测任应用系统定制开发务更换模型需要使用不应用系统定制开发同格式的标注文件,应用系统定制开发所以在网上找了半天类似博文,应用系统定制开发发现大多都只有代码或应用系统定制开发者解释不全,应用系统定制开发对新手不够友好,应用系统定制开发我在转换的过程中就debug应用系统定制开发了半天才转换成功,所以写下这篇博文以求尽可能的全面的解释转换过程,让其他同学少走弯路。
1.yolo v5格式(txt)
v5的标注文件格式比较简单,如下图所示:
每一张图片对应一个.txt文件,每一行表示该图片的一个标注框,该图片有多少标注框就有多少行数据,每一行有五列,分别表示:类别代号、标注框横向的相对中心坐标x_center、标注框纵向的相对中心坐标y_center、标注框相对宽度w、标注框相对高度h。注意x_center、y_center、w、h为真实像素值除以图片的高和宽之后的值。
2.coco格式(json)
本文所描述的coco格式为标准coco数据集里的object instances格式,coco的坐标信息为(xmin,ymin,w,h),(xmin,ymin)表示标注框的左上角坐标,这四个值都是绝对值,coco格式的基本信息描述如下:
{ "info": info, #描述数据集的相关信息,内部由字典组成 "licenses": [license], #列表形式,内部由字典组成 "images": [image], #描述图片信息,列表形式,内部由字典组成,字典数量为图片数量 "annotations": [annotation], #描述bounding box信息列表形式,内部由字典组成,字典数量为bounding box数量 "categories": [category] # 描述图片类别信息,列表形式 ,内部由字典组成,字典数量为类别个数}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
和yolo v5标注文件不同的是,coco标注文件的格式为.json文件,且所有图片的标注信息在一个.json文件里,该json文件由上面描述的字典组成,该字典有五个key,下面将描述每个key对应value的详细信息:
info{ "year": int, #年份 "version": str, #数据集版本 "description": str, #数据集描述 "contributor": str, #数据集的提供者 "url": str, #数据集的下载地址 "date_created": datetime, #数据集的创建日期}license{ "id": int, "name": str, "url": str,} image{ "id": int, #图片标识,相当于图片的身份证 "width": int, #图片宽度 "height": int, #图片高度 "file_name": str, #图片名称,注意不是图片的路径,仅仅是名称 "license": int, "flickr_url": str, #flicker网络地址 "coco_url": str, #网络地址路径 "date_captured": datetime, #图片获取日期}annotation{ "id": int, #bounding box标识,相当于bounding box身份证 "image_id": int, #图片标识,和image中的"id"对应 "category_id": int, #类别id "segmentation": RLE or [polygon], #描述分割信息,iscrowd=0,则segmentation是polygon格式;iscrowd=1,则segmentation就是RLE格式 "area": float, #标注框面积 "bbox": [x,y,width,height], #标注框坐标信息,前文有描述 "iscrowd": 0 or 1, #是否有遮挡,无遮挡为0,有遮挡为1}category{ "id": int, #类别id,注意从1开始,而不是从0开始 "name": str, #类别名称 "supercategory": str, #该类别的超类是什么}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
上述就是coco数据集的详细解析。
二、代码
这一部分是重点,我将尽可能全面讲解需要更改的地方
由第一节分析可知,yolo v5格式只有图片名称、类别、bounding box坐标信息,而coco格式的信息更丰富,而开源代码基本也只关注yolo v5格式里所提供的信息,因此我们不必过于纠结coco格式的多余信息。
详细代码及注释信息如下:
import osimport jsonimport cv2import randomimport timefrom PIL import Imagecoco_format_save_path='D:\\yolov5\\CCTSDB-2021\\train\\' #要生成的标准coco格式标签所在文件夹yolo_format_classes_path='D:\\yolov5\\CCTSDB-2021\mes.txt' #类别文件,一行一个类yolo_format_annotation_path='D:\\yolov5\\CCTSDB-2021\\labels\\train\\' #yolo格式标签所在文件夹img_pathDir='D:\\yolov5\\CCTSDB-2021\\images\\train\\' #图片所在文件夹with open(yolo_format_classes_path,'r') as fr: #打开并读取类别文件 lines1=fr.readlines()# print(lines1)categories=[] #存储类别的列表for j,label in enumerate(lines1): label=label.strip() categories.append({'id':j+1,'name':label,'supercategory':'None'}) #将类别信息添加到categories中# print(categories)write_json_context=dict() #写入.json文件的大字典write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2022, 'contributor': '纯粹ss', 'date_created': '2022-07-8'}write_json_context['licenses']=[{'id':1,'name':None,'url':None}]write_json_context['categories']=categorieswrite_json_context['images']=[]write_json_context['annotations']=[]#接下来的代码主要添加'images'和'annotations'的key值imageFileList=os.listdir(img_pathDir) #遍历该文件夹下的所有文件,并将所有文件名添加到列表中for i,imageFile in enumerate(imageFileList): imagePath = os.path.join(img_pathDir,imageFile) #获取图片的绝对路径 image = Image.open(imagePath) #读取图片,然后获取图片的宽和高 W, H = image.size img_context={} #使用一个字典存储该图片信息 #img_name=os.path.basename(imagePath) #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值 img_context['file_name']=imageFile img_context['height']=H img_context['width']=W img_context['date_captured']='2022-07-8' img_context['id']=i #该图片的id img_context['license']=1 img_context['color_url']='' img_context['flickr_url']='' write_json_context['images'].append(img_context) #将该图片信息添加到'image'列表中 txtFile=imageFile[:5]+'.txt' #获取该图片获取的txt文件 with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr: lines=fr.readlines() #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息 for j,line in enumerate(lines): bbox_dict = {} #将每一个bounding box信息存储在该字典中 # line = line.strip().split() # print(line.strip().split(' ')) class_id,x,y,w,h=line.strip().split(' ') #获取每一个标注框的详细信息 class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h) #将字符串类型转为可计算的int和float类型 xmin=(x-w/2)*W #坐标转换 ymin=(y-h/2)*H xmax=(x+w/2)*W ymax=(y+h/2)*H w=w*W h=h*H bbox_dict['id']=i*10000+j #bounding box的坐标信息 bbox_dict['image_id']=i bbox_dict['category_id']=class_id+1 #注意目标类别要加一 bbox_dict['iscrowd']=0 height,width=abs(ymax-ymin),abs(xmax-xmin) bbox_dict['area']=height*width bbox_dict['bbox']=[xmin,ymin,w,h] bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]] write_json_context['annotations'].append(bbox_dict) #将每一个由字典存储的bounding box信息添加到'annotations'列表中name = os.path.join(coco_format_save_path,"train"+ '.json')with open(name,'w') as fw: #将字典信息写入.json文件中 json.dump(write_json_context,fw,indent=2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
重点
重点
重点
代码中你可能存在疑问的地方
①
coco_format_save_path='D:\\yolov5\\CCTSDB-2021\\train\\' #要生成的标准coco格式标签所在文件夹yolo_format_classes_path='D:\\yolov5\\CCTSDB-2021\mes.txt' #类别文件,一行一个类yolo_format_annotation_path='D:\\yolov5\\CCTSDB-2021\\labels\\train\\' #yolo格式标签所在文件夹img_pathDir='D:\\yolov5\CCTSDB-2021\\images\\train\\' #图片所在文件夹
- 1
- 2
- 3
- 4
1#coco_format_save_path 这里是你自己设置的一个路径,像我在存放yolo数据集和标签的路径下新建了两个文件夹train和val来存放新生成的coco(json)格式文件,因为我的images和labels文件夹下有两个文件分别是存放训练集和验证集的图片,第一轮运行代码的时候coco_format_save_path,yolo_format_classes_path,img_pathDir路径最后都写train,这样生成的训练集的json文件就存放在新建文件夹train里,第二轮运行之前路径最后都改成val,这样生成的验证集的json文件就存放在新建文件夹val里了。
2#yolo_format_classes_path这里用txt文件写就行,这里是要你自己新建一个txt写的,因为之前没有,形式要写成一行一类,不知道的可以看着图片与对应的labels对照一下,要按照顺序写。我下面放个图看起来就会明白了。
txtFile=`imageFile[:5]`+'.txt' #代码在第49行的位置
- 1
这里txtFile
读取的是你的图片名字,像我的图片名字使用数字表示如图
我标签名字也是用对应的数字表示如图
我读的时候单独打印了一下,imageFile
打印出来是图片名字加图片格式比如15454.jpg
,而这一行代码是要将图片名与标签对应上,所以需要去掉.jpg
加上标签的格式.txt
所以imageFile[:5]
这里的索引要你自己设置,你只需要要取你图片的名字而不能加上格式,像我的数据集就是[:5]
正好取到15454
.
好了大概需要注意的地方就是这些了,都是一些可能会有疑问以及容易出错的地方,希望能给与需要的人一些帮助。
对你有帮助的话还请点赞收藏哦嘻嘻
总结
以上就是我对目标检测中yolo v5格式和coco格式的理解和代码实现,大家如果有更深层的理解和更好的代码实现可以留言或私信讨论哦。