基于yolov5實現的AI智能盒子框架
- 開發背景
- 技術實現
- 產品效果
- 源碼預覽
- 功能介紹
2021-2023是沉淀的幾年,經濟不景氣,各行各業都不太好混,所以這幾年也沒有太多心思花在csdn上為各大網友寫一些技術文章,2024年初,也算是給自己留下一點歲月的足跡吧,所以把這段時間精心研究的東西寫出來供大家交流,順帶也看看是否有機會遇到能幫助到其他技術公司或朋友,在交流中實現雙贏,有需要的朋友可以威信(幺捌零叁捌捌伍陸柒零貳,威信與電畫同號),具體合作方式具體交流。
開發背景
從事安防多年,但基本都是從事音視頻的編解碼工作,很少處理圖形圖像相關算法,原因如下:
(1)圖形圖像相關算法如車牌識別識別、人臉識別等如果是自己研發,涉及到高等數學等及圖形圖像處理等高深的支持,開發難度較大;
(2)前n年基本沒有開源的、簡易的不需要熟悉底層算法的AI識別框架,很難將生活中涉及的AI識別或機器學習的相關算法變成現實;
主要基于以上兩點,導致AI相關的算法落地很難、實現很難、應用更難!
然后,基于百度paddle和yolo的開源框架出現了,這使得AI識別難度大大下降,應用門檻大大降低,然而paddle則是面向服務器,對硬件要求較高,部署也相對復雜,很難將普遍應用到生活中,所以經過多番調研yolo則是我們最好的選擇。
選擇yolo有如下優勢
(1)開源且識別效率非常高,僅需一次識別即可完成所有對象的分類識別。
(2)可以應用到服務器中,也可以應用到小型硬件中,本文部署的硬件就支持windows/ubun,支持jetson nano、jetson orin nano等3款中高低檔硬件(約5000元、3000元、1000元)
(3)開源技術論壇和資料較多
(4)支持使用python,支持跨平臺部署(一套代碼,多套環境部署)
在安防領域,基于音視頻的基礎操作已經基本上沒有任何難度(看視頻、直播、錄像等),但基于音視頻的AI應用卻很難,但隨著技術的成熟,這些應用也變得越來越多,結合生活實際需求的場景就有很多,例如
(1)非法闖入:夜間無人值守或重要地點進出監控
(2)摔倒檢測:關愛老人,老人摔倒檢測或打架斗毆跌倒檢測,可用于社區、監獄、廣場、學校等場所。
(3)明火識別:嚴禁煙火的第三方識別火焰,防止火宅,可用于森林、車間、化工產等場所。
(4)煙霧排放:同明火場景。
(5)越界檢測:越過指定邊界,產生報警,一般用于行人識別與闖入檢測,結合視頻區域檢測。可用于無人值守場景。
(6)睡崗檢測:工作期間睡覺檢測,避免安全事故發生。
(7)離崗檢測:工作期間離開崗位檢測,避免安全事故發生。
(8)人群聚眾:檢測人員聚集,避免打群架、避免踩踏事件發生。
(9)攀高檢測:檢測人員是否進行攀爬,避免安全事故發生。
(10)打架斗毆:檢測人員是否打架,可用于學校、公共場所。
(11)人臉抓拍:人臉數據抓拍,可推送給人臉識別服務進行1&1識別及陌生人識別。
(12)遮擋檢測:檢測攝像機是否被人為遮擋或被損壞。協調運維人員進行維護。
(13)垃圾滿溢:檢測垃圾桶垃圾是否滿溢,協助環衛人員智能調度環衛車輛,節省人力和物力。
(14)占道經營:檢測是否有占用道路非法經營,協助城管管理,減輕工作量。
(15)安全帽識別:工地安全帽識別,提高工地安全。
(16)反光衣識別:工地反光衣識別,防止非工作人員闖入工地區域。
(17)電動車進電梯:檢測電動車進出電梯,防止火災發生。
(18)口罩檢測:明廚亮灶,檢測食品從業人員是否佩戴口罩。
(19)蟲害識別:智慧農業,通過AI識別蟲害,智能指導農戶作業。
(20)動物識別:公共場所,不允許動物進出場所。
(21)電梯超員檢測:電梯人員是否超載工作。
(22)河邊垂釣檢測:嚴禁垂釣河邊檢測人員是否有釣魚或捕魚行為。
(23)河邊游泳檢測:嚴禁游泳河邊檢測人員是否有下水游泳行為。
(24)人數統計:人數統計或客流統計,通過AI方式統計繪制市場的客流熱力圖。
(25)抽煙檢測:明廚亮灶,檢測從業人員是否有吸煙行為。
(25)泥頭車識別:街道泥頭車隨意、掉土的事件。
(27)打電話識別:檢測開車是否有打電話行為。
(28)機動車/非機動車識別:機動車和非機動車識別。
(29)車流量統計:識別車輛及統計車流量
以上是我總結的貼近生活,很有可能在生活中非常實用的場景,這些算法都是可以通過數據采集進行一一訓練的。
技術實現
開發環境:pycharm
開發語言:python、vue2.0、pytorch、vision
部署環境:
(1)windows-conda、jetson-nano:conda(低配)、
(2)jetson orin nano:python、cuda、cudnn(sdk)(中高配)
(3)orange PI(正在適配中)
硬件選型:
(1)低配jetson naco(b01替換版本),ubuntu,價格1312元(含外殼),0.5tops,分析實時視頻約4路;一張圖約200ms~300ms耗時;
(2)中配jetson orin nano,ubuntu,價格3200元上下,20tops,分析實時視頻約8路;一張圖約100ms耗時;
(3)高配jetson orin nano,Ubuntu,價格在5200元上下,70-100tops,分析實時視頻約16路;一張圖約30ms耗時;
(4)國產華為芯片orange PI,4G,16核心,價格在1000元左右,分析視頻預估在16路;(正在適配中,硬件一片難求)
產品效果
為此,我開發了一個AI盒子框架,這個框架可以動態添加訓練好的模型、動態添加需要分析的網絡攝像機、動態為每一路攝像機添加不同的分析場景(算法)、動態配置AI盒子參數、動態重啟AI盒子等功能;
AI盒子提供了
(1)登錄AI盒子
AI盒子登錄頁面提供用戶名和密碼模式登錄,登錄后可以修改初始密碼。
為適配不同的地方需求,AI盒子最新版本,支持中文簡體版本、英文版本和中文繁體版本。
(2)系統首頁
AI盒子主要提供設備管理、報警管理、錄像管理、模型配置以及系統設置功能。
(3)設備管理
可以動態添加需要分析的設備,此處的設備為網絡設備,AI盒子通過設備的rtsp標準協議從攝像機獲取視頻流,然后進行抽幀分析,抽幀間隔可以動態進行配置。
可以控制設備進行AI抽幀的分析時間段控制,如早上08:00開始分析,到晚上23:00截止。
可以配置設備分析的區域,區域支持多邊形繪制(區域入侵)、繪制邊界線段(周界檢測)
(4)場景管理
一個設備抽幀的圖片,可以做不同場景的算法分析,例如一個攝像機可以同時分析明火煙霧檢測、攀爬檢測,也可以分析更多的算法(當然,算法越多,耗時就增加,不過對于在1-3秒內能實時響應就已經是非常適用了,可以忽略)
(5)報警管理
當分析場景檢測到超過設定置信度的預警時,會存儲到AI盒子中,AI盒子會將報警異步推送到配置的第三方平臺中,可以在AI盒子中保存n天
如果AI盒子打開報警錄像功能,AI盒子會自動錄取事件發生的前3秒以及后3秒,總共6秒錄像,這些錄像也會被推送給第三方平臺
(6)錄像管理
此外AI盒子支持視頻轉發(rtmp)、手動抓拍、遠程錄像功能,錄像后可以存儲在AI盒子,當推送給第三方平臺后會自動從本地移除
(7)模型管理
AI盒子提供模型載入、識別、上報等完整框架,并不固化整個流程,所以對AI盒子而已,算法、設備、場景都是靈活可以配置的,支持動態的模型添加功能,我們可以將訓練好的模型動態添加到AI盒子中
模型可以包括所有分析,哪些是屬于正常的(不會報警的),哪些屬于異常的(顯示紅框,可能要報警的)
(8)系統配置
AI盒子支持系統配置,配置項目包括AI盒子編碼(推送到第三方,區別多個盒子)、報警保存天數、并發分析數量控制、識別后是否顯示標簽、是否支持報警聯動錄像、是否凌晨自動重啟、報警第三方平臺介紹地址、長連接控制地址。
(9)GPIO及modbus聯動
此外,AI盒子支持自身引腳聯動或t通過外接modbus協議進行對接,以下為AI盒子定制的一個倉庫物料領取場景:
A、人通過人臉機刷臉開門進入物料倉庫(人臉機器聯動門磁)
B、門禁從常開(1狀態)變為斷點開門狀態(0),AI盒子檢測到人員進入,開始聯動攝像機進行錄像;
C、人員進入倉庫后領取物料,拿去完成之后將物料放置到物料臺,然后按墻壁上的拍照IO開關;
D、AI盒子檢測到AI開關后,聯動攝像機視頻進行物料實物抓拍,可以抓圖多張;
E、人員拍照后拿取物料并離開物料倉庫,門磁從開門(0)狀態恢復為常閉狀態(0);
F、AI盒子檢測到關門信號,停止聯動錄像,并將從門禁到出門的錄像+物料拍照打包存儲并發送給第三方平臺;
這樣,一個人從進門領取物料開始錄像==>物料拍照==>停止錄像整個過程留影留像,保留了整個過程的證據。如果是非法闖入則自動通過AI預警進行報警錄像,產生非法闖入預警,如果正常人臉刷臉進入則不會產生非法報警。
源碼預覽
(1)服務啟動
"""===========導入安裝的python庫==========="""
import sys
from pathlib import Pathfrom box.box import Box
from utils.general import check_requirements# 獲取當前文件路徑
FILE = Path(__file__).resolve()
# 獲取當前文件父目錄-YOLOv5根目錄
ROOT = FILE.parents[0]
# 獲取絕對路徑
PARENT = ROOT
# 將根目錄添加到系統path中
if str(ROOT) not in sys.path:sys.path.append(str(ROOT))# 程序啟動入口
if __name__ == '__main__':# 檢查請求參數check_requirements(ROOT / 'requirements.txt', exclude=('tensorboard', 'thop'))# 創建AI盒子box = Box()# 初始化盒子box.init()# 啟動AI盒子box.start()# 等待盒子退出box.join()# 停止AI盒子box.stop()
(2)websocket協議
# 報警推送實現
class SocketService(threading.Thread):# 構造函數def __init__(self):# 重寫父類方法threading.Thread.__init__(self)# 套接口self.ws = Noneself.connected = Falseself.do_run = True# 數據接收self.msg_thread = None# 視頻數量self.count = 0# 視頻回調self.video_back = Nonepass# 停止服務def stop(self):self.do_run = False# 關閉套接口if self.ws is not None:self.ws.close()# 等待接收退出if self.msg_thread is not None:if self.msg_thread.is_alive():self.msg_thread.join()pass# 設置命令回調def set_video_back(self, call):self.video_back = call# 響應結果def send_result(self, url, cmdId, state, desc, data=None, file_path=None):try:if url is None or cmdId is None:return# 請求字典dict_info = {}# 追加文件if file_path is not None:# 讀取文件內容file = open(file_path, "rb")name = os.path.basename(file_path)dict_info['file'] = (name, file, 'application/octet-stream')# 追加數據if data is not None:dict_info['data'] = data# multipart編碼encoder = MultipartEncoder(fields=dict_info)# 請求頭部headers = {'Content-Type': encoder.content_type}# 發送到第三方result_url = (url + "?boxId=" + SystemConfig.ID + "&cmdId=" + cmdId +"&state=" + str(state) + "&desc=" + desc)response = requests.post(result_url, json=data, headers=headers)if response.status_code != 200:return False# 處理返回結果result = response.json()# 處理返回結果if result['error'] != 0:error = result['error']LOGGER.error(f'upload box {SystemConfig.ID} command result failed, reason: {error}')return False# 返回成功結果return Trueexcept Exception as e:LOGGER.error(f'upload alarm error {e}')pass# 報警推送def run(self) -> None:# 開始時間last_time = datetime.datetime.now()while not Global.restart and self.do_run:try:# 查詢通信地址result_url = SystemConfig.ALARM_URLif SystemConfig.ALARM_URL is not None:if not result_url.endswith("/"):result_url += "/"result_url += "result"# 系統重啟if Global.restart:break# 連接服務器if not self.connected:if SystemConfig.SOCKET_URL is None or SystemConfig.SOCKET_URL == '':time.sleep(1)continuetry:# 連接服務self.ws = create_connection(SystemConfig.SOCKET_URL)self.connected = self.ws.connected# 連接成功if self.ws.connected:LOGGER.info(f'@connect websocket success: {SystemConfig.SOCKET_URL}')# 連接信息box = {'id': SystemConfig.ID,'ip': Global.ip,'port': Global.port,'cmd': 'connect'}# 發送連接self.ws.send(json.dumps(box))# 更新心跳時間last_time = datetime.datetime.now()# 同步盒子數據self.sync_server_data()passexcept Exception as e2:LOGGER.error(f'websocket connect error:{e2}')self.connected = Falsepass# 鏈接失敗等待if not self.connected:time.sleep(3)continue
(3)系統配置
# 系統全局配置
import uuidfrom box.util import SystemUtil# 全局配置
class Global:# 數據庫配置dbIp = '127.0.0.1'dbPort = 3306dbUser = 'root'dbPwd = 'root'dbName = 'box3'# web配置ip = '127.0.0.1'port = 5700# 系統重啟標志restart = False# 啟用串口信號讀取enableIO = False# linux-設備名LUX_IO_NAME = '/dev/ttyCH341USB0'# win-設備名WIN_IO_NAME = 'COM13'# 初始化def __init__(self):pass# 獲取本機ip@staticmethoddef local_ip():try:if Global.ip == '127.0.0.1':Global.ip = SystemUtil.get_local_ip()except Exception as e:print(f'get local ip error {e}')# 系統配置
class SystemConfig:# 盒子當前編碼ID = str(uuid.uuid1()).replace("-", "")# 系統登錄賬號ADMIN = 'admin'# 系統賬號密碼PASSWORD = 'dd123456'# 系統并發分析數PATROL_NUM = 4# 報警保存天數SAVE_DAYS = 1# 是否顯示標簽SHOW_LABEL = 1# 是否報警錄像ALARM_RECORD = 1# 是否定時重啟AUTO_RESTART = 1# 報警推送地址ALARM_URL = ''# 長連接地址SOCKET_URL = ''
(4)文件清理
import threading
import os
import time
from threading import Lockfrom box.config import Global
from utils.general import LOGGER# 文件異步清理
class FileClear(threading.Thread):# 待清理文件列表files = []# 全局文件列表鎖lock = Lock()# 構造函數def __init__(self):# 重寫父類方法threading.Thread.__init__(self)pass# 添加清理文件@classmethoddef push(cls, file):if file is None:returncls.lock.acquire()try:cls.files.append(file)except Exception as e:LOGGER.warning(f'add clear file error {e}')finally:cls.lock.release()pass# 報警推送def run(self) -> None:# 系統未重啟while not Global.restart:try:# 系統重啟if Global.restart:break# 嘗試清理try:# 獲取文件大鎖self.lock.acquire()# 當前系統無任務if len(self.files) <= 0:# 釋放文件大鎖self.lock.release()# 睡眠等待1秒time.sleep(1)continue# 刪除所有文件-忽略異常for file in self.files:try:os.remove(file)except Exception as e1:LOGGER.warning(f'{e1}')passpass# 清空數據self.files.clear()# 釋放文件大鎖self.lock.release()time.sleep(0.1)except Exception as e:# 釋放文件大鎖self.lock.release()LOGGER.warning(f'clear file error {e}')passexcept Exception as e:LOGGER.warning(f'clear file error: {e}')
由于功能較多,此處不在一一贅述,有需要合作的請聯系我(威信:幺捌零叁捌捌伍陸柒零貳,威信與電畫同號),咱們在進一步溝通。
功能介紹
AI盒子是基于yolov5框架開發的一套AI識別框架,可以支持多模型、多設備、多場景(算法)識別,支持http協議(同一個局域網)通信、支持websocket協議(不同局域網)通信,支持視頻取流識別,支持接口圖片AI識別、支持媒體視頻轉發(視頻播放)等功能。
AI盒子是獨立的個體,可以單獨部署(外接顯示器,通過瀏覽器即可實時查看報警、實時播放報警),AI盒子也可以集成外部平臺,通過AI盒子對接接口(包括http協議、websocket協議),將報警及錄像等信息推送至第三方平臺。
具體功能介紹如下所示
(1)系統配置
可以配置AI盒子的基本配置,包括AI盒子的編碼(多個盒子時對接外部使用)、錄像及報警保存天數、并發AI分析設備路數、AI預警是否顯示預警標簽、是否12點自動重啟(用不上,異常情況下處理)、第三方報警推送地址、第三方平臺信令下發連接地址(服務端下發指令到AI盒子,如模型下發、設備下發、場景下發、設備重啟、系統配置等)。這些配置都可以實時配置實時生效,不需要重啟。
(2)模型管理
可以通過AI盒子自帶的web端管理界面管理AI盒子中的模型,也可以通過AI盒子對接協議管理AI盒子模型,AI提供與模型無關的處理框架,訓練的模型分類根據實際填寫即可
(3)設備管理
AI盒子主要通過rtsp協議(標準)分析設備視頻流(海康、大華等都可以),通過視頻流幀采樣的方式(采樣幀頻率可以動態配置)分析對應設備的圖片流,并且支持指定時間段內進行分析(如工作時間或下班時間進行AI分析),實現設備動態管理、動態配置,除支持分析視頻流之外,當然AI盒子也提供了圖片分析接口(可以第三方通過接口投遞圖片并進行分析)并返回結果
(4)場景管理
AI分析的每一個設備(視頻流)都可以配置多個場景,如一個攝像機同時支持火焰識別、安全帽識別、摔倒檢測、打架斗毆等多個場景,由于AI盒子是框架,攝像機配置哪些場景都是可以動態靈活配置的。
(5)錄像管理
AI具有設備遠程錄像動能,當AI盒子啟動視頻轉發之后,可以通過websocket接口控制AI盒子進行手動錄像,AI會臨時存儲錄像信息在本地,當服務器正常時會自動將錄像信息推送給第三方平臺,然后清理本地的臨時錄像。
AI盒子也提供了web管理頁面對這些錄像進行管理,包括查詢、錄像播放、錄像清理等功能
(6)協議支持
AI盒子支持通過Http協議管理AI盒子配置、模型、設備、場景等(如AI的WEB端),也可以通過websocket協議下發和操作AI盒子,實現與AI和的多協議交互。
Http協議代碼案例
# 登錄盒子
@app.route("/user/login", methods=["POST"])
def login():# 獲取用戶信息json對象user_data = request.json# 獲取post的form表單賬號密碼username = user_data['username']password = user_data['password']# 賬號密碼無效if username is None or password is None:return jsonify({"error": -1, "description": "賬號或密碼無效!"})# 賬號信息校驗if username != SystemConfig.ADMIN:return jsonify({"error": -1, "description": "用戶名或密碼錯誤!"})# 用戶密碼校驗if password != SystemConfig.PASSWORD:return jsonify({"error": -1, "description": "用戶或密碼不正確!"})# 用戶密碼正確md5 = get_md5(username + ":" + password)# map字典轉jsonreturn jsonify({"error": 0, "description": "success", "value": md5})# 更新密碼
@app.route("/user/setPwd", methods=["PUT"])
def set_pwd():# 校驗用戶令牌result = check_token()if result['error'] != 0:return jsonify({"error": result['error'], "description": result['description']})# 獲取用戶信息user_data = request.jsonif user_data['oldPassword'] is None:return jsonify({"error": -1, "description": "原密碼為空"})if user_data['newPassword'] is None:return jsonify({"error": -1, "description": "新密碼為空"})if SystemConfig.PASSWORD != user_data['oldPassword']:return jsonify({"error": -1, "description": "原密碼不正確"})# 更新密碼SystemConfig.PASSWORD = user_data['newPassword']# 更新系統用戶user_info = {"username": SystemConfig.ADMIN, "password": user_data['newPassword']}config_mapper.update('ADMIN', json.dumps(user_info), 1)# map字典轉jsonreturn jsonify({"error": 0, "description": "success"})# 重啟盒子
@app.route("/system/reboot", methods=["GET"])
def reboot():# 停止web應用服務print("reboot box...")try:# 獲取app停止函數func = request.environ.get('werkzeug.server.shutdown')if func is None:raise RuntimeError('Not running with the Werkzeug Server')# 停止app服務func()except Exception as e:print(e)# 設置為重啟標志Global.restart = True# 等待5秒主程退出time.sleep(5)# posix:linux nt:windowsSystemUtil.reboot()# 如果機器還未重啟先返回成功return jsonify({"error": 0, "description": "success"})
websocket協議代碼
# 報警推送實現
class SocketService(threading.Thread):# 構造函數def __init__(self):# 重寫父類方法threading.Thread.__init__(self)# 套接口self.ws = Noneself.connected = Falseself.do_run = True# 數據接收self.msg_thread = None# 視頻數量self.count = 0# 視頻回調self.video_back = Nonepass# 停止服務def stop(self):self.do_run = False# 關閉套接口if self.ws is not None:self.ws.close()# 等待接收退出if self.msg_thread is not None:if self.msg_thread.is_alive():self.msg_thread.join()pass# 設置命令回調def set_video_back(self, call):self.video_back = call# 響應結果def send_result(self, url, cmdId, state, desc, data=None, file_path=None):try:if url is None or cmdId is None:return# 請求字典dict_info = {}# 追加文件if file_path is not None:# 讀取文件內容file = open(file_path, "rb")name = os.path.basename(file_path)dict_info['file'] = (name, file, 'application/octet-stream')# 追加數據if data is not None:dict_info['data'] = data# multipart編碼encoder = MultipartEncoder(fields=dict_info)# 請求頭部headers = {'Content-Type': encoder.content_type}# 發送到第三方result_url = (url + "?boxId=" + SystemConfig.ID + "&cmdId=" + cmdId +"&state=" + str(state) + "&desc=" + desc)response = requests.post(result_url, json=data, headers=headers)if response.status_code != 200:return False# 處理返回結果result = response.json()# 處理返回結果if result['error'] != 0:error = result['error']LOGGER.error(f'upload box {SystemConfig.ID} command result failed, reason: {error}')return False# 返回成功結果return Trueexcept Exception as e:LOGGER.error(f'upload alarm error {e}')pass
(7)視頻轉發
AI盒子具有視頻轉發功能,如AI盒子一般是最靠近攝像機的硬件(從服務器資源、帶寬和延時、效率等多方面考慮),所以AI盒子是可以訪問攝像機的,如果平臺是云端的或者服務端與AI盒子或攝像機不在同一個局域網,那么這樣就很有可能平臺無法播放攝像機視頻(除非使用海康的平臺-ehome協議或螢石云協議播放,或大華的自動注冊協議播放),為了能通過AI盒子查看攝像機的視頻,AI盒子就集成了這個功能,通過AI盒子就可以將視頻轉發到rtmp服務器,可以使用srs進行部署,使得視頻播放支持rtmp、http-flv、webrtc、hls等協議。
(8)報警預覽
AI盒子是獨立的個體,我們通過AI盒子的WEB端即可實時查看報警信息,當報警發生時候,AI盒子即可接收到報警信息,如下所示
(9)語音播報
web端支持tts預警語音播報功能,當開啟報警預覽時,接收到報警后,瀏覽器端就會播放對應的報警語音,只需要查看一個小音箱即可實現安保語音通知功能。
(10)web管理
AI盒子提供以上所有功能的web端管理功能。
(11)GPIO聯動錄像
AI盒子可以通過硬件連接的釋放實現對AI盒子聯動接入的攝像機進行實時錄像,也可以進行抓拍,這個場景主要用于倉庫物料管理系統的解決方案:
當人員通過人臉機正常刷臉進入倉庫時,人臉機聯動門磁開門,AI盒子通過APIO信號監測門磁開啟聯動關聯攝像機開始錄像;當人員進入倉庫后,領取物料,將物料放置到物料臺,按IO開關進行實物拍照(可以按多次),AI盒子通過信號監測聯動關聯攝像機進行抓拍,人員攜帶物料走出倉庫,關閉門禁,AI盒子通過檢測停止關聯攝像機的聯動錄像;
當人員通過非人臉方式非法闖入倉庫時,AI盒子通過區域入侵、人形識別等算法進行抓拍、錄像,并將報警信息實時推送給后臺管理員(第三發平臺或web端),管理員安排安保人員介入預警事件,保證公司財產安全;
實現場景如下所示
演示視頻如下所示
倉庫領料系統解決方案
第三方平臺進出倉庫記錄以及錄像信息
(12)遠程錄像
同GPIO聯動錄像之外,AI盒子 也支持手動遠程錄像和停止錄像功能,接口如下所示
(13)遠程抓拍
如圖上所示,AI盒子也支持播放視頻的同時進行實時抓拍。
(14)報警推送
AI可通過接口將報警推送到第三方平臺,如下所示
(15)錄像推送
如上所示,推送的報警包含錄像信息
(16)區域配置
AI盒子可以配置檢測視頻范圍的某一部分區域,可以配置區域內檢測,也可以配置邊界檢測,當檢測物體跨過邊界觸發報警
(17)文件清理
AI盒子會定期清理報警信息、報警錄像信息、聯動錄像信息等;
(18)資源國際化(多語言支持)
支持簡體中文、繁體中文、英文3中語言
(19)報警管理
AI盒子可以管理產生的報警信息、報警錄像等信息
以上是AI盒子具備的所有功能,由于盒子由python+vue框架開發,支持ubuntu、windows,支持CPU和 GPU,已經經過jetson nano、jetson orin nx高中低3種型號的適配,歡迎有需要的朋友請來電溝通交流(幺捌零叁捌捌伍陸柒零貳,威信與電畫同號),如果需要實物演示效果,可以提供遠程連接或實時視頻查看,目前產品已經經過3個版本(輪詢版本、實時版本、國際化版本),非常成熟,已經在項目中使用。