検出結果のDB格納
1 | vim create_table.py |
を作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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へ保存するモジュールの作成
1 | vim inventory_database_module.py |
でファイルを作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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() |
として保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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の中身を見るには
1 | vim view_detections.py |
で
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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() |
として保存
1 | python view_detections.py |
を実行すると
1 2 3 4 5 | 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まで下げないと認識しないし
並べた時の複数の検出ができていない
とりあえず指定ディレクトリの画像から検出するようにコード変更する