"建築工地危險檢測系統" 是一款以人工智慧驅動的工具,旨在提升工地的安全性。該系統利用 YOLO 模型進行物件偵測,能夠識別以下潛在危險:
- 未佩戴安全帽的工人
- 未穿著安全背心的工人
- 靠近機械或車輛的工人
- 進入限制區域的工人,透過安全錐座標的計算和分群,限制區域將自動產生。
後處理算法進一步提高了偵測的準確性。該系統專為即時部署而設計,能夠對檢測到的危險進行即時分析並發出警報。
此外,該系統可通過網頁介面即時整合 AI 辨識結果,並通過 LINE、Messenger、微信和 Telegram 等即時通訊應用程式發送通知及現場實時影像,及時提醒和通知相關人員。系統還支援多種語言,允許用戶接收通知並以其首選語言與介面互動。支援的語言包括:
- 🇹🇼 繁體中文(台灣)
- 🇨🇳 簡體中文(中國大陸)
- 🇫🇷 法文
- 🇬🇧 英文
- 🇹🇭 泰文
- 🇻🇳 越南文
- 🇮🇩 印尼文
多語言支援使該系統在全球範圍內的使用者都能方便使用,提升了不同地區的可用性。
以下是系統實時危險偵測的範例:
在運行應用程式之前,您需要配置系統,指定視頻流的詳細信息和其他參數,這些信息需要在 JSON 配置文件中進行設置。示例配置文件 config/configuration.json
應該看起來像這樣:
[
{
"video_url": "https://cctv1.kctmc.nat.gov.tw/6e559e58/",
"site": "Kaohsiung",
"stream_name": "Test",
"model_key": "yolo11n",
"notifications": {
"line_token_1": "language_1",
"line_token_2": "language_2"
},
"detect_with_server": true,
"expire_date": "2024-12-31T23:59:59",
"detection_items": {
"detect_no_safety_vest_or_helmet": true,
"detect_near_machinery_or_vehicle": true,
"detect_in_restricted_area": true
},
"work_start_hour": 0,
"work_end_hour": 24,
"store_in_redis": true
},
{
"video_url": "streaming URL",
"site": "Factory_1",
"stream_name": "camera_1",
"model_key": "yolo11n",
"notifications": {
"line_token_3": "language_3",
"line_token_4": "language_4"
},
"detect_with_server": false,
"expire_date": "No Expire Date",
"detection_items": {
"detect_no_safety_vest_or_helmet": true,
"detect_near_machinery_or_vehicle": false,
"detect_in_restricted_area": true
},
"work_start_hour": 0,
"work_end_hour": 24,
"store_in_redis": true
}
]
數組中的每個對象代表一個視頻流配置,包含以下字段:
-
video_url
:視訊串流的 URL,可能包括:- 監控流
- RTSP
- 副流
- YouTube 視頻或直播
- Discord
-
site
:監控系統的位置(例如:建築工地、工廠)。 -
stream_name
:指派給監視器或串流的名稱(例如:「前門」、「相機1」)。 -
model_key
:機器學習模型的識別鍵(例如:「yolo11n」)。 -
notifications
:LINE 通知的 API 令牌和對應語言的列表。line_token_1
,line_token_2
等:這些是 LINE API 令牌。language_1
,language_2
等:通知的語言(例如:「en」表示英文,「zh-TW」表示繁體中文)。
支援的通知語言包括:
zh-TW
: 繁體中文zh-CN
: 簡體中文en
: 英語fr
:法語vi
:越南語id
:印尼語th
:泰語
有關如何獲取 LINE 令牌的資訊,請參閱 Line Notify教學。
-
detect_with_server
:布林值,指示是否使用伺服器 API 進行物件偵測。如果為True
,系統將使用伺服器進行物件偵測。如果為False
,物件偵測將在本地機器上執行。 -
expire_date
:視訊串流配置的到期日期,使用 ISO 8601 格式(例如:「2024-12-31T23:59:59」)。如果沒有到期日期,可以使用類似「無到期日期」的字串。 -
detection_items
:指定監控特定場景的安全偵測項目。每個項目都可以設定為“True”以啟用或設定為“False”以停用。可用的檢測項目有:detect_no_safety_vest_or_helmet
:偵測人員是否未配戴安全背心或頭盔。這對於在必須配備安全裝備以保護人員的場所監控其安全裝備要求的遵守情況至關重要。detect_near_machinery_or_vehicle
:偵測人員是否危險地靠近機器或車輛。這有助於防止在建築工地或工業區經常遇到的因靠近重型設備或移動車輛而引起的事故。detect_in_restricted_area
:偵測人員是否進入限製或控制區域。限制區域對於未經訓練的人員可能是危險的,或者可能包含敏感設備,因此此設定有助於控制對此類區域的存取。
-
work_start_hour
:指定係統應開始監控視訊串流的時間(24 小時格式)。這樣可以將監控限制在活躍的工作時間,從而減少定義的時間範圍之外的不必要的處理(例如,「7」表示上午 7:00)。 -
work_end_hour
:指定係統應停止監控視訊串流的時間(24 小時格式)。在此時間之後,監控將停止以最佳化資源使用(例如「18」表示下午 6:00)。
「work_start_hour」和「work_end_hour」一起定義一天中的監控時段。對於 24 小時監控,請將“work_start_hour”設為“0”,將“work_end_hour”設為“24”。
store_in_redis
:一個布林值,決定是否將處理後的幀和關聯的檢測資料儲存在 Redis 中。如果為“True”,系統會將資料儲存到 Redis 資料庫以供進一步使用,例如即時監控或與其他服務整合。如果為“False”,則 Redis 中不會保存任何資料。
本應用程式需要特定的環境變數進行正確的配置。這些變數應定義在專案根目錄中的 .env
檔案中。以下是 .env
檔案的範例內容:
DATABASE_URL='mysql+asyncmy://username:password@mysql/construction_hazard_detection'
API_USERNAME='user'
API_PASSWORD='password'
API_URL="http://yolo-server-api:6000"
REDIS_HOST='redis'
REDIS_PORT=6379
REDIS_PASSWORD='password'
LINE_CHANNEL_ACCESS_TOKEN='YOUR_LINE_CHANNEL_ACCESS_TOKEN'
CLOUDINARY_CLOUD_NAME='YOUR_CLOUDINARY_CLOUD_NAME'
CLOUDINARY_API_KEY='YOUR_CLOUD_API_KEY'
CLOUDINARY_API_SECRET='YOUR_CLOUD_API_SECRET'
DATABASE_URL
:MySQL 資料庫的連線 URL。由server_api
模組使用。API_USERNAME
:用於 API 認證的使用者名稱。由main.py
使用。API_PASSWORD
:用於 API 認證的密碼。由main.py
使用。API_URL
:YOLO 伺服器 API 的 URL。由main.py
使用。REDIS_HOST
:Redis 伺服器的主機名稱。由main.py
使用。REDIS_PORT
:Redis 伺服器的埠號。由main.py
使用。REDIS_PASSWORD
:連線至 Redis 伺服器的密碼。由main.py
使用。LINE_CHANNEL_ACCESS_TOKEN
:LINE Messaging API 的存取權杖。由src/notifiers/line_notifier_message_api.py
使用。CLOUDINARY_CLOUD_NAME
:Cloudinary 的雲端名稱,用於媒體管理。由src/notifiers/line_notifier_message_api.py
使用。CLOUDINARY_API_KEY
:存取 Cloudinary 服務的 API 金鑰。由src/notifiers/line_notifier_message_api.py
使用。CLOUDINARY_API_SECRET
:存取 Cloudinary 服務的 API 秘鑰。由src/notifiers/line_notifier_message_api.py
使用。
注意:請將範例中的佔位值替換為實際的憑證與配置詳細資訊,以確保應用程式的正常運作。
Docker
要運行危險檢測系統,您需要在機器上安裝 Docker 和 Docker Compose。按照以下步驟來啟動系統:
-
將存儲庫克隆到本地機器。
git clone https://github.com/yihong1120/Construction-Hazard-Detection.git
-
進入克隆的目錄。
cd Construction-Hazard-Detection
-
使用 Docker Compose 構建並運行服務:
docker-compose build
-
要運行該應用程序,請使用以下命令:
docker-compose up
-
停止服務,使用以下命令:
docker-compose down
Python
要在終端運行危險檢測系統,您需要在機器上安裝 Python。按照以下步驟來啟動系統:
使用以下指令將專案從 GitHub 複製到本機:
git clone https://github.com/yihong1120/Construction-Hazard-Detection.git
進入剛剛複製的專案目錄:
cd Construction-Hazard-Detection
執行以下指令安裝專案所需的套件:
pip install -r requirements.txt
-
開啟終端機,執行以下指令安裝 MySQL:
sudo apt update sudo apt install mysql-server
-
安裝完成後,啟動 MySQL 服務:
sudo systemctl start mysql.service
請從 MySQL 下載頁面下載適合您作業系統的 MySQL 並完成安裝。
完成 MySQL 安裝後,執行初始化腳本來建立 construction_hazard_detection
資料庫及 users
資料表:
mysql -u root -p < scripts/init.sql
執行指令後,系統會提示您輸入 MySQL 的 root 密碼。請確認 scripts/init.sql
檔案內已包含建立資料庫和資料表的 SQL 指令。
Redis 僅在使用 Streaming Web 功能時需要。請依以下步驟安裝及設定 Redis:
-
安裝 Redis: 執行以下指令安裝 Redis:
sudo apt update sudo apt install redis-server
-
設定 Redis(可選):
- 如果需要進一步設定,請編輯 Redis 設定檔案:
sudo vim /etc/redis/redis.conf
- 如需啟用密碼保護,請找到以下行,取消註解並設置密碼:
requirepass YourStrongPassword
將
YourStrongPassword
替換為強密碼。 -
啟動並設置 Redis 服務開機自動啟動:
- 啟動 Redis 服務:
sudo systemctl start redis.service
- 設置開機自動啟動:
sudo systemctl enable redis.service
請參考官方文件:Redis 安裝指南。
執行以下指令啟動物件偵測 API:
uvicorn examples.YOLO_server.backend.app:sio_app --host 0.0.0.0 --port 8001
執行以下指令啟動主應用程式,並指定配置檔案:
python3 main.py --config config/configuration.json
請將 config/configuration.json
替換為您的實際配置檔案路徑。
執行以下指令啟動後端服務:
uvicorn examples.streaming_web.backend.app:sio_app --host 127.0.0.1 --port 8002
使用以下 waitress-serve
指令啟動後端服務:
waitress-serve --host=127.0.0.1 --port=8002 "examples.streaming_web.backend.app:streaming-web-app"
請參考 examples/YOLO_server_api/frontend/nginx.conf
文件進行部署,並將靜態網頁檔案放置於以下目錄:
examples/YOLO_server_api/frontend/dist
- 系統日誌可在 Docker 容器內部訪問,可用於調試目的。
- 如果啟用,檢測到的輸出圖像將保存到指定的輸出路徑。
- 如果檢測到危險,將在指定小時通過 LINE 消息 API 發送通知。
- 確保
Dockerfile
存在於項目的根目錄中,並根據您的應用程序的要求進行了正確配置。
有關 Docker 使用和命令的更多信息,請參閱 Docker 文檔。
訓練此模型的主要數據集是 Roboflow 的建築工地安全圖像數據集。我們已經用額外的註釋豐富了這個數據集,並在 Roboflow 上公開訪問。增強的數據集可以在這裡找到:Roboflow 上的建築危險檢測。此數據集包括以下標籤:
0: '安全帽'
1: '口罩'
2: '無安全帽'
3: '無口罩'
4: '無安全背心'
5: '人'
6: '安全錐'
7: '安全背心'
8: '機械'
9: '車輛'
Model | size (pixels) |
mAPval 50 |
mAPval 50-95 |
params (M) |
FLOPs (B) |
---|---|---|---|---|---|
YOLO11n | 640 | 58.0 | 34.2 | 2.6 | 6.5 |
YOLO11s | 640 | 70.1 | 44.8 | 9.4 | 21.6 |
YOLO11m | 640 | 73.3 | 42.6 | 20.1 | 68.0 |
YOLO11l | 640 | 77.3 | 54.6 | 25.3 | 86.9 |
YOLO11x | 640 | 82.0 | 61.7 | 56.9 | 194.9 |
我們的全面數據集確保模型能夠識別建築環境中常見的各種潛在危險。
- 新增對 WhatsApp 通知的支援。
- 修正examples/YOLO server_api/frontend手機版的UI界面。
我們歡迎對此項目的貢獻。請按照以下步驟操作:
- 分叉存儲庫。
- 進行更改。
- 提交一個清晰描述您改進的拉取請求。
此項目根據 AGPL-3.0 授權。