検出結果のDB格納
vim create_table.py
を作成
import sqlite3
def create_table():
conn = sqlite3.connect('detections.db')
cursor = conn.cursor()
# テーブルを作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS detections (
id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT NOT NULL,
count INTEGER NOT NULL,
timestamp TEXT NOT NULL
)
''')
conn.commit()
conn.close()
if __name__ == '__main__':
create_table()
これを実行し
DBを作成
次にDBへ保存するモジュールの作成
vim inventory_database_module.py
でファイルを作成
import sqlite3
from datetime import datetime
def save_detection_to_db(detections):
conn = sqlite3.connect('detections.db')
cursor = conn.cursor()
# 現在の時刻を取得
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 検出結果をテーブルに挿入
for label, count in detections.items():
cursor.execute('''
INSERT INTO detections (label, count, timestamp)
VALUES (?, ?, ?)
''', (label, count, current_time))
conn.commit()
conn.close()
として保存
import argparse
import json
import cv2
from ultralytics import YOLO
from collections import defaultdict
from line_notify import send_line_notify # インポートを追加
from datetime import datetime
from inventory_database_module import save_detection_to_db # データベース保存用の関数をインポート
# コマンドライン引数の解析
parser = argparse.ArgumentParser(description="YOLOv8 Object Detection")
parser.add_argument('image_path', type=str, help='Path to the input image file')
args = parser.parse_args()
# ラベルマッピングファイルのパス
label_mapping_path = 'label_mapping.json'
# JSONファイルからクラスラベルのマッピングを読み込み
with open(label_mapping_path, 'r', encoding='utf-8') as f:
label_mapping = json.load(f)
# YOLOv8モデルのロード
model = YOLO('inventory_model/best.pt') # ここで適切なモデルを選択
# 画像のロード
image = cv2.imread(args.image_path)
# 画像の検出
results = model(image, save=True, conf=0.1, iou=0.5)
# 検出結果の取得
detections = results[0] # 最初の結果を取得
classes = detections.boxes.cls
# 検出物体のカウント
object_counts = defaultdict(int)
for cls in classes:
class_label = model.names[int(cls)]
if class_label in label_mapping:
label = label_mapping[class_label]
else:
label = class_label
object_counts[label] += 1
# 検出結果のフィルタリング(1以下のもの)
filtered_object_counts = {label: count for label, count in object_counts.items() if count <= 1}
# フィルタリングされた検出結果のメッセージ生成
message_lines = [f'{label}: {count}個' for label, count in filtered_object_counts.items()]
message = '\n'.join(message_lines)
# 現在の時刻を取得
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
message = f"{message}\n在庫チェックの時刻: {current_time}"
# 検出結果の表示
for line in message_lines:
print(line)
# LINE Notifyにメッセージを送信(フィルタリングされた結果のみ)
if message_lines:
send_line_notify(message)
save_detection_to_db(filtered_object_counts) # データベースに検出結果を保存
else:
print("No objects with counts of 1 or less detected.")
というように
結果をDBに保存し
在庫チェックの時刻も送信するようにコード変更
なお実行した後に
DBの中身を見るには
vim view_detections.py
で
import sqlite3
def view_detections(db_path='detections.db'):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# テーブルの内容を取得
cursor.execute('SELECT * FROM detections')
rows = cursor.fetchall()
# カラム名を取得
column_names = [description[0] for description in cursor.description]
# 結果を表示
print(f"{' | '.join(column_names)}")
print("-" * 50)
for row in rows:
print(" | ".join(str(value) for value in row))
conn.close()
if __name__ == '__main__':
view_detections()
として保存
python view_detections.py
を実行すると
id | label | count | timestamp -------------------------------------------------- 1 | バスクリン | 1 | 2024-07-07 06:45:47 2 | バスクリン | 1 | 2024-07-07 06:50:42 3 | バスクリン | 1 | 2024-07-07 06:51:43
となり検出結果の確認ができる
認識精度が低いため
精度を0.1まで下げないと認識しないし
並べた時の複数の検出ができていない
とりあえず指定ディレクトリの画像から検出するようにコード変更する