現場写真をAIで分析【VLMによる自動解析】
現場写真の整理・分析をAIが自動化します。
この記事では、VLMを使った現場写真の自動分析手法を解説します。
1. 現場写真分析の課題
従来の課題
【時間がかかる】 ・大量の写真を手動で確認 ・1枚ずつ説明文を記入 ・整理・分類に時間 【属人化】 ・記述内容がバラバラ ・担当者によって品質が異なる ・ノウハウが共有されない 【見落とし】 ・重要な情報を見落とす ・後から確認が必要に
AI活用のメリット
| 項目 | 従来 | AI活用後 |
|---|---|---|
| 処理時間 | 写真1枚5分 | 写真1枚30秒 |
| 品質 | バラつきあり | 一定水準 |
| 見落とし | 発生する | 補助として有効 |
| 作業負担 | 高い | 大幅軽減 |
2. VLMでできること
基本機能
【説明生成】 ・写真の内容を自動説明 ・状況の要約 ・特徴点の抽出 【分類】 ・作業種別の判定 ・進捗状況の判定 ・天候・時間帯の推測 【チェック】 ・安全面の確認 ・品質面の確認 ・異常の検出
分析可能な写真
| 写真種類 | 分析内容 |
|---|---|
| 全景写真 | 現場状況、進捗 |
| 作業写真 | 作業内容、人員 |
| 設備写真 | 機材、配置 |
| 完成写真 | 仕上がり、品質 |
| 損傷写真 | 状態、程度 |
3. 実践的な分析手法
基本的な分析
Python
def analyze_site_photo(image_path):
prompt = """
この現場写真を分析してください:
1. 撮影場所の状況
2. 確認できる作業内容
3. 写っている設備・機材
4. 天候・時間帯
5. 特記事項
"""
return analyze_image(image_path, prompt)
進捗確認
Python
def check_progress(image_path, expected_status):
prompt = f"""
この現場写真から工事の進捗を確認してください。
予定状況:{expected_status}
以下を判定してください:
1. 実際の進捗状況
2. 予定との比較(予定通り/遅延/前倒し)
3. 確認できる完了作業
4. 残作業の推測
"""
return analyze_image(image_path, prompt)
安全チェック
Python
def safety_check(image_path):
prompt = """
この現場写真を安全管理の観点から分析してください:
1. 確認できる安全対策
- 保護具の着用状況
- 安全設備の設置状況
2. 潜在的なリスク
- 危険箇所の有無
- 改善が必要な点
3. 総合評価(良好/要注意/要改善)
"""
return analyze_image(image_path, prompt)
品質確認
Python
def quality_check(image_path, check_items):
prompt = f"""
この現場写真から品質を確認してください。
確認項目:
{check_items}
各項目について:
- 確認結果(OK/NG/確認不可)
- コメント
"""
return analyze_image(image_path, prompt)
4. 自動化システムの構築
システム構成
【処理フロー】 1. 写真をフォルダに保存 2. 自動で分析処理 3. 結果をデータベースに保存 4. レポートを自動生成
Pythonクラス
Python
import os
import json
from datetime import datetime
from pathlib import Path
class SitePhotoAnalyzer:
def __init__(self, model="llava"):
self.model = model
self.results = []
def analyze_photo(self, image_path):
"""1枚の写真を分析"""
prompt = """
この現場写真を分析してください:
1. 状況説明(1-2文)
2. 作業内容
3. 確認できる設備
4. 特記事項
JSON形式で回答:
{
"description": "状況説明",
"work_type": "作業内容",
"equipment": ["設備1", "設備2"],
"notes": "特記事項"
}
"""
result = analyze_image(image_path, prompt)
return self._parse_result(result)
def _parse_result(self, result_text):
"""結果をパース"""
try:
return json.loads(result_text)
except:
return {"raw": result_text}
def process_folder(self, folder_path):
"""フォルダ内の写真を一括処理"""
folder = Path(folder_path)
image_extensions = {'.jpg', '.jpeg', '.png'}
for image_path in folder.iterdir():
if image_path.suffix.lower() in image_extensions:
print(f"Processing: {image_path.name}")
result = {
'filename': image_path.name,
'path': str(image_path),
'analyzed_at': datetime.now().isoformat(),
'analysis': self.analyze_photo(image_path)
}
self.results.append(result)
return self.results
def save_results(self, output_path):
"""結果を保存"""
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(self.results, f, ensure_ascii=False, indent=2)
def generate_summary(self):
"""サマリーを生成"""
if not self.results:
return "分析結果がありません"
summary = f"分析写真数: {len(self.results)}\n\n"
for result in self.results:
summary += f"### {result['filename']}\n"
analysis = result['analysis']
if 'description' in analysis:
summary += f"- {analysis['description']}\n"
summary += "\n"
return summary
使用例
Python
# 分析器を作成
analyzer = SitePhotoAnalyzer()
# フォルダ内の写真を一括分析
results = analyzer.process_folder("現場写真/2025-01-15/")
# 結果を保存
analyzer.save_results("analysis_results.json")
# サマリーを生成
summary = analyzer.generate_summary()
print(summary)
監視フォルダの設定
Python
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class PhotoHandler(FileSystemEventHandler):
def __init__(self, analyzer):
self.analyzer = analyzer
def on_created(self, event):
if event.is_directory:
return
if event.src_path.lower().endswith(('.jpg', '.png', '.jpeg')):
print(f"New photo detected: {event.src_path}")
result = self.analyzer.analyze_photo(event.src_path)
print(f"Analysis: {result}")
def watch_folder(folder_path):
"""フォルダを監視して自動分析"""
analyzer = SitePhotoAnalyzer()
handler = PhotoHandler(analyzer)
observer = Observer()
observer.schedule(handler, folder_path, recursive=True)
observer.start()
print(f"Watching: {folder_path}")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
# 実行
watch_folder("現場写真/")
5. 報告書への活用
日報への組み込み
Python
def generate_daily_report(folder_path, date):
"""日報を自動生成"""
analyzer = SitePhotoAnalyzer()
results = analyzer.process_folder(folder_path)
report = f"""
# 現場日報
日付:{date}
写真枚数:{len(results)}枚
## 作業状況
"""
for i, result in enumerate(results, 1):
analysis = result['analysis']
report += f"""
### 写真{i}: {result['filename']}
- 状況:{analysis.get('description', '分析中')}
- 作業:{analysis.get('work_type', '-')}
- 備考:{analysis.get('notes', '-')}
"""
report += """
## 明日の予定
(手動で記入)
---
*自動生成レポート*
"""
return report
工事写真帳の作成
Python
def create_photo_book(folder_path, output_path):
"""工事写真帳を作成"""
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
analyzer = SitePhotoAnalyzer()
results = analyzer.process_folder(folder_path)
# PDFを作成
c = canvas.Canvas(output_path, pagesize=A4)
for result in results:
# 写真を配置
c.drawImage(result['path'], 50, 400, width=500, height=350)
# 説明文を配置
analysis = result['analysis']
c.drawString(50, 380, f"撮影日時: {result['analyzed_at']}")
c.drawString(50, 360, f"状況: {analysis.get('description', '')}")
c.drawString(50, 340, f"作業内容: {analysis.get('work_type', '')}")
c.showPage()
c.save()
6. 活用事例
事例1: 建設現場の日常管理
【導入前】 ・毎日50枚の写真を整理 ・1枚あたり5分で説明記入 ・合計250分/日 【導入後】 ・写真をフォルダに保存するだけ ・自動で分析・整理 ・確認作業30分/日 【効果】 ・作業時間:85%削減 ・品質:一定水準を維持 ・見落とし:大幅減少
事例2: 設備点検
課題
設備の状態を写真で記録するが、後から確認が困難
【解決策】 1. 点検写真を撮影 2. VLMで自動分析 3. 異常があれば自動通知 【効果】 ・異常の早期発見 ・記録の一貫性向上 ・報告書作成の効率化
事例3: 安全パトロール
【活用方法】 ・パトロール写真を撮影 ・AIで安全チェック ・問題点を自動抽出 ・是正措置を記録 【プロンプト例】 「この写真から安全上の問題点を 指摘してください: - 保護具の着用 - 足場の状態 - 整理整頓の状況」
7. 運用のポイント
写真撮影のコツ
推奨
- 明るく鮮明に撮影
- 対象物が中央に
- 全体と詳細を両方撮影
- 角度を変えて複数枚
避ける
- 暗い/逆光
- ぶれている
- 対象が小さすぎる
結果の確認
【必ず確認すること】 ・事実と異なる記述がないか ・重要な見落としがないか ・専門用語が正しいか 【活用のポイント】 ・AIは補助ツール ・最終確認は人間が行う ・継続的に精度を確認
継続的な改善
【改善サイクル】 1. 分析結果を確認 2. 問題点を洗い出す 3. プロンプトを改善 4. 再度分析 5. 効果を確認
8. まとめ
VLMによる写真分析
VLMによる写真分析
- 自動で説明文を生成
- 分類・整理が効率化
- 安全・品質チェックに活用
- 報告書作成を自動化
導入効果
・作業時間:70〜90%削減 ・品質:一定水準を維持 ・見落とし:削減 ・属人化:解消
始め方
始め方
- VLM環境を準備
- 少量の写真でテスト
- プロンプトを調整
- 本格運用へ
関連記事
