当前位置: 首页 > news >正文

Pytorch机器学习(十)—— 目标检测中k-means聚类方法生成锚框anchor

Pytorch机器学习(十)—— YOLO中k-means聚类方法生成锚框anchor

目录

Pytorch机器学习(十)—— YOLO中k-means聚类方法生成锚框anchor

前言

一、K-means聚类

 k-means代码

k-means++算法

二、YOLO中使用k-means聚类生成anchor

读取VOC格式数据集

k-means聚类生成anchor

总结




前言

前面文章说过有关锚框的一些知识,但有个坑一直没填,就是在YOLO中锚框的大小是如何确定出来的。其实在YOLOV3中就有采用k-means聚类方法计算锚框的方法,而在YOLOV5中作者在基于k-means聚类方法的结果之后,采用了遗传算法,进一步得到效果更好的锚框。

如果对锚框概念不理解的,可以看一下这篇文章

Pytorch机器学习(九)—— YOLO中对于锚框,预测框,产生候选区域及对候选区域进行标注详解


一、K-means聚类

在YOLOV3中,锚框大小的计算就是采用的k-means聚类的方法形成的。

从直观的理解,我们知道所有已经标注的bbox的长宽大小,而锚框则是对于预测这些bbox的潜在候选框,所以锚框的长宽形状应该越接近真实bbox越好。而又由于YOLO网络的预测层是包含3种尺度的信息的(分别对应3种感受野),每种尺度的anchor又是三种,所以我们就需要9种尺度的anchor,也即我们需要对所有的bbox的尺寸聚类成9种类别!!

聚类方法比较常用的是使用k-means聚类方法,其算法流程如下。

  • 从数据集中随机选取 K 个点作为初始聚类的中心,中心点为C=\left \{ c_{1},c_{2},....,c_{k} \right \} 
  • 针对数据集中每个样本 xi,计算它们到各个聚类中心点的距离,到哪个聚类中心点的距离最小,就将其划分到对应聚类中心的类中
  • 针对每个类别 i ,重新计算该类别的聚类中心  {c_{i}}=\frac{1}{\left |i \right |}\sum x(其中 | ||i| 表示的是该类别数据的总个数)
  • 重复第二步和第三步,直到聚类中心的位置不再发生变化(我们也可以设置迭代次数)

 k-means代码

# 计算中心点和其他点直接的距离
def calc_distance(obs, guess_central_points):
    """

    :param obs: 所有的观测点
    :param guess_central_points: 中心点
    :return:每个点对应中心点的距离
    """
    distances = []
    for x, y in obs:
        distance = []
        for xc, yc in guess_central_points:
            distance.append(math.dist((x, y), (xc, yc)))
        distances.append(distance)

    return distances


def k_means(obs, k, dist=np.median):
    """

    :param obs: 待观测点
    :param k: 聚类数k
    :param dist: 表征聚类中心函数
    :return: guess_central_points中心点
            current_cluster 分类结果
    """
    obs_num = obs.shape[0]
    if k < 1:
        raise ValueError("Asked for %d clusters." % k)
    # 随机取中心点
    guess_central_points = obs[np.random.choice(obs_num, size=k, replace=False)]  # 初始化最大距离
    last_cluster = np.zeros((obs_num, ))

    # 当小于一定值时聚类完成
    while True:
        # 关键是下面的calc_distance,来计算需要的距离
        distances = calc_distance(obs, guess_central_points)
        # 获得对应距离最小值的索引
        current_cluster = np.argmin(distances, axis=1)
        # 如果聚类类别没有改变, 则直接退出
        if (last_cluster == current_cluster).all():
            break

        # 计算新的中心
        for i in range(k):
            guess_central_points[i] = dist(obs[current_cluster == i], axis=0)

        last_cluster = current_cluster

    return guess_central_points, current_cluster

 聚类效果如下

k-means++算法

还有一种k-means++算法,是属于k-means算法的衍生吧,其主要解决的是k-means算法第一步,随机选择中心点的问题。

整个代码也十分简单,只需要把最先随机选取中心点用下面代码计算出来就可以。

# k_means++计算中心坐标
def calc_center(boxes):
    box_number = boxes.shape[0]
    # 随机选取第一个中心点
    first_index = np.random.choice(box_number, size=1)
    clusters = boxes[first_index]
    # 计算每个样本距中心点的距离
    dist_note = np.zeros(box_number)
    dist_note += np.inf
    for i in range(k):
        # 如果已经找够了聚类中心,则退出
        if i+1 == k:
            break
        # 计算当前中心点和其他点的距离
        for j in range(box_number):
            j_dist = single_distance(boxes[j], clusters[i])
            if j_dist < dist_note[j]:
                dist_note[j] = j_dist
        # 转换为概率
        dist_p = dist_note / dist_note.sum()
        # 使用赌轮盘法选择下一个点
        next_index = np.random.choice(box_number, 1, p=dist_p)
        next_center = boxes[next_index]
        clusters = np.vstack([clusters, next_center])
    return clusters

