源鴻蒙人臉門(mén)禁:信創(chuàng)國(guó)產(chǎn)化落地與外設(shè)適配實(shí)踐)
門(mén)禁這東西平時(shí)沒(méi)人在乎直到某個(gè)周一早上八點(diǎn)半全樓的人堵在閘機(jī)前刷不開(kāi)門(mén)物業(yè)的電話(huà)十分鐘內(nèi)就會(huì)打到你手機(jī)上。我在這行待了十來(lái)年從最早的ID讀頭、指紋機(jī)到后來(lái)的二維碼、人臉機(jī)再到這兩年被問(wèn)得最多的一句話(huà)——你們這套東西是國(guó)產(chǎn)的嗎能不能過(guò)信創(chuàng)驗(yàn)收——行業(yè)的水溫變化基本都摸過(guò)一遍。深圳云識(shí)客提出的那套基于開(kāi)源鴻蒙的人臉門(mén)禁方案第一眼看到的時(shí)候我的反應(yīng)是終于有人把操作系統(tǒng)國(guó)產(chǎn)化這件事從辦公室的PC和服務(wù)器挪到了門(mén)禁這種帶外設(shè)、帶實(shí)時(shí)控制、還要跑AI推理的邊緣終端上來(lái)了。簡(jiǎn)單說(shuō)清楚這個(gè)東西是什么它以開(kāi)源鴻蒙OpenHarmony為系統(tǒng)底座在一顆國(guó)產(chǎn)主控上跑人臉門(mén)禁的完整業(yè)務(wù)——人臉注冊(cè)、活體檢測(cè)、比對(duì)開(kāi)門(mén)、韋根輸出、消防聯(lián)動(dòng)、考勤上報(bào)——整個(gè)軟硬件?;径悸湓趪?guó)產(chǎn)供應(yīng)鏈里目的是讓信創(chuàng)場(chǎng)景下的通行管理設(shè)備不再依賴(lài)境外操作系統(tǒng)和芯片。它能干的事說(shuō)白了就是把原來(lái)跑在安卓/Linux上的那臺(tái)人臉機(jī)換成一臺(tái)可控、可審計(jì)、可長(zhǎng)期維護(hù)的機(jī)器同時(shí)把識(shí)別速度、誤識(shí)率和設(shè)備壽命保持在能交付的水平。這篇文章寫(xiě)給誰(shuí)看如果你是系統(tǒng)集成商的項(xiàng)目經(jīng)理正在頭疼一個(gè)寫(xiě)字樓、園區(qū)或者數(shù)據(jù)中心的門(mén)禁國(guó)產(chǎn)化替換怎么落地如果你是嵌入式工程師第一次拿到OpenHarmony的源碼不知道怎么把攝像頭和繼電器接起來(lái)如果你是甲方的信息化負(fù)責(zé)人要寫(xiě)一份能過(guò)評(píng)審的技術(shù)方案——下面這些內(nèi)容應(yīng)該都能直接拿去用。我不會(huì)只講概念會(huì)把選型邏輯、驅(qū)動(dòng)適配、遷移節(jié)奏、現(xiàn)場(chǎng)踩過(guò)的坑都攤開(kāi)說(shuō)。1. 門(mén)禁行業(yè)為什么繞不開(kāi)國(guó)產(chǎn)化這道坎1.1 供應(yīng)鏈的現(xiàn)實(shí)壓力比政策文件更早到來(lái)很多人以為門(mén)禁國(guó)產(chǎn)化的推動(dòng)力來(lái)自驗(yàn)收文件其實(shí)最早感受到壓力的是采購(gòu)和供應(yīng)鏈。一臺(tái)人臉門(mén)禁機(jī)拆開(kāi)看主控SoC、內(nèi)存、閃存、Wi-Fi模組、加密芯片、攝像頭傳感器過(guò)去有相當(dāng)比例來(lái)自境外廠(chǎng)商。2020年前后那波缺貨做門(mén)禁的同行應(yīng)該都有印象某些型號(hào)的芯片交期從8周拉到40周報(bào)價(jià)一天一個(gè)樣項(xiàng)目簽了合同設(shè)備到不了場(chǎng)違約金自己扛。從那時(shí)候起能不能找到第二供應(yīng)源就成了硬件選型的硬指標(biāo)。信創(chuàng)在門(mén)禁這個(gè)品類(lèi)上的要求本質(zhì)上是三件事芯片自主可控、操作系統(tǒng)自主可控、整套產(chǎn)品的認(rèn)證資料齊全。前兩件是技術(shù)問(wèn)題第三件是流程問(wèn)題而流程問(wèn)題往往比技術(shù)問(wèn)題更折磨人。因?yàn)橐粋€(gè)門(mén)禁項(xiàng)目要交付的不只是設(shè)備還有一堆材料芯片的國(guó)產(chǎn)化證明、操作系統(tǒng)的版本說(shuō)明、軟件著作權(quán)、檢測(cè)報(bào)告。設(shè)備本身跑得再快材料湊不齊一樣過(guò)不了驗(yàn)收。我個(gè)人的判斷是門(mén)禁國(guó)產(chǎn)化不是要不要做的選擇題而是什么時(shí)候做、怎么做代價(jià)最小的時(shí)間題。現(xiàn)在還有大量安卓人臉機(jī)在項(xiàng)目上跑著這些設(shè)備未來(lái)三到五年會(huì)集中進(jìn)入替換周期誰(shuí)來(lái)接這個(gè)盤(pán)子取決于誰(shuí)現(xiàn)在把方案磨成熟了。1.2 門(mén)禁終端看著簡(jiǎn)單實(shí)際是最難換的一類(lèi)設(shè)備如果只是把一臺(tái)辦公電腦從Windows換成國(guó)產(chǎn)系統(tǒng)工作量大但路徑清晰。門(mén)禁機(jī)就麻煩得多它同時(shí)踩了三個(gè)雷區(qū)實(shí)時(shí)性要求刷卡到開(kāi)門(mén)用戶(hù)的心理預(yù)期是立刻。繼電器從收到指令到吸合整個(gè)過(guò)程不能有明顯延遲否則體驗(yàn)直接崩。一個(gè)通用操作系統(tǒng)如果沒(méi)有做實(shí)時(shí)性裁剪調(diào)度抖動(dòng)會(huì)讓人抓狂。外設(shè)碎片化嚴(yán)重一個(gè)門(mén)禁項(xiàng)目里可能同時(shí)存在韋根讀頭、RS485梯控、消防干接點(diǎn)、電鎖、門(mén)磁、出門(mén)按鈕每種外設(shè)的時(shí)序和電平都不一樣。這些驅(qū)動(dòng)原來(lái)在安卓生態(tài)里有大量現(xiàn)成的換到新系統(tǒng)上全得自己寫(xiě)或者自己改。算法要跑在本地人臉比對(duì)必須本地完成把圖片傳到云端再返回結(jié)果一次網(wǎng)絡(luò)抖動(dòng)就是一隊(duì)人堵在門(mén)口。這意味著底板上要同時(shí)扛住系統(tǒng)調(diào)度、視頻流采集、神經(jīng)網(wǎng)絡(luò)推理三件事。所以一個(gè)門(mén)禁方案的國(guó)產(chǎn)化絕不是換個(gè)系統(tǒng)鏡像這么簡(jiǎn)單它是系統(tǒng)層、驅(qū)動(dòng)層、算法層、業(yè)務(wù)層的同步遷移。這也是為什么大部分廠(chǎng)商寧愿繼續(xù)用安卓拖兩年也不愿意現(xiàn)在動(dòng)。1.3 開(kāi)源鴻蒙為什么適合做門(mén)禁的底座開(kāi)源鴻蒙在這個(gè)場(chǎng)景里的優(yōu)勢(shì)我說(shuō)幾個(gè)實(shí)際感受到的點(diǎn)不談宣傳口徑。第一是組件化裁剪能力強(qiáng)。OpenHarmony的內(nèi)核層支持輕量、小型、標(biāo)準(zhǔn)三種系統(tǒng)類(lèi)型門(mén)禁這類(lèi)設(shè)備不需要圖形化的完整桌面環(huán)境也不需要瀏覽器內(nèi)核那一整套東西可以把系統(tǒng)裁到幾百兆以?xún)?nèi)剩下的資源全部讓給算法和緩存。我做過(guò)的對(duì)比測(cè)試?yán)锿瑯右活w主控裁剪之后的系統(tǒng)冷啟動(dòng)時(shí)間比通用Linux方案短一截這在需要快速上電恢復(fù)的場(chǎng)景比如斷電重啟后閘機(jī)要立刻工作里很關(guān)鍵。第二是分布式軟總線(xiàn)帶來(lái)的組網(wǎng)可能性。一個(gè)園區(qū)里有幾十上百臺(tái)門(mén)禁如果每臺(tái)設(shè)備都要單獨(dú)配置、單獨(dú)升級(jí)、單獨(dú)拉數(shù)據(jù)運(yùn)維成本會(huì)爆炸。軟總線(xiàn)這套機(jī)制讓設(shè)備之間、設(shè)備與邊緣網(wǎng)關(guān)之間可以建立相對(duì)可信的連接做批量下發(fā)和狀態(tài)匯總會(huì)順手很多。當(dāng)然這一塊要真正用好還得自己在應(yīng)用層做不少工作不是開(kāi)箱即用。第三是供應(yīng)鏈與生態(tài)的匹配度。開(kāi)源鴻蒙的芯片適配列表里國(guó)產(chǎn)主控的覆蓋度這兩年提升很明顯從入門(mén)級(jí)到帶NPU的型號(hào)都有對(duì)應(yīng)移植版本。對(duì)一個(gè)要過(guò)信創(chuàng)驗(yàn)收的項(xiàng)目來(lái)說(shuō)這意味著芯片系統(tǒng)可以打包成一個(gè)互相背書(shū)的組合材料準(zhǔn)備起來(lái)省事。不過(guò)我得先把丑話(huà)說(shuō)前面開(kāi)源鴻蒙不是萬(wàn)能藥。它的工具鏈、調(diào)試體驗(yàn)、社區(qū)文檔的成熟度和安卓比還有差距尤其是涉及具體型號(hào)NPU的推理框架、某些冷門(mén)外設(shè)的驅(qū)動(dòng)你大概率要自己啃源碼。抱著換個(gè)系統(tǒng)就完事的心態(tài)進(jìn)來(lái)第一個(gè)月就會(huì)撞墻。下面幾章我會(huì)把這些墻一塊一塊標(biāo)出來(lái)。2. 整套方案拆開(kāi)看一臺(tái)人臉門(mén)禁里到底裝了什么2.1 硬件選型別在第一步就把自己鎖死硬件這塊我的原則很簡(jiǎn)單先定認(rèn)證范圍再定性能指標(biāo)最后才看價(jià)格。順序反了后面全是返工。一塊門(mén)禁主板要重點(diǎn)看這幾項(xiàng)部件關(guān)注點(diǎn)常見(jiàn)坑主控SoC是否在國(guó)產(chǎn)適配列表內(nèi)、是否有NPU、算力多少TOPS只看CPU主頻不看NPU推理全靠CPU跑幀率上不去內(nèi)存1GB起步跑人臉多路外設(shè)建議2GB512MB在壓力測(cè)試下頻繁觸發(fā)OOM存儲(chǔ)eMMC 8GB起步人臉庫(kù)大要留足空間人臉模板寫(xiě)滿(mǎn)后沒(méi)有告警機(jī)制直接寫(xiě)失敗攝像頭寬動(dòng)態(tài)、紅外補(bǔ)光、全局快門(mén)優(yōu)先用卷簾快門(mén)做活體快速移動(dòng)時(shí)拖影導(dǎo)致誤判加密芯片是否支持國(guó)密算法、密鑰是否可安全存儲(chǔ)人臉模板明文存eMMC安全評(píng)估直接掛繼電器/IO干接點(diǎn)輸出、門(mén)磁輸入、消防輸入數(shù)量消防聯(lián)動(dòng)接口預(yù)留不足后期加板子改結(jié)構(gòu)關(guān)于算力我一般按這個(gè)經(jīng)驗(yàn)值估算1:1比對(duì)刷臉找自己在200ms內(nèi)完成1:N檢索幾百到幾千人庫(kù)在500ms內(nèi)完成這是能接受的體驗(yàn)下限。如果NPU算力只有0.5TOPS做1:N檢索就得靠分級(jí)策略——先粗篩再精比否則排隊(duì)。這個(gè)后面第5章會(huì)展開(kāi)。注意主控選型一定要確認(rèn)開(kāi)源鴻蒙的移植版本是否包含你要用的那一路攝像頭接口MIPI還是USB。有些移植版本只適配了USB攝像頭而門(mén)禁結(jié)構(gòu)件里通常預(yù)留給MIPI的空間更小改起來(lái)要?jiǎng)幽>摺?.2 系統(tǒng)分層把資源花在刀刃上OpenHarmony的標(biāo)準(zhǔn)分層是內(nèi)核層、系統(tǒng)服務(wù)層、框架層、應(yīng)用層。放到門(mén)禁上我通常是這么分配的內(nèi)核層保留Linux內(nèi)核加必要的驅(qū)動(dòng)攝像頭、顯示、GPIO、網(wǎng)絡(luò)、看門(mén)狗把不需要的子系統(tǒng)全部裁掉。這里有個(gè)細(xì)節(jié)看門(mén)狗必須留而且必須配好。門(mén)禁設(shè)備裝在弱電井或者門(mén)框頂上一旦死機(jī)沒(méi)人會(huì)去重啟狗要能自己把設(shè)備拉回來(lái)。我一般設(shè)置喂狗周期和業(yè)務(wù)線(xiàn)程心跳綁定超過(guò)閾值沒(méi)喂就硬復(fù)位。系統(tǒng)服務(wù)層重點(diǎn)保留分布式軟總線(xiàn)、安全子系統(tǒng)、電源管理。圖形這塊看情況如果用的是簡(jiǎn)單的段碼屏或者小尺寸LCD其實(shí)可以不用完整的圖形框架直接走framebuffer繪制省下來(lái)的內(nèi)存給算法用。應(yīng)用層就是門(mén)禁業(yè)務(wù)本身設(shè)備管理、人員管理、識(shí)別服務(wù)、通行控制、記錄上報(bào)。我習(xí)慣把識(shí)別服務(wù)做成獨(dú)立的常駐進(jìn)程和業(yè)務(wù)UI解耦這樣界面刷新卡頓不會(huì)影響刷臉響應(yīng)。2.3 人臉?biāo)惴ū镜鼗堑拙€(xiàn)不是選項(xiàng)人臉識(shí)別在門(mén)禁里的技術(shù)路線(xiàn)這幾年基本收斂了檢測(cè)對(duì)齊特征提取比對(duì)四步全部在本地完成。云端只做人員信息同步和記錄匯總不做實(shí)時(shí)比對(duì)。為什么這么堅(jiān)持三個(gè)原因。一是延遲走公網(wǎng)一次往返少說(shuō)一兩百毫秒加上服務(wù)端排隊(duì)高峰期體驗(yàn)極差二是可靠性網(wǎng)絡(luò)斷了門(mén)還得開(kāi)這是物理安全的底線(xiàn)三是合規(guī)人臉屬于敏感個(gè)人信息能不往外傳就不往外傳把特征值存在本地加密分區(qū)里是最省事的合規(guī)姿勢(shì)。算法選型上我傾向于用輕量級(jí)的人臉模型參數(shù)量控制在幾MB級(jí)別輸入分辨率一般用112×112或者160×160。這里有個(gè)常見(jiàn)的誤區(qū)很多人覺(jué)得輸入分辨率越高識(shí)別越準(zhǔn)其實(shí)在門(mén)禁這種近距離、正臉為主的場(chǎng)景里過(guò)高的輸入分辨率只會(huì)拖慢推理收益非常有限。我做過(guò)對(duì)比320×320輸入相比160×160輸入識(shí)別率提升不到1個(gè)百分點(diǎn)但推理耗時(shí)翻了一倍多?;铙w檢測(cè)必須做而且要明確告訴甲方你做的是哪種。目前門(mén)禁上主流是近紅外活體加一路紅外攝像頭靠反射率差異判斷和可見(jiàn)光活體靠紋理、微動(dòng)、摩爾紋。近紅外的抗照片攻擊能力強(qiáng)成本高一點(diǎn)可見(jiàn)光方案便宜但對(duì)屏幕翻拍這類(lèi)攻擊的防護(hù)要弱一些。我的建議是園區(qū)、寫(xiě)字樓這類(lèi)場(chǎng)景用紅外方案成本可以接受內(nèi)部考勤點(diǎn)如果預(yù)算緊可見(jiàn)光方案也能頂?shù)鞔_寫(xiě)在方案里別到時(shí)候被抽查打臉。2.4 人臉數(shù)據(jù)怎么存、怎么刪這件事必須在設(shè)計(jì)階段定死數(shù)據(jù)這塊我踩過(guò)大坑。早期項(xiàng)目為了方便把人臉特征值和姓名、工號(hào)、部門(mén)明文存在同一張表里結(jié)果安全評(píng)估的時(shí)候被指出特征值和個(gè)人身份信息未做分離存儲(chǔ)整改花了兩周?,F(xiàn)在的做法是特征值單獨(dú)加密存儲(chǔ)密鑰走安全芯片或者TEE業(yè)務(wù)層只持有索引ID。設(shè)備本地不留原始人臉圖片注冊(cè)時(shí)在A(yíng)pp或者管理端完成采集和特征提取只把特征模板下發(fā)到設(shè)備。刪除人員的時(shí)候要先刪特征再刪索引最后寫(xiě)一條操作日志三者順序不能反否則會(huì)出現(xiàn)特征還在但查不到人的臟數(shù)據(jù)。還有一點(diǎn)常被忽略設(shè)備報(bào)廢或返廠(chǎng)維修時(shí)的數(shù)據(jù)清除流程。我在方案里會(huì)明確寫(xiě)一條設(shè)備下線(xiàn)前必須執(zhí)行恢復(fù)出廠(chǎng)并物理擦除加密分區(qū)出具清除記錄。這既是合規(guī)要求也是甲方安全部門(mén)最在意的東西。很多廠(chǎng)商在這塊只說(shuō)支持刪除但沒(méi)告訴甲方怎么驗(yàn)證刪除是不是真的刪干凈了交付時(shí)會(huì)很被動(dòng)。3. 從裸板到刷臉開(kāi)門(mén)核心環(huán)節(jié)的實(shí)操過(guò)程3.1 開(kāi)發(fā)環(huán)境搭建與源碼準(zhǔn)備環(huán)境這塊第一次搞OpenHarmony的人最容易卡在工具鏈上。我的建議是用官方推薦的Ubuntu LTS版本做編譯環(huán)境不要在Windows子系統(tǒng)里硬搞綁定USB設(shè)備調(diào)試的時(shí)候會(huì)各種玄學(xué)問(wèn)題。大致的準(zhǔn)備流程是這樣# 1. 基礎(chǔ)依賴(lài)一次性裝齊別一個(gè)個(gè)試 sudo apt-get update sudo apt-get install -y git-lfs curl python3-pip \ build-essential gcc-arm-linux-gnueabi \ libssl-dev libncurses5-dev # 2. 拉取repo工具 curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 repo chmod x repo sudo mv repo /usr/local/bin/ # 3. 初始化代碼倉(cāng)版本號(hào)按你拿到的適配包填 repo init -u 對(duì)應(yīng)版本倉(cāng)地址 -b release分支 --no-repo-verify repo sync -c -j8 --force-sync拉代碼這一步源碼體積不小網(wǎng)絡(luò)不穩(wěn)的話(huà)建議用-j4甚至-j2別貪快斷一次重來(lái)更費(fèi)時(shí)間。同步完之后先別急著改代碼先跑一次全量編譯確認(rèn)環(huán)境是通的這一步能幫你排除掉八成的環(huán)境問(wèn)題。./build/prebuilts_download.sh ./build.sh --product-name 你的產(chǎn)品名 --ccache--ccache強(qiáng)烈建議加上第一次編譯慢后面增量編譯能省大量時(shí)間。我第一次沒(méi)加改一行驅(qū)動(dòng)等了四十分鐘那感覺(jué)相當(dāng)酸爽。3.2 外設(shè)驅(qū)動(dòng)適配門(mén)禁的功夫全在這兒人臉門(mén)禁和普通開(kāi)發(fā)板最大的區(qū)別就是外設(shè)特別雜。我按踩坑頻率從高到低說(shuō)。攝像頭。MIPI攝像頭的適配通常芯片原廠(chǎng)會(huì)提供參考驅(qū)動(dòng)把它掛到HDF硬件驅(qū)動(dòng)框架下面重點(diǎn)是確認(rèn)三件事分辨率檔位、幀率、以及ISP圖像信號(hào)處理有沒(méi)有正常工作。我遇到過(guò)最詭異的一次問(wèn)題是畫(huà)面整體偏綠查了兩天發(fā)現(xiàn)是ISP的白平衡參數(shù)沒(méi)有加載因?yàn)榕渲梦募窂皆诋a(chǎn)品目錄下沒(méi)被正確打包進(jìn)去。韋根接口。這是門(mén)禁行業(yè)的老朋友26位、34位協(xié)議都用得多。它是單向、時(shí)序敏感的協(xié)議用GPIO加定時(shí)器實(shí)現(xiàn)比較穩(wěn)。核心邏輯是檢測(cè)數(shù)據(jù)線(xiàn)的下降沿按間隔區(qū)分0和1最后校驗(yàn)奇偶位。/* 韋根26接收的核心思路偽代碼實(shí)際要結(jié)合GPIO中斷和硬件定時(shí)器 */ static void wiegand_edge_handler(int d0_level, int d1_level) { if (d0_level 0) { bit_buffer[bit_index] 0; } else if (d1_level 0) { bit_buffer[bit_index] 1; } /* 超過(guò)約 25ms 無(wú)新邊沿判定一幀結(jié)束 */ reset_timer(25); } static void wiegand_frame_timeout(void) { if (bit_index 26 check_parity(bit_buffer)) { uint32_t card_no (extract_bits(bit_buffer, 1, 24)); notify_access_service(card_no); } bit_index 0; }注意韋根協(xié)議沒(méi)有時(shí)鐘線(xiàn)完全靠約定時(shí)序。如果同一根線(xiàn)上掛了兩臺(tái)設(shè)備或者線(xiàn)纜過(guò)長(zhǎng)超過(guò)100米邊沿會(huì)變形導(dǎo)致讀到錯(cuò)誤卡號(hào)。現(xiàn)場(chǎng)施工時(shí)一定要求用雙絞屏蔽線(xiàn)并且只做單向接收。繼電器與門(mén)磁。繼電器控制電鎖門(mén)磁反饋門(mén)的狀態(tài)。這里最重要的是失敗安全設(shè)計(jì)斷電時(shí)門(mén)應(yīng)該是開(kāi)還是關(guān)消防通道必須斷電開(kāi)Fail Safe金庫(kù)、機(jī)房必須斷電關(guān)Fail Secure。這個(gè)不是軟件邏輯問(wèn)題是接線(xiàn)和選型問(wèn)題但軟件層面要提供配置項(xiàng)讓同一個(gè)固件適配兩種接法。我在實(shí)際項(xiàng)目里會(huì)額外加一個(gè)開(kāi)門(mén)超時(shí)告警繼電器吸合超過(guò)設(shè)定秒數(shù)比如10秒門(mén)磁還沒(méi)反饋閉合就上報(bào)告警防止長(zhǎng)時(shí)間通電燒鎖。消防聯(lián)動(dòng)。消防信號(hào)一般是干接點(diǎn)輸入要求收到信號(hào)后強(qiáng)制常開(kāi)。這個(gè)東西平時(shí)不動(dòng)作但驗(yàn)收必測(cè)而且必須做成硬聯(lián)動(dòng)——不能只靠軟件輪詢(xún)GPIO最好同時(shí)走硬件通路軟件掛了消防信號(hào)也得能開(kāi)門(mén)。3.3 人臉識(shí)別業(yè)務(wù)的完整閉環(huán)把上面的零件串起來(lái)一次刷臉的完整流程是這樣的攝像頭持續(xù)采集檢測(cè)線(xiàn)程按固定頻率比如每200ms一幀做人體/人臉檢測(cè)沒(méi)有人臉就丟棄省算力檢測(cè)到人臉后觸發(fā)跟蹤等目標(biāo)穩(wěn)定連續(xù)N幀檢測(cè)到同一張臉再送對(duì)齊模塊對(duì)齊后裁剪出標(biāo)準(zhǔn)人臉區(qū)域做質(zhì)量評(píng)分評(píng)分過(guò)低太暗、太糊、角度過(guò)大直接提示請(qǐng)正對(duì)攝像頭不進(jìn)入比對(duì)活體檢測(cè)并行執(zhí)行紅外和可見(jiàn)光交叉驗(yàn)證特征提取得到特征向量與本地庫(kù)做1:N檢索命中且相似度超過(guò)閾值觸發(fā)開(kāi)門(mén)邏輯未命中則提示并記錄全程寫(xiě)通行記錄異步上報(bào)。這里面有兩個(gè)參數(shù)是調(diào)優(yōu)的關(guān)鍵我單獨(dú)說(shuō)。相似度閾值。這個(gè)值定得太低誤識(shí)率上升可能出現(xiàn)長(zhǎng)得像的人能開(kāi)別人的門(mén)定得太高本人刷不開(kāi)用戶(hù)體驗(yàn)崩。我的經(jīng)驗(yàn)是先在一批真實(shí)數(shù)據(jù)上跑出FAR誤識(shí)率和FRR拒識(shí)率的曲線(xiàn)然后按場(chǎng)景選工作點(diǎn)。寫(xiě)字樓可以選FAR稍高一點(diǎn)的位置體驗(yàn)優(yōu)先數(shù)據(jù)中心、機(jī)房這類(lèi)高安全區(qū)域把閾值往上提同時(shí)加一道卡臉的雙因子驗(yàn)證。質(zhì)量評(píng)分門(mén)限。這個(gè)值定得太嚴(yán)用戶(hù)在門(mén)口來(lái)回晃半天開(kāi)不了門(mén)定得太松低質(zhì)量圖片進(jìn)比對(duì)誤識(shí)率就上去了。我一般設(shè)置成正常人站定1秒內(nèi)能過(guò)。如果實(shí)測(cè)下來(lái)平均耗時(shí)超過(guò)2秒就說(shuō)明門(mén)限過(guò)嚴(yán)要往下調(diào)。/* 開(kāi)門(mén)決策的骨架邏輯 */ int access_decision(float similarity, float liveness_score, uint32_t card_no, int scene_mode) { float sim_th (scene_mode MODE_HIGH_SECURITY) ? 0.86f : 0.78f; float live_th 0.70f; if (liveness_score live_th) { report_event(EV_FAKE_FACE, card_no); return ACCESS_DENY; } if (scene_mode MODE_HIGH_SECURITY card_no 0) { /* 高安全場(chǎng)景必須卡臉雙因子缺一不可 */ return ACCESS_NEED_CARD; } if (similarity sim_th) { report_event(EV_PASS, card_no); return ACCESS_GRANT; } report_event(EV_NO_MATCH, card_no); return ACCESS_DENY; }這段代碼看著簡(jiǎn)單但閾值和場(chǎng)景模式的組合方式是決定一個(gè)項(xiàng)目現(xiàn)場(chǎng)能不能順利交付的核心。我的習(xí)慣是把閾值做成可遠(yuǎn)程下發(fā)的配置現(xiàn)場(chǎng)調(diào)試的時(shí)候不用重新燒固件直接改配置重啟服務(wù)就行效率高很多。3.4 與上層平臺(tái)的對(duì)接門(mén)禁設(shè)備終究是個(gè)終端數(shù)據(jù)要回平臺(tái)。對(duì)接這塊主流的幾種方式對(duì)接方式適用場(chǎng)景優(yōu)缺點(diǎn)HTTP/HTTPS 輪詢(xún)小規(guī)模、實(shí)時(shí)性要求低實(shí)現(xiàn)簡(jiǎn)單服務(wù)器壓力大延遲高M(jìn)QTT 長(zhǎng)連接中大規(guī)模、需要實(shí)時(shí)下發(fā)雙向通信好需要維護(hù)Broker私有TCP協(xié)議存量平臺(tái)改造性能好但協(xié)議不透明維護(hù)成本高標(biāo)準(zhǔn)門(mén)禁協(xié)議如OSDP對(duì)接第三方控制器互通性好功能受限我一般推薦MQTT。設(shè)備上電后連Broker訂閱自己的指令主題上報(bào)通行記錄和心跳。人員數(shù)據(jù)下發(fā)走一個(gè)批量接口一次下發(fā)一張?jiān)隽勘怼_@樣平臺(tái)側(cè)不用去猜設(shè)備在線(xiàn)狀態(tài)靠心跳超時(shí)就能判斷。這里有個(gè)實(shí)際教訓(xùn)下發(fā)人員數(shù)據(jù)一定要做冪等和分頁(yè)。我遇過(guò)一個(gè)園區(qū)項(xiàng)目一次下發(fā)五千人設(shè)備端解析的時(shí)候內(nèi)存爆了直接重啟重啟后又從頭下發(fā)死循環(huán)。后來(lái)改成每頁(yè)200人帶序號(hào)和校驗(yàn)設(shè)備確認(rèn)一頁(yè)平臺(tái)才發(fā)下一頁(yè)問(wèn)題就解決了。4. 存量門(mén)禁的國(guó)產(chǎn)化替換怎么落地4.1 遷移前的資產(chǎn)盤(pán)點(diǎn)這一步千萬(wàn)別省接手一個(gè)替換項(xiàng)目第一件事不是報(bào)價(jià)是盤(pán)點(diǎn)。我一般會(huì)做一張表把每臺(tái)設(shè)備的現(xiàn)狀摸清楚盤(pán)點(diǎn)項(xiàng)為什么重要設(shè)備型號(hào)與年限超期設(shè)備直接換還沒(méi)到期的考慮保留或者做網(wǎng)關(guān)兼容通信方式韋根、RS485、TCP還是私有協(xié)議決定替換難度卡片類(lèi)型ID、IC、CPU卡決定是否要?jiǎng)佑脩?hù)手里的卡人員數(shù)據(jù)量決定人臉庫(kù)規(guī)模和設(shè)備存儲(chǔ)選型現(xiàn)有平臺(tái)廠(chǎng)商決定要不要保留原平臺(tái)、做協(xié)議轉(zhuǎn)換還是整體換掉點(diǎn)位物理?xiàng)l件有沒(méi)有網(wǎng)口、有沒(méi)有預(yù)留電源、門(mén)框能不能裝新設(shè)備這張表看著樸素但它能幫你判斷出哪些點(diǎn)位可以快速替換、哪些點(diǎn)位是硬骨頭。我見(jiàn)過(guò)太多項(xiàng)目因?yàn)闆](méi)盤(pán)點(diǎn)清楚施工隊(duì)到了現(xiàn)場(chǎng)才發(fā)現(xiàn)門(mén)框是內(nèi)嵌式的新設(shè)備尺寸不匹配只能現(xiàn)場(chǎng)改結(jié)構(gòu)工期一拖再拖。4.2 分區(qū)分期替換別想著一次性推倒重來(lái)存量項(xiàng)目的替換我的主張是永遠(yuǎn)不要一次性全網(wǎng)切換。原因很實(shí)在門(mén)禁是通行剛需切換失敗就是全員堵門(mén)這個(gè)風(fēng)險(xiǎn)沒(méi)人擔(dān)得起。具體節(jié)奏我一般這么安排第一階段并行試點(diǎn)選一個(gè)人流量中等、影響面可控的點(diǎn)位比如某個(gè)側(cè)門(mén)或者后勤通道新老設(shè)備并行運(yùn)行兩到四周。這個(gè)階段的目標(biāo)不是驗(yàn)證功能是驗(yàn)證穩(wěn)定性——連續(xù)跑一個(gè)月不出故障才敢往下推。第二階段分區(qū)替換按樓棟或者樓層分批每批替換前一周通知替換當(dāng)天安排人到現(xiàn)場(chǎng)盯準(zhǔn)備好回滾方案把老設(shè)備留在庫(kù)房出問(wèn)題半小時(shí)內(nèi)換回去。第三階段數(shù)據(jù)收口所有點(diǎn)位換完之后老平臺(tái)的數(shù)據(jù)做一次全量歸檔形成歷史記錄然后下線(xiàn)老平臺(tái)。每個(gè)階段的間隔不要太短尤其是第一階段我寧可多跑兩周。試點(diǎn)跑出來(lái)的問(wèn)題越多越好這些問(wèn)題在試點(diǎn)階段是麻煩在全網(wǎng)階段就是事故。4.3 卡片兼容最容易被低估的坑人員數(shù)據(jù)遷移里最麻煩的往往不是人臉是卡。很多老項(xiàng)目用的是ID卡只讀卡號(hào)新設(shè)備如果不支持ID讀頭用戶(hù)手里的卡就等于作廢得重新發(fā)卡。一個(gè)幾千人的園區(qū)重新發(fā)卡光是通知、收集、制卡、發(fā)放就是幾周的工作量還要處理我的卡剛好丟了這種突發(fā)情況。我的處理方式分三種第一種新設(shè)備直接支持原有卡類(lèi)型。這是最省事的成本是硬件上多一個(gè)讀頭或者多一個(gè)模塊但對(duì)甲方來(lái)說(shuō)體驗(yàn)最好用戶(hù)無(wú)感。第二種保留老讀頭通過(guò)韋根接入新控制器。適合老讀頭還能用、只是主控要換的場(chǎng)景。這樣卡不動(dòng)人不動(dòng)只換大腦。第三種過(guò)渡期雙軌。新老系統(tǒng)同時(shí)識(shí)別發(fā)新卡的同時(shí)老卡繼續(xù)有效一段時(shí)間等大家都拿到新卡了再停老卡。這個(gè)方案最貴但風(fēng)險(xiǎn)最低適合對(duì)通行連續(xù)性要求極高的場(chǎng)景。提示做卡片遷移前一定要抽一批卡做實(shí)測(cè)確認(rèn)卡號(hào)讀取方式和原系統(tǒng)一致。我遇到過(guò)原系統(tǒng)讀的是卡號(hào)的某一段新設(shè)備讀的是完整卡號(hào)導(dǎo)致數(shù)據(jù)對(duì)不上全員無(wú)法開(kāi)門(mén)那場(chǎng)面相當(dāng)難看。4.4 國(guó)產(chǎn)化終端的日常運(yùn)維命令行是繞不過(guò)去的設(shè)備上線(xiàn)之后運(yùn)維才是長(zhǎng)跑。國(guó)產(chǎn)化終端里很多現(xiàn)場(chǎng)工程師最不習(xí)慣的就是沒(méi)有圖形化工具什么都要敲命令行。這里我把最常用的幾個(gè)動(dòng)作整理一下都是實(shí)測(cè)可用的。進(jìn)入命令行一般有這么幾種途徑串口調(diào)試口板子上通常有調(diào)試串口波特率常見(jiàn)115200、SSH設(shè)備開(kāi)了網(wǎng)口和SSH服務(wù)的話(huà)、以及通過(guò)ADB類(lèi)似的調(diào)試通道。現(xiàn)場(chǎng)最穩(wěn)的是串口因?yàn)樗灰蕾?lài)網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)配錯(cuò)了也能進(jìn)去救。登錄之后文件操作是最基礎(chǔ)的。查找文件用find刪除用rm但這兩個(gè)命令在設(shè)備上要格外小心# 按名稱(chēng)查找限制深度避免遍歷整個(gè)文件系統(tǒng)拖慢設(shè)備 find /data/app -maxdepth 3 -name *.log -type f # 按時(shí)間查找找出最近一天修改過(guò)的配置 find /etc -type f -mtime -1 # 查看大文件占用找出是誰(shuí)把空間吃掉了 du -sh /data/* | sort -rh | head -10 # 刪除前先確認(rèn)強(qiáng)烈建議先 ls 一遍 ls /data/log/2024*.log rm -f /data/log/2024*.log # 危險(xiǎn)操作不要碰這幾條刪了設(shè)備就起不來(lái)了 # rm -rf /system /vendor /data/service我的習(xí)慣是任何rm -rf之前必須先跑一遍對(duì)應(yīng)的ls確認(rèn)輸出的是你想刪的東西。這個(gè)習(xí)慣救過(guò)我至少三次。還有一條設(shè)備上如果做的是只讀文件系統(tǒng)刪除操作會(huì)失敗或者重啟后恢復(fù)別以為是沒(méi)刪掉先確認(rèn)掛載方式。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 現(xiàn)場(chǎng)故障速查表這張表是我這些年攢下來(lái)的基本上現(xiàn)場(chǎng)八成的報(bào)修都能對(duì)上號(hào)現(xiàn)象可能原因排查方向刷臉沒(méi)反應(yīng)屏幕正常識(shí)別服務(wù)進(jìn)程掛了查進(jìn)程、看日志最后一行、確認(rèn)內(nèi)存是否耗盡識(shí)別變慢越用越卡人臉庫(kù)過(guò)大或內(nèi)存泄漏看內(nèi)存曲線(xiàn)是否持續(xù)上漲確認(rèn)1:N檢索規(guī)模偶爾誤開(kāi)別人的門(mén)閾值過(guò)低或特征相似調(diào)高閾值檢查是否用了質(zhì)量過(guò)差的注冊(cè)照片刷卡無(wú)效人臉正常韋根線(xiàn)序或讀頭供電量電壓、換線(xiàn)、確認(rèn)協(xié)議位數(shù)門(mén)鎖吸合但門(mén)沒(méi)開(kāi)機(jī)械卡滯或電鎖功率不足手動(dòng)推門(mén)測(cè)試量電鎖供電電流設(shè)備頻繁重啟電源不穩(wěn)或看門(mén)狗誤觸發(fā)測(cè)電源紋波延長(zhǎng)喂狗周期查是否有死循環(huán)網(wǎng)絡(luò)時(shí)通時(shí)斷IP沖突或網(wǎng)線(xiàn)質(zhì)量換靜態(tài)IP用長(zhǎng)ping觀(guān)察丟包紅外活體誤拒補(bǔ)光不足或鏡頭臟污清潔鏡頭檢查紅外燈是否點(diǎn)亮表格只能給方向真正的定位還得看日志。我強(qiáng)烈建議在固件里做一個(gè)本地日志滾動(dòng)機(jī)制保留最近若干天的關(guān)鍵事件別指望現(xiàn)場(chǎng)連網(wǎng)去平臺(tái)撈日志很多時(shí)候網(wǎng)絡(luò)本身就是故障原因。5.2 識(shí)別率調(diào)優(yōu)先看數(shù)據(jù)再動(dòng)參數(shù)調(diào)優(yōu)這件事最忌諱的就是憑感覺(jué)改參數(shù)。我的做法是固定一套測(cè)試流程準(zhǔn)備一個(gè)測(cè)試集包含本單位真實(shí)人員的照片這是關(guān)鍵用一個(gè)公開(kāi)數(shù)據(jù)集調(diào)出來(lái)的參數(shù)在你這個(gè)單位的燈光下可能完全不適用。在早、中、晚三個(gè)時(shí)段各測(cè)一輪記錄每組數(shù)據(jù)的通過(guò)率和平均耗時(shí)。只有拿到這個(gè)基線(xiàn)你才知道改參數(shù)到底有沒(méi)有用。幾個(gè)最常調(diào)的參數(shù)和作用方向檢測(cè)閾值調(diào)低更容易檢出人臉但會(huì)帶來(lái)更多誤檢調(diào)高則相反人多的時(shí)候可能漏檢。質(zhì)量門(mén)限調(diào)低更快通過(guò)但低質(zhì)量圖片進(jìn)比對(duì)會(huì)拉高誤識(shí)率謹(jǐn)慎下調(diào)。比對(duì)閾值最敏感的參數(shù)每次調(diào)整幅度不要超過(guò)0.02調(diào)完必須重測(cè)。跟蹤幀數(shù)決定目標(biāo)穩(wěn)定多久才送比對(duì)調(diào)大更穩(wěn)但更慢一般3到5幀。我的經(jīng)驗(yàn)是先把檢測(cè)和質(zhì)量環(huán)節(jié)調(diào)順讓送進(jìn)比對(duì)環(huán)節(jié)的都是好圖再動(dòng)比對(duì)閾值。順序反了會(huì)陷入改了閾值發(fā)現(xiàn)還是不穩(wěn)的死循環(huán)。另外一個(gè)容易被忽略的點(diǎn)是注冊(cè)照的質(zhì)量。很多單位的員工照片是從工牌系統(tǒng)里直接導(dǎo)入的有的模糊、有的側(cè)臉、有的還戴著帽子。這些照片注冊(cè)進(jìn)去識(shí)別率必然差。正確做法是統(tǒng)一用設(shè)備現(xiàn)場(chǎng)采集注冊(cè)或者至少對(duì)導(dǎo)入的照片做質(zhì)量校驗(yàn)不合格的強(qiáng)制重新采集。這一步做扎實(shí)識(shí)別率能提升一大截比調(diào)參數(shù)有效得多。5.3 穩(wěn)定性與功耗決定設(shè)備能不能活滿(mǎn)五年門(mén)禁設(shè)備的交付周期一般標(biāo)五年實(shí)際很多人希望用八年。能不能撐住看三件事。散熱。帶NPU的主控滿(mǎn)載時(shí)發(fā)熱不小而門(mén)禁機(jī)的結(jié)構(gòu)往往很小、甚至全封閉。我做過(guò)的項(xiàng)目里夏天高溫環(huán)境下設(shè)備表面溫度能到六七十度長(zhǎng)期下來(lái)eMMC壽命衰減很快。解決辦法是降低推理頻率——沒(méi)必要每幀都跑人臉檢測(cè)可以按固定間隔執(zhí)行配合運(yùn)動(dòng)檢測(cè)觸發(fā)。這一調(diào)整能把平均功耗降下來(lái)不少。寫(xiě)操作次數(shù)。eMMC有寫(xiě)入壽命日志和記錄如果無(wú)節(jié)制地寫(xiě)幾年下來(lái)可能就寫(xiě)壞了。我一般會(huì)把日志分區(qū)單獨(dú)劃出來(lái)做滾動(dòng)覆蓋通行記錄先寫(xiě)內(nèi)存隊(duì)列批量落盤(pán)避免每條記錄都觸發(fā)一次寫(xiě)盤(pán)操作。斷電保護(hù)。門(mén)禁斷電是常態(tài)但斷電瞬間如果在寫(xiě)數(shù)據(jù)可能造成文件系統(tǒng)損壞。方案里要么加超級(jí)電容做掉電保存要么把關(guān)鍵數(shù)據(jù)做成先寫(xiě)臨時(shí)文件再原子替換的方式避免寫(xiě)到一半斷電留下半個(gè)文件。6. 信創(chuàng)選型與合規(guī)資料的一份實(shí)操清單6.1 認(rèn)證和目錄怎么看別被銷(xiāo)售話(huà)術(shù)帶跑信創(chuàng)相關(guān)的認(rèn)證和目錄種類(lèi)不少名稱(chēng)也容易混。作為方案負(fù)責(zé)人你需要搞清楚的是你交付的這臺(tái)設(shè)備具體要滿(mǎn)足甲方的哪一條要求。有的項(xiàng)目只要求操作系統(tǒng)和芯片在目錄內(nèi)有的項(xiàng)目要求整機(jī)有檢測(cè)報(bào)告有的還要求軟件著作權(quán)和代碼自主率說(shuō)明。這三種要求對(duì)應(yīng)的準(zhǔn)備工作量差得很遠(yuǎn)。我的建議是做一份資料清單逐項(xiàng)確認(rèn)資料項(xiàng)由誰(shuí)提供常見(jiàn)問(wèn)題芯片國(guó)產(chǎn)化說(shuō)明主控廠(chǎng)商型號(hào)寫(xiě)法和目錄不一致需要廠(chǎng)商出函操作系統(tǒng)版本說(shuō)明系統(tǒng)方案商版本號(hào)要能對(duì)應(yīng)到具體發(fā)布版本整機(jī)檢測(cè)報(bào)告整機(jī)廠(chǎng)商送檢樣機(jī)和量產(chǎn)機(jī)不一致會(huì)出問(wèn)題軟件著作權(quán)開(kāi)發(fā)方著作權(quán)名稱(chēng)和產(chǎn)品名稱(chēng)對(duì)不上密碼模塊相關(guān)材料安全模塊供應(yīng)商用了國(guó)密算法但拿不出證明材料數(shù)據(jù)安全說(shuō)明方案方人臉數(shù)據(jù)存儲(chǔ)和清除流程說(shuō)明缺失這里面最容易出問(wèn)題的是型號(hào)一致性。芯片廠(chǎng)商的正式型號(hào)、目錄里的登記型號(hào)、你BOM里的寫(xiě)法經(jīng)常是三套不同的字符串。交付前一定要把這些對(duì)齊讓廠(chǎng)商出一份蓋章的說(shuō)明。這個(gè)事在項(xiàng)目后期做會(huì)非常被動(dòng)最好在選型階段就鎖定。6.2 方案選型的幾個(gè)判斷標(biāo)準(zhǔn)最后說(shuō)點(diǎn)選型上的個(gè)人偏好供參考。第一看系統(tǒng)的長(zhǎng)期維護(hù)能力不看一時(shí)的功能列表。開(kāi)源鴻蒙的版本迭代比較快選方案商的時(shí)候要問(wèn)清楚這個(gè)版本你們計(jì)劃維護(hù)幾年安全補(bǔ)丁怎么跟系統(tǒng)大版本升級(jí)的時(shí)候我的應(yīng)用要不要跟著改這些問(wèn)題答不上來(lái)的后期大概率會(huì)變成孤兒版本。第二看驅(qū)動(dòng)適配的完備程度不看演示效果。演示的時(shí)候接一路攝像頭、一個(gè)繼電器誰(shuí)都能跑通。要問(wèn)的是韋根讀頭支持哪些協(xié)議位數(shù)RS485能不能做梯控消防輸入是否支持硬聯(lián)動(dòng)這些邊角料才是門(mén)禁的真實(shí)工作量所在。第三看數(shù)據(jù)方案是否經(jīng)得起追問(wèn)。人臉數(shù)據(jù)怎么存、存多久、怎么刪、誰(shuí)能看到這四個(gè)問(wèn)題如果有任何一個(gè)答得含糊就別往高安全場(chǎng)景里推。寧可多花點(diǎn)成本做加密存儲(chǔ)和分級(jí)權(quán)限也別在驗(yàn)收環(huán)節(jié)被卡住。第四算總成本不算設(shè)備單價(jià)。國(guó)產(chǎn)化門(mén)禁的單臺(tái)價(jià)格通常比同規(guī)格的安卓設(shè)備略高但要看全周期功耗、故障率、運(yùn)維人力、替換周期。我做過(guò)幾個(gè)項(xiàng)目的粗略測(cè)算如果一臺(tái)國(guó)產(chǎn)設(shè)備能多穩(wěn)定運(yùn)行兩年省下的現(xiàn)場(chǎng)維護(hù)人力和停用損失基本能覆蓋掉這部分差價(jià)。當(dāng)然這個(gè)賬每個(gè)項(xiàng)目情況不同得按實(shí)際算。我個(gè)人在實(shí)際操作中的體會(huì)是門(mén)禁國(guó)產(chǎn)化這件事技術(shù)難點(diǎn)其實(shí)集中在外設(shè)適配和現(xiàn)場(chǎng)調(diào)試這兩塊系統(tǒng)本身反而不是最大的障礙。真正讓項(xiàng)目翻車(chē)的往往是資料不齊、型號(hào)對(duì)不上、卡遷移沒(méi)測(cè)、試點(diǎn)沒(méi)跑夠。這些活兒看著瑣碎但它們決定了一個(gè)方案是從能演示走到能交付還是停在PPT里。最后再分享一個(gè)小技巧做這類(lèi)替換項(xiàng)目的時(shí)候我會(huì)在庫(kù)房里額外留兩臺(tái)調(diào)試機(jī)一臺(tái)保持出廠(chǎng)狀態(tài)一臺(tái)保持和生產(chǎn)完全一致的固件。現(xiàn)場(chǎng)出了問(wèn)題可以立刻拿同配置機(jī)器復(fù)現(xiàn)比遠(yuǎn)程猜要快得多。這個(gè)習(xí)慣是從一次半夜被叫去機(jī)房、結(jié)果發(fā)現(xiàn)是現(xiàn)場(chǎng)網(wǎng)絡(luò)配置錯(cuò)了之后養(yǎng)成的代價(jià)不小但很值。