深度学习笔记之一看数据

news2024/10/7 20:30:20

最近在百度ai上跟了个“深度学习7日打卡营”的课程,目前看到人脸关键点检测章节,地址如下:飞桨AI Studio - 人工智能学习与实训社区 (baidu.com)

        老师们讲解的很好,但是对于我这样的白菜来说,有些细节还是感觉略过去了,真正开始动手的时候,又感觉无从下手了。其实自从有了深度学习框架后,深度学习的门槛已经很低了,但是也不是没有,尤其是对于第一次接触的人来说,相关的概念和牵扯的知识还是挺多的,对我来说python基本也算刚开始用,机器学习深度学习啥的都是刚接触,基础课程对我来说也不算太基础,只是有一点代码的功底,一边用一边学吧。

        进入正题,一般深度学习hello world级别的应用,数据集都是框架提供好的,用api直接调用就可以下载使用,但是对于实际工作中用到的数据集一般都是通过各种渠道获取的,里面的数据有没有问题,标注有没有错误,对于训练的影响极大,我个人感觉首先应该看下数据了解几个问题:

1、数据集的目录结构;

2、包含多少图片,图片的格式,图片的尺寸等信息;

3、标签文件的内容,格式,大概组织结构;

4、标签里描述的图片和实际图片是否对应,随机选一些图片看看标签和图片是否对应;

5、标签数据中如果有坐标,在数据集拓展时,尤其是剪裁缩放时考虑标签坐标的变化;

有了问题,就写点代码,看看答案:

import os
from PIL import Image
import numpy as np
import pandas as pd
import random
import  matplotlib.pyplot as plt
import matplotlib.image as mpimg

