@wanghuijiao
2021-07-13T10:53:43.000000Z
字数 15880
阅读 1647
技术文档
object_detection ------|-- Yolov4|-- Yolov5|-- NHY_Yolo_datasetinsightface ------
/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_slimpython 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.jpg2 ------|-- 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.idxtrain.recpropertylfw.bincfp_fp.binagedb_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 12296 /insightface/dataset/nhy_data/splited_train_images_no_align_ex22/2/2021-06-25_15-11-56_7050_0.jpg 25 /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_scriptpython -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_scriptpython -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.txtpython write_pairs.py# 制作 bin 文件cd /insightface/recognition/common./build_eval_pack.sh
/NHY_Yolo_dataset2021-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.2train.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/darknetcd darknetmkdir build_releasecd build_releasecmake ..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 = 2train = data/train.txtvalid = data/test.txtnames = data/obj.namesbackup = backup/
datknet/data目录下新建name.names文件,文件格式如下图1.25所示:
facehostageterroristwindow
/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.txtyour_name.taml文件,文件格式如下图1.26所示:
train: data/nhydata0624-0625/train.txt # 118287 imagesval: data/nhydata0624-0625/test.txt # 5000 images# number of classesnc: 5# class namesnames: ['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/ArcFaceCUDA_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_slimpython 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/ArcFacepython -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