人流量統(tǒng)計(jì)、特定目標(biāo)搜索+跟蹤!手把手帶你玩!
點(diǎn)擊下方“AI算法與圖像處理”,一起進(jìn)步!
重磅干貨,第一時(shí)間送達(dá)

環(huán)境
ubuntu 18.04 64位 yolov5 deepsort fastreid
前言
基于YOLOv5和DeepSort的目標(biāo)跟蹤 介紹過針對(duì)行人的檢測與跟蹤。本文介紹另一個(gè)項(xiàng)目,結(jié)合 FastReid 來實(shí)現(xiàn)行人的檢測、跟蹤和重識(shí)別。項(xiàng)目地址: https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid,作者給出的2個(gè)主要實(shí)例,也是非常的實(shí)用,包括行人流量的統(tǒng)計(jì)、人群中特定目標(biāo)的查找與跟蹤。
項(xiàng)目復(fù)現(xiàn)
首先,創(chuàng)建個(gè)全新的虛擬環(huán)境
conda create -n pytorch1.6 python=3.7
conda activate pytorch1.6
接著去拉取源碼
git clone https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid.git
cd Yolov5-Deepsort-Fastreid
然后安裝下其它的依賴包
# 如果沒有g(shù)pu的話,就按照requirements.txt安裝即可
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
# 編輯requirements.txt,注釋掉torch和torchvision
pip install -r requirements.txt
# 使用cython加速
pip install cython
cd fast_reid/fastreid/evaluation/rank_cylib
make all
cd ../../../../
先來跑個(gè)行人計(jì)數(shù)的demo
python person_count.py

yolov5的作者分別在googleapi和github上都保存了模型文件,但是這2個(gè)yolov5s.pt是不一樣的,大家可以通過md5sum去查看一下,github上的模型文件是對(duì)的
如果你在運(yùn)行過程中出現(xiàn)下面的錯(cuò)誤
2021-07-13 14:22:20 [INFO]: Loading weights from ./deep_sort/deep/checkpoint/ckpt.t7... Done!
Traceback (most recent call last):
File "person_count.py", line 244, in <module>
yolo_reid.deep_sort()
File "person_count.py", line 121, in deep_sort
bbox_xywh, cls_conf, cls_ids, xy = self.person_detect.detect(video_path, img, ori_img, vid_cap)
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/person_detect_yolov5.py", line 95, in detect
pred = self.model(img, augment=self.augment)[0]
File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 722, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 111, in forward
return self.forward_once(x, profile) # single-scale inference, train
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 131, in forward_once
x = m(x) # run
File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 722, in _call_impl
result = self.forward(*input, **kwargs)
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 36, in forward
self.training |= self.export
File "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 772, in __getattr__
type(self).__name__, name))
torch.nn.modules.module.ModuleAttributeError: 'Detect' object has no attribute 'export'
這個(gè)就是模型的問題,建議使用源碼中自帶的shell腳本進(jìn)行下載
sh weights/download_weights.sh
我們來看看這個(gè)行人流量統(tǒng)計(jì)的基本原理:
首先,作者將yolov5的目標(biāo)檢測封裝成了一個(gè)類Person_detect,通過它的detect方法可以檢測到視頻中的每一個(gè)行人目標(biāo)
然后,在畫面中設(shè)定一條基準(zhǔn)線,給定線條兩端的坐標(biāo)即可
line = [(0, int(0.48 * ori_img.shape[0])), (int(ori_img.shape[1]), int(0.48 * ori_img.shape[0]))]
cv2.line(ori_img, line[0], line[1], (0, 255, 255), 4)
接著,創(chuàng)建跟蹤器,開始對(duì)yolov5檢測出的每一個(gè)目標(biāo)進(jìn)行跟蹤。這里以目標(biāo)預(yù)測框的中心點(diǎn)為基準(zhǔn),下圖是它的計(jì)算方法

如果前后幀的中心點(diǎn)所連成的直線和預(yù)先設(shè)定的基準(zhǔn)線相交,則判定為越線,但是這里還有個(gè)方向的問題,向上還是向下?來看另一張圖

