自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 plt.show不显示图片

今天使用plt.imshow(img) plt.show()但是不能像之前那样显示图片了,不知道为什么,参考以下链接,问题稍微解决,只能在本地运行,但服务器代码还是不行参考链接

2020-08-15 20:56:18 2804

原创 torch.gather

torch.gather(input, dim, index, out=None, sparse_grad=False) → Tensorinput和index都是tensor,值得注意的是dim这个参数,意味着在对应维度位置上取index的值,可参考对dim参数的说明,即dim是会变为1的那个维度,或者说是应用index的维度。具体说明可参考该博客out[i][j][k] = input[index[i][j][k]][j][k] # if dim == 0out[i][j][k] = inpu

2020-08-10 22:00:42 500

原创 pytorch-cpn的refine_loss

refine_output和 target7 的shape均为[batch,17,64,48],经过计算每个元素对应位置的loss后,得到[batch,17,64,48]的refine_loss,然后经过refine_loss.mean(dim=3).mean(dim=2),得到[batch,17]的loss。 target7 = torch.zeros((1,num_class, output_shape[0], output_shape[1])) refine_output = torc

2020-07-18 17:08:52 481

原创 数据增强之仿射变换(旋转图像)

图片仿射变换需要用到一些线性代数的知识,以下为参考链接。几何变换矩阵分析:空间变换与基变换矩阵分析:从特征值到奇异值图片发生仿射变换,对应的坐标点标注也要进行响应的变换。核心代码如下#图片进行变换rotMat = cv2.getRotationMatrix2D(center, angle, 1.0)img = cv2.warpAffine(img, rotMat, (width, height))#坐标点标注进行变换R = rotMat[:, : 2]W = np.array([rot

2020-07-17 22:34:17 754

原创 coco关键点数据集水平翻转数据增强,连同标注一起变化

对coco图片进行水平翻转时,连同关键点标注也要对应着进行变化。首先是x坐标,从x变为了width-1-x,然后对应的,人体的左右边要进行交换,比如原来的左手就变成右手,原来的右手变成左手,通过以下代码完成。 for (q, w) in symmetry: cod[q], cod[w] = cod[w], cod[q]`关键点标注变化的核心代码如下: img = cv2.flip(img, 1) label = points cod = [] allc

2020-07-16 21:59:52 2054 1

原创 数据增强,对图片的crop,以及对关键点标注的对应缩放

以以下图片(000000391895.jpg)为例子,可视化图片裁剪过程对图片裁剪的关键在于如何让关键点标注在裁剪前后同步进行坐标点的转换。要裁剪的区域为gt_box,但需要对gt_box进行一定的扩展,首先算出中心点objcenter,再根据中心点进行高和宽的缩放,然后对图片进行一定的裁剪。详细可参考此博客if __name__ == '__main__': import matplotlib.patches as patches def augmentationCropI

2020-07-16 17:23:03 1538 1

原创 pytorch-cpn可视化标注信息

pytorch-cpn项目的代码对coco标注进行了重新组装,但是基本的标注内容并没有改变,关键点的坐标依然是以图片左上角为坐标原点,标注格式依然为[x1,y1,v1,x2,y2,v2,…,x17,y17,v17]。在其mscocoMulti.py文件中,以下为核心可视化代码的部分。 plt.figure() c = (np.random.random((1, 3)) * 0.6 + 0.4).tolist()[0] plt.plot(x[v > 0], y[

2020-07-14 23:31:13 388 1

原创 CPN网络的label_transform.py文件对cocoapi的使用

CPN代码中,label_transform.py对COCO数据的标注进行重新组装,生成新的train_data。这里可以学习到如何使用cocoapi的函数。记录如下,对函数的说明可参看注释。from tqdm import tqdmdataDir = '../..'dataType = 'val2017'annFile = '{}/annotations/person_keypoints_{}.json'.format(dataDir,dataType)coco_kps=COCO(annFile

2020-07-14 17:37:11 174

原创 plt.plot()画点,画连线

plt.plot是一个非常强大的函数,可以用来画各种各样的图。下面介绍最简单的画点,画连线方法plt.plot的第一个参数为x=[x1,x2,x3,…,xn],第二个参数为y=[y1,y2,y3,…,yn]再根据其他参数,可画出(x1,y1),(x2,y2),(x3,y3),…,(xn,yn)的一系列点或者由这些点依次连成的线。plt.plot可用来可视化人体关键点的标注。详情可参考cocoapi代码或者我的博客import matplotlib.pyplot as pltplt.figure

2020-07-13 23:27:42 32979

原创 plt 画图以及相关说明

最近在学着如何可视化COCO数据集的标注,需要用到matplotlib来画图,参考了一些资料。以下代码来源于参考资料参考资料1参考资料2import numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei'] # #用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False #用来正常显示坐标轴的负号x = np.linspace(-3,

2020-07-13 17:59:55 410

原创 resnet50特征图分辨率和通道数的变化

resnet50输出4个特征图。4个特征图的分辨率依次为原始图片的1/4, 1/8, 1/16, 1/32,通道数依次为256,512,1024,2048。import torch.nn as nnimport mathimport torch.utils.model_zoo as model_zoo__all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 'resnet152']mod

2020-07-12 00:07:15 10657 1

原创 torch.nn.MSELoss

如果 reduce = False,那么 size_average 参数失效,直接返回向量形式的 loss如果 reduce = True,那么 loss 返回的是标量。如果size_average为True,则除以参与计算loss的元素个数N,即取平均值;如果size_average为False,则为loss的总和,不除以N。reduce和size_average的默认值为Trueimport torchimport numpy as np# loss_fn = torch.nn.MSELoss

2020-07-11 14:01:38 724

原创 根据关键点坐标生成heatmap

使用高斯模糊,根据关键点坐标生成heatmap假设heatmap大小为6448,关键点的坐标为(32,24)即将一个6448的黑图的中心点点亮import matplotlib.pyplot as pltimport numpy as npimport cv2def generate_heatmap(heatmap, sigma): heatmap[32][24] = 1 heatmap = cv2.GaussianBlur(heatmap, sigma, 0) am

2020-07-08 20:29:56 4316

原创 特征图分辨率的降低,保持,提高

卷积输入输出分辨率大小公式当kernel大小为3,padding为1,stride为1的时候,卷积前后的特征图分辨率大小不变import torchimport torch.nn as nnfrom PIL import Imageimport numpy as npconv = nn.Conv2d(3, 4, kernel_size=3, stride=1, padding=1, bias=False)file = 'lena.png'img = Image.o

2020-07-06 22:35:57 2409

原创 pytorch的nn.Upsample,查看上采样效果

使用Image类读取图片,转为numpy数组,HWC转为CHW,然后转为[1,C,H,W],再转为Tensor,数据类型转为float。利用upsample进行上采样。再按相反的顺序,最终转为Image类的格式,显示出来。import torchimport torch.nn as nnfrom PIL import Imageimport numpy as npm = nn.Upsample(scale_factor=2, mode='nearest')up = nn.Upsample(

2020-07-06 13:07:58 5322

原创 将plt坐标原点从左下转换为左上

用plt画图的时候,默认坐标原点是左下角,画图时往往不方便。使用下列语句,即可实现原点转换为左上角。plt.gca().invert_yaxis()

2020-06-20 21:54:49 1708

原创 软链接COCO数据集

ln -s a b a 是源文件,b是目标文件。a也可以是源目录,b是尚未建立的目标目录值得注意的是执行命令的时候,应该是a目录已经建立,目录b没有建立。以mmdetection项目为例,需要在data/coco目录下软链接3个目录~/mmdetection/data/coco$ ln -s /home/all/datasets/coco/annotations/ annotations~/mmdetection/data/coco$ ln -s /home/all/datasets/coc

2020-06-19 15:29:09 1571 1

原创 可视化COCO数据集keypoints标注

COCO关键点的标注格式为[x1,y1,v1,x2,y2,v2,…,x17,y17,v17],大小必为17×3。[x,y]代表以图片左上角为原点的关键点的坐标。v=0代表该点未标注,v=代表该点已标注,但不可见。v=2代表标注并可见。显示标注信息的核心代码如下sks = np.array(coco_kps.loadCats(ann['category_id'])[0]['skeleton']) - 1kp = np.array(ann['keypoints'])x = kp[0::3]y = kp

2020-06-19 00:07:51 4700 6

原创 可视化COCO分割标注

COCO的分割物品标注在annotation属性的segmentation属性中,具体格式为一系列表示多边形各个端点的xy坐标。具体为[x1,y1,x2,y2,x3,y3…xn,yn],即标注的形式是由(x1,y1),(x2,y2),(x3,y3)…(xn,yn)点依次连接起来形成的多边形。核心代码位于showAnns函数中,主要体会标注是一系列xy坐标端点形成的多边形即可。核心部分代码如下import matplotlib.pyplot as pltfig, ax = plt.subplots(f

2020-06-18 21:41:57 1705

原创 plt.subplots

fig, ax = plt.subplots(2,3)返回的第一个fig为画布,第二个ax用于指定子图。(axes)是指图形的一部分(两条坐标轴围成的区域,ax可以可以通过下标去获取不同的子图。import numpy as npimport matplotlib.pyplot as pltfig, ax = plt.subplots(2,3)ax[0][0].plot([1,2,3,4,5])ax[1][2].plot([5,4,3,2,1])x = np.linspace(0.0,5.0)

2020-06-18 15:27:07 630

原创 matplotlib的Polygon函数

参考链接random.rand的函数说明PatchCollection的实例化对象说明set_array的函数说明Circles, Wedges and Polygons用Polygon和PatchCollection画一个五边形的代码如下,可修改r的具体值画出不同的import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.patches import Polygonfrom matplotlib.collection

2020-06-18 15:23:50 6607

原创 COCOapi使用得到指定的annId

getAnnIds首先根据imgIds找到所有的ann标注,然后,再根据ann['category_id']是否在输入的catIds中,对ann标注进行筛选,同时也用ann['area']对ann进行筛选。从而得到最后的ann图片注释,从而得到ann的Id。import time as timeimport jsonimport numpy as npfrom collections import defaultdictimport itertoolsdef _isArrayLike(obj)

2020-06-17 21:31:56 1732 1

原创 COCO数据集获取图片信息并根据URL进行显示

import time as timeimport jsonimport numpy as npfrom collections import defaultdictimport cv2 as cvdef _isArrayLike(obj): return hasattr(obj, '__iter__') and hasattr(obj, '__len__')class COCO: def __init__(self, annotation_file=None):

2020-06-17 21:24:56 1005

原创 COCO数据集根据给定的种类id获得符合条件的图片id

代码参考cocoapi核心代码如下,catId为进行筛选的类别id。首先,利用self.catToImgs[catId]获取符合类别的图片的id,然后,利用集合set的与交集操作&,完成对满足多个类别条件的图片id的筛选。 ids = set(imgIds) for i, catId in enumerate(catIds): if i == 0 and len(ids) == 0:

2020-06-17 16:58:06 1795

原创 COCO数据集的种类

COCO数据集共80类,12个大类。其代码示例如下。以下代码参考cocoapiimport time as timeimport jsonfrom collections import defaultdictdef _isArrayLike(obj): return hasattr(obj, '__iter__') and hasattr(obj, '__len__')class COCO: def __init__(self, annotation_file=None):

2020-06-17 16:20:09 4201

原创 COCO数据集person_keypoints_val2017.json标注文件的使用方式

对于每个标注文件,都会有anns, cats, imgs,imgToAnns, catToImgs 这5类字典dict数据结构需要生成。其具体过程如下:import jsonfrom collections import defaultdictannotation_file = '../../annotations/instances_val2017.json'dataset = json.load(open(annotation_file, 'r'))# print(dataset)#共有5

2020-06-17 15:31:21 4361 1

原创 手动实现计算模型的参数量和计算量

此代码来源于Higher HRNetimport osimport torchimport torch.nn as nnimport torchvision.models as modelsdef get_model_summary(model, *input_tensors, item_length=26, verbose=True): """ :param model: :param input_tensors: :param item_length:

2020-06-16 20:11:12 644

原创 register_forward_hook(hook)

建议阅读官方文档说明该函数对模块注册一个钩子函数。每次模块的forward()函数计算输出后,都会调用该钩子函数。钩子函数必须具有以下函数签名hook(module, input, output)一个简单的conv模块调用一个计算参数量的钩子函数如下def hook(module,input,output): class_name = str(module.__class__.__name__) if class_name.find("Conv") != -1 or class_name.

2020-06-16 16:53:25 1124

原创 model.apply(fn)或net.apply(fn)

首先,我们知道pytorch的任何网络net,都是torch.nn.Module的子类,都算是module,也就是模块。pytorch中的model.apply(fn)会递归地将函数fn应用到父模块的每个子模块submodule,也包括model这个父模块自身。比如下面的网络例子中。net这个模块有两个子模块,分别为Linear(2,4)和Linear(4,8)。函数首先对Linear(2,4)和Linear(4,8)两个子模块调用init_weights函数,即print(m)打印Linear(2,4

2020-06-13 23:18:57 19016 14

原创 计算nn.Linear的计算量FLOPs

import torchimport torch.nn as nnm = nn.Linear(20, 30)input = torch.randn(128, 3,20)output = m(input)print(output.size())flops = (torch.prod(torch.LongTensor(list(output.size()))) \ * input[0].size(1)).item()print((list(output.size())))pri

2020-06-13 17:35:05 3092 2

原创 pytorch中Conv2d的FLOPs的计算范例

import torchconv = torch.nn.Conv2d(1,8,(2,3))input = torch.rand(1,1,224,224) # batch,channel,width,heightoutput = conv(input)print(output.shape)bn = torch.nn.BatchNorm2d(8)l = [conv,bn]for module in l: class_name = str(module.__class__.__name__

2020-06-13 16:14:06 1155 1

原创 查看Conv2d,BN两类module的参数大小

import torchconv = torch.nn.Conv2d(1,8,(2,3))bn = torch.nn.BatchNorm2d(8)l = [conv,bn]for module in l: print('{}.weight.data.size()'.format(str(module.__class__.__name__)),module.weight.data.size())

2020-06-13 13:07:54 668

原创 torch.prob

torch.prod(input)返回input全部元素的乘积import torchb = torch.tensor([2, 3.3])print(torch.prod(b))输出tensor(6.6000)

2020-06-13 12:45:42 3256

原创 pytorch计算module的参数量

import torchconv = torch.nn.Conv2d(1,8,(2,3))bn = torch.nn.bBatchNorm2d(8)l = [conv,bn]for module in l: params = 0 for param_ in module.parameters(): print(param_) params += param_.view(-1).size(0) print(module,params)可以看到

2020-06-13 12:09:27 579

原创 pytorch获取module的classname

import torchconv = torch.nn.Conv2d(1,8,(2,3))bn = torch.nn.BatchNorm2d(8)l = [conv,bn]for item in l: print(item.__class__.__name__)输出结果:Conv2dBatchNorm2d

2020-06-13 11:40:48 1478 1

原创 测试pytorch的Conv2d的类继承关系

Conv2d是一个torch.nn.Module,但不是torch.nn.ModuleListimport torchconv = torch.nn.Conv2d(1,8,(2,3))if not isinstance(conv,torch.nn.ModuleList): print('not ModuleList')if isinstance(conv,torch.nn.Module): print('is torch.nn.Module')输出结果not ModuleLis

2020-06-13 11:20:39 349

原创 理解opencv读取图片后的格式,理解图片矩阵的储存方式

python对opencv读入图片的shape理解在高,宽,通道数上分别进行裁剪import cv2import numpy as npimg = cv2.imread("./image.jpg")print(img.shape) #高,宽,通道数cut1 = img[:30,:,:]cv2.imwrite("./cut1.jpg", cut1)cut2 = img[:,:30,:]cv2.imwrite("./cut2.jpg", cut2)cut3 = img[:,:,0]

2020-06-11 23:23:35 2099 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除