class DataViewing(object):

    def __init__(self):
        self.files = None  # 实际目录下的文件列表
        self.label_data = None  # 标签数据
        self.config_files = None  # 标签配置文件中的文件列表

    def show_files(self, path):
        '''看一下图片文件夹下图片的大概信息'''
        self.files = os.listdir(path)  # 获取目录下所有文件
        print("目录下文件数量:%d " % (len(self.files)))
        file_types = []
        file_shapes = []
        for file in self.files:
            ext = file.split(".")[-1]  # 获取文件拓展名
            img = np.array(Image.open(path+file))  # 读取图片并转化为ndarray格式
            h, w, c = img.shape  # 获取图片长宽高
            shape = [h, w, c]  # 存入list
            if ext not in file_types:  # 收集拓展名
                file_types.append(ext)
            if shape not in file_shapes:  # 收集图片形状
                file_shapes.append(shape)

        print("目录下文件类型有:", file_types)
        print("图片形状有:", file_shapes)
        # python的列表类型转换为numpy的ndarray类型方便实用numpy的方法获取最大最小值
        file_shapes = np.array(file_shapes)
        print(file_shapes.shape)  # 打印一下转换后的数据形状,确认形状是否正确
        print("图片形状有:%d 种" % (file_shapes.shape[0]))
        max = file_shapes.max(axis=0)  # 按列统计最大值
        min = file_shapes.min(axis=0)  # 按列统计最小值
        avg = file_shapes.sum(axis=0)/file_shapes.shape[0]  # 均值
        print("图片最大高度:", max[0])
        print("图片最大宽度:", max[1])
        print("图片最大通道数:", max[2])
        print("图片最小通道数:", min[2])
        print("图片平均大小:", avg)
        self.show_some_pics(path, 3)

    def show_some_pics(self, path, num):
        ''' 随便找几张图片展示一下'''
        samples = random.sample(self.files, num) #随机获取指定数量的元素
        for file in samples:
            img = np.array(Image.open(path+file))
            plt.figure()
            plt.title(file)
            plt.imshow(img)
            plt.show()

    def show_csv(self, file_path):
        '''看下标签配置文件的大概信息'''

        # 申明式条件判断,挺好用的
        assert os.path.exists(file_path), '文件不存在'

        data = pd.read_csv(file_path)  # pandas方式读取csv文件,比较便捷
        print("标签数据形状:", data.shape)
        # 获取前5行数据看看,jupyter命令方式执行data.head(5)可以直接显示美观的表格数据
        head5 = data.head(5)
        print(head5)
        self.label_data = data.values  # 除了标题的数据,返回的还是dataframe

    def label_data_summary(self):
        '''看看配置文件中的文件信息和实际图片目录中的能不能对应上,
            顺便获取一下标签数据的均值和标准差
        '''
        # 第一列是文件名 后面的列是标签数据
        self.config_files, self.label_data = self.label_data[:,
                                                             0], self.label_data[:, 1:]
        print(self.config_files[1])
        print("配置文件中记录的文件数量:", self.config_files.shape)
        print("目录下的文件数量:", len(self.files))
        if self.config_files.shape[0] == len(self.files):
            flag = True
            for file_name in self.config_files:
                if file_name not in self.files:
                    flag = False
                    print(file_name, "不存在")
            if flag:
                print("配置文件中的文件和实际文件完全对应")
        else:
            print("配置文件中的文件数量和实际目录下的文件数量不一样")
        print(self.label_data.shape)
        mean = self.label_data.mean()  # 计算均值
        std = self.label_data.std()  # 计算标准差
        print("标签数据的均值为:", mean)
        print("标签数据的标准差为:", std)

    def show_some_pic_with_label(self, path, num):
        '''随便取几张图,输出标签点看看'''
        for i in range(num):
            index = np.random.randint(0, len(self.config_files)) #随机取数组索引
            file_name = self.config_files[index] #按随机索引获取文件名字
            key_pts = self.label_data[index, :].astype('float')  #按随机索引获取标签数据
            plt.figure(figsize=(5, 5))
            print(os.path.join(path, file_name)) 
            self.show_keypoints(Image.open(
                os.path.join(path, file_name)), key_pts) #读取图片,和标签数据传参
            plt.show()  # 展示图像

    def show_keypoints(self, image, key_pts):
        '''展示带关键点的图像信息,传入的是图片的ndarray和关键信息nadrray'''
        # plt.imshow(image.astype("uint8"))  有人转换了一下图片数组,变成无符号整型,我这里图片显示不出来
        plt.imshow(np.array(image))  # 展示图片信息,直接转成adarray就能显示
        #描点
        for i in range(len(key_pts)//2, ):
            plt.scatter(key_pts[i*2], key_pts[i*2+1], c='b', marker='.', s=20)
            # 参数c --点的颜色
            # marker --点的样式
            # s --点的面积(大小)


dv = DataViewing()

这个代码我反反复复调整了多次,基本能展示我需要的信息了。相关的注释我描述的基本算很细致,不懂的我都在网上查资料补充进去了。

 

首先看下训练集中的图片信息:

图片数量,拓展名,各种尺寸都有,图片有4个通道,训练一般用3通道的图片,这些在后面归一化时都要处理。

再看下标签文件信息:

 这里我只显示了前面5行,有个标题行,基本就是个列索引,第一列是图片名字,后面是人脸关键点坐标信息,0-135就是68个坐标信息。

标签数据统计信息:

打标签的文件数量3462个,实际图片文件夹中有3462张图片,完全对应。顺便看了下标签数据的均值和标准差

随机抽几张图片,把标签坐标打到图片上看看对不对:

标签坐标和图片上的位置是对应的,没啥问题。

这样基本上就把数据集的一些基本情况了解清楚了,随着后面学习的深度,回头看需要补充什么信息,再来完善这个类。

ps:这个数据集就是7日打卡营人脸关键点检测项目的数据集,有兴趣的朋友可以点文章开头的连接,自己fork项目下载查看。 

 

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

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

相关文章

Java-多线程

进程与线程 程序>进程>线程 程序是一段静止的代码,只有真正运行时的程序,才被称为进程。一个程序运行至少有一个进程 从操作系统底层来说,进程只是一个概念,真正执行的是线程。 进程是操作系统资源分配的基本单位&#x…

六、动画 - 旋转的应用例子,时钟

目录: 1.前期准备知识 2.实操 - 做时钟 3.完整代码 一、前期准备知识 因为旋转都是默认元素中心来旋转,所以,我们可以通过父元素包裹子元素。 通过父元素旋转,然后父带动子元素,到时候可以通过影藏父元素的背景颜色&a…

关于三元运算符强转的问题

1.int和char比较 public static void main(String[] args) {char x x;int i 10;char y 2;System.out.println(true? x: i);System.out.println(true? x: 1167);System.out.println(true?y:2);System.out.println((int)x);}JVM: public static void main(Stri…

CSS基础学习--23 CSS属性 选择器

一、定义 具有特定属性的HTML元素样式&#xff08;不仅仅是class和id&#xff09; 二、属性选择器 例子是把包含标题&#xff08;title&#xff09;的所有元素变为蓝色&#xff1a; <!DOCTYPE html> <html> <head> <style> [title] { color:blue; }…

Linux_CentOS_7.9修改更新默认时区

前言&#xff1a;近期一直在频繁部署虚拟机做系统测试发现Linux默认时区未做更改&#xff0c;这里做个记录留作参考。 查看服务器时区&#xff08;默认为纽约时间&#xff09; [rootorcl3 ~]# timedatectl 系统默认安装的所有时区&#xff0c;找到我们需要的时区 [rootor…

Proteus仿真之DAC(DAC0832)

1.数模/模数转换的目的&#xff1a;生活中常见的物理量如温度、流量、压力、位移、速度等都是一种模拟量。但是&#xff0c;计算机只能处理0、1的数字量&#xff0c;此时就需要将模拟量转为数字量。与此同时&#xff0c;MCU对模拟量设备进行控制时&#xff0c;如控制电动调节阀…

直播间自定义公屏视图的升级之路(View版)

目录 1.前言2.旧版设计的分析3.新版设计的分析4.代码实现&#xff08;View版本&#xff09;4.1.流式布局的实现4.1.1.测量4.1.2.布局 4.2针对需求优化流式布局4.2.1.测量4.2.2.布局 5.总结 1.前言 最近的版本呢&#xff0c;产品更新了一个直播间的需求&#xff0c;原本直播间的…

蓝库云|企业如何建立自己的供应商管理系统?零代码工具带来惊喜

在面对采购的物品和服务比较复杂多样的企业&#xff0c;都需要管理大量的供应商&#xff0c;因此需要更加有效和专业的供应商管理系统。随着数字化转型的意识不断增强&#xff0c;中小型企业也越来越意识到采用供应商系统的必要性&#xff0c;以提高采购效率和质量&#xff0c;…

LangChain 使用文本描述的方式操作MySQL中的数据

一、LangChain 使用文本描述的方式操作MySQL中的数据 在 LangChain 中提供了 SQLDatabaseChain &#xff0c;可以通过语义文本去操作 MySQL中的数据&#xff0c;例如在 MySQL 中有如下表数据&#xff1a; 用户表 CREATE TABLE user (id int NOT NULL AUTO_INCREMENT COMMENT…

HTML5 Canvas动画实例

在开发在线游戏时&#xff0c;绘制动画是非常重要的。本文介绍一个使用Canvas API实现的动画实例——游戏人物的跑步动画。 01、动画的概念及原理 1、动画 动画是通过一幅幅静止的、内容不同的画面(即帧)快速播放来呈现的&#xff0c;使人们在视觉上产生动的感觉。这是利用了…

如何让VSCode不生成 tempcoderunnerfile.py

原因 runcode插件默认包含执行选中文本功能&#xff0c;当运行程序时会优先执行光标选中的代码并生成temp文件 解决方法 方法一&#xff1a;删除生成文件 在setting.json中添加 "code-runner.executorMap": {"php": "php $fullFileName &&am…

【Linux】Ubuntu20.04使用xrdp远程桌面时,gnome桌面环境没有最小化、任务栏等问题

一、问题背景 如下图所示&#xff0c;终端窗口没有最小化&#xff0c;因此只能关闭或移到一边去。 二、解决办法 在安装任何扩展前&#xff0c;需要将xrdp的桌面尽量向原生桌面靠拢。 在~/.xsessionrc配置文件中添加下面三行。 export GNOME_SHELL_SESSION_MODEubuntu ex…

Mediapipe 人像分割;实时更换背景;人脸添加特效

参考&#xff1a; https://zhuanlan.zhihu.com/p/476351994 1、Mediapipe 人像分割 import cv2 import mediapipe as mp import numpy as np mp_drawing mp.solutions.drawing_utils mp_selfie_segmentation mp.solutions.selfie_segmentation # 图片人物抠图: IMAGE_FILES…

idea生成serialVersionUID序列号

设置idea file->settings,搜索serialVersionUID&#xff0c;勾选框起来的两项 实体类实现Serializable接口 Data public class User implements Serializable { }鼠标放到类名上 点击提示的uid 生成的uid 结束&#xff01; hy:17 生活是一面镜子&#xff0c;给予我们…

springboot 停车场管理系统-计算机毕设 附源码82061

springboot 停车场管理系统 2023年5月 摘要 由于数据库和数据仓库技术的快速发展&#xff0c;停车场管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。停车场管理系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都…

GO 基本配置

其他 IDEA 配置go语言环境 https://blog.csdn.net/weixin_45719444/article/details/121726325 关于IDEA的 plugins下找不到GO插件 点击安装 安装插件 Go 安装插件 Generate struct tags for golang

Flink CDC 2.4 正式发布,新增 Vitess 数据源,更多连接器支持增量快照,升级 Debezium 版本...

01 Flink CDC 简介 Flink CDC [1] 是基于数据库的日志 CDC 技术&#xff0c;实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态&#xff0c;Flink CDC 可以高效实现海量数据的实时集成。 作为新一代的实时数据集成框架&#xff0c;Flink CDC…

二进制搭建Kubernetes集群(三)——部署多master

本文将完成多master集群的部署&#xff0c;即部署master02&#xff0c;以及nginx负载均衡、keepalived高可用 多master集群架构图&#xff1a; 架构说明&#xff1a; node节点的kubelet只能对接一个master节点的apiserver&#xff0c;不可能同时对接多个master节点的apiserver…

【Solr】中文分词配置

提示&#xff1a;在设置中文分词前需确保已经生成过core&#xff0c;未生成core的可以使用&#xff1a;solr create -c "自定义名称"进行定义。 未分词前的效果预览&#xff1a; 下载分词器&#xff1a; 下载地址: https://mvnrepository.com/artifact/com.github.m…

山西电力市场日前价格预测【2023-06-29】

日前价格预测 预测明日&#xff08;2023-06-29&#xff09;山西电力市场全天平均日前电价为407.26元/MWh。其中&#xff0c;最高日前价格为539.37元/MWh&#xff0c;预计出现在21: 15。最低日前电价为312.43元/MWh&#xff0c;预计出现在13: 00。以上预测仅供学习参考&#xff…