Chrome Pointer

2021年10月25日 星期一

Python物件導向程式設計 (封裝, 繼承, 多型) 教學

💙物件導向

Python程式語言是一種物件導向語言(Object-oriented programming)

所有資料都是物件

能夠提高軟體的重複性、擴充性及維護性


物件導向程式設計(Object Oriented Programming, OOP)主要有以下的特徵

封裝(encapsulation 

繼承(inheritance

多型(polymorphism


💚Class語法

Class Python用來實作物件導向的語法,

第一個英文字母要大寫

class Class_name():

    statement_1

    …

    statement_n

• Class裡面的變數叫做attribute 

    • Class要取用內部的attribute需要加上self.xxx 

• Class裡面的函數叫做method 

    • Class裡的method第一個參數都要設為self


可以直接呼叫定義好的Class加以創建



💛__init__ 函數

Class裡面,可以定義__init__()函數,當Class被創建的時候,

__init__()函數將會自動被執行~



💜封裝

封裝指的是將類別裡的attribute/method私有化,讓class外部無法直接使用

    attribute/method名稱前面加上”__”



💝繼承

• attribute/method可以被繼承,繼承者叫做子類別(subclass)

被繼承的叫做父類別(superclass)


💓多重繼承

類別也可以同時繼承多個父類別


🧡多型

多型的意思是,在預設情況下,子類別會繼承父類別的 attribute/method

但如果子類別定義了一個與父類別method一 樣的method

則子類別會覆寫父類別的method功能~

2021年10月12日 星期二

插入Guest Additions 的映像檔 錯誤訊息排解

在使用過程中,最常遇到的問題就是解析度調整共用剪貼簿和共用資料夾的問題,所以就避免不了要安裝 Guest Additions 這套內建工具,因此它是解決這些問題的必要條件!!


Guest Additions 錯誤訊息排解

Could not mount the media/drive ‘C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso’ (VERR_PDM_MEDIA_LOCKED).


若出現上面這條訊息,

請去 >> 存放裝置 >>控制器IDE  把光碟機給刪除~


之後重啟虛擬機,

選擇「插入Guest Additions 的映像檔」,

就會成功了~



成功安裝 Guest Additions 後,點擊〔裝置〕,勾選〔自動調整客體顯示大小〕

此時隨意拉動視窗,會發現虛擬機內部視窗也同步改變大小。



• EX: sudo usermod -G vboxsf -a cmtsai 
• 登出 登入後生效 if not work, please restart it.



2021年10月4日 星期一

Yolov5安裝教學 + Yolov5訓練教學


一、Yolov5安裝教學

 

1.     安裝Anaconda https://www.anaconda.com/products/individual

2.     建立Anaconda虛擬環境

*YOLOV5訓練一定要下載python3.8以上

conda create -n your_env_name python=3.6

e.g. conda create -n yolov5 python=3.7

3.     啟用Anaconda虛擬環境

conda activate your_env_name

e.g.conda activate yolov5

---------------------------------------------------------

退出虛擬環境: conda deactivate

刪除虛擬環境:conda remove -n your_env_name --all

4.     下載需要套件 https://tw511.com/a/01/29504.html

pip install opencv-python

pip install numpy

pip install matplotlib

pip install pandas

pip install scipy

pip install seaborn

pip install tqdm

pip install pillow

pip install tensorboard

pip install pyyaml

pip install pandas

pip install scikit-image

pip install Cython

pip install thop

pip install pycocotools

 

5.      安裝Cuda

https://developer.nvidia.com/cuda-10.2-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exelocal

 

6.     安裝Pytorch  https://pytorch.org/get-started/locally/

*要選對作業系統如果有GPU(顯示卡)要記得點選如果沒有請點選CPU

pip3 install torch==1.9.0+cu102 torchvision==0.10.0+cu102 torchaudio===0.9.0 -f https://download.pytorch.org/whl/torch_stable.html

7.     安裝PyCharm

https://www.jetbrains.com/pycharm/

8.     設定PyCharm

(1) Fileà settingsà Projectà Python Interpreter

(2) Python Interpreter點開下拉框à show allà +(add)

(3) Conda Environmentà Existing environmentà Interpreter下拉à python.exe

(4) 點選剛剛的python.exeà okà 執行看有沒有錯誤

9.     安裝labelImg

(1)Pycharm右下角à 點選ternimal

(2) git clone https://github.com/tzutalin/labelImg

10.  下載YOIOV5目錄

11.  套用YOLOV5套件(requirements.txt)

(1)   Pycharm右下角à 點選ternimal

(2)   pip install -r requirements.txt

 

12.  測試(辨識人和船圖片下載:在資料夾IMG_2997.JPG

import torch

import cv2

import numpy as np

 

model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

# print(model)

img=cv2.imread('IMG_2997.JPG')

results = model(img)

results.print()

print(results.xyxy)

cv2.imshow('YOLO COCO', np.squeeze(results.render()))

cv2.waitKey(0)

13.  測試(視訊)

import torch

import numpy as np

import cv2

model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

cap = cv2.VideoCapture(0)

while cap.isOpened():

    success, frame = cap.read()

    if not success:

      print("Ignoring empty camera frame.")

      continue

    results = model(frame)

    cv2.imshow('YOLO COCO 01', np.squeeze(results.render()))

    if cv2.waitKey(1) & 0xFF == 27:

        break

cap.release()

cv2.destroyAllWindows()

14.  錯誤處理(沒有錯可跳過)




OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/.

 

解決方法:

        train.py加入程式

import os

os.environ['KMP_DUPLICATE_LIB_OK']='True'

 


Yolov5訓練教學

1.     創建一個pycharm project

2.     pycharm project下創建images, labels兩個空目錄


3.     把要訓練的圖片放到Data àimages資料夾裡面


4.     安裝labelimg程式(貼上標籤)

(1)   conda install pyqt=5

(2)   conda install -c anaconda lxml

(3)   接著到terminal下,切(cd)labelimg目錄下

(4)   pyrcc5 -o libs/resources.py resources.qrc

5.     設定與執行labelimg程式

(1)   找到 yolococo/labelimg/data 下有一個檔案叫做predefines_classes.txt檔案

(2)   在裡面內容修改成你訂的類別

(3)   再執行:python labelImg.py  (mac可能要python3)

 

6.     訓練設定

依照規範,我們建立 dataset.yaml如下:

就放在yolov5目錄即可


7.     開始訓練

python train.py --img 320 --batch 16 --epochs 5 --data dataset.yaml --weights yolov5s.pt

*看看是否有錯誤,沒有的話就可以將--epochs 5 改為 500 來作完整訓練 (也可將--img 640 改為320速度較快)

8.     如果有錯誤(UnicodeDecodeError: 'cp950' codec can't decode byte 0xf0 in position 9: illegal multibyte sequence)

        train.py檔案的第72with open(hyp) as f

變成àwith open(hypencoding="utf-8"as f

9.     查看訓練結果

 

10.  執行訓練模組

import numpy as np

import cv2

 

model = torch.hub.load('ultralytics/yolov5', 'custom', path='yolov5/runs/train/exp3/weights/best.pt',force_reload=True)

cap = cv2.VideoCapture(0)

 

while cap.isOpened():

    success, frame = cap.read()

    if not success:

      print("Ignoring empty camera frame.")

      continue

    frame = cv2.resize(frame,(800,480))

    results = model(frame)

    # print(np.array(results.render()).shape)

    cv2.imshow('YOLO COCO 01', np.squeeze(results.render()))

    if cv2.waitKey(1) & 0xFF == 27:

        break

cap.release()

cv2.destroyAllWindows()