但我自己在使用过程中,对于提升不大。主要因为其实bbox的尺度差异一般不会太大,所以这个中心点的选取,对于最后影响不大。


二、YOLO中使用k-means聚类生成anchor

下面重点说一下如何使用这个k-means算法来生成anchor,辅助我们训练,下面的代码和上面的有一点不一样,因为我们上面的代码是基于点的(x,y),而我们聚类中,是bbox的(w,h),下面代码都以VOC格式的训练集为例,如果是coco格式的,得麻烦你自己转一下格式了。

如果不想用我下面的代码但也想用k-means聚类,请读取自己数据集时,读取bbox和图片的(w,h)以列表的形式保存,确保自己n*2或者m*2的列表.

读取VOC格式数据集

我下面的代码,不仅读取了voc格式的数据集,还做了一些数据的统计,如果不想要,自己注释点就好,代码比较简单,也写了注释。

大家可以不用太纠结代码实现,记得改一下自己的图片路径即可。

from xml.dom.minidom import parse
import matplotlib.pyplot as plt
import cv2 as cv
import os
train_annotation_path = '/home/aistudio/data/train/Annotations' # 训练集annotation的路径
train_image_path = '/home/aistudio/data/train/JPEGImages'       # 训练集图片的路径
# 展示图片的数目
show_num = 12
#打开xml文档

def parase_xml(xml_path):
    """
    输入:xml路径
    返回:image_name, width, height, bboxes
    """
    domTree = parse(xml_path)
    rootNode = domTree.documentElement
    # 得到object,sizem,图片名称属性
    object_node = rootNode.getElementsByTagName("object")
    shape_node = rootNode.getElementsByTagName("size")
    image_node = rootNode.getElementsByTagName("filename")
    image_name = image_node[0].childNodes[0].data
    bboxes = []
    # 解析图片的长宽
    for size in shape_node:
        width = int(size.getElementsByTagName('width')[0].childNodes[0].data)
        height = int(size.getElementsByTagName('height')[0].childNodes[0].data)
    # 解析图片object属性
    for obj in object_node:
        # 解析name属性,并统计类别数
        class_name = obj.getElementsByTagName("name")[0].childNodes[0].data
        # 解析bbox属性,并统计bbox的大小
        bndbox = obj.getElementsByTagName("bndbox")
        
        for bbox in bndbox:
            x1 = int(bbox.getElementsByTagName('xmin')[0].childNodes[0].data)
            y1 = int(bbox.getElementsByTagName('ymin')[0].childNodes[0].data)
            x2 = int(bbox.getElementsByTagName('xmax')[0].childNodes[0].data)
            y2 = int(bbox.getElementsByTagName('ymax')[0].childNodes[0].data)
            bboxes.append([class_name, x1, y1, x2, y2])
    return image_name, width, height, bboxes

def read_voc(train_annotation_path, train_image_path, show_num):
    """
    train_annotation_path:训练集annotation的路径
    train_image_path:训练集图片的路径
    show_num:展示图片的大小
    """
    # 用于统计图片的长宽
    total_width, total_height = 0, 0
    # 用于统计图片bbox长宽
    bbox_total_width, bbox_total_height, bbox_num = 0, 0, 0
    min_bbox_size = 40000
    max_bbox_size = 0
    # 用于统计聚类所用的图片长宽,bbox长宽
    img_wh = []
    bbox_wh = []
    # 用于统计标签
    total_size = []
    class_static = {'crazing': 0, 'inclusion': 0, 'patches': 0, 'pitted_surface': 0, 'rolled-in_scale': 0, 'scratches': 0}
    num_index = 0

    for root, dirs, files in os.walk(train_annotation_path):
        for file in files:
            num_index += 1
            xml_path = os.path.join(root, file)
            image_name, width, height, bboxes = parase_xml(xml_path)
            image_path = os.path.join(train_image_path, image_name)
            img_wh.append([width, height])
            total_width += width
            total_height += height

            # 如果需要展示,则读取图片
            if num_index < show_num:
                image_path = os.path.join(train_image_path, image_name)
                image = cv.imread(image_path)
            # 统计有关bbox的信息
            wh = []
            for bbox in bboxes:
                class_name = bbox[0]
                class_static[class_name] += 1
                x1, y1, x2, y2 = bbox[1], bbox[2], bbox[3], bbox[4]
                bbox_width = x2 - x1
                bbox_height = y2 - y1
                bbox_size = bbox_width*bbox_height
                # 统计bbox的最大最小尺寸
                if min_bbox_size > bbox_size:
                    min_bbox_size = bbox_size
                if max_bbox_size < bbox_size:
                    max_bbox_size = bbox_size
                total_size.append(bbox_size)
                # 统计bbox平均尺寸
                bbox_total_width += bbox_width
                bbox_total_height += bbox_height
                # 用于聚类使用
                wh.append([bbox_width / width, bbox_height / height])   # 相对坐标
                bbox_num += 1
                # 如果需要展示,绘制方框
                if num_index < show_num:
                    cv.rectangle(image, (x1, y1), (x2, y2), color=(255, 0, 0), thickness=2)
                    cv.putText(image, class_name, (x1, y1+10), cv.FONT_HERSHEY_SIMPLEX, fontScale=0.2, color=(0, 255, 0), thickness=1)
            bbox_wh.append(wh)
            # 如果需要展示
            if num_index < show_num:
                plt.figure()
                plt.imshow(image)
                plt.show()
     

    # 去除2个检查文件                
    # num_index -= 2
    print("total train num is: {}".format(num_index))
    print("avg total_width is {}, avg total_height is {}".format((total_width / num_index), (total_height / num_index)))
    print("avg bbox width is {}, avg bbox height is {} ".format((bbox_total_width / bbox_num), (bbox_total_height / bbox_num)))
    print("min bbox size is {}, max bbox size is {}".format(min_bbox_size, max_bbox_size))
    print("class_static show below:", class_static)

    return img_wh, bbox_wh

