Colaboratory下运行tensorflow版faster rcnn的demo文件

1 前言

之前在windows的Anaconda下运行过faster rcnn,也在ubuntu环境下进行实验,但每次运行demo文件都会报各种错误,试过github上各种版本的代码,百度了N遍试了N种方法都未解决,最后放弃治疗。后来在网上找免费GPU云时,找到了Google的Colaboratory。Colaboratory是Google的一个研究项目,旨在提供开发者一个云端训练神经网络的工具。它是Jupyter笔记本环境,不用做任何配置,完全运行在云端。Colaboratory存储在Google Drive中,可以进行共享。Colaboratory向开发者提供了免费的Tesla K80 GPU使用。但是需要才能使用,的方法具体就不介绍了,一般有两种,第一是自己花钱找家靠谱的VPN,第二也是自己花钱去Vultr或搬瓦工上买个服务器自己搭建ss或ssr。

自己用了Colaboratory两天后,不用自己配置GPU环境和各种python包,终于没有那种报错,跑通了faster rcnn的demo文件,留下了心酸的泪水。

我用的faster rcnn代码地址:https://github.com/endernewton/tf-faster-rcnn
Colaboratory教程:https://colab.research.google.com/notebooks/welcome.ipynb#scrollTo=xitplqMNk_Hc
谷歌云端硬盘:https://drive.google.com/drive/my-drive

2 代码修改

从github上下载完整个文件,进行修改。

2.1 GPU框架修改

GPU类型和架构对比表:

GPU model Architecture
TitanX (Maxwell/Pascal) sm_52
GTX 960M sm_50
GTX 1080 (Ti) sm_61
Grid K520 (AWS g2.2xlarge) sm_30
Tesla K80 (AWS p2.xlarge) sm_37

Colaboratory的GPU型号是Tesla K80,因此在lib/setup.py文件中,找到extra_compile_args,将-arch改为sm_37:

 extra_compile_args={'gcc': ["-Wno-unused-function"],
                            'nvcc': ['-arch=sm_37',
                                     '--ptxas-options=-v',
                                     '-c',
                                     '--compiler-options',
                                     "'-fPIC'"]},

2.2 demo文件修改

因为原本的demo代码最后运行结果是直接弹出有标注框的图片,而且一张图片只有一个标注框,因此需要修改tools/demo.py文件,使一张图片能显示所有的标注框,并且运行完后不弹出显示,而是直接保存。

修改vis_detections函数和demo函数如下:

def vis_detections(im, class_name, dets, ax,thresh=0.5):
    """Draw detected bounding boxes."""
    inds = np.where(dets[:, -1] >= thresh)[0]
    if len(inds) == 0:
        return

#    im = im[:, :, (2, 1, 0)]
#    fig, ax = plt.subplots(figsize=(12, 12))
#    ax.imshow(im, aspect='equal')
    for i in inds:
        bbox = dets[i, :4]
        score = dets[i, -1]

        ax.add_patch(
            plt.Rectangle((bbox[0], bbox[1]),
                          bbox[2] - bbox[0],
                          bbox[3] - bbox[1], fill=False,
                          edgecolor='red', linewidth=3.5)
            )
        ax.text(bbox[0], bbox[1] - 2,
                '{:s} {:.3f}'.format(class_name, score),
                bbox=dict(facecolor='blue', alpha=0.5),
                fontsize=14, color='white')

    ax.set_title(('{} detections with '
                  'p({} | box) >= {:.1f}').format(class_name, class_name,
                                                  thresh),
                  fontsize=14)
#   plt.axis('off')
#   plt.tight_layout()
#   plt.draw()

