FairMOT实时多目标跟踪
簡介
FairMOT是今年很火的一個多目標跟蹤算法,前不久也開放了最新版本的論文,并于最近重構了開源代碼,我也在實際工程視頻上進行了測試,效果是很不錯的。不過,官方源碼沒有提高實時攝像頭跟蹤的編程接口,我在源碼的基礎上進行了修改,增加了實時跟蹤模塊。本文介紹如何進行環境配置和腳本修改,實現攝像頭跟蹤(本文均采用Ubuntu16.04進行環境配置,使用Windows在安裝DCN等包的時候會有很多問題,不建議使用)。
環境配置
下述環境配置需要保證用戶已經安裝了git和conda,否則配置pytorch和cuda會諸多不便。
首先,通過下面的git命令從Github克隆源碼到本地并進入該項目。訪問鏈接(提取碼uouv)下載訓練好的模型,在項目根目錄下新建models目錄(和已有的assets、src等目錄同級),將剛剛下載好的模型文件fairmot_dla34.pth放到這個models目錄下。
git clone git@github.com:ifzhang/FairMOT.git cd FairMOT下面,通過conda創建適用于該項目的虛擬環境(環境隔離),國內用戶速度慢可以參考我conda的文章配置國內源。創建之后通過activate激活環境(該命令出錯將conda換為source)。然后在當前虛擬環境下(后續關于該項目的操作都需要在該虛擬環境下)安裝pytorch和cuda(這里也建議配置國內源后安裝conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch)。最后,通過pip命令安裝所需d的Python包(國內建議配置清華源),注意先安裝cython。
conda create -n fairmot python=3.6 conda activate fairmot conda install pytorch==1.2.0 torchvision==0.4.0 cudatoolkit=10.0 pip install cython pip install -r requirements.txt pip install -U opencv-python==4.1.1.26同時,用于項目使用了DCNv2所以需要安裝該包,該包只能通過源碼安裝,依次執行下述命令即可(安裝過程報warning是正常情況,不報error就行)。
git clone https://github.com/CharlesShang/DCNv2 cd DCNv2 ./make.sh cd ../至此,所有的環境配置已經完成,由于這里還需要使用到ffmpeg來生成視頻文件,所以系統需要安裝ffmpeg(Ubuntu采用apt安裝即可),教程很多,不多贅述。
想要試試項目是否正常工作,可以使用下面的命令在demo視頻上進行跟蹤測試(初次允許需要下載dla34模型,這個模型國內下載速度還可以,我就直接通過允許代碼下載的)。
cd src python demo.py mot --input-video ../videos/MOT16-03.mp4 --load_model ../models/fairmot_dla34.pth --conf_thres 0.4默認文件輸出在項目根目錄的demos文件夾下,包括每一幀的檢測結果以及組合成的視頻。
實時跟蹤
實時跟蹤主要在兩個方面進行修改,一是數據加載器,二是跟蹤器。首先,我們在src目錄下新建一個類似于demo.py的腳本文件名為camera.py,寫入和demo.py類似的內容,不過,我們把視頻路徑換位攝像機編號(這是考慮到JDE采用opencv進行視頻讀取,而opencv視頻讀取和攝像機視頻流讀取是一個接口)。具體camera.py內容如下。
import osimport _init_paths from opts import opts from tracking_utils.utils import mkdir_if_missing import datasets.dataset.jde as datasets from track import eval_seqdef recogniton():result_root = opt.output_root if opt.output_root != '' else '.'mkdir_if_missing(result_root)print("start tracking")dataloader = datasets.LoadVideo(0, opt.img_size)result_filename = os.path.join(result_root, 'results.txt')frame_rate = dataloader.frame_rateframe_dir = None if opt.output_format == 'text' else os.path.join(result_root, 'frame')eval_seq(opt, dataloader, 'mot', result_filename,save_dir=frame_dir, show_image=False, frame_rate=frame_rate)if __name__ == '__main__':os.environ['CUDA_VISIBLE_DEVICES'] = '0'opt = opts().init()recogniton()接著,原來JDE關于視頻加載是針對真正的視頻的,對于攝像頭這種無限視頻流,修改其幀數為無限大(很大很大的整數值即可),也就是將src/lib/datasets/dataset/jde.py中LoadVideo修改如下。
class LoadVideo:def __init__(self, path, img_size=(1088, 608)):self.cap = cv2.VideoCapture(path)self.frame_rate = int(round(self.cap.get(cv2.CAP_PROP_FPS)))self.vw = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))self.vh = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))if type(path) == type(0):self.vn = 2 ** 32else:self.vn = int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))self.width = img_size[0]self.height = img_size[1]self.count = 0self.w, self.h = 1920, 1080print('Lenth of the video: {:d} frames'.format(self.vn))def get_size(self, vw, vh, dw, dh):wa, ha = float(dw) / vw, float(dh) / vha = min(wa, ha)return int(vw * a), int(vh * a)def __iter__(self):self.count = -1return selfdef __next__(self):self.count += 1if self.count == len(self):raise StopIteration# Read imageres, img0 = self.cap.read() # BGRassert img0 is not None, 'Failed to load frame {:d}'.format(self.count)img0 = cv2.resize(img0, (self.w, self.h))# Padded resizeimg, _, _, _ = letterbox(img0, height=self.height, width=self.width)# Normalize RGBimg = img[:, :, ::-1].transpose(2, 0, 1)img = np.ascontiguousarray(img, dtype=np.float32)img /= 255.0return self.count, img, img0def __len__(self):return self.vn # number of frames至此,讀取視頻流也通過一個粗暴的方式實現了,然后就是窗口顯示了,原來項目中跟蹤器只會一幀一幀寫入跟蹤后的結果圖像,然后通過ffmpeg將這些圖像組合為視頻。不過,原項目已經設計了實時顯示跟蹤結果窗口的接口了,只需要調用track.py中的eval_seq函數時,參數show_image設置為True即可。不過,也許作者并沒有測試過這個模塊,這里顯示會有些問題,務必將eval_seq中下述代碼段進行如下修改。
if show_image:cv2.imshow('online_im', online_im)cv2.waitKey(1)調整完成后,輸入下面的命令運行跟蹤腳本(命令行Ctrl+C停止跟蹤,跟蹤的每一幀存放在指定的output-root目錄下的frame目錄中)。
python camera.py mot --load_model ../models/fairmot_dla34.pth --output-root ../results上圖是我實際測試得到的運行結果,攝像頭分辨率比較低并且我做了一些隱私模糊處理,不過,整個算法的實用性還是非常強的,平均FPS也有18左右(單卡2080Ti)。
補充說明
本文對FairMOT源碼進行了簡單粗暴的修改以實現了一個攝像頭視頻實時跟蹤系統,只是研究FairMOT代碼閑暇之余的小demo,具體代碼可以在我的Github找到。
總結
以上是生活随笔為你收集整理的FairMOT实时多目标跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLA论文解读
- 下一篇: PyTorch-模型可视化工具Torch