目次
1. IoUとは
2. PrecisionとRecall
3. 実験
_3.1 データロード
_3.2 IoUの関数
_3.3 Iouの可視化
_3.4 Precisionの関数
_3.5 Precisionの可視化
_3.6 Recallの関数
_3.7 Recallの可視化
前回の記事は「画像分類・物体検出・セグメンテーションの比較」を説明しました。また、
今回の記事は物体検出における学習モデル評価方法Iouについて説明したいです。
1. IoUとは
IoUとは、Intersection over Unionの英語略称で、画像認識物の体検出精度のひとつのメリットです。画像中の検出したい物体を、作成したモデルがどの程度正しく検出できるかを評価する指標です。IoU は、以下の式で定義されます。つまり、領域の共通部分の割り算します。
予測が完全に正しい場合、IoU は1です。正解領域と予測領域の重なりが大きいほど IoU の値は大きくなります。
2. PrecisionとRecall
Precision を確認 予測したデータのうち,実際に当たっているものです。予測データのうち必要な所を制限です。
Recallは予測データのうち必要な所を実際に合わします。
3. 実験
環境:Google Colab
データセット:車画像
モデル評価:IoU, Precision, Recall
3.1 データロード
ライブラリインポート
from google.colab import files import cv2 import numpy as np
image = files.upload() image = list(image.keys())[0] image = cv2.imread(image)
name = ‘test.jpg’ # path to test image cv2.imwrite(name, image) |
画像表示
from google.colab.patches import cv2_imshow
cv2_imshow(image) |
3.2 IoUの関数
def intersection_over_union(boxA, boxB): # (x, y)作成 xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3])
# 交差長方形の計算 interArea = max(0, xB – xA + 1) * max(0, yB – yA + 1) # 予測と実績の計算 boxAArea = (boxA[2] – boxA[0] + 1) * (boxA[3] – boxA[1] + 1) boxBArea = (boxB[2] – boxB[0] + 1) * (boxB[3] – boxB[1] + 1) # Iouの計算 iou = interArea / float(boxAArea + boxBArea – interArea) return iou
|
3.3 Iouの可視化
IoUは0.8857になります。
# 実績と予測データ作成 predict_box = (95, 90, 500, 370) actual_box = (105, 100, 510, 360)
# 方形作成 iou_img = cv2.rectangle(image, predict_box[:2], predict_box[2:], (0, 0, 0), 2) iou_img = cv2.rectangle(iou_img, actual_box[:2], actual_box[2:], (0, 0, 255), 2) cv2.imwrite(‘output.jpg’, iou_img)
# IoU計算 iou = intersection_over_union(predict_box, actual_box) cv2.putText(iou_img, “IoU: {:.4f}”.format(iou), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
# 画像表示 cv2_imshow(iou_img)
|
3.4 Precisionの関数
# Precision
def Precision(boxA, boxB): # (x, y)作成 xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3])
interArea = max(0, xB – xA + 1) * max(0, yB – yA + 1) boxAArea = (boxA[2] – boxA[0] + 1) * (boxA[3] – boxA[1] + 1) boxBArea = (boxB[2] – boxB[0] + 1) * (boxB[3] – boxB[1] + 1) precision = interArea / float(boxAArea) return precision
|
3.5 Precisionの可視化
# Precision を確認 予測したデータのうち,実際に当たっているもの # 予測データのうち必要な所を制限 predict_box = (95, 90, 500, 370) actual_box = (105, 100, 510, 360) # 赤 実際 / 青 予測 image = list(upimage.keys())[0] image = cv2.imread(image)
# 方形作成 prec_img = cv2.rectangle(image, predict_box[:2], predict_box[2:], (0, 0, 0), 2) prec_img = cv2.rectangle(prec_img, actual_box[:2], actual_box[2:], (0, 0, 255), 2) cv2.imwrite(‘output_prec.jpg’, prec_img)
# Recall計算 iou = Precision(predict_box, actual_box) cv2.putText(prec_img, “Precision: {:.4f}”.format(iou), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
# 画像表示 cv2_imshow(prec_img) |
3.6 Recallの関数
def Recall(boxA, boxB): # (x, y)作成 xA = max(boxA[0], boxB[0]) yA = max(boxA[1], boxB[1]) xB = min(boxA[2], boxB[2]) yB = min(boxA[3], boxB[3])
interArea = max(0, xB – xA + 1) * max(0, yB – yA + 1) boxAArea = (boxA[2] – boxA[0] + 1) * (boxA[3] – boxA[1] + 1) boxBArea = (boxB[2] – boxB[0] + 1) * (boxB[3] – boxB[1] + 1) recall = interArea / float(boxBArea) return recall
|
3.7 Recallの可視化
# Recallを確認 # 予測データのうち必要な所を実際に合わす predict_box = (95, 90, 500, 370) actual_box = (105, 100, 510, 360) # 赤 実際 / 青 予測 image = list(upimage.keys())[0] image = cv2.imread(image)
# 方形作成 rec_img = cv2.rectangle(image, predict_box[:2], predict_box[2:], (0, 0, 0), 2) rec_img = cv2.rectangle(rec_img, actual_box[:2], actual_box[2:], (0, 0, 255), 2) cv2.imwrite(‘output.jpg’, rec_img)
# IoU計算 iou = Recall(predict_box, actual_box) cv2.putText(rec_img, “Recall: {:.4f}”.format(iou), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)
# 画像表示 cv2_imshow(rec_img)
|
担当者:KW
バンコクのタイ出身 データサイエンティスト
製造、マーケティング、財務、AI研究などの様々な業界にPSI生産管理、在庫予測・最適化分析、顧客ロイヤルティ分析、センチメント分析、SaaS、PaaS、IaaS、AI at the Edge の環境構築などのスペシャリスト