def demo(sess, net, image_name):
    """Detect object classes in an image using pre-computed object proposals."""

    # Load the demo image
    im_file = os.path.join(cfg.DATA_DIR, 'demo', image_name)
    im = cv2.imread(im_file)

    # Detect all object classes and regress object bounds
    timer = Timer()
    timer.tic()
    scores, boxes = im_detect(sess, net, im)
    timer.toc()
    print('Detection took {:.3f}s for {:d} object proposals'.format(timer.total_time, boxes.shape[0]))

    # Visualize detections for each class
    CONF_THRESH = 0.8
    NMS_THRESH = 0.3
    im = im[:, :, (2, 1, 0)]
    fig,ax = plt.subplots(figsize=(12, 12))
    ax.imshow(im, aspect='equal')
    for cls_ind, cls in enumerate(CLASSES[1:]):
        cls_ind += 1 # because we skipped background
        cls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)]
        cls_scores = scores[:, cls_ind]
        dets = np.hstack((cls_boxes,
                          cls_scores[:, np.newaxis])).astype(np.float32)
        keep = nms(dets, NMS_THRESH)
        dets = dets[keep, :]
        vis_detections(im, cls, dets, ax,thresh=CONF_THRESH)
    plt.axis('off')
    plt.tight_layout()
    plt.draw()

在最后一部分进行修改:

for im_name in im_names:
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        print('Demo for data/demo/{}'.format(im_name))
        demo(sess, net, im_name)
        plt.savefig("testfigs/" + im_name) 

    #plt.show()   

然后再在根目录下新建名为testfigs的文件夹,这样就完成了。

3 数据集下载

下载voc2007数据集的三个压缩包链接:
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
再新建一个名为VOCdevkit的文件夹,上面三个链接下载的压缩包都解压到这个文件夹里,即把VOCtrainval和VOCtest中的VOC2007文件夹里的以下几个子文件合并到一起:
Colaboratory下运行tensorflow版faster rcnn的demo文件_第1张图片
最后合并完的整个VOCdevkit文件夹结构内容如下:
Colaboratory下运行tensorflow版faster rcnn的demo文件_第2张图片
再在根目录下新建output/res101/voc_2007_trainval+voc_2012_trainval/default路径文件夹来放预训练模型,下载已有人在谷歌云端硬盘里分享的voc_0712_80k-110k.tgz文件,链接:https://drive.google.com/drive/folders/0B1_fAEgxdnvJeGg0LWJZZ1N2aDA
解压后将那四个文件放到default文件夹里。

然后就可以把整个文件夹上传到云盘里,但是因为文件数目多而且大,上传很慢,想要速度可以快一点,可以只上传VOC2007的前2000个数据集,那5个子文件夹里的内容都只选取前2000个就行,把其它的删除。如果时间充裕不急的话,就整个上传好了。

4 运行demo文件

4.1 配置Colaboratory

新建一个python3记事本,并在修改菜单中的笔记本设置里,把硬件加速器改为GPU。然后在Colab笔记本中进行挂载,使Google Drive与Colaboratory关联,能在笔记本中导入整个文件夹运行。Colaboratory是虚拟的ubuntu环境,因此可以运用ubuntu代码,只要在前面加上!就行。

!apt-get install -y software-properties-common
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

运行时会有网页地址跳出来,进入那个网页后,选择自己的账号转到页面,复制验证码到框里进行验证,一共两次,最后完成的结果如下图所示:
Colaboratory下运行tensorflow版faster rcnn的demo文件_第3张图片
然后对云端硬盘进行命名:

!mkdir -p drive
!google-drive-ocamlfuse drive

查看云端硬盘中根目录下的文件夹:

!ls drive/
#指定当前的工作文件夹
import os
#此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上
os.chdir("drive/tf-faster-rcnn-master") 
!ls

运行结果为:
在这里插入图片描述

4.2 编译Cython

!make clean

运行结果:
在这里插入图片描述

!make

运行结果:
Colaboratory下运行tensorflow版faster rcnn的demo文件_第4张图片
最后回到根目录:

cd ..

4.3 安装Python COCO API

因为代码需要API来连接COCO数据集。

cd data
!git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
!make
cd ../../..

到此前期工作都结束了。

4.4 运行demo

输入以下代码来运行demo文件:

!python3 tools/demo.py

运行结果保存在testfigs文件夹中,运行的图片为data/demo文件夹里的图片,最后运行结果的其中一张如下所示:
Colaboratory下运行tensorflow版faster rcnn的demo文件_第5张图片
大功告成!

你可能感兴趣的:(faster,rcnn,深度学习,卷积神经网络,图像识别)