img_wh, bbox_wh = read_voc(train_annotation_path, train_image_path, show_num)     

k-means聚类生成anchor

我这里的k-means代码集合了k-means++的实现,也集合了 太阳花的小绿豆这位博主提出用IOU作为评价指标来计算k-means而不是用欧拉距离的方法可以测试发现,使用IOU确实效果要比使用欧拉距离做为评价指标要好)

import numpy as np
# 这里IOU的概念更像是只是考虑anchor的长宽
def wh_iou(wh1, wh2):
    # Returns the nxm IoU matrix. wh1 is nx2, wh2 is mx2
    wh1 = wh1[:, None]  # [N,1,2]
    wh2 = wh2[None]  # [1,M,2]
    inter = np.minimum(wh1, wh2).prod(2)  # [N,M]
    return inter / (wh1.prod(2) + wh2.prod(2) - inter)  # iou = inter / (area1 + area2 - inter)

# 计算单独一个点和一个中心的距离
def single_distance(center, point):
    center_x, center_y = center[0]/2 , center[1]/2
    point_x, point_y = point[0]/2, point[1]/2
    return np.sqrt((center_x - point_x)**2 + (center_y - point_y)**2)

# 计算中心点和其他点直接的距离
def calc_distance(boxes, clusters):
    """

    :param obs: 所有的观测点
    :param clusters: 中心点
    :return:每个点对应中心点的距离
    """
    distances = []
    for box in boxes:
        # center_x, center_y = x/2, y/2
        distance = []
        for center in clusters:
            # center_xc, cneter_yc = xc/2, yc/2
            distance.append(single_distance(box, center))
        distances.append(distance)

    return distances

# k_means++计算中心坐标
def calc_center(boxes, k):
    box_number = boxes.shape[0]
    # 随机选取第一个中心点
    first_index = np.random.choice(box_number, size=1)
    clusters = boxes[first_index]
    # 计算每个样本距中心点的距离
    dist_note = np.zeros(box_number)
    dist_note += np.inf
    for i in range(k):
        # 如果已经找够了聚类中心,则退出
        if i+1 == k:
            break
        # 计算当前中心点和其他点的距离
        for j in range(box_number):
            j_dist = single_distance(boxes[j], clusters[i])
            if j_dist < dist_note[j]:
                dist_note[j] = j_dist
        # 转换为概率
        dist_p = dist_note / dist_note.sum()
        # 使用赌轮盘法选择下一个点
        next_index = np.random.choice(box_number, 1, p=dist_p)
        next_center = boxes[next_index]
        clusters = np.vstack([clusters, next_center])
    return clusters


# k-means聚类,且评价指标采用IOU
def k_means(boxes, k, dist=np.median, use_iou=True, use_pp=False):
    """
    yolo k-means methods
    Args:
        boxes: 需要聚类的bboxes,bboxes为n*2包含w,h
        k: 簇数(聚成几类)
        dist: 更新簇坐标的方法(默认使用中位数,比均值效果略好)
        use_iou:是否使用IOU做为计算
        use_pp:是否是同k-means++算法
    """
    box_number = boxes.shape[0]
    last_nearest = np.zeros((box_number,))
    # 在所有的bboxes中随机挑选k个作为簇的中心
    if not use_pp:
        clusters = boxes[np.random.choice(box_number, k, replace=False)]
    # k_means++计算初始值
    else:
        clusters = calc_center(boxes, k)
    
    # print(clusters)
    while True:
    	# 计算每个bboxes离每个簇的距离 1-IOU(bboxes, anchors)
        if use_iou:
            distances = 1 - wh_iou(boxes, clusters)
        else:
            distances = calc_distance(boxes, clusters)
        # 计算每个bboxes距离最近的簇中心
        current_nearest = np.argmin(distances, axis=1)
        # 每个簇中元素不在发生变化说明以及聚类完毕
        if (last_nearest == current_nearest).all():
            break  # clusters won't change
        for cluster in range(k):
            # 根据每个簇中的bboxes重新计算簇中心
            clusters[cluster] = dist(boxes[current_nearest == cluster], axis=0)

        last_nearest = current_nearest

    return clusters

