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 <num_class>

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM