第一模块:深度学习轻量级模型nanodet
第一部分:nanodet环境部署与数据集的准备
超快轻量级对象检测模型。能在移动设备上进行实时显示。
⚡超轻量级:标准型号文件只有 1.8 MB。
⚡超级快: 在ARM CPU运行速度可以达到97fps (10.23ms) 。
😎训练友好:GPU内存成本比其他型号低得多。
😎易于部署:根据 ncnn 推理框架提供C++实施和Android 演示。
nanodet简介
NanoDet是一种Fcos风格的一级无锚目标检测模型,使用ATSS进行目标采样,使用广义焦损失进行分类和盒回归。
详情请参阅这些论文:
Fcos: Fully convolutional one-stage object detection
ATSS:Bridging the Gap Between Anchor-based and Anchor-free Detection via Adaptive Training Sample Selection
Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection
1.1 配置信息
在本文中使用的服务器为联想服务器,单张显卡N卡2080Ti,cuda11.0,python3.8.0,pytorch1.7.1,cudatoolkit11.0,mkl-2020.2-256,torchvision-0.8.2-py38_cu110等等,这其中列举了一些在国内下载较慢的一些配置,这些资源我会专门进行搜集,然后建立一个服务站,以便大家更加快速方便的下载使用。当然我这边的配置包(linux下ubuntu18.04)会以百度云盘链接的形式给大家进行分享。
1.2 环境配置
1.2.1 首先配置cuda11.0
wget http://developer.download.nvidia.com/compute/cuda/11.0.2/local_installers/cuda_11.0.2_450.51.05_linux.run
apt-get update
apt-get install sudo
sudo sh cuda_11.0.2_450.51.05_linux.run
sudo apt-get install gedit
sudo gedit ~/.bashrc
在打开的文件最后一行加入路径:
export PATH="/usr/local/cuda-11.0/bin:$PATH"export LD_LIBRARY_PATH="/usr/local/cuda-11.0/lib64:$LD_LIBRARY_PATH"
然后save,退出
在命令行输入
source ~/.bashrc
查询cuda版本进行检验
nvcc -V
以下是检验的结果图
1.2.2 创建nanodet工作环境
conda create -n nanodet python=3.8 -y
source activate
conda activate nanodet
1.2.3 安装pytorch与所需依赖
conda install pytorch torchvision cudatoolkit=11.0 -c pytorch
pip install Cython termcolor numpy tensorboard pycocotools matplotlib pyaml opencv-python tqdm
当然这里会下载非常慢,我这边提供百度云盘链接
cuda_11.0.2_450.51.05_linux 提取码:6xpu
pytorch-1.7.1-py3.8_cuda11.0.221_cudnn8.0.5_0.tar 提取码:4x63
cudatoolkit-11.0.221-h6bb024c_0.tar 提取码:h369
mkl-2020.2-256.tar 提取码:9y8g
torchvision-0.8.2-py38_cu110.tar 提取码:3rke
1.3下载nanodet工作文件
git clone https://github.com/RangiLyu/nanodet.git
cd nanodet
python setup.py develop
1.4 准备数据集
我在收集数据这方面一直是一个取巧者,但是一般来说都比较适用。但是无论是做深度学习的调研还是商业化功能,一个必不可少的部分就是数据。开源的框架和神经网络固然重要,开放的数据集也同样不能忽视。
我们一般做深度学习都是比较单一化,都是单个数据。这次就以“T”标为例来制作数据集。
1.4.1 收集数据
用无人机去拍摄几段不同角度的“T”子标的视频,然后对视频进行截取,取出其中有用的片段,去除没有拍到目标的片段。这样第一步的数据流就准备完毕了。
但是咱们制作的是一个基于图片识别的软件,那么需要的就是大量的图片数据,接下来的步骤就是讲视频流转换为图片数据集。
以下就是分割视频为图片的Python小程序
import cv2
def video2frame(videos_path,frames_save_path,time_interval):
'''
:param videos_path: 视频的存放路径
:param frames_save_path: 视频切分成帧之后图片的保存路径
:param time_interval: 保存间隔
:return:
'''
vidcap = cv2.VideoCapture(videos_path)
success, image = vidcap.read()
count = 0
while success:
success, image = vidcap.read()
count += 1
fenge=count/400
if count % (time_interval) == 0:
cv2.imencode('.jpg', image)[1].tofile(frames_save_path + "/%d.jpg" % count)
# if count == 20:
# break
print(count)
if __name__ == '__main__':
videos_path ='C:/Users/rexmatken/Desktop/xx/xx.mp4'#修改视频路径
frames_save_path = 'C:/Users/rexmatken/Desktop/xx'#修改图片保存路径
time_interval =