COCO数据集相关知识介绍

news2024/12/26 0:13:34

👨‍💻个人简介: 深度学习图像领域工作者
🎉总结链接:
             链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:
                    📌1.工作中常用深度学习脚本
                    📌2.torch、numpy等常用函数详解
                    📌3.opencv 图片、视频等操作
                    📌4.个人工作中的项目总结(纯干活)
              链接: https://blog.csdn.net/qq_28949847/article/details/128552785
🎉视频讲解: 以上记录,通过B站等平台进行了视频讲解使用,可搜索 ‘Python图像识别’ 进行观看
              B站:Python图像识别
              抖音:Python图像识别
              西瓜视频:Python图像识别


1. 数据下载

COCO2017数据集官方下载:
http://images.cocodataset.org/annotations/annotations_trainval2017.zip
http://images.cocodataset.org/zips/val2017.zip
http://images.cocodataset.org/zips/train2017.zip

COCO整个人体关键点数据集:
github: https://github.com/jin-s13/COCO-WholeBody里面包含下载标签的链接,谷歌网盘下载

百度网盘下载:链接:https://pan.baidu.com/s/1OFE_6kq_0ogTXlxc7rpZdg?pwd=xhiu

里面包含coco2017数据集以及coco整体关键点

2. annotations标签文件介绍:

captions_train2017.json:图片描述训练集
captions_val2017.json:图片描述测试集
coco_wholebody_train_v1.0.json:人全体关键点训练集
coco_wholebody_val_v1.0.json:人全体关键点测试集
instances_train2017.json:目标检测、分割训练集
instances_val2017.json:目标检测、分割测试集
person_keypoints_train2017.json:关键点训练集
person_keypoints_val2017.json:关键点测试集

不过上面的json文件中的标注有些会相互之间包含,比如person_keypoints_train2017.json关键点数据集中,也会有seg和box的标注信息。

3. json文件格式介绍

上面这些json文件的格式大体上都是一样的,都包含以下5个字段:

{
    "info": info,
    "licenses": [license],
    "images": [image],
    "annotations": [annotation],
    "categories": [categories]
}

info:是一个字典,包含了数据集的年份、版本、作者,以及描述等信息
licenses:是一个list,包含了数据集的发布证书信息,由于有多个证书,将它们的信息以序列表的形式进行存储,序列表中每个证书的存储形式是一样的
images:是一个list,包含了图像信息,由于有多张图像,将它们的信息以序列表的形式进行存储,序列表中每张图像信息的存储形式是一样的

这三个字段在每个json中都是一样的格式,但是annotations和categories,每个json会根据不同标注内容会不一样。

最重要的是 images 字段,它里面包含了图片的 file_name、 height、 width这三个信息,会经常用到。

images字段的内容是个列表,包含了所有的图片

上面3个字段的示例:

"info": {
        "description": "COCO-WholeBody",
        "url": "https://github.com/jin-s13/COCO-WholeBody",
        "version": "1.0",
        "year": "2020",
        "date_created": "2020/07/01"
    },
"licenses": [
	    {
	        "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
	        "id": 1,
	        "name": "Attribution-NonCommercial-ShareAlike License"
	    }],
"images": [
        {
            "license": 3,
            "file_name": "000000391895.jpg",
            "coco_url": "http://images.cocodataset.org/train2017/000000391895.jpg",
            "height": 360,
            "width": 640,
            "date_captured": "2013-11-14 11:18:45",
            "flickr_url": "http://farm9.staticflickr.com/8186/8119368305_4e622c8349_z.jpg",
            "id": 391895
        },
        {
            "license": 4,
            "file_name": "000000522418.jpg",
            "coco_url": "http://images.cocodataset.org/train2017/000000522418.jpg",
            "height": 480,
            "width": 640,
            "date_captured": "2013-11-14 11:38:44",
            "flickr_url": "http://farm1.staticflickr.com/1/127244861_ab0c0381e7_z.jpg",
            "id": 522418
        }]

3.1 Keypoint Detection 人全体关键点 annotations和categories 介绍:

3.2 Keypoint Detection(17个关键点检测) annotations和categories 介绍:

一个图像包干若干对象,一个对象对应一个字典,一个字典注释包含对象注释的所有数据(包括id、bbox等)

”keypoints“字段的value是一个长度为3 * n 的数组,其中n是类别定义的关键点总数(例如人体姿态关键点的n为17)。每个关键点都由3个值组成(x, y, v),其中v=0表示未标记,此时x=y=0;v=1时表示标记,但不可见,不可见的原因在于被遮挡了;v=2时表示标记且可见。

annotation是个列表,里面是好多的字典,每个字典是一个标注对象,注意这个字典中包含的是图片中的一个对象的信息,不是整张图片的所有对象的信息。
形式如下:

annotation[{
	"segmentation"  : [] # 分割信息
	"keypoints"		: [x1,y1,v1,x2,y2,v2,...],  # 共 3 * 17 个数值
	"num_keypoints"	: int, 	# v=1,2的关键点的个数,即有标记的关键点个数
	"area"		:  float,  # 标注对象的面积
	"iscrowd"   : int,  # 
	"image_id"  : int, # 
	"bbox"  : [x1, y1, w, h],  # 标注对象的box框 	
},...]
 
categories[{
	"keypoints"	: [str], 	# 长度为17的关键点名字符串,关键点的标注顺序在这里能体现出来
	"skeleton"	: [edge], 	# 关键点的连通性,主要是通过一组关键点边缘队列表的形式表示,用于可视化.
}]

coco_wholebody_train_v1.0.json相关操作

将coco_wholebody_train_v1.0.json全身数据集中的人的box和人脸的右眼中心、左眼中心、鼻子、右嘴边、左嘴边提取出来,并保存为txt文件(数据未进行归一化,其中的左右是相对标注图片来的),用来同时训练人的box和人脸关键点,脚本如下:

from pycocotools.coco import COCO
import cv2
import os
import numpy as np
import random


def show_img(yolo_res):
    # 测试图片路径
    # if img_name != '000000004441.jpg':
    #     continue
    img_name = yolo_res[0]
    print(img_name)
    cls = yolo_res[1]
    width = yolo_res[2]
    height = yolo_res[3]
    print(width, height)
    x1 = yolo_res[4]
    y1 = yolo_res[5]
    width_box = yolo_res[6]
    height_box = yolo_res[7]
    right_eye_x = yolo_res[8]
    right_eye_y = yolo_res[9]
    right_eye_value = yolo_res[10]
    left_eye_x = yolo_res[11]
    left_eye_y = yolo_res[12]
    left_eye_value = yolo_res[13]
    nose_x  = yolo_res[14]
    nose_y = yolo_res[15]
    nose_value = yolo_res[16]
    right_mouse_x = yolo_res[17]
    right_mouse_y = yolo_res[18]
    right_mouse_value = yolo_res[19]
    left_mouse_x = yolo_res[20]
    left_mouse_y = yolo_res[21]
    left_mouse_value = yolo_res[22]
    im = cv2.imread(os.path.join(cocoRoot, img_name))
    cv2.circle(im, (int(right_eye_x), int(right_eye_y)), 1, (0, 255, 0), 2)
    cv2.circle(im, (int(left_eye_x), int(left_eye_y)), 1, (0, 255, 0), 2)
    cv2.circle(im, (int(nose_x), int(nose_y)), 1, (0, 255, 0), 2)
    cv2.circle(im, (int(right_mouse_x), int(right_mouse_y)), 1, (0, 255, 0), 2)
    cv2.circle(im, (int(left_mouse_x), int(left_mouse_y)), 1, (0, 255, 0), 2)
    print(left_mouse_value, right_mouse_value, nose_value, left_mouse_value, left_eye_value, right_eye_value)
    # 画矩形
    cv2.rectangle(im, (int(x1), int(y1)), (int(x1) + int(width_box), int(y1) + int(height_box)), (0, 255, 0), 2)

    cv2.imshow('111', im)
    cv2.waitKey(0)


