搜到了很多有关coco可视化的网页,但是其中的代码有的冗长,有的简短,但大都无法直接运行无报错,综合各方代码,自己整理了个版本,在coco2017数据集完美运行,具体可视化效果如下:
# -*- coding: utf-8 -*-
import os
import sys, getopt
from pycocotools.coco import COCO
import cv2
import matplotlib.pyplot as plt
def mkdir_os(path):
if not os.path.exists(path):
os.makedirs(path)
def main(argv):
inputfile = '' # './data/coco/val2017/'
jsonfile = '' # './data/coco/annotations/instances_val2017.json'
outputfile = '' # './data/coco/vis/'
try:
opts, args = getopt.getopt(argv, "hi:j:o:", ["ifile=", "jfile=", "ofile="])
except getopt.GetoptError:
print('test.py -i <inputfile> -j <jsonfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print('test.py -i <inputfile> -j <jsonfile> -o <outputfile>')
sys.exit()
elif opt in ("-i", "--ifile"):
inputfile = arg
elif opt in ("-j", "--jfile"):
jsonfile = arg
elif opt in ("-o", "--ofile"):
outputfile = arg
print('\n输入的文件为:', inputfile)
print('\n输入的json为:', jsonfile)
print('\n输出的文件为:', outputfile)
mkdir_os(outputfile)
coco = COCO(jsonfile)
catIds = coco.getCatIds(catNms=['wires']) # catIds=1 表示人这一类
imgIds = coco.getImgIds(catIds=catIds) # 图片id,许多值
print(imgIds)
for i, imgId in enumerate(imgIds):
print(i, "/", len(imgIds))
img = coco.loadImgs(imgId)[0]
cvImage = cv2.imread(os.path.join(inputfile, img['file_name']), -1)
cvImage = cv2.cvtColor(cvImage, cv2.COLOR_BGR2GRAY)
cvImage = cv2.cvtColor(cvImage, cv2.COLOR_GRAY2BGR)
plt.cla()
plt.axis('off')
plt.imshow(cvImage)
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
coco.showAnns(anns)
plt.savefig(os.path.join(outputfile, img['file_name']))
if __name__ == "__main__":
main(sys.argv[1:])