linux下yolact演算法的實現,測試自己的資料集

哦買法噶發表於2020-10-08

**

環境

Ubuntu16.0 pytorch1.3.0 pycharm
程式碼連結:https://github.com/dbolya/yolact

  • 下載anaconda cudnn 均為最新版
  • 下載所需要的包
    #Cython needs to be installed before pycocotools
    pip install cython
    pip install opencv-python pillow pycocotools matplotlib
    git clone https://github.com/dbolya/yolact.git
    cd yolact
    3.在readme裡面下載所需要的權重檔案

程式碼修改

由於我用的是pytorch1.3.0,所以需要進行一些程式碼的修改,在yolact.py檔案中497行下的修改:
去掉 is_script_conv = isinstance(module, torch.jit.WeakScriptModuleProxy)
更換為 is_script_conv = ‘Script’ in type(module).name
2.新增weights檔案以及裡面的權重
3.新增coco/annotations 存放訓練json檔案
新增coco/images/JPEGImages 存放圖片
此時執行python eval.py可以執行

訓練自己的資料集

1.將錄好的視訊利用MP4.py以10幀獲取一幅圖片(錄時控制的大小是550*550)
2.檢視圖片質量,刪除沒有影像的圖片
3.對圖片進行改名字
4.對圖片進行標註
5.利用labelme2coco.py轉為coco資料集

  • 利用以下程式碼將自己的圖片設定為550×550的大小
import os

import cv2
import numpy as np


## 讀取影像,解決imread不能讀取中文路徑的問題
def cv_imread(filePath):
    cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), -1)
    ## imdecode讀取的是rgb,如果後續需要opencv處理的話,需要轉換成bgr,轉換後圖片顏色會變化 !!!!!!!!
    ##cv_img=cv2.cvtColor(cv_img,cv2.COLOR_RGB2BGR)
    return cv_img


# 縮小圖片演算法  imagePath指的是大圖圖片  image_xPath指的是小圖圖片
def shrink(imagePath, image_xPath, out_width, out_height):
    # img = cv2.imread(imagePath)
    img = cv_imread(imagePath)
    #print("高度,寬度:{}".format(img.shape[:2]))
    # height, width = img.shape[:2]
    # 縮小圖片
    image_x = cv2.resize(img, (out_width, out_height), interpolation=cv2.INTER_CUBIC)  # INTER_CUBIC	4x4畫素鄰域的雙三次插值
    """cv2.imshow('reSize2', image_x) #展示圖片
    cv2.waitKey()
    cv2.destroyAllWindows()"""
    cv2.imwrite(image_xPath, image_x)  # 寫入 如果是中文路徑有問題


if __name__ == '__main__':
    file_path = r'./examples/instance_segmentation/outdir/JPEGImages/'
    out_path = r'./examples/instance_segmentation/outdir/JPEGImage/'
    image_list = os.listdir(file_path)  # 得到的是 含有各個圖片名字的一個list
    for image_name in image_list:
        print("正在輸出:{}".format(image_name.replace(".JPG","_x.JPG")))
        shrink(file_path + image_name, out_path + image_name, 550, 550)  # 加上 'r'是為了防止轉義字元 這是不使用字尾名加_x的
        # shrink(file_path + image_name, out_path + image_name.replace(".JPG", "_x.JPG"), 512, 512)  # 加上 'r'是為了防止轉義字元
        # shrink(file_path+image_name, file_path+image_name.replace(".JPG","_x.JPG"), 512, 512)  # 加上 'r'是為了防止轉義字元
    # shrink(r"I:/資料集/玉米苗識別部分地塊/玉米苗識別部分地塊/原始資料/6架次/DJI_0369.JPG", r"I:\image_x\DJI_0369_x.JPG", 512,512)  # 加上 'r'是為了防止轉義字元

  • 利用labelme對已經修正好的圖片進行標註
    標註時需要注意如果一個圖片中有多個同類物件,標註的形式是person-1,person-2…

  • 將標註好的labelme轉化為coco資料集
    轉化程式碼下載地址:https://github.com/wkentaro/labelme
    在anconda中:
    #python2
    conda install pyqt
    pip install labelme
    #python3
    conda create --name=labelme python=3.6
    source activate labelme
    pip install pyqt5
    pip install labelme
    ubuntu中:
    #python2
    sudo apt-get install python-pyqt5 # PyQt5
    sudo pip install labelme
    #python3
    sudo apt-get install python3-pyqt5 # PyQt5
    sudo pip3 install labelme

  • 修改labelme.txt
    ignore
    background
    加上自己的類別名

  • 執行labelme2coco.py
    python labelme2coco.py input_dir=‘ ’ output_dir=‘ ’ --labels labels.txt

更改config檔案,建立自己的資料集類別

my_custom_dataset = dataset_base.copy({
    'name': 'My Dataset',

    'train_images': 'path_to_training_images',
    'train_info':   'path_to_training_annotation',

    'valid_images': 'path_to_validation_images',
    'valid_info':   'path_to_validation_annotation',

    'has_gt': True,
    'class_names': ('my_class_id_1', 'my_class_id_2', 'my_class_id_3', ...)
})
  • 更改num_classes為自己的類別數+1(背景)

  • dataset路徑改為自己的

  • 執行train.py進行訓練

  • 執行eval.py (將44行權重檔案改為訓練出來的權重檔案)

    想要得到output_coco_json可以將114行parser.set_defaults中的output_coco_json改為Ture

  • 執行run_coco_eval.py

相關文章