肺炎疫情攻防战--肺炎X光病灶识别 Pytorch baseline

2023-11-12

肺炎疫情攻防战–肺炎X光病灶识别 Pytorch baseline

刚从Keras转Pytorch没多久,一边看着文档一边Google完成这比赛的baseline。
比赛地址

比赛简介

本次由2019-nCoV病毒引发的肺炎疫情仍在持续,AI研习社重启肺炎赛题,希望大家尽量减少外出,安心在家打比赛拿奖金,勤洗手,多戴口罩。全国人民上下一心,共抗疫情。

数据集:训练集20013张,测试集 6671张。图片大小102410243
任务:训练模型正确识别肺炎X光病灶数量

环境

实验室断电了,淘宝租了2080ti,一天60块。T_T
jupyter lab+Python3.6+Pytorch 1.0.1

查看所给数据集

# 查看csv数据
import pandas as pd
from collections import Counter
csv=pd.read_csv("train.csv",header=None)
print(csv)
           0  1
0          0  0
1          1  0
2          2  0
3          3  0
4          4  0
...      ... ..
20008  20008  0
20009  20009  0
20010  20010  0
20011  20011  1
20012  20012  1

[20013 rows x 2 columns]

20013张图片,0列代表图片id,1列为标签

查看种类分布

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 分布情况
cases_count = csv[1].value_counts()
print(cases_count)
# 画图
plt.figure(figsize=(6,3))
sns.barplot(x=cases_count.index, y= cases_count.values)
plt.title('Number of cases', fontsize=14)
plt.xlabel('Case type', fontsize=12)
plt.ylabel('Count', fontsize=12)
plt.xticks(range(len(cases_count.index)), ['0', '1','2','3'])
plt.show()

0    15503
2     2450
1     1960
3       89
4       10
Name: 0.1, dtype: int64

在这里插入图片描述
这有数据集有点欺负人了,严重的类别不均衡,第一类占了75%,第三,四类可以放弃了。稍后可以扩充看看效果。没服务器跑的话直接全按0提交吧。(逃)

查看图片样例

导入图片查看肺炎ct长怎样,kaggle上学到的方法。

