美文网首页
Caffe demo: R-CNN detection

Caffe demo: R-CNN detection

作者: Zack_H | 来源:发表于2019-07-16 11:45 被阅读0次

    Caffe官网->Notebook Examples->R-CNN detection : 地址
    由于使用的是docker环境,并且创建前没有加--privilege参数,所以安装不了Matlab,因此无法使用selective_search_ijcv_with_python模块来进行selective search.
    还好demo里也支持使用第三方的selective search工具。(只需要使用csv类型作为input)
    整个工程用的python 3.6的环境。

    • 先在github上找到了一个selective search的python版本,而且它已经内置在pip的包里了。可以直接使用pip安装。
    pip install selectivesearch
    
    • 先用这个ss库对图片进行处理,提取region proposals. 具体代码如下:
    from skimage import io
    import selectivesearch
    import pandas as pd
    
    # 图片路径,(demo中只测试了一张图片)
    image_path = '/root/project/caffe/examples/images/fish-bike.jpg'
    output_path = '_temp/csvtest.csv'
    
    img = io.imread(image_path)
    img_lbl, regions = selectivesearch.selective_search(img, scale=500, sigma=0.9, min_size=1000)
    # 具体参数细节可查看github
    
    candidates = set()
    for r in regions:
        # excluding same rectangle (with different segments)
        if r['rect'] in candidates:
            continue
        # excluding regions smaller than 2000 pixels
        if r['size'] < 2000:
            continue
        # distorted rects
        x, y, w, h = r['rect']
        if w / h > 10 or h / w > 10:
            continue
        candidates.add(r['rect'])
    windows = []
    for c in candidates:
        x, y, w, h = c
        windows.append([x,y, x+w,y+h])
    print('[windows after ss : ', len(windows), ' ]')
    
    df = pd.DataFrame(windows,columns=['xmin', 'ymin', 'xmax', 'ymax'])
    df.insert(0,'filename',[image_path for i in range(len(windows))])
    df.to_csv(output_path,index=False)
    
    • Caffe demo的/root/project/caffe/python/detect.py文件关于csv处理的部分有误,需要修改:


      /root/project/caffe/python/detect.py
    • detection.py的执行代码修改如下:
    !/root/project/caffe/python/detect.py --crop_mode=list --pretrained_model=/root/project/caffe/models/bvlc_reference_rcnn_ilsvrc13/bvlc_reference_rcnn_ilsvrc13.caffemodel --model_def=/root/project/caffe/models/bvlc_reference_rcnn_ilsvrc13/deploy.prototxt --gpu --raw_scale=255 _temp/csvtest.csv _temp/csvtestoutput.csv
    
    • 预测后的分析和可视化需要修改的部分,其他的不动。
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    df = pd.read_csv('_temp/csvtestoutput.csv')
    print(df.shape)
    # print(df.iloc[0])
    
    with open('/root/project/caffe/data/ilsvrc12/det_synset_words.txt') as f:
        labels_df = pd.DataFrame([
            {
                'synset_id': l.strip().split(' ')[0],
                'name': ' '.join(l.strip().split(' ')[1:]).split(',')[0]
            }
            for l in f.readlines()
        ])
    labels_df.sort_values('synset_id')
    
    NUM_OUTPUT = 200
    class_cols = ['class{}'.format(x) for x in range(NUM_OUTPUT)]
    predictions_df = pd.DataFrame(np.vstack(df[class_cols].values), columns=labels_df['name'])
    print(predictions_df.iloc[0])
    
    max_s = predictions_df.max(0)
    max_s.sort_values(ascending=False, inplace=True)
    print(max_s[:10])
    
    # image_path = '/root/cvdata/myData/mylab.jpg'
    image_path = '/root/project/caffe/examples/images/fish-bike.jpg'
    
    # Find, print, and display the top detections: person and bicycle.
    i = predictions_df['person'].argmax()
    j = predictions_df['bicycle'].argmax()
    
    # Show top predictions for top detection.
    f = pd.Series(df.iloc[i][class_cols].values, index=labels_df['name'])
    print('Top detection:')
    print(f.sort_values(ascending=False)[:5])
    print('')
    
    # Show top predictions for second-best detection.
    f = pd.Series(df.iloc[j][class_cols].values, index=labels_df['name'])
    print('Second-best detection:')
    print(f.sort_values(ascending=False)[:5])
    
    # Show top detection in red, second-best top detection in blue.
    im = plt.imread(image_path)
    plt.imshow(im)
    currentAxis = plt.gca()
    
    det = df.iloc[i]
    coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']
    currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='r', linewidth=5))
    
    det = df.iloc[j]
    coords = (det['xmin'], det['ymin']), det['xmax'] - det['xmin'], det['ymax'] - det['ymin']
    currentAxis.add_patch(plt.Rectangle(*coords, fill=False, edgecolor='b', linewidth=5))
    

    相关文章

      网友评论

          本文标题:Caffe demo: R-CNN detection

          本文链接:https://www.haomeiwen.com/subject/wtezkctx.html