'''
    形成如下格式的TXT文件, eye: 是眼的中心
    [img_name, cls, width, height, x1, y1, width_box, height_box,
        right_eye_x, right_eye_y, right_eye_value,
        left_eye_x, left_eye_y, left_eye_value,
        nose_x, nose_y, nose_value,
        right_mouse_x, right_mouse_y, right_mouse_value,
        left_mouse_x, left_mouse_y, left_mouse_value]
    数据未进行归一化处理
'''
if __name__ == '__main__':

    ann_file = r'E:\lg\coco2017\annotations\coco_wholebody_train_v1.0.json'
    # 图片路径
    cocoRoot = r'E:\lg\coco2017\train2017'
    # 生成的txt保存路径
    save_path = r'E:\lg\coco2017\annotations\box_facekpts'
    coco = COCO(ann_file)
    # 遍历所有的图片
    for imgID in coco.getImgIds():
        imgInfo = coco.loadImgs(imgID)[0]
        print(f'图像{imgID}的信息如下:\n{imgInfo}')
        img_name = imgInfo['file_name']
        imPath = os.path.join(cocoRoot, img_name)
        im = cv2.imread(imPath)
        height = imgInfo['height']
        width = imgInfo['width']
        annIds = coco.getAnnIds(imgIds=imgID)
        anns = coco.loadAnns(annIds)
        img_lst_kpts = []
        img_shapes = []
        for ann in anns:
            bbox = ann['bbox']
            face_kpts = ann['face_kpts']
            imgId = ann['image_id']
            all_lst_kpts = []
            lst_kpts = []
            for i, kpts in enumerate(face_kpts):
                lst_kpts.append(kpts)
                if len(lst_kpts) == 3:
                    all_lst_kpts.append(lst_kpts)
                    lst_kpts = []
            img_shapes.append({'bbox': bbox, 'face_kpts': all_lst_kpts})
        print('img_shapes:', img_shapes)

        if len(img_shapes) != 0:
            f_txt = open(os.path.join(save_path, os.path.splitext(img_name)[0] + '.txt'), 'w')
        # [36, 39, 42, 45, 30, 48, 54]: 索引对应right_eye left_eye nose mouth_right mouth_left
        for box_face in img_shapes:
            cls = 0
            box = box_face['bbox']
            x1 = box_face['bbox'][0]
            y1 = box_face['bbox'][1]
            width_box = box_face['bbox'][2]
            height_box = box_face['bbox'][3]
            all_lst_kpts = box_face['face_kpts']
            # 左右眼是通过左右两个眼角计算得到的
            right_eye_x = int(all_lst_kpts[36][0] + ((all_lst_kpts[39][0] - all_lst_kpts[36][0]) / 2))
            right_eye_y = int(all_lst_kpts[36][1] + ((all_lst_kpts[39][1] - all_lst_kpts[36][1]) / 2))
            right_eye_value = all_lst_kpts[36][2]
            left_eye_x = int(all_lst_kpts[42][0] + ((all_lst_kpts[45][0] - all_lst_kpts[42][0]) / 2))
            left_eye_y = int(all_lst_kpts[42][1] + ((all_lst_kpts[45][1] - all_lst_kpts[42][1]) / 2))
            left_eye_value = all_lst_kpts[42][2]
            nose_x = int(all_lst_kpts[30][0])
            nose_y = int(all_lst_kpts[30][1])
            nose_value = all_lst_kpts[30][2]
            right_mouse_x = int(all_lst_kpts[48][0])
            right_mouse_y = int(all_lst_kpts[48][1])
            right_mouse_value = all_lst_kpts[48][2]
            left_mouse_x = int(all_lst_kpts[54][0])
            left_mouse_y = int(all_lst_kpts[54][1])
            left_mouse_value = all_lst_kpts[54][2]

            yolo_res = [img_name, cls, width, height, x1, y1, width_box, height_box,
                        right_eye_x, right_eye_y, right_eye_value,
                        left_eye_x, left_eye_y, left_eye_value,
                        nose_x, nose_y, nose_value,
                        right_mouse_x, right_mouse_y, right_mouse_value,
                        left_mouse_x, left_mouse_y, left_mouse_value]
            yolo_res = [str(item) for item in yolo_res]
            # 进行可视化展示,验证上面的索引取值是否正确
            # show_img(yolo_res)
            f_txt.write(' '.join(yolo_res) + '\n')
        f_txt.close()

保存的格式为:每张图片对应一个txt文件,如下图:在这里插入图片描述
txt的内容形式为:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422254.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringTx 源码解析 - @Transactional 声明式事务执行原理

一、Spring Transactional 声明式事务执行原理 Transactional 是 Spring 框架中用于声明事务的注解,可以标注在方法或类上。当标注在类上时,表示该类的所有public方法都将支持事务。当标注在方法上时,表示该方法将在一个事务内执行。 Trans…

BGP对等体建邻配置

BGP对等体大体分为EBGP对等体和IBGP对等体。而BGP对等体的建邻主要分为两种:1、使用物理接口建邻 2、使用环回借口建邻,针对不同的BGP对等体选用不同的建邻方式。 EBGP的建邻主要使用的是物理接口建邻 IBGP的建邻主要使用的是环回接口建邻 这两种建邻方…

VBA的面向接口编程

工作中有时候会用到VBA(Visual Basic for Applications),不是很多,也没有专门去学习VBA,用的时候遇到问题就上网去查资料,解决问题了就放下了。 今天被同事问到VBA中类的用法,我从来没有用过&am…

论文解读:基于 OpenMLDB 的流式特征计算优化

近期,数据库领域的顶级学术会议 ICDE 2023 在迪斯尼主题公园的故乡 - 美国的安纳海姆(Anaheim)举办。由 OpenMLDB 开源社区和新加坡科技设计大学(Singapore University of Technology and Design)联合完成的研究工作在…

Vue2-黑马(三)

目录: (1)vue2-axios (2)axios-发送请求 (3)vue2-axios-请求体格式 (4)vue2-axios-默认配置 (1)vue2-axios 已经配置了代理,可以…