作者利用了三角形的正切與反正切原理,使用math模塊中的degrees方法來判斷,如果這個(gè)角度 >0,說明是向上走,反之則為向下走
def vector_angle(midpoint, previous_midpoint):
x = midpoint[0] - previous_midpoint[0]
y = midpoint[1] - previous_midpoint[1]
return math.degrees(math.atan2(y, x))
看完行人計(jì)數(shù)的示例,我們再來看看特定目標(biāo)的重識(shí)別示例
python person_search_reid.py
報(bào)錯(cuò)了
Fusing layers...
Traceback (most recent call last):
File "person_search_reid.py", line 120, in <module>
yolo_reid = yolo_reid(cfg, args, path=args.video_path)
File "person_search_reid.py", line 35, in __init__
self.deepsort = build_tracker(cfg, args.sort, use_cuda=use_cuda)
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/deep_sort/__init__.py", line 18, in build_tracker
max_age=cfg.DEEPSORT.MAX_AGE, n_init=cfg.DEEPSORT.N_INIT, nn_budget=cfg.DEEPSORT.NN_BUDGET, use_cuda=use_cuda)
File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/deep_sort/deep_reid.py", line 29, in __init__
self.extractor = Reid_feature()
File "./fast_reid/demo/demo.py", line 84, in __init__
cfg = setup_cfg(args)
File "./fast_reid/demo/demo.py", line 35, in setup_cfg
cfg.merge_from_file(args.config_file)
File "./fast_reid/fastreid/config/config.py", line 107, in merge_from_file
cfg_filename, allow_unsafe=allow_unsafe
File "./fast_reid/fastreid/config/config.py", line 50, in load_yaml_with_base
with PathManager.open(filename, "r") as f:
File "./fast_reid/fastreid/utils/file_io.py", line 357, in open
path, mode, buffering=buffering, **kwargs
File "./fast_reid/fastreid/utils/file_io.py", line 251, in _open
opener=opener,
FileNotFoundError: [Errno 2] No such file or directory: '../../kd-r34-r101_ibn/config-test.yaml'
這是缺少配置文件,到下面的鏈接去下載
鏈接: https://pan.baidu.com/s/1bMG3qy7npecCh6AzNO-Zyw
提取碼: hy1m
把這2個(gè)文件都存放在目錄kd-r34-r101_ibn下,然后修改源碼fast_reid/demo/demo.py中的第45行,將
default='../../kd-r34-r101_ibn/config-test.yaml',
改成
default='kd-r34-r101_ibn/config-test.yaml',
將第68行的
default=['MODEL.WEIGHTS', '../../kd-r34-r101_ibn/model_final.pth'],
改成
default=['MODEL.WEIGHTS', 'kd-r34-r101_ibn/model_final.pth'],
然后再次運(yùn)行腳本person_search_reid.py,可以得到

可以看到,由于事先已經(jīng)提了2位行人(a1111111111和b222222222222)的特征,所以,畫面中能夠識(shí)別出這2個(gè)人并進(jìn)行跟蹤。默認(rèn),特征文件保存在fast_reid/query下
特征提取
如果你也想要制作一個(gè)特征文件,可以按照下面的步驟進(jìn)行
首先,需要截取目標(biāo)人物的圖片,存放在某個(gè)以特定目標(biāo)命名的文件夾下,如我這里的xugaoxiang.com,這樣,后面進(jìn)行識(shí)別的時(shí)候,就顯示xugaoxiang.com這個(gè)名字了。把這個(gè)文件夾拷貝到fast_reid/query目錄下,目錄結(jié)構(gòu)如下
(pytorch1.6) xugaoxiang@1070Ti:~/Works/Yolov5-Deepsort-Fastreid/fast_reid/query$ tree
.
├── names.npy
├── query_features.npy
└── xugaoxiang.com
├── 10.png
├── 11.png
├── 12.png
├── 13.png
├── 14.png
├── 15.png
├── 1.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
├── 8.png
└── 9.png
接下來執(zhí)行
cd fast_reid/demo
python person_bank.py
執(zhí)行完畢后,query目錄下的query_features.npy和names.npy就被更新了
最后,找個(gè)包含目標(biāo)的視頻測試下效果


工程下載
最后,將包含所需文件全部打包,需要的朋友自行下載
鏈接:https://pan.baidu.com/s/1JiFzo5_H7TKniZZPzjZK7A
提取碼:nauu
參考資料
https://github.com/zengwb-lx/Yolov5-Deepsort-Fastreid https://blog.csdn.net/zengwubbb/article/details/113422048 https://xugaoxiang.com/2021/06/29/fastreid/
努力分享優(yōu)質(zhì)的計(jì)算機(jī)視覺相關(guān)內(nèi)容,歡迎關(guān)注:
個(gè)人微信(如果沒有備注不拉群!) 請注明:地區(qū)+學(xué)校/企業(yè)+研究方向+昵稱
下載1:何愷明頂會(huì)分享
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結(jié)分析
下載2:終身受益的編程指南:Google編程風(fēng)格指南
在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):c++,即可下載。歷經(jīng)十年考驗(yàn),最權(quán)威的編程規(guī)范!
下載3 CVPR2021 在「AI算法與圖像處理」公眾號(hào)后臺(tái)回復(fù):CVPR,即可下載1467篇CVPR 2020論文 和 CVPR 2021 最新論文
點(diǎn)亮
只需一秒,我卻能開心一天