使用我下面的auot_anchor代码注意!!(这里代码也是借鉴的太阳花的小绿豆博主的,他把里面的torch函数改为np函数后,使得代码移植性变强了!)

传入的参数中img_wh和bbox_wh即读取voc数据集中图片的长宽和bbox的长宽,为n*2和m*2的列表 !!

这里我还加入了YOLOV5中的遗传算法,具体细节就不展开了。

from tqdm import tqdm
import random
# 计算聚类和遗传算法出来的anchor和真实bbox之间的重合程度
def anchor_fitness(k: np.ndarray, wh: np.ndarray, thr: float):  # mutation fitness
    """
    输入:k:聚类完后的结果,且排列为升序
         wh:包含bbox中w,h的集合,且转换为绝对坐标
         thr:bbox中和k聚类的框重合阈值
    """
    r = wh[:, None] / k[None]
    x = np.minimum(r, 1. / r).min(2)  # ratio metric
    best = x.max(1)
    f = (best * (best > thr).astype(np.float32)).mean()  # fitness
    bpr = (best > thr).astype(np.float32).mean()  # best possible recall
    return f, bpr


def auto_anchor(img_size, n, thr, gen, img_wh, bbox_wh):
    """
    输入:img_size:图片缩放的大小
          n:聚类数
          thr:fitness的阈值
          gen:遗传算法迭代次数
          img_wh:图片的长宽集合
          bbox_wh:bbox的长框集合
    """
    # 最大边缩放到img_size
    img_wh = np.array(img_wh, dtype=np.float32)
    shapes = (img_size * img_wh / img_wh).max(1, keepdims=True)
    wh0 = np.concatenate([l * s for s, l in zip(shapes, bbox_wh)])  # wh

    i = (wh0 < 3.0).any(1).sum()
    if i:
        print(f'WARNING: Extremely small objects found. {i} of {len(wh0)} labels are < 3 pixels in size.')
    wh = wh0[(wh0 >= 2.0).any(1)]  # 只保留wh都大于等于2个像素的box
    # k_means 聚类计算anchor
    k = k_means(wh, n, use_iou=True, use_pp=False)
    k = k[np.argsort(k.prod(1))]  # sort small to large
    f, bpr = anchor_fitness(k, wh, thr)
    print("kmeans: " + " ".join([f"[{int(i[0])}, {int(i[1])}]" for i in k]))
    print(f"fitness: {f:.5f}, best possible recall: {bpr:.5f}")
        
    # YOLOV5改进遗传算法
    npr = np.random
    f, sh, mp, s = anchor_fitness(k, wh, thr)[0], k.shape, 0.9, 0.1  # fitness, generations, mutation prob, sigma
    pbar = tqdm(range(gen), desc=f'Evolving anchors with Genetic Algorithm:')  # progress bar
    for _ in pbar:
        v = np.ones(sh)
        while (v == 1).all():  # mutate until a change occurs (prevent duplicates)
            v = ((npr.random(sh) < mp) * random.random() * npr.randn(*sh) * s + 1).clip(0.3, 3.0)
        kg = (k.copy() * v).clip(min=2.0)
        fg, bpr = anchor_fitness(kg, wh, thr)
        if fg > f:
            f, k = fg, kg.copy()
        pbar.desc = f'Evolving anchors with Genetic Algorithm: fitness = {f:.4f}'

    # 按面积排序
    k = k[np.argsort(k.prod(1))]  # sort small to large
    print("genetic: " + " ".join([f"[{int(i[0])}, {int(i[1])}]" for i in k]))
    print(f"fitness: {f:.5f}, best possible recall: {bpr:.5f}")

auto_anchor(img_size=416, n=9, thr=0.25, gen=1000, img_wh=img_wh, bbox_wh=bbox_wh)

如果有兴趣代码细节的,可以看里面的注释,如果还有不懂的,可以私信我交流。

最后计算出来的结果如下,可以看到计算出来的anchor的是长方型的,这是因为我的bbox中长方型的anchor居多,符合我的预期。我们只需要把下面的anchor,替换掉默认的anchor即可!

 

最后说明一下,用聚类算法算出来的anchor并不一定比初始值即coco上的anchor要好,原因是目标检测大部分基于迁移学习,backbone网络的训练参数是基于coco上的anchor学习的,所以其实大部分情况用这个聚类效果并没有直接使用coco上的好!!,而且聚类效果跟数据集的数量有很大关系,一两千张图片,聚类出来效果可能不会很好



总结

整个算法思路其实不难,但代码有一些冗余和长,主要也是结合自己在学习和使用过程中,发现很多博主没有说明白如何使用这些代码。

相关文章:

Python的占位格式符

对于print函数里的语句 print("我的名字是%s, 年龄是%d"%(name, age)) 中的%s和%d叫做占位符&#xff0c;它们的完整形态是 %[(name)][flags][width][.precision]typecode 其中带有[]的前缀都是可以省略的。 [(name)]: (name)表示, 根据, 制定的名称(…...

关于sklearn库的安装

对于安装sklearn真的是什么问题都被我遇到了 例如pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(hostfiles.pythonhosted.org, port443): Read timed out.遇到了 这种也遇到了Requirement already satisfied: numpy in c:\users\yjq\appdata\roamin…...

accuracy_score函数

1.acc计算原理 sklearn中accuracy_score函数计算了准确率。 在二分类或者多分类中&#xff0c;预测得到的label&#xff0c;跟真实label比较&#xff0c;计算准确率。 在multilabel&#xff08;多标签问题&#xff09;分类中&#xff0c;该函数会返回子集的准确率。如果对于一…...

怎么成为稚晖君?

如何成为IT大佬稚晖君——电子系统设计应具备的基本技能和方法论 快速提高电子技术的必经之路_一些老生常谈的道理 嵌入式AI入坑经历 稚晖君软件硬件开发环境总结 首先&#xff0c;机器学习深度学习这些和硬件是两个领域的内容&#xff0c;个人不建议一起学&#xff0c;注意力…...

Pandas库

Pandas是python第三方库&#xff0c;提供高性能易用数据类型和分析工具。Pandas基于NumPy实现&#xff0c;常与NumPy和Matplotlib一同使用。pandas库引用&#xff1a; import pandas as pd 包括两个数据类型&#xff1a;Series&#xff08;相当于一维数据类型&#xff09;&…...

通过两道一年级数学题反思自己

背景 做完这两道题我开始反思自己&#xff0c;到底是什么限制了我&#xff1f;是我自己&#xff1f;是曾经教导我的老师&#xff1f;还是我的父母&#xff1f; 是考试吗&#xff1f;还是什么&#xff1f; 提目 1、正方体个数问题 2、相碰可能性 过程 静态思维&#xff1a; …...

深度学习—卷积神经网络(CNN)全笔记,附代码

本文内容为哔站学习笔记【卷积神经网络-CNN】深度学习&#xff08;唐宇迪带你学AI&#xff09;&#xff1a;卷积神经网络理论详解与项目实战&#xff0c;计算机视觉&#xff0c;图像识别模块实战_哔哩哔哩_bilibili 目录 深度学习基础 什么是深度学习&#xff1f; 机器学习流…...

Building wheel for mmcv-full (setup.py) ... error解决办法!

mmdetection 安装后&#xff0c;根据官方给的程序安装mmcv时&#xff0c;出现&#xff1a;Building wheel for mmcv-full (setup.py) … error 环境&#xff1a;CUDA11.3, Pytorch1.11 安装根据官网给的安装程序&#xff1a;pip install mmcv-full -f https://download.openmm…...

联邦学习开山之作代码解读与收获

参考&#xff1a;联邦学习代码解读&#xff0c;超详细_一只揪的博客-CSDN博客_联邦学习代码 参考文献&#xff1a;[1602.05629] Communication-Efficient Learning of Deep Networks from Decentralized Data (arxiv.org) 参考代码&#xff1a;GitHub - AshwinRJ/Federated-L…...

Python安装第三方库常用方法 超详细~

Python安装第三方库常用方法前言安装方法1. 通过pychram安装2. pip安装大法3. 下载whl文件到本地离线安装3.1 补充4.其他方法4.1 Python官方的Pypi菜单4.2 国内镜像源解决pip安装过慢的问题小结前言 在pyhton的学习中&#xff0c;相信大家通常都会碰到第三方库的安装问题&…...

Python--找出字符串中出现次数最多的字符及其出现的次数

方法一&#xff1a; 1、循环遍历列表或字符串&#xff0c;如果字符在字典中则值加1&#xff0c;如果不在则创建&#xff08;key,value) 2、找到字典中&#xff0c;最大的value值 3、根据最大的value值&#xff0c;找对应的key值&#xff0c;打印出出现次数最多的字符 str &qu…...

滤波笔记一:卡尔曼滤波(Kalman Filtering)详解

本笔记是总结了B站DR_CAN的卡尔曼滤波器的课程&#xff0c;他的B站主页为&#xff1a;DR_CAN的个人空间_哔哩哔哩_bilibili PS:虽然我不是学自控的&#xff0c;但是老师真的讲的很好&#xff01; 目录 Lesson1 递归算法 Lesson2 数学基础_数据融合_协方差矩阵_状态空间方程…...