from PIL import Image
images=csv[1].values
labels=csv[0].values
paths="train/"
imgs0=(csv[csv[1]==0][0].iloc[:5]).tolist()
imgs1=(csv[csv[1]==1][0].iloc[:5]).tolist()
imgs2=(csv[csv[1]==2][0].iloc[:5]).tolist()
imgs3=(csv[csv[1]==3][0].iloc[:5]).tolist()
imgs4=(csv[csv[1]==4][0].iloc[:5]).tolist()
imgs=imgs0+imgs1+imgs2+imgs3+imgs4
f, ax = plt.subplots(5,5, figsize=(8,8))
for i in range(25):
    img_path=paths+str(imgs[i])+'.jpg'
    img=Image.open(img_path).convert('RGB')
    ax[i//5, i%5].imshow(img)
    ax[i//5, i%5].set_title(i//5)    
    ax[i//5, i%5].axis('off')
    ax[i//5, i%5].set_aspect('auto')
    
plt.show()

在这里插入图片描述

思路

我觉得是个检测任务,检测病灶的数量。但我打算先当成多分类试试看。

自定义Dataset类

import pandas as pd
import numpy as np
import os
from PIL import Image
from torch.utils.data import Dataset
class MyDataSet(Dataset):
    def __init__(self,image_path,csv_path,transforms,phrase):
        # 读取csv
        csv=pd.read_csv(csv_path,header=None)
        # 读取第一列,组合成完整的图片地址
        self.imgs=[image_path+str(k)+".jpg" for k in csv[0].values]
        self.phrase=phrase
        if self.phrase!="test":
            self.labels=np.asarray([k for k in csv[1].values])
        self.transforms=transforms
    

    def __getitem__(self, index):
        img_path = self.imgs[index]
        pil_img = Image.open(img_path).convert("RGB")
        if self.transforms:
            data = self.transforms(pil_img)
        else:
            pil_img = np.asarray(pil_img)
            data = torch.from_numpy(pil_img)
        if self.phrase!="test":
            label=self.labels[index]
            sample = (data,label)
        else:
            sample=data
        return sample

    def __len__(self):
        return len(self.imgs)

先做数据增强

训练集随机裁剪然后中心裁剪成224224,随机翻转,随机亮度对比度,随机旋转15度,标准化。验证集测试集只裁剪为224224。

from torchvision import transforms
# 数据增强
data_transforms={
    "train":
    transforms.Compose([
            transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
            transforms.CenterCrop(size=224),
            transforms.RandomHorizontalFlip(),
            transforms.ColorJitter(brightness=0.2, contrast=0.2),
            transforms.RandomRotation(15),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
                    
    ]),
    "val":
    transforms.Compose([
            transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
            transforms.CenterCrop(size=224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    "test":
    transforms.Compose([
            transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),
            transforms.CenterCrop(size=224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    
}

读取数据集,划分数据集

from torch.utils.data import DataLoader,SubsetRandomSampler
from load_data import MyDataSet
import numpy as np
batch_size=64
dataset=MyDataSet("train/","train.csv",data_transforms["train"],"train")
# 验证集比例
validation_split = .2
shuffle_dataset = True
random_seed= 42
batch_size=128

dataset_size = len(dataset)
indices = list(range(dataset_size))
split = int(np.floor(validation_split * dataset_size))
if shuffle_dataset :
    np.random.seed(random_seed)
    np.random.shuffle(indices)
train_indices, val_indices = indices[split:], indices[:split]

# 创建sampler
train_sampler = SubsetRandomSampler(train_indices)
valid_sampler = SubsetRandomSampler(val_indices)

train_loader = DataLoader(dataset, batch_size=batch_size, shuffle=shuffle_dataset,num_workers=4)
val_loader=DataLoader(dataset, batch_size=batch_size, shuffle=shuffle_dataset,num_workers=4)


建立模型

resnet34,imagenet预训练模型迁移学习

from torchvision import models
from torch import nn
import sys
# 冻结最初几层网络
def set_parameter_requires_grad(model, feature_extracting):
    if feature_extracting:
        for i, para in enumerate(model.parameters()):
            if i < 50:
                para.requires_grad = False
            else:
                para.requires_grad = True
           
def initialize_model(model_name, num_classes, feature_extract, use_pretrained=False):
    model_ft = None
    input_size = 0
 
    model_ft = models.resnet34(pretrained=use_pretrained)
    set_parameter_requires_grad(model_ft, feature_extract)
    num_ftrs = model_ft.fc.in_features
        model_ft.fc = nn.Sequential(nn.Linear(num_ftrs, num_classes))
    input_size = 224
    return model_ft, input_size
from model import initialize_model
num_classes=5
model_name="resnet34"
feature_extract=True
model,input_size=initialize_model(model_name=model_name,num_classes=num_classes,feature_extract=feature_extract, use_pretrained=True)

训练

参考官方文档的训练过程

import copy
import time
import torch
import matplotlib.pyplot as plt
def train_model(model, device,dataloaders, criterion, optimizer, num_epochs, is_inception=False):
    since = time.time()

    val_acc_history = []
    train_acc_history=[]
    val_loss_history = []
    train_loss_history=[]
    best_model_wts = copy.deepcopy(model.state_dict())
    best_acc = 0.0

    for epoch in range(num_epochs):
        print('Epoch {}/{}'.format(epoch, num_epochs - 1))
        print('-' * 10)

        # Each epoch has a training and validation phase
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()  # Set model to training mode
            else:
                model.eval()   # Set model to evaluate mode

            running_loss = 0.0
            running_corrects = 0

            # Iterate over data.
            for inputs, labels in dataloaders[phase]:
                inputs = inputs.to(device)
                labels = labels.to(device)


                # zero the parameter gradients
                optimizer.zero_grad()

                # forward
                # track history if only in train
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    loss = criterion(outputs, labels)

                    _, preds = torch.max(outputs, 1)

                    # backward + optimize only if in training phase
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()

                # statistics
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)

            epoch_loss = running_loss / len(dataloaders[phase].dataset)
            epoch_acc = running_corrects.double() / len(dataloaders[phase].dataset)

            print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))

            # deep copy the model
            if phase == 'val' and epoch_acc > best_acc:
                best_acc = epoch_acc
                best_model_wts = copy.deepcopy(model.state_dict())
            if phase == 'val':
                val_acc_history.append(epoch_acc)
                val_loss_history.append(epoch_loss)
            if phase=="train":
                train_acc_history.append(epoch_acc)
                train_loss_history.append(epoch_loss)
                

        print()
    his=[train_acc_history,val_acc_history,train_loss_history,val_loss_history]
    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))
    print('Best val Acc: {:4f}'.format(best_acc))
    
    # load best model weights
    model.load_state_dict(best_model_wts)
    torch.save(model,"model_{}.pkl".format(best_acc))
    return model, his

训练20轮,损失函数交叉熵,优化adam,学习率0.001

from train import train_model
from torch import nn,optim
epoch=20
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = model.to(device)
criterion = nn.CrossEntropyLoss()
# optimizer=optim.SGD(params_to_update, lr=0.01, momentum=0.9)
optimizer = optim.Adam(params_to_update,lr=0.001,)
model,his=train_model(model, device,dataloader, criterion, optimizer, num_epochs=epoch, is_inception=False)
Epoch 0/19
----------
train Loss: 0.5685 Acc: 0.7956
val Loss: 0.5189 Acc: 0.8125

Epoch 1/19
----------
train Loss: 0.5186 Acc: 0.8106
val Loss: 0.5188 Acc: 0.8058

Epoch 2/19
----------
train Loss: 0.5061 Acc: 0.8116
val Loss: 0.4857 Acc: 0.8204

Epoch 3/19
----------
train Loss: 0.4996 Acc: 0.8152
val Loss: 0.4822 Acc: 0.8215

Epoch 4/19
----------
train Loss: 0.4967 Acc: 0.8183
val Loss: 0.4853 Acc: 0.8145

Epoch 5/19
----------
train Loss: 0.4891 Acc: 0.8187
val Loss: 0.4733 Acc: 0.8215

Epoch 6/19
----------
train Loss: 0.4824 Acc: 0.8197
val Loss: 0.5399 Acc: 0.7997

Epoch 7/19
----------
train Loss: 0.4837 Acc: 0.8209
val Loss: 0.4696 Acc: 0.8246

Epoch 8/19
----------
train Loss: 0.4783 Acc: 0.8210
val Loss: 0.4666 Acc: 0.8253

Epoch 9/19
----------
train Loss: 0.4755 Acc: 0.8232
val Loss: 0.4616 Acc: 0.8270

Epoch 10/19
----------
train Loss: 0.4711 Acc: 0.8227
val Loss: 0.4693 Acc: 0.8250

Epoch 11/19
----------
train Loss: 0.4683 Acc: 0.8231
val Loss: 0.4571 Acc: 0.8289

Epoch 12/19
----------
train Loss: 0.4634 Acc: 0.8247
val Loss: 0.4644 Acc: 0.8299

Epoch 13/19
----------
train Loss: 0.4613 Acc: 0.8286
val Loss: 0.4404 Acc: 0.8329

Epoch 14/19
----------
train Loss: 0.4582 Acc: 0.8281
val Loss: 0.4535 Acc: 0.8323

Epoch 15/19
----------
train Loss: 0.4556 Acc: 0.8265
val Loss: 0.4553 Acc: 0.8256

Epoch 16/19
----------
train Loss: 0.4508 Acc: 0.8305
val Loss: 0.4375 Acc: 0.8361

Epoch 17/19
----------
train Loss: 0.4453 Acc: 0.8316
val Loss: 0.4301 Acc: 0.8377

Epoch 18/19
----------
train Loss: 0.4473 Acc: 0.8323
val Loss: 0.4267 Acc: 0.8396

Epoch 19/19
----------
train Loss: 0.4391 Acc: 0.8330
val Loss: 0.4140 Acc: 0.8431

Training complete in 56m 33s
Best val Acc: 0.843094

画图

import numpy as np
train_acc = [h.cpu().numpy() for h in his[0]]
val_acc = [h.cpu().numpy() for h in his[1]]

plt.title("Accuracy vs Number of Training Epochs")
plt.xlabel("Training Epochs")
plt.ylabel("Accuracy")
plt.plot(range(1,epoch+1),train_acc,label="training")
plt.plot(range(1,epoch+1),val_acc,label="val")
plt.ylim((0,1.))
plt.xticks(np.arange(1, epoch+1, 1.0))
plt.legend()
plt.savefig("acc.png")
plt.show()
plt.close('all')
train_loss = [h for h in his[2]]
val_loss = [h for h in his[3]]
plt.title("Loss vs Number of Training Epochs")
plt.xlabel("Training Epochs")
plt.ylabel("Accuracy")
plt.plot(range(1,epoch+1),train_loss,label="training")
plt.plot(range(1,epoch+1),val_loss,label="val")
plt.xticks(np.arange(1, epoch+1, 1.0))
plt.legend()
plt.savefig("loss.png")
plt.show()

在这里插入图片描述
大部分情况下验证集准确率都大于训练集准确率,且loss也优于训练集,个人理解是训练集做了数据增强,而验证集测试集并没有处理,使得训练集数据分布变得更加广泛,变得难以训练,从而使模型变得泛化能力增强。在大型数据集中往往都会出现这种情况。

输出csv提交

手动新建了csv,序号从0到6670

import torch
from load_data import MyDataSet
from torch.utils.data import DataLoader
model=torch.load("model_0.84.pkl")
# 读取测试集
dataset=MyDataSet("test/","upload.csv",data_transforms["test"],"test")
testdata=DataLoader(dataset,batch_size=32, shuffle=False,num_workers=4)
print(dataset.__len__())
6671
# 输出学习了[Nin7a](https://blog.csdn.net/Nin7a/article/details/104057441)大佬的blog

import pandas as pd
model.eval()
predicted_labels_list=[]
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
for batch_id,(features) in enumerate(testdata):
    features = features.to(device)
    probas = model(features)
    _, predicted_labels = torch.max(probas, 1)
    for label in predicted_labels:
        predicted_labels_list.append(label.cpu().item())


dict={'label':predicted_labels_list}
df=pd.DataFrame(dict)
df.to_csv('upload.csv',header=False,index=True)

提交

在这里插入图片描述
目前新榜单,暂时排名第十

小结

看了提交的csv,果然一个3和4也没有,全不是预测为0,1,2类,下一步可能会学习一下处理类别不均衡的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

肺炎疫情攻防战--肺炎X光病灶识别 Pytorch baseline 的相关文章

  • Linux 分区扩容

    虚拟机磁盘空间250G 克隆后系统分区空间只有200G 通过resize2fs扩容分区 suer pro 22 244 sudo fdisk l 磁盘 dev sda 268 4 GB 268435456000 字节 524288000 个
  • 【C++】C语言基础部分知识点总结 (指针,函数,内存,关键字,预处理等)(秋招篇)

    文章目录 前言 讲一下32位系统常用数据类型的字节大小 stm32f103为例 讲一些C C 中常见的库 什么是易变变量 代码的转化和构建通常会经历哪几个步骤 预处理 编译 汇编 链接 介绍一下C C 常用的关键字 介绍一些const的使用
  • python 基础绘图(关于随时间序列变动的图的画法)

    画这种图要考虑两点 1 如何生成连续的时间轴 2 如何在图中适当的显示轴标签的样式和数量 import matplotlib pyplot as plt import matplotlib as mpl import numpy as np
  • Collection排序

    使用Collection的sort方法可以对List对象进行排序 其中Record为自己定义的类 包含value index count三个成员变量 ArrayList
  • 记录获取蓝鲸智云token的过程

    一 使用python脚本获取蓝鲸智云token python版本环境 3 11 coding utf 8 import requests def get user token domain user password 模拟用户登录 并返回
  • 判断IP是否能够ping成功

    public bool IsCondtion object condtion CondtionPing vData condtion as CondtionPing int m pingNum 3 if vData null return
  • 操作系统 --- 多线程 Multithreading

    操作系统 多线程 Multi Threading 什么是线程和多线程 进程的缺点 线程 Thread 线程的优点 线程和进程的区别 关于线程的资源 线程独有的资源 线程共享的资源 同步线程和异步线程 Asynchronous thread
  • 物联网采集数据存储到MySQL_物联网中的数据分类、存储与应用

    本文主要介绍物联网的数据从传感器采集 存储到分析处理的过程 数据分类 物联网数据可以分为静态数据和动态数据 静态数据 被测设备地址类 地点 GIS信息 设备名称编号 资产属性相关 设备相关的标签类 设备的规格 静态数据多以结构性 关系型数据
  • 【计算机视觉

    文章目录 一 Mask R CNN 二 Hybrid Task Cascade 三 Cascade Mask R CNN 四 Contour Proposal Network 五 GCNet 六 PANet 七 K Net 八 Center
  • Ubuntu安装“启动引导器”的设备选哪一项,选默认还是选/boot分区?

    如果你要用Ubuntu的引导器代替Windows的引导器 就选 dev sda 如果你要保留Windows的引导器 就选 boot分区 但这样一来 装完Ubuntu重启后 只能启动Windows 还必须在Windows上面安装Easybcd
  • 多元函数的泰勒展开公式

    泰勒定理 泰勒展开是一个很有趣的方法 应该大部分人都看过下面这么一条定理 泰勒定理 若函数f x 在闭区间 a b 上存在直至n阶的连续导函数 在开区间 a b 内存在 n 1 阶导函数 则对任意给定的 x x0 a b x x 0 a
  • CentOS 7系统安装配置图解教程

    操作系统 CentOS 7 3 备注 CentOS 7 x系列只有64位系统 没有32位 生产服务器建议安装CentOS 7 x86 64 Minimal 1611 iso版本 一 安装CentOS 7 3 成功引导系统后 会出现下面的界面
  • Zookeeper安装(服务注册与发现)

    第一步 先准备安装包 这里我推荐在Apache官网下载 Zookeeper下载地址 https archive apache org dist zookeeper zookeeper 3 6 1 https archive apache o
  • c++以空格分开的输入数组_C++处理输入字符串并转为数组的操作

    最近在做题的时候在处理输入时遇到一个令人头疼的问题 今天解决了和大家分享一下 比如题目要求的输入为一行数 数与数之间用空格间隔开 数的个数未知 数也有正有负 11 2 65 7 那么如何把这个输入保存到数组a中 且数组a中的值为a 0 11
  • 4G DTU

    4G DTU是一种可以将RS232 485采集的数据通过3G 4G发送到云端服务器进行数据交互的传输设备 实现串口设备的无线长距离数据传输 进而实现远程数据通信管理 主要应用在远程数据采集和远程控制项目 卓岚的4G DTU分为2种类型 1
  • vue中tree-transfer树形穿梭框的使用

    首先安装插件 npm install el tree transfer save 或者 npm i el tree transfer S 安装 效果图 代码
  • vue点击导航菜单,展示选中样式,菜单路由存在嵌套路由时也可以判断为当前路由

    采用计算属性监听跳转页面后url拼接的路由路径来判断是否在当前页面 包括解决嵌套路由带来的判断干扰 效果图 定义路由 router js import Vue from vue import VueRouter from vue route
  • 睿智的智能优化算法2——遗传算法的python实现

    睿智的智能优化算法2 遗传算法的python实现 什么是遗传算法 求解过程 整体代码分解 1 编码解码部分 2 求取适应度部分 3 自然选择部分 4 组合交叉 5 基因突变 实现代码 GITHUB下载连接 睿智的智能优化算法小课堂再次开课啦
  • LSM6DS3,SO, SPI

    一 LSM6DS3是ST的一款6轴力学传感器 3轴加速度 3轴陀螺仪 特别注意 后缀不一样 功能有很大不一样 有的有OIS功能 有的没有 LSB的意思是最小有效位 为数字输出方式 一般我们可以用mdps LSB来表示灵敏度 8 75 mdp

随机推荐

  • iOS开发Google Protocol Buffer 的解析封装(二)

    为此我封装了一个Google Protocol Buffer的网络解析方法 由于项目时间比较急 我没有写出更好的封装方法 我会继续创作 希望大家的鼓励与支持 PBHttpMethod h 的文件 import
  • Junit mockito 测试Controller层方法有Pageable异常

    1 问题 在使用MockMVC Mockito模拟Service层返回的时候 当我们在Controller层中参数方法调用有Pageable对象的时候 我们会发现 我们没办法生成一个Pageable的对象 会报一个Pageable是一个接口
  • C语言中宏的预编译控制语句#ifndefine、#define和#endif(总结)

    例如 ifndefine 这是 if not defined 的简写 是宏定义的一种 它是可以根据是否已经定义了一个变量来进行分支选择 一般用于调试等等 实际上确切的说这应该是预处理功能中三种 宏定义 文件包含和条件编译 中的第三种 条件编
  • smartGit安装和过期解决

    一 下载安装包 去百度下载 二 安装英文 第三点是中文版本的 2 1 exe安装 解压smartgit win 18 1 5 zip 点击smartgit64 exe安装 2 2 配置 2 3 用户配置 core autocrlf fals
  • python极简循环输出+break和continue

    目录 一 python极简输出 二 break和continue 一 python极简输出 如上图所示 上面只有一个错误答案 我们用排除法知道 错误的是答案B 但这里面有个有趣的答案C 就是 print languages i years
  • 【华为OD机试】查字典 (C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 人眼定位算法简单概述

    这篇博客只是总结一下人眼定位的方法 首先人眼定位效果是得到人眼的坐标 即瞳孔的坐标 大体来说人眼定位的方法有两种 第一种是利用人眼的几何特征 灰度特征等通过算法来实现定位 第二种要通过机器学习 其实opencv自带了瞳孔分类器 但我应用起来
  • 基于 python的MES管理系统

    一 项目简介 基于 python的MES管理系统 二 实现功能 支持多端 pc端 移动端 小程序 app 支持各种协议 modbus mqtt 支持接入各种数据源 内置数据计算服务 支持数据清洗 支持数据可视化 支持空间数据 支持门店数据
  • ZooKeeper的一个性能测试

    2011 07 15 18 07 00 3台ZooKeeper服务器 8核64位jdk1 6 log和snapshot放在不同磁盘 场景一 同一个目录下 先createEPHEMERALnode 再delete create和delete各
  • 人脸识别技术成熟加速终端设备技术扩展

    脸支付的应用 已经对我们的生活带来了很多便利 除了金融 现在商超等场景 也大多添加了刷脸支付设备 无需拿出手机 不用担心手机没电 刷脸即可支付 人脸识别技术的成熟 也加速了在终端设备的技术扩展速度 现在的刷脸设备 除了基本的支付功能 还融合
  • xxx.jar中没有主清单属性解决办法

    在springboot中的pom xml文件中引入
  • MyEclipse下配置WebLogic10(转)

    MyEclipse下配置WebLogic10 转 安装 WebLogic 比较容易 在这里就不再累述了 大家可以参阅相关文档 现在着重讲一下 WebLogic 的配置 因为后面在配置 MyEclipse 时将用到这里的配置信息 运行开始 g
  • 【Bug记录】Fail to create pixmap with Tk_GetPixmap in TkImgPhotoInstanceSetSize

    Bug记录 项目场景 问题描述 解决方案 项目场景 绘图代码出现Fail to create pixmap with Tk GetPixmap in TkImgPhotoInstanceSetSize 问题描述 在测试网络时出现此Bug 可
  • 机器数的原码、反码、补码、移码表示以及浮点数的二进制表示

    初学计算机组成原理时 有点儿搞不清楚机器数的各种表示方法 今天在这里总结一下 希望对大家有帮助 首先明确两个概念 机器数是指将 和 数字化的数 其中用 0 表示 1 表示 而对应的有 和 的数则称为真值 机器数的表示方法 1 原码表示法 符
  • debug模式下,一个30的for循环直接从i=1跳到你想要的数字(i=10)

    废话不多说 直接上图 1 先创建一个for循环 debug模式运行 在for循环中间打断点 我们可以看出刚运行的时候i 0 2 点击 debug 下一步 或者F6 直到他显示这个variables 这时 我们可以对i进行任意的修改你想要的数
  • 【Python】 14-CVS文件操作

    1 CVS文件 值没有类型 所有东西都是字符串 没有字体大小或颜色的设置 没有多个工作表 不能指定单元格的宽度和高度 不能合并单元格 不能嵌入图像或图表 CSV 文件中的每个单元格 有逗号分割 也许你可以只是对每行文本调用 split 方法
  • Google Pixel 3玩机教程

    说到谷歌的亲儿子Pixel系列 你一定就会想到安卓原生系统 现在我将会教你如何使用pixel去root并且破解电信 第一步 解锁手机 1 打开手机的开发者选项 选择OEM解锁 打开它 再把USB调试打开 2 在电脑上的google deve
  • GPIO的开漏和推挽

    GPIO的开漏和推挽 简单来说推挽输出可以自由输出高低电平 开漏输出只能在关闭时配合上拉提高高电平 打开时漏掉电流形成低电平 操作单片机点亮一个LED的时候我们需要操作GPIO输出一个高电平来点亮一个LED 当我们打开用户手册时会发现GPI
  • OR-Tool 报INFEASIBLE

    OR Tool 使用Minimum Cost Flows报 There was an issue with the min cost flow input Status Status INFEASIBLE 这是因为node的编号需要是连续的
  • 肺炎疫情攻防战--肺炎X光病灶识别 Pytorch baseline

    肺炎疫情攻防战 肺炎X光病灶识别 Pytorch baseline 刚从Keras转Pytorch没多久 一边看着文档一边Google完成这比赛的baseline 比赛地址 比赛简介 本次由2019 nCoV病毒引发的肺炎疫情仍在持续 AI