遛狗是每天要打卡的事情,狗狗生性活泼爱动,一天不遛就浑身难受,遛狗最重要的就是要拴绳了,牵紧文明绳是养犬人的必修课。外出遛狗时,主人手上的牵引绳更多是狗狗生命健康的一道重要屏障。每天的社区生活中,相信大家都会或多或少的在路上遇上一些遛狗的人不讲文明不讲武德,出门就是习惯性的不牵绳子遛狗,对于自己不熟悉的狗狗来说我们自然是害怕的,频频报道的狗咬人的事件也是层出不穷,,“狗狗性格温顺不会咬人的”这一类所谓的说辞不是放纵不牵绳子的理由。
前文我们已经进行了相应了开发实践感兴趣的话可以自行移步阅读:
《牵绳遛狗你我他文明家园每一天,助力共建文明社区,基于DETR(DEtection TRansformer)开发构建公共场景下未牵绳遛狗检测识别系统》
《牵绳遛狗你我他文明家园每一天,助力共建文明社区,基于YOLOv3开发构建公共场景下未牵绳遛狗检测识别系统》
《牵绳遛狗你我他文明家园每一天,助力共建文明社区,基于YOLOv4开发构建公共场景下未牵绳遛狗检测识别系统》
《牵绳遛狗你我他文明家园每一天,助力共建文明社区,基于YOLOv5开发构建公共场景下未牵绳遛狗检测识别系统》
对于此类的现象是否能够从技术的角度来进行思考甚至是干预呢?我想理论上来说也是可行的,本文的主要目的就是站在不牵绳遛狗这个大背景下探索基于技术手段来分析对此类行为干预的可行性,这里主要是基于YOLOv6开发构建对应的目标检测模型,我们的设计初衷就是考虑未来这样的技术手段能够结合路边、河道、社区、门口等等的可用的视频摄像头,对于画面中出现的遛狗目标对象进行实时的智能计算分析,如果发现问题就可以通过语音播报提醒,如果还是不加改正就可以将当前的时段视频发送到相关的部门来跟进处理,当然了,这些比较偏向业务应用层面不是我们开发者所能决定的,这里主要是结合我们的所见所想来开发构建实践性质的项目。
首先看下实例效果:
接下来简单看下实例数据集:
这里我们没有能拿到监控摄像头采集的真实数据,所以这里都是从网络源采集获取的数据,然后经由人工筛选和标注处理构建的。
本文选择的是YOLOv6这一算法模型,Yolov6是美团开发的轻量级检测算法,截至目前为止该算法已经迭代到了4.0版本,每一个版本都包含了当时最优秀的检测技巧和最最先进的技术,YOLOv6的Backbone不再使用Cspdarknet,而是转为比Rep更高效的EfficientRep;它的Neck也是基于Rep和PAN搭建了Rep-PAN;而Head则和YOLOX一样,进行了解耦,并且加入了更为高效的结构。YOLOv6也是沿用anchor-free的方式,抛弃了以前基于anchor的方法。除了模型的结构之外,它的数据增强和YOLOv5的保持一致;而标签分配上则是和YOLOX一样,采用了simOTA;并且引入了新的边框回归损失:SIOU。
YOLOv5和YOLOX都是采用多分支的残差结构CSPNet,但是这种结构对于硬件来说并不是很友好。所以为了更加适应GPU设备,在backbone上就引入了ReVGG的结构,并且基于硬件又进行了改良,提出了效率更高的EfficientRep。RepVGG为每一个3×3的卷积添加平行了一个1x1的卷积分支和恒等映射的分支。这种结构就构成了构成一个RepVGG Block。和ResNet不同的是,RepVGG是每一层都添加这种结构,而ResNet是每隔两层或者三层才添加。RepVGG介绍称,通过融合而成的3x3卷积结构,对计算密集型的硬件设备很友好。
训练数据配置文件如下所示:
# Please insure that your custom_dataset are put in same parent dir with YOLOv6_DIR
train: ./dataset/images/train # train images
val: ./dataset/images/test # val images
test: ./dataset/images/test # test images (optional)
# whether it is coco dataset, only coco dataset should be set to True.
is_coco: False
# Classes
nc: 2 # number of classes
# class names
names: ['dog', 'rope']
这里选择使用的是最轻量级的n系列的模型,如下:
# YOLOv6s model
model = dict(
type='YOLOv6n',
pretrained='weights/yolov6n.pt',
depth_multiple=0.33,
width_multiple=0.25,
backbone=dict(
type='EfficientRep',
num_repeats=[1, 6, 12, 18, 6],
out_channels=[64, 128, 256, 512, 1024],
fuse_P2=True,
cspsppf=True,
),
neck=dict(
type='RepBiFPANNeck',
num_repeats=[12, 12, 12, 12],
out_channels=[256, 128, 128, 256, 256, 512],
),
head=dict(
type='EffiDeHead',
in_channels=[128, 256, 512],
num_layers=3,
begin_indices=24,
anchors=3,
anchors_init=[[10,13, 19,19, 33,23],
[30,61, 59,59, 59,119],
[116,90, 185,185, 373,326]],
out_indices=[17, 20, 23],
strides=[8, 16, 32],
atss_warmup_epoch=0,
iou_type='siou',
use_dfl=False, # set to True if you want to further train with distillation
reg_max=0, # set to 16 if you want to further train with distillation
distill_weight={
'class': 1.0,
'dfl': 1.0,
},
)
)
solver = dict(
optim='SGD',
lr_scheduler='Cosine',
lr0=0.0032,
lrf=0.12,
momentum=0.843,
weight_decay=0.00036,
warmup_epochs=2.0,
warmup_momentum=0.5,
warmup_bias_lr=0.05
)
data_aug = dict(
hsv_h=0.0138,
hsv_s=0.664,
hsv_v=0.464,
degrees=0.373,
translate=0.245,
scale=0.898,
shear=0.602,
flipud=0.00856,
fliplr=0.5,
mosaic=1.0,
mixup=0.243,
)
终端执行:
python3 tools/train.py --batch-size 16 --conf configs/yolov6n_finetune.py --data data/self.yaml --fuse_ab --device 0 --name yolov6n --epochs 100 --workers 2
计算输出如下所示:
训练完成输出如下所示:
Inferencing model in train datasets.: 100%|?????| 14/14 [00:07<00:00, 1.93it/s]
Evaluating speed.
Evaluating mAP by pycocotools.
Saving runs/train/yolov6n/predictions.json...
Results saved to runs/train/yolov6n
Epoch: 99 | mAP@0.5: 0.9074510280613662 | mAP@0.50:0.95: 0.5462296176076901
Training completed in 1.305 hours.
loading annotations into memory...
Done (t=0.00s)
creating index...
index created!
Loading and preparing results...
DONE (t=0.16s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=1.06s).
Accumulating evaluation results...
DONE (t=0.16s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.546
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.907
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.583
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.308
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.370
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.574
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.545
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.645
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.663
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.375
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.484
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.689
训练完成结果详情如下:
离线推理实例如下所示:
我们的想法是结合rope和dog的位置来判断是否存在为牵绳遛狗行为的存在,感兴趣的话也可以动手尝试下!