利用Python求斐波那契数列的第N项以及前N项和(循环、递归、集合)

著名的斐波那契数列&#xff0c;即从第三项开始&#xff0c;每一项都等于前两项之和。 之前写过利用Java语言来编写&#xff0c;由于最近正在学Python&#xff0c;所以将自己的想法记录在此&#xff0c;有需要的朋友可以参考一下。 写在前面&#xff1a;这里的三个方法其实思…...

一文速学(十八)-数据分析之Pandas处理文本数据(str/object)各类操作+代码一文详解(三)

目录 前言 一、子串提取 提取匹配首位子串 提取所有匹配项(extractall)...

Python数据分析-数据预处理

数据预处理 文章目录数据预处理1.前言2.数据探索2.1缺失值分析2.2 异常值分析2.2.1 简单统计量分析2.2.2 3$\sigma$原则2.2.3 箱线图分析2.3 一致性分析2.4 相关性分析3.数据预处理3.1 数据清洗3.1.1 缺失值处理3.1.2 异常值处理3.2 数据集成3.2.1 实体识别3.2.2 冗余属性识别3…...

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

&#x1f366;&#x1f366;写这篇AES文章也是有件趣事&#xff0c;有位小伙伴发了段密文&#xff0c;看看谁解密速度快&#xff0c;学过Python的小伙伴一下子就解开来了&#xff0c;内容也挺有趣的。 &#x1f35f;&#x1f35f;原来加解密也可以这么有趣&#xff0c;虽然看起…...

朴素贝叶斯模型及案例(Python)

目录 1 朴素贝叶斯的算法原理 2 一维特征变量下的贝叶斯模型 3 二维特征变量下的贝叶斯模型 4 n维特征变量下的贝叶斯模型 5 朴素贝叶斯模型的sklearn实现 6 案例&#xff1a;肿瘤预测模型 6.1 读取数据与划分 6.1.1 读取数据 6.1.2 划分特征变量和目标变量 6.2 模型…...

python之Tkinter详解

Python之Tkinter详解 文章目录Python之Tkinter详解1、Tkinter是什么2、Tkinter创建窗口①导入 tkinter的库 &#xff0c;创建并显示窗口②修改窗口属性③创建按钮④窗口内的组件布局3、Tkinter布局用法①基本界面、label(标签)和button(按钮)用法②entry(输入)和text(文本)用法…...

【python】python进行debug操作

文章目录前言一、debug环境介绍二、debug按钮介绍2.1、step into:单步执行&#xff08;遇到函数也是单步&#xff09;2.2、step over:单步执行&#xff08;遇到函数&#xff0c;全部运行&#xff09;2.3、step into my code:&#xff08;直接跳到下一个断点&#xff09;2.4、st…...

Python安装tensorflow过程中出现“No matching distribution found for tensorflow”的解决办法

在Pycharm中使用pip install tensorflow安装tensorflow时报错&#xff1a; ERROR: Could not find a version that satisfies the requirement tensorflow(from versions: none) ERROR: No matching distribution found for tensorflow搜了好多帖子有的说可能是网络的问题&…...

pandas中的read_csv参数详解

