Overview
a glance on conda, pytorch, yolo
Installation
linux version
(base) chenfh5@herbie:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
conda1,2
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh --no-check-certificate
bash Anaconda3-2021.11-Linux-x86_64.sh
(base) chenfh5@herbie:~$ conda -V
conda 4.10.3
(base) chenfh5@herbie:~$ anaconda -V
anaconda Command line client (version 1.9.0)
pytorch3,4,5
conda create -n my_deeplearning python=3.9 numpy matplotlib pandas jupyter notebook
conda activate my_deeplearning
conda info -e
conda deactivate
conda remove -n my_deeplearning --all
(my_deeplearning) chenfh5@herbie:~$ nvidia-smi
Mon Nov 22 17:32:24 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.32.00 Driver Version: 455.32.00 CUDA Version: 11.1 |
+-------------------------------+----------------------+----------------------+
conda install pytorch torchvision torchaudio cudatoolkit=11.3
# verification
import torch as t
x = t.rand(5,3)
y = t.rand(5,3)
print('x={}'.format(x))
print('y={}'.format(y))
if t.cuda.is_available():
x = x.cuda()
y = y.cuda()
print('cuda x+y={}'.format(x+y))
print('torch version={}'.format(t.__version__)) # 1.10.0
print('cuda is_available={}'.format(t.cuda.is_available())) # True
jupyter6,7
jupyter notebook --generate-config
(my_deeplearning) chenfh5@herbie:~/deployment/my_deeplearning/src$ ipython
Python 3.9.7 | packaged by conda-forge | (default, Sep 29 2021, 19:20:46)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.29.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:
Out[2]: '***'
vim ~/.jupyter/jupyter_notebook_config.py
# append to jupyter_notebook_config.py
c.NotebookApp.ip = '*'
c.NotebookApp.port = 9091
c.NotebookApp.open_browser = False
c.NotebookApp.password = '???'
c.NotebookApp.notebook_dir = '/home/chenfh5/deployment/my_deeplearning/jupyter_data'
# start the jupyter server
conda activate my_deeplearning
jupyter notebook # adhoc
nohup jupyter notebook --allow-root > error.log & echo $!> jupyter_pid.txt # background
(my_deeplearning) chenfh5@herbie:~/deployment/my_deeplearning/jupyter_data$ vim ~/.jupyter/jupyter_notebook_config.py
(my_deeplearning) chenfh5@herbie:~/deployment/my_deeplearning/jupyter_data$ jupyter notebook
[W 09:40:59.582 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 09:40:59.586 NotebookApp] Serving notebooks from local directory: /home/chenfh5/deployment/my_deeplearning/jupyter_data
[I 09:40:59.586 NotebookApp] Jupyter Notebook 6.4.6 is running at:
[I 09:40:59.586 NotebookApp] http://herbie:9091/
[I 09:40:59.586 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
jupyter pytorch verification snapshot
Illustration
imagenet-simple
netstat -tulnp | grep 9093
conda create --name imagenet_simple python=3.7
conda activate imagenet_simple
/home/chenfh5/anaconda3/envs/imagenet_simple/bin/python3.7 -m pip install Flask torch torchvision
git clone --depth=1 https://github.com/avinassh/pytorch-flask-api.git
FLASK_ENV=development FLASK_APP=app flask run --host=0.0.0.0 --port=9093
curl -X POST -F file=@lena.png http://localhost:9093/predict
{
"class_id": "n02869837",
"class_name": "bonnet"
}
imagenet-web
conda create --name imagenet_web python=3.9
conda activate imagenet_web
git clone --depth=1 https://github.com/avinassh/pytorch-flask-api-heroku.git
pip3 install Flask torch torchvision numpy Pillow gunicorn
FLASK_ENV=development FLASK_APP=app flask run --host=0.0.0.0 --port=9094
http://herbie:9094/
imagenet-batch
conda create --name imagenet_batch python=3.9
conda activate imagenet_batch
git clone --depth=1 https://github.com/ShannonAI/service-streamer.git
pip3 install torchvision pillow flask service_streamer
FLASK_ENV=development FLASK_APP=app FLASK_DEBUG=0 flask run --host=0.0.0.0 --port=9095
curl -F "file=@cat.jpg" http://127.0.0.1:9095/predict
{
"class_id": "n02123159",
"class_name": "tiger_cat"
}
curl -F "file=@cat.jpg" http://127.0.0.1:9095/stream_predict
{
"class_id": "n02123159",
"class_name": "tiger_cat"
}
wrk -c 64 -d 20s --timeout=20s -s file.lua http://127.0.0.1:9095/predict
Running 20s test @ http://127.0.0.1:9095/predict
2 threads and 64 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.93s 414.93ms 3.31s 88.07%
Req/Sec 23.96 15.19 80.00 67.60%
637 requests in 20.03s, 127.52KB read
Requests/sec: 31.81
Transfer/sec: 6.37KB
wrk -c 64 -d 20s --timeout=20s -s file.lua http://127.0.0.1:9095/stream_predict
Running 20s test @ http://127.0.0.1:9095/stream_predict
2 threads and 64 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 754.17ms 372.05ms 2.21s 69.94%
Req/Sec 82.83 93.43 310.00 79.70%
1731 requests in 20.03s, 346.54KB read
Requests/sec: 86.42
Transfer/sec: 17.30KB
YOLO
yolov5 custom training8,9,10,11
!git clone https://github.com/ultralytics/yolov5
!python train.py --img 640 --cfg yolov5s.yaml --hyp hyp.scratch.yaml --batch 32 --epochs 4 --data road_sign_data.yaml --weights yolov5s.pt --workers 24 --name my_yolov5_road_det --device 0,1,2,3
!python detect.py --source ../Road_Sign_Dataset/images/test/ --weights runs/train/my_yolov5_road_det/weights/best.pt --conf 0.25 --name my_yolov5_road_det --device 0
class Model(nn.Module) in yolo.py:
1. load `yolov5s.yaml`
2. parse yaml to model
3. build stride, anchor
4. init weight, bias
Overriding model.yaml nc=80 with nc=4
from n params module arguments
0 -1 1 3520 models.common.Conv [3, 32, 6, 2, 2]
1 -1 1 18560 models.common.Conv [32, 64, 3, 2]
2 -1 1 18816 models.common.C3 [64, 64, 1]
3 -1 1 73984 models.common.Conv [64, 128, 3, 2]
4 -1 2 115712 models.common.C3 [128, 128, 2]
5 -1 1 295424 models.common.Conv [128, 256, 3, 2]
6 -1 3 625152 models.common.C3 [256, 256, 3]
7 -1 1 1180672 models.common.Conv [256, 512, 3, 2]
8 -1 1 1182720 models.common.C3 [512, 512, 1]
9 -1 1 656896 models.common.SPPF [512, 512, 5]
10 -1 1 131584 models.common.Conv [512, 256, 1, 1]
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
12 [-1, 6] 1 0 models.common.Concat [1]
13 -1 1 361984 models.common.C3 [512, 256, 1, False]
14 -1 1 33024 models.common.Conv [256, 128, 1, 1]
15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
16 [-1, 4] 1 0 models.common.Concat [1]
17 -1 1 90880 models.common.C3 [256, 128, 1, False]
18 -1 1 147712 models.common.Conv [128, 128, 3, 2]
19 [-1, 14] 1 0 models.common.Concat [1]
20 -1 1 296448 models.common.C3 [256, 256, 1, False]
21 -1 1 590336 models.common.Conv [256, 256, 3, 2]
22 [-1, 10] 1 0 models.common.Concat [1]
23 -1 1 1182720 models.common.C3 [512, 512, 1, False]
24 [17, 20, 23] 1 24273 models.yolo.Detect [4, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
Model Summary: 270 layers, 7030417 parameters, 7030417 gradients, 15.9 GFLOPs
model12,13,14
class YoloNetV3(nn.Module) in model.py:
pass
class YOLOv5(nn.Module) in yolo.py:
pass
class Exp(BaseExp): in yolox_base.py:
pass
network
- yolov1: 7 * 7 = 49个预测
- 7 = grid
- 每一个预测是一个(2*(4+1)+20)=30维向量
- 30 = 2个unsupervised bounding box * (4个边框坐标(xywh)+ 1边框置信度) + 20类对象coco20
credit ref15
- yolov2: 13 * 13 * 5 = 845个预测
- 13 = 416*416图片/32倍下采样; 5 = kmean先验框anchor
- 每一个预测是一个(4+1+20)=25维向量
- 25 = 4个anchor边框坐标(xywh) + 1边框置信度 + 20类对象coco20
credit ref16
- yolov3: 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647个预测
- 每一个预测是一个(4+1+80)=85维向量
- 85 = 4个anchor边框坐标(xywh) + 1边框置信度 + 80类对象coco80
credit ref17
conv
因为一张图片可能有很多特征(e.g., color, texture, edge),所以可能需要学习/利用多个卷积核来提取多种图像特征
图中是4*4*4的conv, 不同颜色代表不同特征/通道/卷积权重
每一个特征=原图所有通道在(该位置的值*卷积权重)之和
credit ref18
resNet24 vs. yolo13
# resnet
model = models.resnet18(pretrained=True).eval()
result = model.forward(image)
-> class ResNet(nn.Module):
-> ResNet.fc():
-> fc = nn.Linear.forward()
-> F.linear(input, self.weight, self.bias)
-> `y = xA^T + b` (so return without box)
# yolo
model = yolo.YOLOv5(80, img_sizes=672, score_thresh=0.3)
model.eval()
checkpoint = torch.load('yolov5s.pth')
model.load_state_dict(checkpoint)
results, losses = model.forward(images)
-> class YOLOv5(nn.Module):
-> yolov5.forward()
-> features = yolov5.backbone()
-> results = yolov5.head(features)
-> class Head(nn.Module):
-> head.forward()
-> results = head.inference(features)
-> head.predictor()
-> class Predictor(nn.Module):
-> mlp
-> results.append(dict(boxes=box, labels=label, scores=score))
Custom traning model25
- download my_face_plate.zip(yolo format) frin google drive
- git clone draw-YOLO-box to validate the annotation information
- git clone yolov5
- add ./yolov5/data/my_face_plate.yaml
- run train.py with proper parameters26
time python train.py --img 1120 --batch 64 --epochs 900 --data my_face_plate.yaml --weights yolov5s.pt --cache --project _mytrain/my_face_plate higher --epochs probably increase accuracy before overfit, one epoch = one full dataset used by forward and backward in the network higher --batch probably increase accuracy before overfit, how many images fetch in one training processing(update weights) higher --img can avoid small objects missing, a warning will raise when missing is high
- run model.forward() to verify
- inference server setup
Reference
- 两行代码下载安装Anaconda
- conda配置清华源
- Mac下安装PyTorch
- 在Linux系统中安装深度学习框架Pytorch
- How to use multiple GPUs in pytorch?
- 搭建Jupyter Notebook远程云服务器
- 在linux服务器配置jupyter notebook, 并且配置不同的kernel和环境
- How to Train YOLO v5 on a Custom Dataset
- How to Train a YOLO v5 Object Detector on a Custom dataset
- Yolox之自有数据集训练
- my-yolov5-road.ipynb in colab
- yolov3 network
- yolov5 network
- yolox network
- YOLOv1 深入理解
- YOLOv2 深入理解
- YOLOv3 深入理解
- 卷积核进行降维和升维
- 目标检测Anchor是什么?
- 非极大值抑制(NMS)讲解
- backbone, head, neck等深度学习中的术语解释
- 数据增强, backbone, head, neck, 损失函数
- backbone, head, neck summary
- Inference_PyTorch
- yolov5 Train-Custom-Data
-
[深度学习 三个概念:Epoch, Batch, Iteration](https://www.jianshu.com/p/22c50ded4cf7)
PREVIOUSGZ one week