# PyTorch目标检测学习小结

一、环境搭建

当前:Windows10 + Anaconda3.6

1.1 创建PyTorch的虚拟环境

打开Anaconda中的Anaconda Prompt那个黑框框,输入:

#注意这里pytorch是自己设置的虚拟环境名称,可以随意取
conda create --name pytorch python=3.6

之后输入y,创建pytorch虚拟环境。以下是一些常规命令:

#进入到虚拟环境
activate pytorch

#切回root环境
activate root

#删除虚拟环境
conda remove -n pytorch --all

#查看当前存在哪些虚拟环境
conda info -e

1.2 安装PyTorch

链接PyTorch官网,可以任意选择安装环境 https://pytorch.org/

#例:无CUDA安装
conda install pytorch-cpu torchvision-cpu -c pytorch    

二、基础知识--Tensor

之前只用过Tensflow,学习pytorch时候,第一念头就是tensor,下面写一些入坑笔记,更多的pytorch知识参见文末的参考文献。

PyTorch中的Tensor常用类型有:float,int,bool...
Tensor和Numpy中的ndarray很多操作类似,两者之间也可以相互转换

2.1 Tensor的构建

import torch

a = torch.FloatTensor(2,3)  #2x3浮点型张量
c = torch.IntTensor(2,3)    #2x3整数型张量

b = torch.FloatTensor([1,2,3,4])    #浮点型张量2,3,4,5
d = torch.IntTensor([1,2,3,4])  ##整数型张量2,3,4,5

i = torch.empty(2,3)    #创建一个2x3Tensor
e = torch.rand(2,3) #随机生成2x3的浮点型Tensor,元素值在0~1区间均匀分布
f = torch.randn(2,3)    #随机生成2x3的浮点型Tensor,元素取值满足均值为0,方差为1的正态分布
g = torch.arange(2,8,1) #自定义起始值2、结束值8、步长1的浮点型Tensor
h = torch.zeros(2,3,dtype=torch.long)   #元素值全部为0的2x3long型Tensor

#根据现有张量创建新张量,沿用之前的属性(除非重新设置)
x = torch.IntTensor(5,3)
x = x.new_ones(5, 3, dtype=torch.double)
x = torch.randn_like(x, dtype=torch.float)

#查看张量维度
print(x.size()) #返回tuple

2.2 Tensor的计算

import torch

#加(size和dtype需一致)
torch.add(a,c)  #a,c两张量对应元素相加
torch.add(a,10) #张量a每个元素加10
c.add_(a)   #a+c并赋值到c
#NOTE:任何以_ 结尾的操作都会用结果替换原变量. 如: x.copy_(y), x.t_(), 都会改变 x.

#乘法(点乘)(size和dtype需一致)
torch.mul(a,c)  #a,c两张量对应元素相乘
torch.mul(a,10) #张量a每个元素乘以10

#矩阵乘法(x乘)
torch.mm(a,c)   #张量a,c进行矩阵乘法

#除法(size和dtype需一致)
torch.div(a,c)  #a,c两张量对应元素相除
torch.div(a,10) #张量a每个元素除以10

#幂
torch.pow(a,2)  #张量a的平方

#绝对值
torch.abs(a)    #张量a中元素值全部取绝对值

#元素值自定义裁剪
torch.clamp(a,-0.1,0.1) #张量a的元素与上下边界0.1,-0.1比较,超过上边界的元素裁剪为0.1,超过下边界的裁剪为-0.1

#切片
#任何NumPy索引方式的操作适用于Tensor
print(a[:,1])   #返回第2列

#单元素Tensor取值
#若张量只有一个元素tensor([-1,2334]),可使用.item()来得到Python数据类型的数值
x.item()

#张量维度和大小改变
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)  # -1 表示从其他维度推断
print(x.size(), y.size(), z.size())
#torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

三、小案例--YOLOv3红细胞检测

这里主要用红细胞检测为案例(自己百度下载并标注了一些苹果橘子图片,同样流程也完成了目标检测),结果展示:

3.1 LabelImg数据标注

对JPEGImages文件夹中的原始图像进行目标标注,使用的工具是LabelImg,YOLOV3的label标注的一行五个数分别代表类别编号,BoundingBox 中心 X 坐标,中心 Y 坐标,宽,高(这些坐标都是 0~1 的相对坐标)。labelImg下载及使用方法参见:
https://blog.csdn.net/python_pycharm/article/details/85338801#commentsedit

最后将数据整理成两个文档存在data/custom文件夹里
Annotations存放标注后的xml文件
JPEGImages存放原始图片
红细胞标注后的数据下载参见的是https://github.com/cosmicad/dataset

3.2 数据预处理

1)复制JPEGImages,重命名为images
--为了和之后代码(utils/datasets.py)中路径保持一致
2)建立两个空的文件夹ImageSets,labels
3)运行makeTxt.py,将数据分为训练集,测试集和验证集
--在ImageSets下得到四个txt文件,train,test,valid,trainval
4)运行voc_label.py(记得修改其中的classes为自己数据集要检测的类别),得到训练集,测试集和验证集的具体路径以及具体labels信息
--得到train,test,valid三个txt,labels中的五点标注txt信息
其中makeTxt.py和voc_label.py参见https://blog.csdn.net/public669/article/details/98020800

3.3 文件配置

在data/custom目录下新建classes.names--要检测物体的名称
在config目录下新建custom.data--一些声明,包括类别数、train和valid的路径、class.names
注:classes.names文件最后要留一个空行,不然会报错list index out of range,详情见
https://github.com/eriklindernoren/PyTorch-YOLOv3/issues/177

3.4 模型训练测试及试用

代码参考的是大神的https://github.com/eriklindernoren/PyTorch-YOLOv3
因为coco数据集太大了,下载要好久,就考虑用小点的数据来学习,不过原代码已经保存好训练权重yolov3.weights了,可以直接进行coco数据集(80类)目标检测

#下载训练好的coco数据集权重
cd weights/
bash download_weights.sh

#目标检测
python3 detect.py --image_folder data/coco_samples/

--修改cfg中的learning_rate=0.005 #原来是0.001
--修改train和test.py中的batch_size=4 #原来为8,不改的话报错shape is invaid for input of size

#自定义模型
cd config/
bash create_custom_model.sh 1   #红细胞检测只有一个类别,苹果橘子测试有两个类别,根据需求更改

#模型训练
cd /home/kiki/PyTorch-YOLOv3    #注意修改成自己的路径
python3 train.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --epochs 500
#--最后Total Loss 0.165

#查看Tensorboard
tensorboard --logdir=PATH\logs

#测试
python3 test.py --model_def config/yolov3-custom.cfg --data_config config/custom.data --weights_path checkpoints/yolov3_ckpt_499.pth --class_path data/custom/classes.names
#--最后AP=0.782,mAP=0.782

#红细胞检测
python3 detect.py --image_folder data/samples/ --model_def config/yolov3-custom.cfg --weights_path checkpoints/yolov3_ckpt_499.pth --class_path data/custom/classes.names --checkpoint_model checkpoints/yolov3_ckpt_499.pth  --conf_thres 0.95 --nms_thres 0.4

3.5 踩过的坑

踩过的坑有很多,没有一一记录,选几个常见的报错整理了下:

1、执行detect.py出错

python3 detect.py --image_folder data/coco_samples/
命令行执行报错:
qt.qpa.screen: QXcbConnection: Could not connect to display
Could not connect to any X display.

原因:没装Xmanager,装上就好了,Xmanager下载地址:http://www.xshellcn.com/

2、执行train.py报错ValueError: not enough values to unpack (expected 3, got 0)

修改:train.py中150行
if epoch % opt.evaluation_interval == 0:
改为
if epoch % opt.evaluation_interval == 1:

3、执行train.py报错IndexError: index 0 is out of range

重复构建模型,删除已有的yolov3-custom.cfg模型,重新bash create_custom_model.sh

4、执行train.py报错RuntimeError: cannot perform reduction function max on tensor with no elements because the operation does not have an identity

检查data/custom中的数据,xml文件和图片个数是否一致,labels中是否有空的txt等

参考资料

https://github.com/zergtant/pytorch-handbook
https://pytorch.org/tutorials/
https://github.com/L1aoXingyu/code-of-learn-deep-learning-with-pytorch
https://blog.csdn.net/public669/article/details/98020800
https://github.com/eriklindernoren/PyTorch-YOLOv3
http://www.pianshen.com/article/1287380494/

原文地址:https://www.cnblogs.com/shenggang/p/12133039.html

时间: 2024-08-29 23:17:23

# PyTorch目标检测学习小结的相关文章

openCV目标检测学习笔记(一)