项目部署---shell脚本自动部署项目

通过shell脚本自动部署项目 操作步骤: 在Linux中安装Git在Linux中安装maven编写shell脚本(拉取代码、编译、打包、启动)为用户授予执行shell脚本的权限执行shell脚本 执行过程:Linux服务器(编译、打包、启动&#x…

每天一道大厂SQL题【Day21】华泰证券真题实战(三)

每天一道大厂SQL题【Day21】华泰证券真题实战(三) 大家好,我是Maynor。相信大家和我一样,都有一个大厂梦,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题&…

爱智EdgerOS之深入解析爱智云原生产品ECSM

一、云原生简介 近些年来,云原生逐渐被业界认可和接受,在国内,包括政府、金融、通信、能源在内的众多领域的大型机构和企业都实现了不同程度的云化,那么什么是云原生呢?云原生计算基金会提供了官方的定义:…

参考|雨水情测报和大坝安全监测系统建设方案

解决方案 小型雨水情测报和大坝安全监测系统解决方案,系统主要由降雨量监测站、水库水位监测站、大坝安全监测中的渗流量、渗流压力和变形监测站及视频和图像监测站等站点组成,同时建立规范、统一的监测平台,集数据传输、信息共享、数据储存…

比较系统的学习 pandas (6)

pandas 数据类型转换 在开始数据分析前,有时需要为数据分配好合适的类型,这样才能 够高效地处理数据 # 对所有字段指定统一类型 data pd.DataFrame(data, dtypefloat32) # 对每个字段分别指定 data pd.read_excel(data.xlsx, dtype{name: string, sc…

CUDA和TensorRT入门

CUDA 官方教程:CUDA C Programming Guide (nvidia.com) 一、基础知识 首先看一下显卡、GPU、和CUDA的关系介绍: 显卡、GPU和CUDA简介_吴一奇的博客-CSDN博客 延迟:一条指令返回的时间间隔; 吞吐量:单位时间内处理…

libwebsockets交叉编译

libwebsockets官网:https://libwebsockets.org/ github:https://github.com/warmcat/libwebsockets 首先下载libwebsockets源码,源码既可以在其官网上下载,也可以到github上下载。这里以v4.1.6为例,https://github.co…

react项目中自定义一个markdown编辑器

Markdown 是一种轻量级标记语言。 Markdown是一种简单的格式化文本的方法,在任何设备上看起来都很棒。它不会做任何花哨的事情,比如改变字体大小、颜色或类型——只是基本的,使用你已经知道的键盘符号。 它还允许人们使用易读易写的纯文本格…

为什么众多大型国企都在升级企业数智化底座?

在数字经济大潮中,数字化转型已不是企业的“选修课”,而是关乎企业生存和长远发展的“必修课”。在企业数字化转型中,国有企业特别是中央企业普遍将数字化转型战略作为“十四五”时期业务规划的重要内容之一,数字化能力也成为衡量…

图文详解CAN Log文件 - ASC文件格式

目录 1 CAN Log文件 -- ASC文件格式 1.1 Header 1.2 版本编号 1.3 经典CAN网络中的描述 1.3.1 经典CAN Standard标准帧的描述 1.3.2 经典CAN Extended扩展帧的描述 1.3.3 CAN Remote远程帧的描述 1.3.4 CAN Error错误帧的描述 1.4 CANFD网络中的描述 1.4.1 经典CAN S…

图解并用 C 语言实现非比较排序(计数排序、桶排序和基数排序)

目录 一、计数排序 二、桶排序 三、基数排序 一、计数排序 算法步骤: 找出待排序数组 arr 中的最小值和最大值(分别用 min 和 max 表示)。 创建一个长度为 max - min 1、元素初始值全为 0 的计数器数组 count。 扫描一遍原始数组&…

Nacos客户端实例注册源码分析-篇一

Nacos客户端实例注册源码分析-篇一 版本 nacos 服务器端 nacos 2.0.3 实例客户端注册入口 注册案例 回到之前搭建的服务提供者项目 9002 ,在真实的生产环境下,如果需要让某一个服务注册到 Nacos 的服务当中,我们引入对应的 nacos 发现依赖&…

4月Google Play政策更新,游戏上架需要注意这几点

3月21日,据路透社报道,由于发现国内某知名电商应用存在恶意软件问题,谷歌已暂时将该APP从商店下架,并表示:将该APP下架是一种安全预防措施,已经下载的用户也会收到警告,提示他们进行卸载。 4月…

基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)

摘要:动物识别系统用于识别和统计常见动物数量,通过深度学习技术检测日常几种动物图像识别,支持图片、视频和摄像头画面等形式。在介绍算法原理的同时,给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…

c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换

c/c:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的…