@wanghuijiao
2021-07-13T18:53:43.000000Z
字数 15880
阅读 918
技术文档
object_detection ------
|-- Yolov4
|-- Yolov5
|-- NHY_Yolo_dataset
insightface ------
/insightface
是指insightface文件夹,以下所有涉及路径指引之处在实际部署时请自行替换。若发现摄像头成像质量不佳,建议使用AMCap软件进行调试。
(1)在PC电脑上使用AMCap软件对摄像头调试曝光和焦点等属性,Options -> Video Devices–> Properties–>照相机控制。一般设置属性为自动。设置如下图1.2所示。
图1.2 照相机控制设置
(2)在PC电脑上使用AMCap软件对摄像头调试帧率和分辨率等属性,Options -> Video Devices–> Capture Format–>数据流格式。帧率不低于20fps、分辨率不低于416*416。数据流格式设置界面如下图1.3所示。
图1.3 数据流格式设置界面
目前,该摄像头无法通过接入手机的方式采集数据,此外,由于在开展数据采集工作时,球形机器人本体尚未制作完毕,因此,我们选择基于笔记本电脑的采集方式,尽可能以模仿机器人的角度和运动去拍摄视频。
操作步骤:
2) 把视频采集的脚本代码/NHY_Yolo_dataset/labelwork/save_video.py
复制到笔记本电脑,在某个虚拟环境env中安装opencv,然后运行脚本代码,即可看到摄像头拍摄的视频。下图1.4是脚本在终端执行的效果。
图1.4 视频采集脚本在终端内运行效果
3) 让一个同事手持笔记本电脑在房间门口录制场景视频,先录制一小段背景视频,然后演员在特定场地中模拟实际场景,其中,需要注意:
/NHY_Yolo_dataset/labelwork
目录下,每次的录制视频以时间形式作为文件名称,例如:2021-07-09_10-13-29.avi。/NHY_Yolo_dataset/labelwork/getframe.py
脚本对视频分帧得到图片,便于人工标注数据制作模型训练集。getframe.py共有4个参数: python getframe.py --path 2021-06-25-10-47.avi --split 5
,会生成5份等量的数据,然后即可将5份数据划分给5个人,分别负责各自的数据标注。划分结果如下图1.5所示: conda create -n labelme_test python=3.6 #指定了版本号
;若已有虚拟环境env,可选择进入某个env中pip install labelme
标注规范
质检
/NHY_Yolo_dataset/labelwork/draw.py
将标注结果画在图片上,用于检验查看标注结果。draw.py共有2个参数: <object-class> <x_center> <y_center> <width> <height>
其中,<x_center> <y_center> <width> <height>
是相对坐标,需要用绝对坐标除以图片长和宽,即x_center = x_center_absolute/image_width, y_center = y_center_absolute/image_height
和width = width_absolute/image_width,height = height_absolute/image_height
。/NHY_Yolo_dataset/labelwork/json2yolo.py
脚本将标签转为txt格式。json2yolo.py共有1个参数,--path是标注json结果所在路径。1)裁剪、对齐 人脸识别模型的训练数据需要先用人脸检测算法如MTCNN、Retinaface先进行裁剪、对齐操作,并统一缩放到112*112尺寸。此处提供脚本可以直接对图片或视频中的人脸进行检测、裁剪并对齐缩放操作,并把处理后的人脸保存下来。脚本见:/insightface/retinaface_arcface/deploy_slim/get_not_aligned_faces.sh
。
命令说明如图1.12所示:
图1.12 裁剪对齐人脸命令
cd /insightface/retinaface_arcface/deploy_slim
python get_not_aligned_faces.py \
--input_video /insightface/dataset/nhy_data/train/2021-06-25_15-11-56.avi \
--img_save_dir /insightface/dataset/nhy_data/train_images_no_align_ex11/ \
--det 2 \
--align 1 \
--interval 6 \
--margin 44
# --det 值为2时,用Retinaface模型检测人脸,为0时,用MTCNN检测
# --align 值为1,表示做对齐操作;为0,不对齐
# --interval 表示每$interval帧取一帧做人脸检测
# --margin 表示检测到人脸框后,在统一尺寸到112*112前,对人脸框上下左右外扩几个像素,为44时,表示向上下左右各扩22(44/2)像素。
执行上步裁剪对齐操作后,会得到一堆混杂在一起的人脸图片(112*112)。
2)手动给标签 对上一步得到的人脸图片进行手动按人脸身份(ID,identity)分类,ID序号从0到N,以ID命名子文件夹,分类的过程就是标注(子文件夹名即给定的ID标签)的过程。在分类过程中,对符合要求的人脸图片进行筛选。
示例:
准备对齐后的人脸数据集, 并手动分类到按身份序号从 0-N 命名的子文件夹。文件组织结构示例,如图1.15所示:
图 1.15 人脸数据集文件组织结构示例
1 ------
|-- Jack_1.jpg
|-- Jack_2.jpg
|-- Jack_3.jpg
2 ------
|-- Rose_1.jpg
|-- Rose_2.jpg
3)质检 浏览各子文件夹人脸图片,需要检查以下情况:
4)建立图片库Gallery 由于人脸识别需要建立Gallery来作为人脸身份信息,以用于将测试图片与之对比计算相似度,进行匹配识别测试图片身份。
/insightface/retinaface_arcface/deploy_slim/rename.py
。同时,建立Gallery原则为: /insightface/retinaface_arcface/deploy_slim/0628_gallery
faces_emore/
train.idx
train.rec
property
lfw.bin
cfp_fp.bin
agedb_30.bin
其中,前三个是训练集,后三个.bin
是验证集。因此需要将上节第 2)步标注得到的数据集图片转成训练时需要的格式。
制作数据集脚本位置为/insightface/recognition/datasets/self_dataset_script/make_self_dataset.sh
,过程如下:
1) 人脸数据集对齐:
2) 生成lst文件:
lst 文件格式:包括序号、图片路径、标签等三列信息。如下图1.17所示:
图 1.17 lst 文件格式示例
1027 /insightface/dataset/nhy_data/splited_train_images_no_align_ex22/1/2021-06-25_15-11-56_1296_1.jpg 1
2296 /insightface/dataset/nhy_data/splited_train_images_no_align_ex22/2/2021-06-25_15-11-56_7050_0.jpg 2
5 /insightface/dataset/nhy_data/splited_train_images_no_align_ex22/0/2021-06-25_10-40-32_108_0.jpg 0
生成lst命令,如图1.18所示:
图1.18 生成lst命令
cd /insightface/recognition/datasets/self_dataset_script
python -u face2rec2_m.py \
--list True \
--prefix /insightface/recognition/datasets/0629_ex0/ \
--root /insightface/dataset/nhy_data/splited_train_images_no_align_ex0/ \
--train-ratio 0.8 \
--test-ratio 0.2 \
--recursive True
# 参数说明
# --list:是否生成lst文件
# --prefix:lst文件保存位置
# --root:对齐后人脸数据存放位置
# --train-ratio/--test-ratio:训练集和测试集的比例
3)制作property,生成rec文件
# prefix路径下,制作 property 文件,格式: 类别,人脸长,人脸宽,如 “8,112,112”
cd /insightface/recognition/datasets/self_dataset_script
python -u face2rec2_m.py \
--prefix /insightface/recognition/datasets/0629_ex0/ \
--root /insightface/dataset/nhy_data/splited_train_images_no_align_ex0/ \
--train-ratio 0.8 \
--test-ratio 0.2 \
--recursive True
4)生成bin文件
制作pairs.txt
bin文件用于验证和测试,其内容是两两图片的结合,然后给出这两张图片的真实标签,1代表是同一个人,0代表不是同一个人,以此达到验证和测试的目的。首先我们需要把所有的人脸数据两两结合起来,如下所示,每一行是一个测试样本,其中前两个是两张图片的地址,最后一个数字代表这两张图片是不是同一个人,运行write_pairs.py,程序中修改人脸数据目录和生成的文件要保存的目录,制作pairs.txt。pair.txt格式如图1.20所示:
图1.20 pair.txt格式
/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1578_0.jpg,/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1878_1.jpg,1
/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1578_0.jpg,/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1314_0.jpg,1
/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1878_1.jpg,/insightface/dataset/nhy_data/test_images_no_align_ex0/2/2021-06-25_15-11-56_1314_0.jpg,1
制作pairs.txt和bin文件命令,如图1.21所示:
图1.21 制作pairs.txt和bin文件命令
# 修改write_pairs.py Line 33行路径, 制作pairs.txt
python write_pairs.py
# 制作 bin 文件
cd /insightface/recognition/common
./build_eval_pack.sh
/NHY_Yolo_dataset
2021-06-24_14-50-56.avi
和2021-06-25_15-11-56.avi
抽帧产生的图片,在这些图片上使用labelme标注训练集。存放路径和组织结构
/insightface/recognition/datasets
下以日期进行版本管理,0628和0629_ex0是南湖院数据, 文件夹内包含了训练和验证需要的所有文件。对应训练集格式说明小节所展示的数据集格式,以0628为例,说明文件组织结构,如图1.22所示。
property # 辅助文件,记录ID个数和训练集图片尺寸
self_eval_1wp.bin #自制测试集
test_images_no_align_ex0_pairs.txt # 制作bin测试集时辅助文件,记录1:1成对图片,以及标签
test_images_no_align_ex0_pairs.bin # 自制测试集
test.idx # 辅助文件,记录验证时乱序后图片读取顺序
test.lst # 辅助文件,记录验证集图片序号、地址、标签
test.rec # 训练时验证所用验证集文件,占训练数据0.2
train.idx # 辅助文件,记录训练时乱序后图片读取顺序
train.lst # 辅助文件,记录训练集图片序号、地址、标签
train.rec # 训练时直接用到的文件,占训练数据0.8
CMake >= 3.18,CUDA >= 10.2,OpenCV >= 2.4,cuDNN >= 8.0.2,GPU with CC >= 3.0
git clone https://github.com/AlexeyAB/darknet
cd darknet
mkdir build_release
cd build_release
cmake ..
cmake --build . --target install --parallel 8
/usr/local/cuda
目录下/usr/local/cudnn
目录下train.txt
和test.txt
,这两个文件中每一行是待训练图片的路径,train.txt
中的数据用于训练,test.txt
中的数据用于测试。/object_detection/Yolov4/darknet/data
目录下新建name.data
文件,文件格式如下图1.24所示:
classes = 2
train = data/train.txt
valid = data/test.txt
names = data/obj.names
backup = backup/
datknet/data
目录下新建name.names
文件,文件格式如下图1.25所示:
face
hostage
terrorist
window
/object_detection/Yolov4/darknet/cfg
目录下,以yolov4-tiny.cfg
为例, /object_detection/Yolov4/darknet detector train [data] [cfg] [pretrain model] -map -gpus 0
pip install -r requirements.txt
your_name.taml
文件,文件格式如下图1.26所示:
train: data/nhydata0624-0625/train.txt # 118287 images
val: data/nhydata0624-0625/test.txt # 5000 images
# number of classes
nc: 5
# class names
names: ['face','hostage','terrorist','window','gun']
python train.py \
--data data/nhydata416.yaml \
--cfg models/nhydata416_yolov5s.yaml \
--img 416 \
--weight yolov5s.pt \
--batch-size 32 \
--epoch 400
# --data数据集.yaml文件的路径;
# --cfg是网络参数设置文件的路径;
# --img输入图像的分辨率;
# --weight是预训练模型所在路径;
# --batch-size是一次训练所用图片数量;
# --epoch是训练轮次。
目前训练均在服务器端进行,得到的权重文件格式为.pt格式,而在球形机器人端部署前需要将.pt格式转为wts格式,方便下一步进行模型部署时使用。模型转换脚本为/object_detection/Yolov5/gen_wts.py
。
算法参考自deepinsight/insightface人脸识别算法部分, 选择用Mobilefacenet作为人脸识别网络。
本算法基于insightface MXNet版,故需要安装MXNet。环境配置命令如图1.28所示。
图1.28 环境配置命令
pip install mxnet-cu100 # mxnet-cu102
/insightface/recognition/ArcFace
, 模型Backbone、数据集、训练参数等等信息均在该路径下的配置文件config.py
内说明,模型结构、数据集、损失函数分别由‘network’、‘dataset’、‘loss’等字典控制,在‘default’字典中配置训练时选用的模型、数据集和损失函数以及学习率等超参数。
cd /insightface/recognition/ArcFace
CUDA_VISIBLE_DEVICES='4,5,6,7' python -u train.py \
--dataset selfie \
--network y1 \
--loss arcface \
--ckpt 2 \
--verbose 50 \
--lr 0.001 \
--lr-steps 50,100,200 \
--wd 0.0001 \
--num_epoch 100 \
--models-root ./models/y1_noPre_0629_ex0_noAlign_ex0
# --dataset 对应配置文件内dataset字典所列信息,可选‘emore’、‘retina’、‘selfie’,‘selfie’是自定义数据集
# --network Arcface提供了不同的Backbone结构可供选择,'y1'是mobilefacenet,其他可选:resnet100 -'r100'、'r100fc' 、resnet50-'r50'、 'd169'、 'd201'、 'y2'、 'm1'、 'm05'、 'mnas'、 'mnas05'、 'mnas025'、 'vargfacenet'等
# --loss 损失函数,可选'arcface'、'nsoftmax'、'cosface'、'triplet'、'atriplet'
# --ckpt 权重文件保存,模式'2'表示每次验证后都保存模型,模式'1'只保存验证精度最高的模型,'0'永不保存
# --verbose 每50batch在验证集上验证一次模型性能
# --lr 学习率
# --lr-steps 学习率衰减batch数
# --wd 权重衰减
# --num_epoch 共训练多少epoch停止训练
# --models-root 模型保存路径
/insightface/retinaface_arcface/models/MobileFaceNet_ArcFace
/insightface/recognition/ArcFace/models/y1_noPre_0629_ex0_noAlign_ex0
, epoch 0005与Yolov5模型转换相似,需要将人脸识别arcface-mobilefacenet模型权重文件从.params格式转为wts格式,方便下一步进行模型部署时使用。模型转换脚本为/insightface/retinaface_arcface/deploy_slim/gen_wts.py
。
/object_detection/Yolov4/darknet
目录下会有图片保存(蓝色的线代表loss,红色的线代表map),如图1.30所示: *. _best.weights
,可以用这个权重文件来进行测试。测试命令可以如下图1.31所示:
python darknet_save_video.py \
--input test1.mp4 \
--out_filename test1.avi \
--weights /object_detection/Yolov4/darknet/backup/yolov4-tiny-nhy-416x416_best.weights \
--ext_output \
--dont_show \
--config_file /object_detection/Yolov4/darknet/cfg/yolov4-tiny-nhy-416x416.cfg \
--data_file /object_detection/Yolov4/darknet/data/nhydata.data`
# --input 表示输入视频或者图片所在路径;
# --out_filename 表示输出文件名;
# --weights表示权重文件;
# --config_file表示模型设置文件;
# --data表示数据文件。
/object_detection/Yolov5/runs/train
目录下会有图片保存,例如图1.32所示(图中可以查看loss和map值): /object_detection/Yolov5/runs/train
目录下会保存best.pt
,可以用这个权重文件来进行测试。测试命令可以如下图1.34:
python detect.py \
--source /object_detection/Yolov5/darknet/test.mp4 \
--save-txt \
--weights ./runs/train/nhy0624-0625/weights/best.pt \
--name nhy0624-0625 \
--conf 0.25 \
--img-size 416
# --source表示输入视频或者图片所在路径;
# --save-txt 表示保存检测结果到txt文件;
# --weights表示权重文件;
# --name表示测试结果保存路径;
# --conf 0.25表示检测结果阈值;
# --img-size表示输入图片大小。
会在终端输出如图1.35所示的信息提示,Train-acc是指在与训练级同分布的验证集上精度,Train-lossvalue是损失值,随训练的进行,Train-acc会逐步上升,Train-lossvalue会逐步下降,在两者开始变得上下震荡,不再单调下降(或上升)时停止模型训练。目前提供的在南湖院采集的数据上预训练模型在验证集上精度可达99.8%。
图1.35 人脸识别模型训练输出信息
生成demo脚本:/insightface/retinaface_arcface/deploy_slim/face_recognition.sh
cd /insightface/retinaface_arcface/deploy_slim
python face_recognition.py \
--model /insightface/recognition/ArcFace/models/y1_noPre_0629_ex0_noAlign_ex0/y1-arcface-selfie/model,0005 \
--det 2 \
--sim_threshold 0.7 \
--input_video /insightface/dataset/nhy_data/train/2021-06-25_15-11-56_30s-1min.avi \
--output_video_name ./results/0629_5_nopre_2021-06-25_15-11-56_30s-1min_0.7.mp4 \
--photo_gallery ./0628_gallery \
--align 0 \
--margin 0
# --model 要加载的权重文件
# --det 2 用Retinaface检测
# --sim_threshold 人脸识别相似度阈值
# --input_video 要测试的视频
# --output_video_name 识别结果的视频命名
# --photo_gallery 人脸注册库
# --align 人脸检测是否进行对齐操作,为0不做对齐,为1执行对齐
# --margin 人脸检测后是否在缩放前对框进行外扩,为44时,上下左右各外扩22(44/2)个像素
计算测试集精度脚本在:/insightface/recognition/ArcFace/verification.sh
,命令如图1.37所示:
cd /insightface/recognition/ArcFace
python -u verification.py \
--gpu 0 \
--data-dir /insightface/recognition/datasets/0628 \
--model '/insightface/recognition/ArcFace/models/y1_noPre_0629_ex0_noAlign_ex0/y1-arcface-selfie/model,0005' \
--target self_eval_1wp,lfw \
--batch-size 64
# --gpu 使用0号gpu
# --data-dir 测试集bin文件所在路径
# --model 权重文件
# --target 测试集名称
# --batch-size 批数量
生成的demo见:/insightface/retinaface_arcface/deploy_slim/results/0629_5_nopre_2021-06-25_15-11-56_30s-1min_0.7.mp4