最近在研究一些基于openCV的目标检测算法,由浅入深,今天是第一天. 首先网上下载了一份较简单的来对视频中运动物体进行二值显示的代码进行学习,以下是我的理解,初学者会犯一些错希望大家予以指正. #include<cv.h>#include "cxcore.h"#include<highgui.h> int main(int argc,unsigned char* argv[]) { CvCapture* capture = cvCreateFileCaptur

pytorch 目标检测 图像预处理

Faster RCNN 和Retinanet在将图像数据输送到网络之前,要对图像数据进行预处理.大致上与博客提到的相同. 事实上还可以采取第三步,将图片的宽和高扩展为32的整倍数,正如在Retinanet使用的.下面是一个简单的Pytorch数据预处理模块: class Resizer(): def __call__(self, sample, targetSize=608, maxSize=1024, pad_N=32): image, anns = sample['img'], sample

从零开始实现SSD目标检测(pytorch)(一)

目录 从零开始实现SSD目标检测(pytorch) 第一章 相关概念概述 1.1 检测框表示 1.2 交并比 第二章 基础网络 第三章 先验框设计 第四章 LOSS设计 从零开始实现SSD目标检测(pytorch) 特别说明: 本系列文章是Pytorch目标检测手册的翻译+总结 知其然知其所以然,光看论文不够,得亲自实现 第一章 相关概念概述 1.1 检测框表示 边界宽(bounding box)是包围一个物体(objective)的框,用来表示这个物体的位置.形状.大小等信息.不是最小外接矩形

基于深度学习的目标检测研究进展

前言 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个人,具体的位置就是上图右侧图像两个边框(bounding-box)所在的位置.其实刚刚的这个过程就是目标检测,目标检测就是"给定一张图像或者视频帧,找出其中所有目标的位置,并给出每个目标的具体类别". 目标检测对于人来说是再简单不过的任务,但是对于计算机来说,它看到的是一些值为0~255的数组,因而很难直接得到图像中有人或者猫这种高层语义概念,也不清楚目标出现在

CS231n第八课:目标检测定位学习记录

结合视频第八集和笔记:http://chuansong.me/n/353443351445 本节课程从分类(Classification),定位(Localization)和检测(Detection)三个方面入手. 从上图可以直观的看到: 1.对于分类而言,就是对于给定的图片把其划分到给定的几种类别中某一种.很显然,图像中只能存在一种给定类别中的对象. 2.而定位就是找到对应的对象的位置区域,把它框选出来(即Bounding Box),这个选框除了位置信息(x,y)外还要包含其大小信息(w,h)

目标检测SSD模型pytorch版的权重参数

最近,我在学习目标检测算法中的SSD(Single Shot MultiBox Detector),GitHub上已经有人对SSD算法完成了pytorch版本的代码实现(https://github.com/amdegroot/ssd.pytorch),但是其中训练好的参数(ssd300_mAP_77.43_v2.pth)并不容易下载,因此我把它分享出来:链接:https://pan.baidu.com/s/1inytkGtOtppgrf22AEwrOQ,提取码:u721. 原文地址:https

深度学习 目标检测算法 SSD 论文简介

深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 二.代码训练测试: https://github.com/weiliu89/caffe/tree/ssd  一.论文算法大致流程: 1.类似"anchor"机制: 如上所示:在 featur

基于深度学习的目标检测

普通的深度学习监督算法主要是用来做分类,如图1(1)所示,分类的目标是要识别出图中所示是一只猫.而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)竞赛以及实际的应用中,还包括目标定位和目标检测等任务.其中目标定位是不仅仅要识别出来是什么物体(即分类),而且还要预测物体的位置,位置一般用边框(bounding box)标记,如图1(2)所示.而目标检测实质是多目标的定位,即要在图片中定位多个目标物体,包括分类和定位.比如对图1(3

吴恩达【深度学习工程师】 04.卷积神经网络 第三周目标检测 (1)基本的对象检测算法

该笔记介绍的是<卷积神经网络>系列第三周:目标检测(1)基本的对象检测算法 主要内容有: 1.目标定位 2.特征点检测 3.目标检测  目标定位 使用算法判断图片中是不是目标物体,如果是还要再图片中标出其位置并使用边框标记出来                          我们研究过的问题中,图片分类的思想可以帮助学习分类定位,而分类定位的思想又可以帮助学习对象检测 a.分类定位问题,通常有一个较大的对象位于图片中间位置. b.对象检测问题,图片可以含有多个对象,或一张图片中会有多个不同分