之前在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
从github上下载完整个文件,进行修改。
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'"]},
因为原本的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的文件夹,这样就完成了。
下载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文件夹里的以下几个子文件合并到一起:
最后合并完的整个VOCdevkit文件夹结构内容如下:
再在根目录下新建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个就行,把其它的删除。如果时间充裕不急的话,就整个上传好了。
新建一个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}
运行时会有网页地址跳出来,进入那个网页后,选择自己的账号转到页面,复制验证码到框里进行验证,一共两次,最后完成的结果如下图所示:
然后对云端硬盘进行命名:
!mkdir -p drive
!google-drive-ocamlfuse drive
查看云端硬盘中根目录下的文件夹:
!ls drive/
#指定当前的工作文件夹
import os
#此处为google drive中的文件路径,drive为之前指定的工作根目录,要加上
os.chdir("drive/tf-faster-rcnn-master")
!ls
!make clean
!make
cd ..
因为代码需要API来连接COCO数据集。
cd data
!git clone https://github.com/pdollar/coco.git
cd coco/PythonAPI
!make
cd ../../..
到此前期工作都结束了。
输入以下代码来运行demo文件:
!python3 tools/demo.py
运行结果保存在testfigs文件夹中,运行的图片为data/demo文件夹里的图片,最后运行结果的其中一张如下所示:
大功告成!