linux+cuda11.1的detectron2安装以及demo运行教程
使用json头文件对coco格式json进行查看
大家可以用coco2017的json跟我一起测试一下
#使用json头文件读入coco数据集
import json
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/coco_ycbv_train_000000.json",'r') as load_f:
f = json.load(load_f)
print(f.keys())
#查看一下这份文件的annotations信息
f['annotations']
#读取annotations里第一个标注框的信息
f['annotations'][0]
#读取第一个bbox
f['annotations'][0]['bbox']
#读取一下这份文件的info信息
f['info']
#读取一下这份文件的licenses信息
f['licenses']
#读取类别
f['categories']
#读取图片的信息
f['images']
#试着读取一下id=0的框
f['images'][0]
#再试着读一下文件的路径
#到时候根据这个来修改文件路径
f['images'][0]['file_name']
#文件指针关闭
#参考代码[Python 文件打开,关闭,文件指针](https://blog.csdn.net/Smile_Mr/article/details/83179473)
load_f.close()
使用COCO API 对COCO格式的JSON进行查看
加载annotations文件(这里加载instances_val2017.json),生成COCO对象
import numpy as np
from pycocotools.coco import COCO
import json
annFile = os.path.join(COCODIRS['annotations'], 'coco_ycbv_train_000000.json')
# with open(annFile,'r') as fp: # 这段注释,原本是直接加载json,看看里面的内容
# a = json.load(fp)
# a
coco = COCO(annFile) # 初始化生成COCO对象
coco # 生成的COCO对象
- coco.getCatIds() 此函数用于获取加载对象所包含的所有类别的id(即category 的序号)
- coco.getAnnIds() 获取加载对象所包含的所有标记信息(就是所有图片的Segmentation,即分割的坐标数据)
- coco.getImgIds() 获取所有 标记所对应的原图id
categories = coco.loadCats(coco.getCatIds()) # loadCats()需要传入 需加载的类别id序列(catIds)
#categories[:10] # 为了输出美观,这是仅展示10条数据
categories[:]#显示全部数据
names = [cat['name'] for cat in categories]
#names[:10]#为了输出美观,这里我们也只显示十个类别
names[:]#显示全部类别
获取指定名称的类别序号(找category name为 x 的 category id)
这里获取 name为8,14,21所对应的类别id,原因是:我的数据集json文件里面只包含类别8,14,21的物体
catIds = coco.getCatIds(catNms=['8', '14', '21'])
catIds
获取所有符合catIds的图片id
即上面我们得到的类别为8,14,21,那么就获取图片中含有这三个类别的图片对应的id
- 注意getImgIds 取的是交集,不是并集,多加一个id都只返回空串¶
imgIds = coco.getImgIds(catIds=catIds)
imgIds
从上面符合条件的所有图片序号中随机选取(这里用numpy的随机函数)一个图片,通过loadImgs()加载该图片的信息
img_info = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])
img_info
可以看到loadImgs()返回的是一个list,其每条元素是对应的一个图片的具体信息
由于我们这里需要的是一个图片信息,所以用下面的方法,提取出第一条信息
img_info = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])[0]
#从里面只选择一张图片试试看(底下这行代码只能运行一次,所以我们注释了底下的,选上面的代码运行)
#img_info = img_info[0]
img_info
可以看到获得的图片信息包括:
- license
- file_name
- coco_url
- height
- width
- date_captured
- flickr_url
- id
使用json头文件对coco格式json进行修改
我这里以我修改ycbv的json文件的filename为例
import json
dic = {}
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'r',encoding='utf8') as load_f:
f = json.load(load_f)
print(f.keys())
#读取图片的信息
f['images']
可以看到,我文件里的file_name都是 ‘…\000000\rgb\000001.png’这样的格式的,这样的格式我没有办法在detectron2里使用,所以我想使用python的字符串函数将其改成’/000000/rgb/000001.png’
for num in range(0,len(f['images'])):
#print(num)
#print(img[num]['file_name'])
str = f['images'][num]['file_name']
str = str.replace('..\\','')
str = str.replace('\\','/')
#print(str)
f['images'][num]['file_name']=str
print(f['images'][num]['file_name'])
#把刚才所有的处理都保存到dic中,然后关闭load_f
dic = {}
dic = f
load_f.close()
现在重新打开文件,使用jump函数将刚才修改好的内容覆盖到这个文件里
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'w') as load_f:
json.dump(dic,load_f)
load_f.close()
检查一下修改的结果
#检测一下修改结果
with open("/home/fengsiyuan/detectron2/datasets/coco/annotations/data_train.json",'r',encoding='utf8') as load_f:
f = json.load(load_f)
print(f.keys())
f['images'][113197]
可以看到,文件的file_name已经修改成我们想要的格式了。所以我们把文件指针关闭
load_f.close()