COCO数据集使⽤——COCOAPI配置
1.下数据集 ,包括训练集,验证集,测试集,annotation等。
2. 下载新版API,地址。
3. 进⼊PythonAPI/路径⾥,进⾏配置,下⾯的配置过程分为两种情况。⼀是ubuntu系统,⼀是windows系统。
【⽤ubuntu配置】 ——⽐较推荐,坑⽐较少!
激活tensorflow环境,进⼊~/cocostuffapi/PythonAPI/路径下,输⼊ python install,如果不报错即配置成功,在python环境中import pycocotools试试看,如果不报错,说明安装成功。
报错可能有:cython版本过低,pycocotools要求cython版本⼤于0.27.3
解决⽅案:pip install Cython(注意C是⼤写),安装完后输⼊cython测试是否安装成功。
2018.10.10更新:
看到了⼏个关于coco数据集的处理教程,分享下链接~
1.pycocotools中包含了⼀个coco.py⽂件,是⼀个对coco数据json⽂件的解析⼯具(这也是我们前⾯要千⾟万苦安装它的原因),在程序开头这样调⽤: import COCO
coco.py中包含以下⼏个接⼝():
# decodeMask - Decode binary mask M encoded via run-length encoding.
# encodeMask - Encode binary mask M using run-length encoding.
迅搜百科
# getAnnIds - Get ann ids that satisfy given filter conditions.
# getCatIds - Get cat ids that satisfy given filter conditions.
# getImgIds - Get img ids that satisfy given filter conditions.
# loadAnns - Load anns with the specified ids.
# loadCats - Load cats with the specified ids.
# loadImgs - Load imgs with the specified ids.
# annToMask - Convert segmentation in an annotation to binary mask.
# showAnns - Display the specified annotations.
# loadRes - Load algorithm results and create API for accessing them.
# download - Download COCO images server.
# Throughout the API "ann"=annotation,"cat"=category, and "img"=image.
2018.10.11更新:
coco数据集的使⽤:
图⽚名称file_name和图⽚id的对应关系:id号就是图⽚名称从⾮零位开始的部分,所以想要通过图⽚名称读取id,再读取信息可以这样做:
def filename_imgid(filename_list):
imgIds =[]
for i in range(len(filename_list)):
for j in range(12):
if(filename_list[i][j]!='0'):
imgIds.append(int(filename_list[i][j:12])) #将字符串转换成数字存储
break
return imgIds
【注意】:
break只跳出最内层循环
filename_list[i][j]是字符’0’,不是数字0
vs2017和vs2019获取了imgIds之后,需要通过loadImgs操作来提取信息,我们先来查看⼀下coco数据存储格式:
coco=COCO(annFile)
imgs =[(img_id, coco.imgs[img_id])for img_id in coco.imgs] #获取全部图⽚信息
print(imgs[0])  #输出的是第⼀个图⽚的信息
print(type(imgs[0]))  #<class'tuple'>说明是以tuple存储的。
coco数据集的存储格式是这样的(也就是上⾯的print(imgs[0])输出):
(532481, {'width': 640, 'file_name': '000000532481.jpg', 'coco_url': '/val2017/000000532481.jpg', 'height': 426, 'id': 532481, 'li cense': 3, 'date_captured': '2013-11-20 16:28:24', 'flickr_url': 'farm7.staticflickr/6048/5915494136_da3cfa7c5a_z.jpg'})
也就是说,必须通过img的id才能获取后⾯这个tuple的信息。现在已知了imgIds,要load的时候,需要使⽤命令:
# img = coco.loadImgs(imgIds)[0]
img = coco.loadImgs(imgIds)  #因为我是⾃⼰构建的imgIds,本来就已经是⼀个数字构成的list了,所以就不需要[0]了,关于[0]的说明见⽂章最下⾯。
主程序部分:
c语言定义一个结构dataDir='/mask/data/coco'
dataType='val2017'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)
coco=COCO(annFile)
filename_list =_get_img_filename(dataDir,dataType)
imgIds =filename_imgid(filename_list)
print(imgIds)
img = coco.loadImgs(imgIds)
print(type(img[1]['file_name']))
for i in range(len(imgIds)):
I =io.imread('%s/%s/%s'%(dataDir, dataType, img[i]['file_name']))
plt.imshow(I)
annIds = AnnIds(imgIds=img[i]['id'])
anns = coco.loadAnns(annIds)
coco.showAnns(anns)
plt.show()
对[0]的说明:
imgIds =[1296,1490,1000,1353,872,1425,885,1503]  #⾃⼰的图⽚id
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])
print(img)
img2 = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
print(img2)
#img:
[{'license':4,'file_name':'000000001000.jpg','coco_url':'/val2017/000000001000.jpg','height':480,'width':640,'id':1000,'d ate_captured':'2013-11-21 05:13:59','flickr_url':'farm5.staticflickr/4115/4906536419_6113bd7de4_z.jpg'}]
ostrich读音浊化吗#img2:
{'license':2,'file_name':'000000001503.jpg','coco_url':'/val2017/000000001503.jpg','height':240,'width':320,'id':1503,'d
ate_captured':'2013-11-22 17:22:02','flickr_url':'farm1.staticflickr/4/4589204_0d42f46fe6_z.jpg'}
由此可以看出,img读到的是⼀个list,要对img[0]才是dict,也就是img2 = img[0]~~
scaler是什么意思下⼀部分是⽤提取的图⽚来构建tfrecords⽤来训练,之后在更。
更新:
在mask rcnn的download_and_convert_coco.py基础上,加⼊了我⾃⼰构造的两个函数,通过图⽚名字来获取图⽚id,然后load,在函数_add_to_tfrecord()中加了以下⼏句话:
filename_list =_get_img_filename(image_dir, split_name)
imgIds =filename_imgid(filename_list)
imgs =[(img_id, coco.imgs[img_id])for img_id in coco.imgs if img_id in imgIds] #最重要的是这句
这两个⾃⼰定义的函数如下:
def _get_img_filename(image_dir,split_name):python解析json文件
filename_list = os.listdir(os.path.join(image_dir, split_name))
return filename_list
def filename_imgid(filename_list):
imgIds =[]
for i in range(len(filename_list)):
for j in range(12):
if(filename_list[i][j]!='0'):
imgIds.append(int(filename_list[i][j:12]))  # 将字符串转换成数字存储
break
return imgIds

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。