山内セミナーⅠ(2022/07/06)

関連サイトと資料

matplotlibライブラリのインストール

  1. 下の図の赤丸をクリックして、コマンドプロンプトを開いてください。


  2. 「conda activate seminar1」と入力して、エンターキーを押してください。 プロンプトの左側のカッコの中の表示が「base」から「seminar1」に変化し、仮想環境「seminar1」に入ったことを示しています。


  3. 仮想環境「seminar1」で、 「pip install matplotlib」と入力して、 エンターキーを押してください。

オブジェクト検出(YOLOv4)

import cv2
import numpy as np
import matplotlib.pyplot as plt
    

# モデルを読み込む
weights = 'yolov4.weights'
config = 'yolov4.cfg'
model = cv2.dnn_DetectionModel(weights, config)
    

# モデルの推論に使用するエンジンとデバイスを設定する
model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
    

# モデルの入力パラメーターを設定する
scale = 1.0 / 255.0    # スケールファクター
size = (512, 512)      # 入力サイズ(CSP)
mean = (0.0, 0.0, 0.0) # 差し引かれる平均値
swap = True            # チャンネルの順番(True: RGB、False: BGR)
crop = False           # クロップ
model.setInputParams(scale, size, mean, swap, crop)
  
# NMS(Non-Maximum Suppression)をクラスごとに処理する
model.setNmsAcrossClasses(False)  # (True: 全体、False: クラスごと)
    

# ファイルからクラスの名前のリストを読み込む関数
def read_classes(file):
  classes = None
  with open(file, mode='r', encoding="utf-8") as f:
    classes = f.read().splitlines()
  return classes
  
# クラスの数だけカラーテーブルを生成する関数
def get_colors(num):
  colors = []
  np.random.seed(0)
  for i in range(num):
    color = np.random.randint(0, 256, [3]).astype(np.uint8)
    colors.append(color.tolist())
  return colors
  
# クラスリストとカラーテーブルを取得する
names = 'coco.names'
classes = read_classes(names)
colors = get_colors(len(classes))
    

target = 'dog.jpg'
image = cv2.imread(target, cv2.IMREAD_COLOR)
  
# オブジェクトを検出する
confidence_threshold = 0.5
nms_threshold = 0.4
class_ids, confidences, boxes = model.detect(image, confidence_threshold, nms_threshold)
  
# 2次元配列(n, 1)から1次元配列(n, )に変換
class_ids = np.array(class_ids).flatten()
confidences = np.array(confidences).flatten()
  
# 検出されたオブジェクトを描画する
for class_id, confidence, box in zip(class_ids, confidences, boxes):
  class_name = classes[class_id]
  color = colors[class_id]
  thickness = 2
  cv2.rectangle(image, box, color, thickness, cv2.LINE_AA)
  
  result = "{0} ({1:.3f})".format(class_name, confidence)
  point = (box[0], box[1] - 5)
  font = cv2.FONT_HERSHEY_SIMPLEX
  scale = 0.5
  cv2.putText(image, result, point, font, scale, color, thickness, cv2.LINE_AA)
    

# 検出結果画像の表示
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
    

save_fn = 'result.png'
cv2.imwrite(save_fn, image)
    

result.png

オブジェクト検出(Scaled-YOLOv4)

import cv2
import numpy as np
import matplotlib.pyplot as plt
    

# モデルを読み込む
weights = 'yolov4-mish.weights'
config = 'yolov4-mish.cfg'
model = cv2.dnn_DetectionModel(weights, config)
    

# モデルの推論に使用するエンジンとデバイスを設定する
model.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)
    

# モデルの入力パラメーターを設定する
scale = 1.0 / 255.0    # スケールファクター
size = (512, 512)      # 入力サイズ(CSP)
mean = (0.0, 0.0, 0.0) # 差し引かれる平均値
swap = True            # チャンネルの順番(True: RGB、False: BGR)
crop = False           # クロップ
model.setInputParams(scale, size, mean, swap, crop)
  
# NMS(Non-Maximum Suppression)をクラスごとに処理する
model.setNmsAcrossClasses(False)  # (True: 全体、False: クラスごと)
    

# ファイルからクラスの名前のリストを読み込む関数
def read_classes(file):
  classes = None
  with open(file, mode='r', encoding="utf-8") as f:
    classes = f.read().splitlines()
  return classes
  
# クラスの数だけカラーテーブルを生成する関数
def get_colors(num):
  colors = []
  np.random.seed(0)
  for i in range(num):
    color = np.random.randint(0, 256, [3]).astype(np.uint8)
    colors.append(color.tolist())
  return colors
  
# クラスリストとカラーテーブルを取得する
names = 'coco.names'
classes = read_classes(names)
colors = get_colors(len(classes))
    

target = 'car1.jpg'
image = cv2.imread(target, cv2.IMREAD_COLOR)
  
# オブジェクトを検出する
confidence_threshold = 0.5
nms_threshold = 0.4
class_ids, confidences, boxes = model.detect(image, confidence_threshold, nms_threshold)
  
# 2次元配列(n, 1)から1次元配列(n, )に変換
class_ids = np.array(class_ids).flatten()
confidences = np.array(confidences).flatten()
  
# 検出されたオブジェクトを描画する
for class_id, confidence, box in zip(class_ids, confidences, boxes):
  class_name = classes[class_id]
  color = colors[class_id]
  thickness = 2
  cv2.rectangle(image, box, color, thickness, cv2.LINE_AA)
  
  result = "{0} ({1:.3f})".format(class_name, confidence)
  point = (box[0], box[1] - 5)
  font = cv2.FONT_HERSHEY_SIMPLEX
  scale = 0.5
  cv2.putText(image, result, point, font, scale, color, thickness, cv2.LINE_AA)
    

# 検出結果画像の表示
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()
    

save_fn = 'result2.png'
cv2.imwrite(save_fn, image)
    

result2.png(car1.jpgのScaled-YOLOv4による推論結果)

result3.png(car1.jpgのYOLOv4による推論結果)

result4.png(motorbike1.pngのScaled-YOLOv4による推論結果)

result5.png(motorbike1.pngのYOLOv4による推論結果)