anaconda環(huán)境下實現(xiàn)SiamCAR

文章地址:http://openaccess.thecvf.com/content_CVPR_2020/html/Guo_SiamCAR_Siamese_Fully_Convolutional_Classification_and_Regression_for_Visual_Tracking_CVPR_2020_paper.html
代碼地址:https://github.com/ohhhyeahhh/SiamCAR

【一】從github上下載代碼

image.png

【二】通過conda進(jìn)入項目

image.png
image.png
image.png

根據(jù)官方提供步驟,使用命令配置環(huán)境。
由于大部分模塊我已經(jīng)安裝好,直接根據(jù)requirement.txt提示安裝相對應(yīng)的模塊就行。
因此使用pip install XXX 安裝原來環(huán)境中沒有的模塊

【三】下載模型和數(shù)據(jù)集json文件

image.png

模型下載好后,項目文件下新建snapshot


image.png

數(shù)據(jù)集json文件下載后可以存放在pretrained_models下


image.png

文檔訓(xùn)練提供的代碼訓(xùn)練的是UAV123數(shù)據(jù)集,因此下載UAV123數(shù)據(jù)集。
UAV123總共有13G,如果只是測試用,只用下最小的那個壓縮包(1.8G)。
這篇博文中有下載地址:https://blog.csdn.net/sinat_27318881/article/details/85211053

image.png

打開UAV123目錄下的data_seq


image.png

然后隨便選一個數(shù)據(jù)集,我選的是bike1


image.png

在SiamCAR同級目錄下新建testing_dataset。

image.png

在testing_dataset新建文件夾UAV123,放入UAV123數(shù)據(jù)集和json文件


image.png

修改UAV123.json文件
只測試bike1這個序列集,因此在UAV123.json中找到bike1


image.png

把bike1相關(guān)數(shù)據(jù)復(fù)制另存為一份新的json,并命名為UAV123.json,新保存的json文件一定要包含以下幾個屬性


image.png

為了提高測試速度,特地刪了bike1文件下的圖片,只保留了200張,因此,UAV123.json中的img_names也只保留200張圖片名

以下為更改后文件夾目錄


image.png

【四】運行

把tools下test.py復(fù)制一份到SiamCAR-master/test.py
[圖片上傳中...(image.png-44d81c-1602570317165-0)]

image.png

運行時在官網(wǎng)提供文檔的命令后面再加上 --vis 顯示出視頻


image.png
image.png

【五】利用該算法跑自己的視頻

1.注釋創(chuàng)建數(shù)據(jù)集的方法,復(fù)制test.py命名為test2.py,即SiamCAR-master/test2.py

image.png

2.用cv的方法讀取視頻幀,然后循環(huán)遍歷幀,為每一幀畫框

    # 讀視頻 分割成幀
    videoFile = 'E:/lqj/testing_dataset/garbage/garbage.mp4'
    capture = cv2.VideoCapture(videoFile)
    height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 視頻高度
    width = capture.get(cv2.CAP_PROP_FRAME_WIDTH)  # 視頻寬度
    count = capture.get(cv2.CAP_PROP_FRAME_COUNT)  # 視頻總幀數(shù)
    fps = capture.get(cv2.CAP_PROP_FPS)  # 視頻幀率

    print("count is %d , fps is %d " % (count, fps))

    out = cv2.VideoWriter('E:/lqj/testing_dataset/garbage/garbage_new.mp4', cv2.VideoWriter_fourcc('D', 'I', 'V', 'X'),
                          15, (np.int(width), np.int(height)), True)
    out_path = 'E:/lqj/testing_dataset/garbage/output/'

    if not os.path.isdir(out_path):
        os.makedirs(out_path)

    frameNum = 0
    model_name = args.snapshot.split('/')[-2] + str(hp['lr']) + '_' + str(hp['penalty_k']) + '_' + str(hp['window_lr'])

    
    i = 0
    #初始第一幀圖片的位置和大小
    gt_bbox = [540, 0, 41, 45]

    while True:
        ret, frame = capture.read()

        #給將每一幀圖片畫框
        img = frame

        toc = 0
        pred_bboxes = []
        track_times = []

        tic = cv2.getTickCount()

        if i == 0:
            cx, cy, w, h = get_axis_aligned_bbox(np.array(gt_bbox))
            gt_bbox_ = [cx - (w - 1) / 2, cy - (h - 1) / 2, w, h]
            tracker.init(img, gt_bbox_)
            pred_bbox = gt_bbox_
            pred_bboxes.append(pred_bbox)
        else:
            outputs = tracker.track(img, hp)
            pred_bbox = outputs['bbox']
            pred_bboxes.append(pred_bbox)
        toc += cv2.getTickCount() - tic
        track_times.append((cv2.getTickCount() - tic) / cv2.getTickFrequency())

        i += 1

        if i == 0:
            cv2.destroyAllWindows()

        if args.vis and i > 0:
            if not any(map(math.isnan, gt_bbox)):

                pred_bbox = list(map(int, pred_bbox))

                cv2.rectangle(img, (pred_bbox[0], pred_bbox[1]),
                              (pred_bbox[0] + pred_bbox[2], pred_bbox[1] + pred_bbox[3]), (0, 255, 255), 3)
                cv2.putText(img, str(i), (40, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2)
                cv2.imshow('garbage', img)
                cv2.waitKey(1)


        frameNum = frameNum + 1
        if frameNum % 2 == 0:  # 調(diào)整幀數(shù)
            cv2.imwrite(out_path + 'vieo1_' + str(frameNum) + ".jpg", frame)  # 保存圖片

        # if ret is True:
        #     cv2.imshow("video-input", frame)
        #     out.write(frame)
        #
        #     c = cv2.waitKey(50)
        #     if c == 27:  # ESC
        #         break
        #     else:
        #         break

    toc /= cv2.getTickFrequency()


    # save results

    model_path = os.path.join('results', 'garbage', model_name)
    if not os.path.isdir(model_path):
        os.makedirs(model_path)
    result_path = os.path.join(model_path, 'garbage.txt')
    with open(result_path, 'w') as f:
        for x in pred_bboxes:
            f.write(','.join([str(i) for i in x]) + '\n')

    #os.chdir(model_path)
    capture.release()
    out.release()

    print('well done')

用畫圖工具獲取第一幀圖片中目標(biāo)所在位置及大小(x, y, w, h)


image.png

3.運行看效果

image.png
image.png

我修改的代碼不是很好,還是有報錯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容