anaconda环境下实现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进入项目

image.png
image.png
image.png

根据官方提供步骤,使用命令配置环境。
由于大部分模块我已经安装好,直接根据requirement.txt提示安装相对应的模块就行。
因此使用pip install XXX 安装原来环境中没有的模块

【三】下载模型和数据集json文件

image.png

模型下载好后,项目文件下新建snapshot


image.png

数据集json文件下载后可以存放在pretrained_models下


image.png

文档训练提供的代码训练的是UAV123数据集,因此下载UAV123数据集。
UAV123总共有13G,如果只是测试用,只用下最小的那个压缩包(1.8G)。
这篇博文中有下载地址:https://blog.csdn.net/sinat_27318881/article/details/85211053

image.png

打开UAV123目录下的data_seq


image.png

然后随便选一个数据集,我选的是bike1


image.png

在SiamCAR同级目录下新建testing_dataset。

image.png

在testing_dataset新建文件夹UAV123,放入UAV123数据集和json文件


image.png

修改UAV123.json文件
只测试bike1这个序列集,因此在UAV123.json中找到bike1


image.png

把bike1相关数据复制另存为一份新的json,并命名为UAV123.json,新保存的json文件一定要包含以下几个属性


image.png

为了提高测试速度,特地删了bike1文件下的图片,只保留了200张,因此,UAV123.json中的img_names也只保留200张图片名

以下为更改后文件夹目录


image.png

【四】运行

把tools下test.py复制一份到SiamCAR-master/test.py
[图片上传中...(image.png-44d81c-1602570317165-0)]

image.png

运行时在官网提供文档的命令后面再加上 --vis 显示出视频


image.png
image.png

【五】利用该算法跑自己的视频

1.注释创建数据集的方法,复制test.py命名为test2.py,即SiamCAR-master/test2.py

image.png

2.用cv的方法读取视频帧,然后循环遍历帧,为每一帧画框

    # 读视频 分割成帧
    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)  # 视频总帧数
    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:  # 调整帧数
            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')

用画图工具获取第一帧图片中目标所在位置及大小(x, y, w, h)


image.png

3.运行看效果

image.png
image.png

我修改的代码不是很好,还是有报错

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341