1.官网语法 pandas.read_csv(filepath_or_buffer, sepNoDefault.no_default**,** delimiterNone**,** headerinfer’, namesNoDefault.no_default**,** index_colNone**,** usecolsNone**,** squeezeFalse**,** prefixNoDefault.no_default**,** mangle_dupe_colsTrue**,** dty…...

Python — — turtle 常用代码

目录 一、设置画布 二、画笔 1、画笔属性 2、绘图命令 (1) 画笔运动命令 (2) 画笔控制命令 (3) 全局控制命令 (4) 其他命令 3. 命令详解 三、文字显示为一个圆圈 四、画朵小花 一、设置画布 turtle为我们展开用于绘图区域&#xff0c;我们可以设置它的…...

【我是土堆 - PyTorch教程】学习随手记(已更新 | 已完结 | 10w字超详细版)

目录 1. Pytorch环境的配置及安装 如何管理项目环境&#xff1f; 如何看自己电脑cuda版本&#xff1f; 安装Pytorch 2. Python编辑器的选择、安装及配置 PyCharm PyCharm神器 Jupyter&#xff08;可交互&#xff09; 3. Python学习中的两大法宝函数 说明 实战操…...

“OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.”解决方法总结

一、问题描述 跑了点神经网络的代码&#xff0c;想画几个激活函数的图像&#xff0c;代码如下&#xff1a; 运行后报了以下错误&#xff1a; 翻译如下&#xff1a; OMP&#xff1a;错误 #15&#xff1a;正在初始化 libiomp5md.dll&#xff0c;但发现 libiomp5md.dll 已经初…...

python3.11.2安装 + pycharm安装

下载 &#xff1a;https://www.python.org/ 2.双击下载的软件&#xff1a; 3.进入安装界面 下一步&#xff0c;点击 是 上一步点击后就看到如下&#xff1a; 安装成功了&#xff0c;接下来检测一下&#xff1a;cmd 安装pycharm PyCharm是一种Python IDE&#xff08;Integr…...

Python中numpy.polyfit的用法详解

numpy中polyfit的用法 参数 polyfit(x, y, deg, rcondNone, fullFalse, wNone, covFalse):x:M个采样点的横坐标数组&#xff1b; y:M个采样点的纵坐标数组&#xff1b;y可以是一个多维数组&#xff0c;这样即可拟合相同横坐标的多个多项式&#xff1b; deg&#xff1a;多项式…...

彻底解决Python包下载慢问题

python默认使用的是国外镜像&#xff0c;有时候下载非常慢&#xff0c;最快的办法就是在下载命令中增加国内源&#xff1a; 常用的国内源如下&#xff1a; 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/…...

Anaconda 使用指南,少走弯路

​​​​​​​anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载 官网下载太慢可选用镜像下载 官网下载 &#xff1a;Anaconda | Individual Editionhttps://www.anaconda.com/products/distribution 镜像下载&#xff1a;Index of /anaconda/archive/ | 清华大…...

使用stable diffusion webui时,安装gfpgan失败的解决方案(windows下的操作)

1.问题描述 初次打开stable diffusion webui时&#xff0c;需要安装gfpgan等github项目。但在安装gfpgan时&#xff0c;显示RuntimeError: Couldnt install gfpgan 2.解决方案 无法安装gfpgan的原因是网络问题&#xff0c;就算已经科学上网&#xff0c;并设置为全局&#x…...

Python 中导入csv数据的三种方法

这篇文章主要介绍了Python 中导入csv数据的三种方法,内容比较简单&#xff0c;非常不错&#xff0c;具有一定的参考借鉴价值&#xff0c;需要的朋友可以参考下微点阅读小编收集的文章介绍。 Python 中导入csv数据的三种方法&#xff0c;具体内容如下所示&#xff1a; 1、通过…...

相关性分析、相关系数矩阵热力图

相关性 相关性分析是研究两组变量之间是否具有线性相关关系&#xff0c;所以做相关性分析的前提是假设变量之间存在线性相关性&#xff0c;得到的结果也是描述变量间的线性相关程度。除此之外&#xff0c;相关性分析方法还会有其他的假设条件。而灰色关联度分析首先对数据量要求…...

【python123】题目答案整理 ------更多答案见专栏

目录 二老鼠打洞 来自计算机的问候-任意数量参数 自定义幂函数 来自计算机的问候-多参函数 编写函数输出自除数 最大素数 求数列前n项的平方和 生兔子 计算圆周率——割圆法 数列求前n项和 素数&#xff1a; *如有错误请私聊纠正 二老鼠打洞 nint(input()) # 每日打…...

Python编程题汇总

Python编程复习 1.1找出列表中单词最长的一个 找出列表中单词最长的一个def test():a ["hello", "world", "yoyo", "congratulations"]length len(a[0])# 在列表中循环for i in a:if len(i) > length:length ireturn length p…...

Matplotlib详解

视频教程 1.什么是matplotlib matplotlib: 最流行的Python底层绘图库&#xff0c;主要做数据可视化图表,名字取材于MATLAB&#xff0c;模仿MATLAB构建 2.样例 2.1折线图 eg&#xff1a;假设一天中每隔两个小时(range(2,26,2))的气温(℃)分别是[15,13,14.5,17,20,25,26,26,…...

Jetson AGX Orin安装Anaconda、Cuda、Cudnn、Pytorch、Tensorrt最全教程

文章目录一&#xff1a;Anaconda安装二&#xff1a;Cuda、Cudnn安装三&#xff1a;Pytorch安装四&#xff1a;Tensorrt安装一&#xff1a;Anaconda安装 Jetson系列边缘开发板&#xff0c;其架构都是arm64&#xff0c;而不是传统PC的amd64&#xff0c;深度学习的环境配置方法大…...

pytorch入门篇2 玩转tensor(查看、提取、变换)

上一篇博客讲述了如何根据自己的实际需要在pytorch中创建tensor&#xff1a;pytorch入门篇1——创建tensor&#xff0c;这一篇主要来探讨关于tensor的基本数据变换&#xff0c;是pytorch处理数据的基本方法。 文章目录1 tensor数据查看与提取2 tensor数据变换2.1 重置tensor形状…...

随机森林算法

随机森林1.1定义1.2随机森林的随机性体现的方面1.3 随机森林的重要作用1.4 随机森林的构建过程1.5 随机森林的优缺点2. 随机森林参数描述3. 分类随机森林的代码实现1.1定义 随机森林是一种有监督学习算法&#xff0c;是以决策树为基学习器的集成学习算法。随机森林非常简单&am…...

实证分析 | 中介效应检验原理与Stata代码实现

前言 本文是温忠鳞和叶宝娟2014年刊载于《心理科学进展》的论文《中介效应分析&#xff1a;方法和模型发展》的简要笔记与拓展。 温忠麟、叶宝娟&#xff1a;《中介效应分析&#xff1a;方法和模型发展》&#xff0c;《心理科学进展》&#xff0c;2014年第5期 中介效应检验 要…...

几个代码画出漂亮的词云图,python最简单的词云图教程(建议收藏)

在开始编写程序之前&#xff0c;我们先了解一下词云图的作用&#xff0c;我们拿到一篇文章&#xff0c;想得到一些关键词&#xff0c;但文章篇幅很大&#xff0c;无法短时间得到关键词&#xff0c;这时我们可以通过程序将文章中的每个词组识别出来&#xff0c;统计每个词组出现…...

mac m1,m2 安装 提供GPU支持的pytorch和tensorflow

mac m1,m2 安装 提供GPU支持的pytorch和tensorflowAnaconda安装测试Pytorch参考链接安装步骤安装 Xcode创建conda环境测试加速效果注意Tensorflow参考链接安装步骤安装 Xcode指定安装环境加速效果测试The Endmac m1 刚出的时候&#xff0c;各种支持都不完善。那时候要使用conda…...

如何用Python优雅的合并两个Dict

假设有两个dict x和y&#xff0c;合并成一个新的dict&#xff0c;不改变 x和y的值&#xff0c;例如 x {a: 1, b: 2}y {b: 3, c: 4} 期望得到一个新的结果Z&#xff0c;如果key相同&#xff0c;则y覆盖x。期望的结果是 >>> z {a: 1, b: 3, c: 4} 在PEP448中&#xff…...

python读取文件的几种方式

下面是不同场景较为合适的数据读取方法&#xff1a; 1.python内置方法&#xff08;read、readline、readlines&#xff09; 纯文本格式或非格式化、非结构化的数据&#xff0c;常用语自然语言处理、非结构文本解析、应用正则表达式等后续应用场景下&#xff0c;Python默认的三…...

python常用模块大全

目录 时间模块time() 与 datetime()random()模块os模块sys模块tarfile用于将文件夹归档成 .tar的文件shutil 创建压缩包,复制,移动文件zipfile将文件或文件夹进行压缩 shelve 模块 json和pickle序列化hashlib 模块subprocess 模块re模块 时间模块time() 与 datetime() time()模…...

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…...

Python:ModuleNotFoundError错误解决

前言&#xff1a; 大家都知道python项目中需要导入各种包&#xff08;这里的包引鉴于java中的&#xff09;&#xff0c;官话来讲就是Module。 而什么又是Module呢&#xff0c;通俗来讲就是一个模块&#xff0c;当然模块这个意思百度搜索一下都能出来&#xff0c;Python 模块(…...

python案例——利用python画图

1、画直线 问题描述&#xff1a; 利用python中的 turtle &#xff08;海龟绘图&#xff09;模块提供的函数绘制直线 算法设计&#xff1a; turtle.penup(): 画笔抬起turtle.color(): 设置颜色turtle.goto(): 画笔移动到下一目标turtle.pendown(): …...

pandas.DataFrame设置某一行为表头(列索引),设置某一列为行索引,按索引取多行多列

pandas读取文件 pandas.DataFrame 设置索引 pandas.DataFrame 读取单行/列&#xff0c;多行多列 pandas.DataFrame 添加行/列 利用pandas处理表格类型数据&#xff0c;快捷方便&#xff0c;不常用但是有的时候又是必要技能&#xff0c;在这里记录一下一些常用函数和自己的踩坑…...

主成分分析(PCA)算法模型实现及分析(MATLAB实现)PCA降维

主成分分析&#xff08;PCA&#xff09;算法模型实现及分析&#xff08;源码在文章后附录&#xff09;1 引言2 关于PCA原理和算法实现2.1 PCA基本原理2.2 协方差计算2.3 PCA实现步骤  &#xff08;1&#xff09;PCA算法实现步骤  &#xff08;2&#xff09;基于特征值分解协…...

python 识别图片验证码/滑块验证码准确率极高的 ddddocr 库

前言 验证码的种类有很多&#xff0c;它是常用的一种反爬手段&#xff0c;包括&#xff1a;图片验证码&#xff0c;滑块验证码&#xff0c;等一些常见的验证码场景。 识别验证码的python 库有很多&#xff0c;用起来也并不简单&#xff0c;这里推荐一个简单实用的识别验证码的…...

华为OD机试 - 称砝码(Java JS Python)

题目描述 现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ; 每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。 输入描述 对于每组测试数据: 第一行:n --- 砝码的种数(范围[1,10]) 第二行:m1 m2 m3 ... m…...