在行空板上部署MediaPipe實(shí)現(xiàn)實(shí)時(shí)人像分割與摳圖
1. 項(xiàng)目緣起為什么要在行空板上折騰MediaPipe摳圖最近在做一個(gè)智能交互展項(xiàng)需要在資源受限的嵌入式設(shè)備上實(shí)時(shí)處理攝像頭畫面把人物從背景里干凈地“摳”出來。一開始想到的是上云或者用高性能工控機(jī)跑OpenCVDeeplabv3但成本、延遲和部署復(fù)雜度都成了問題。直到我把目光投向了手邊的行空板UNIHIKER和Google的MediaPipe一個(gè)想法冒了出來能不能在這塊小巧的板子上實(shí)現(xiàn)一個(gè)夠用、實(shí)時(shí)的人物摳圖系統(tǒng)行空板是一塊基于Linux系統(tǒng)的開源硬件集成了屏幕、按鍵和豐富的傳感器性能對于嵌入式應(yīng)用來說相當(dāng)不錯(cuò)。而MediaPipe作為一個(gè)跨平臺的機(jī)器學(xué)習(xí)管道框架其輕量級模型和高效的推理引擎是出了名的。它的Selfie Segmentation模型專門為實(shí)時(shí)人像分割優(yōu)化模型小巧僅幾MB在移動(dòng)端都能流暢運(yùn)行。那么把它移植到行空板的ARM架構(gòu)上理論上完全可行。這個(gè)組合的意義在于它把需要強(qiáng)大算力的“摳圖”這件事下沉到了邊緣設(shè)備實(shí)現(xiàn)了低延遲、高隱私、離線可用的實(shí)時(shí)人像處理非常適合教育、互動(dòng)藝術(shù)、輕量級智能終端等場景。2. 行空板開發(fā)環(huán)境搭建與核心依賴部署要在行空板上跑通MediaPipe第一步就是把環(huán)境給配齊了。行空板默認(rèn)運(yùn)行的是Debian系統(tǒng)這給我們提供了很大的便利。2.1 系統(tǒng)準(zhǔn)備與基礎(chǔ)包安裝首先通過SSH或者直接使用行空板的終端更新軟件源并安裝一些基礎(chǔ)編譯工具和Python環(huán)境管理工具。sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-venv git wget curl build-essential cmake我強(qiáng)烈建議使用Python虛擬環(huán)境來管理項(xiàng)目依賴避免污染系統(tǒng)環(huán)境。cd ~ python3 -m venv mp_env source mp_env/bin/activate激活虛擬環(huán)境后命令提示符前會(huì)出現(xiàn)(mp_env)的標(biāo)識。2.2 MediaPipe Python包的安裝挑戰(zhàn)與解決MediaPipe官方提供了Python輪子wheel但主要是針對x86_64架構(gòu)和特定的ARM64架構(gòu)如樹莓派。行空板使用的處理器可能需要我們尋找兼容的版本或者從源碼編譯。最穩(wěn)妥的方法是安裝MediaPipe針對Linux ARM的版本。pip3 install --upgrade pip對于大多數(shù)基于ARMv8的行空板可以嘗試安裝官方的Linux ARM版本。但根據(jù)我的實(shí)測直接pip install mediapipe可能會(huì)因?yàn)榧軜?gòu)不匹配而失敗。一個(gè)更可靠的方案是使用由社區(qū)維護(hù)的、針對特定平臺預(yù)編譯的版本或者利用MediaPipe的“自定義包”功能。不過為了最廣泛的兼容性我采用了另一種更直接的方法使用MediaPipe的輕量級解決方案即不安裝完整的mediapipe包而是使用其提供的.tflite模型文件結(jié)合TensorFlow Lite運(yùn)行時(shí)進(jìn)行推理。這是因?yàn)镸ediaPipe Selfie Segmentation模型本身就是一個(gè)TFLite模型我們可以直接下載并使用它。# 安裝TensorFlow Lite運(yùn)行時(shí) pip3 install tflite-runtime如果tflite-runtime安裝遇到問題也可以嘗試安裝完整的TensorFlow稍重但兼容性好pip3 install tensorflow2.3 模型文件獲取與OpenCV安裝接下來下載MediaPipe的Selfie Segmentation模型。我們可以從MediaPipe的官方GitHub倉庫獲取。mkdir -p ~/selfie_segmentation/models cd ~/selfie_segmentation/models wget -O selfie_segmentation.tflite https://storage.googleapis.com/mediapipe-models/image_segmenter/selfie_segmentation/float16/1/selfie_segmentation.tflite這個(gè)float16版本的模型在精度和速度上取得了很好的平衡非常適合行空板。同時(shí)我們還需要安裝OpenCV來處理圖像。pip3 install opencv-python-headless這里安裝的是headless版本因?yàn)樗话珿UI相關(guān)的庫如GTK在服務(wù)器或行空板這種無桌面環(huán)境或輕量桌面環(huán)境下更節(jié)省資源。如果你的應(yīng)用需要利用行空板自帶的屏幕顯示圖像可能需要額外安裝opencv-python包含GUI支持但通常headless版本配合行空板自帶的顯示接口也是可以的。至此最核心的環(huán)境和模型就準(zhǔn)備好了。這種“TFLite運(yùn)行時(shí) 獨(dú)立模型文件”的方式比安裝完整的MediaPipe Python包更加輕量依賴更少是嵌入式部署的常見做法。3. 圖像分割與摳圖的核心代碼實(shí)現(xiàn)有了模型和環(huán)境接下來就是編寫代碼實(shí)現(xiàn)從讀取圖像到輸出摳圖結(jié)果的完整流程。這個(gè)過程可以分為幾個(gè)關(guān)鍵步驟圖像預(yù)處理、模型推理、后處理生成掩膜和圖像合成。3.1 圖像預(yù)處理與模型輸入適配MediaPipe Selfie Segmentation模型的輸入要求是RGB三通道圖像尺寸為256x256像素像素值歸一化到[0, 1]的浮點(diǎn)數(shù)。我們需要將任意尺寸的輸入圖像比如從行空板攝像頭讀取的轉(zhuǎn)換到這個(gè)格式。import cv2 import numpy as np import tflite_runtime.interpreter as tflite def preprocess_image(image): 將輸入圖像預(yù)處理為模型所需的格式。 Args: image: numpy數(shù)組BGR格式OpenCV默認(rèn)。 Returns: input_data: 形狀為(1, 256, 256, 3)的numpy數(shù)組RGB格式值范圍[0,1]。 original_shape: 原始圖像的形狀用于后續(xù)還原。 # 記錄原始尺寸 original_shape image.shape[:2] # (height, width) # 將BGR轉(zhuǎn)換為RGB rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 縮放到256x256 resized_image cv2.resize(rgb_image, (256, 256)) # 將像素值從[0,255]轉(zhuǎn)換為[0,1]的浮點(diǎn)數(shù) input_data resized_image.astype(np.float32) / 255.0 # 添加批次維度變成 (1, 256, 256, 3) input_data np.expand_dims(input_data, axis0) return input_data, original_shape這里有一個(gè)關(guān)鍵點(diǎn)OpenCV默認(rèn)讀入的圖像是BGR通道順序而模型通常期望RGB順序。cv2.cvtColor這個(gè)轉(zhuǎn)換必不可少否則顏色通道錯(cuò)亂會(huì)導(dǎo)致模型識別異常。3.2 加載TFLite模型并執(zhí)行推理我們使用TFLite解釋器來加載和運(yùn)行模型。def initialize_interpreter(model_path): 初始化TFLite解釋器。 interpreter tflite.Interpreter(model_pathmodel_path) interpreter.allocate_tensors() return interpreter def run_inference(interpreter, input_data): 執(zhí)行模型推理。 # 獲取輸入和輸出張量的詳細(xì)信息 input_details interpreter.get_input_details() output_details interpreter.get_output_details() # 將預(yù)處理后的數(shù)據(jù)設(shè)置為輸入 interpreter.set_tensor(input_details[0][index], input_data) # 執(zhí)行推理 interpreter.invoke() # 獲取輸出結(jié)果 # Selfie Segmentation模型輸出一個(gè)形狀為(1, 256, 256, 1)的掩膜 output_data interpreter.get_tensor(output_details[0][index]) return output_dataoutput_data就是模型預(yù)測的掩膜mask其值在0到1之間通常經(jīng)過sigmoid激活越接近1表示該像素屬于“人物”的概率越高。3.3 掩膜后處理與圖像合成得到的掩膜是256x256大小的我們需要將其還原到原始圖像的尺寸并利用它來摳圖。def postprocess_mask(mask, original_shape): 將模型輸出的掩膜后處理并縮放到原始圖像尺寸。 Args: mask: 模型輸出形狀(1, 256, 256, 1)或(256, 256, 1)。 original_shape: 目標(biāo)尺寸 (height, width)。 Returns: resized_mask: 形狀為(original_height, original_width)的二維數(shù)組值范圍[0,255] (uint8)。 # 去除批次維度得到(256, 256, 1) mask np.squeeze(mask, axis0) if mask.ndim 4 else mask # 如果模型輸出是(256, 256, 1)則壓縮為(256, 256) mask np.squeeze(mask, axis-1) if mask.shape[-1] 1 else mask # 將概率值[0,1]轉(zhuǎn)換為[0,255]的灰度圖 mask_uint8 (mask * 255).astype(np.uint8) # 縮放到原始圖像尺寸 resized_mask cv2.resize(mask_uint8, (original_shape[1], original_shape[0]), interpolationcv2.INTER_LINEAR) return resized_mask def apply_mask_to_image(image, mask, background_color(255, 255, 255)): 使用掩膜將人物從原圖中摳出并放置在指定背景色上。 Args: image: 原始BGR圖像。 mask: 與image同尺寸的灰度掩膜值越大代表越可能是前景。 background_color: 背景的BGR顏色。 Returns: result: 摳圖后的BGR圖像。 # 將掩膜歸一化到[0, 1]作為alpha通道 alpha mask.astype(np.float32) / 255.0 # 為alpha增加通道維度便于廣播 (H, W) - (H, W, 1) alpha np.expand_dims(alpha, axis-1) # 創(chuàng)建純色背景圖 background np.full_like(image, background_color, dtypenp.uint8) # 前景 原圖 * alpha foreground image.astype(np.float32) * alpha # 背景 背景色 * (1 - alpha) background_part background.astype(np.float32) * (1 - alpha) # 合成 result (foreground background_part).astype(np.uint8) return resultapply_mask_to_image函數(shù)實(shí)現(xiàn)了最常見的阿爾法混合。這里background_color可以隨意替換比如換成另一張圖片就能實(shí)現(xiàn)“換背景”的效果。alpha通道的平滑過渡值在0到1之間使得摳圖邊緣不會(huì)生硬這是直接使用二值化閾值如mask 128所不具備的優(yōu)勢。4. 在行空板上實(shí)現(xiàn)實(shí)時(shí)攝像頭摳圖將上述代碼模塊整合并接入行空板的攝像頭就能實(shí)現(xiàn)實(shí)時(shí)摳圖了。行空板通常使用/dev/video0作為攝像頭設(shè)備。import time def main(): # 初始化 model_path models/selfie_segmentation.tflite interpreter initialize_interpreter(model_path) # 打開攝像頭行空板USB攝像頭通常是video0 cap cv2.VideoCapture(0) # 可以設(shè)置分辨率降低分辨率可以提高幀率 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) if not cap.isOpened(): print(無法打開攝像頭) return print(開始實(shí)時(shí)摳圖按 q 鍵退出...) while True: # 讀取一幀 ret, frame cap.read() if not ret: print(無法獲取幀) break # 記錄開始時(shí)間以計(jì)算FPS start_time time.time() # 1. 預(yù)處理 input_data, orig_shape preprocess_image(frame) # 2. 推理 output_mask run_inference(interpreter, input_data) # 3. 后處理得到原始尺寸的掩膜 mask postprocess_mask(output_mask, orig_shape) # 4. 應(yīng)用掩膜生成摳圖結(jié)果這里背景設(shè)為綠色 result apply_mask_to_image(frame, mask, background_color(0, 255, 0)) # 計(jì)算并顯示FPS fps 1.0 / (time.time() - start_time) cv2.putText(result, fFPS: {fps:.1f}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) # 顯示結(jié)果如果行空板連接了屏幕 cv2.imshow(MediaPipe Selfie Segmentation - UNIHIKER, result) # 按q退出 if cv2.waitKey(1) 0xFF ord(q): break # 釋放資源 cap.release() cv2.destroyAllWindows() if __name__ __main__: main()這段代碼構(gòu)成了一個(gè)完整的實(shí)時(shí)摳圖應(yīng)用。在行空板上運(yùn)行你就能看到攝像頭畫面中的人像被實(shí)時(shí)地?fù)赋鰜肀尘氨惶鎿Q成了綠色。幀率FPS是衡量實(shí)時(shí)性的關(guān)鍵指標(biāo)在行空板上根據(jù)分辨率和模型復(fù)雜度達(dá)到10-20 FPS是很有希望的。注意行空板運(yùn)行帶GUI的OpenCV (cv2.imshow) 需要圖形界面環(huán)境支持。如果你的行空板運(yùn)行在純命令行模式無桌面這部分代碼會(huì)報(bào)錯(cuò)。此時(shí)你有兩個(gè)選擇1) 將結(jié)果圖像保存為文件2) 使用行空板自帶的pinpong庫或其它方式將圖像數(shù)據(jù)發(fā)送到板載屏幕上顯示。這涉及到行空板特定的顯示API調(diào)用需要參考其官方文檔。5. 性能優(yōu)化與效果提升實(shí)戰(zhàn)技巧在資源受限的行空板上讓整個(gè)流程跑得又快又好需要一些優(yōu)化技巧。5.1 推理速度優(yōu)化輸入分辨率與模型選擇模型的輸入分辨率直接影響推理速度。Selfie Segmentation模型固定輸入256x256這本身已經(jīng)很小。但我們可以從預(yù)處理和后處理環(huán)節(jié)省時(shí)間。降低攝像頭采集分辨率這是最有效的提速方法之一。如果最終顯示或處理不需要太高清的圖像直接將攝像頭分辨率設(shè)為320x240或更低能極大減少需要處理的數(shù)據(jù)量。cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)探索更輕量模型MediaPipe可能還提供更小的模型變體或者可以嘗試將模型量化到int8精度tflite模型。量化模型在保持可接受精度損失的前提下能顯著提升在ARM處理器上的推理速度。你需要尋找或自己使用TensorFlow工具量化模型。5.2 摳圖邊緣優(yōu)化掩膜平滑與腐蝕膨脹直接使用模型輸出的掩膜進(jìn)行混合有時(shí)在頭發(fā)絲、透明物體邊緣處會(huì)有鋸齒感或殘留背景色。高斯模糊平滑邊緣對掩膜施加一個(gè)輕微的高斯模糊可以使alpha過渡更加平滑自然。def smooth_mask(mask, kernel_size5, sigma1.0): blurred cv2.GaussianBlur(mask.astype(np.float32), (kernel_size, kernel_size), sigma) # 重新歸一化到0-255防止模糊導(dǎo)致整體變暗 blurred np.clip(blurred, 0, 255).astype(np.uint8) return blurred在postprocess_mask函數(shù)中對resized_mask調(diào)用smooth_mask后再返回。形態(tài)學(xué)操作處理噪點(diǎn)如果掩膜中存在小的空洞人物內(nèi)部被誤判為背景或孤立的噪點(diǎn)背景被誤判為人可以使用形態(tài)學(xué)操作。def denoise_mask(mask, kernel_size3): kernel np.ones((kernel_size, kernel_size), np.uint8) # 先閉運(yùn)算填充小洞再開運(yùn)算去除小白點(diǎn) mask cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) return mask注意形態(tài)學(xué)操作會(huì)改變掩膜形狀需謹(jǐn)慎調(diào)節(jié)核大小。5.3 處理復(fù)雜背景與多人場景Selfie Segmentation是一個(gè)通用模型在復(fù)雜背景或多人場景下效果可能會(huì)下降。背景復(fù)雜度模型在干凈、對比度高的背景下表現(xiàn)最好。如果背景和人物顏色相近比如穿白衣服站在白墻前分割效果會(huì)變差。在實(shí)際應(yīng)用中可以通過布光或選擇背景來改善。多人場景該模型設(shè)計(jì)用于分割單個(gè)人像“自拍”。對于多人同框它會(huì)嘗試分割出所有人物作為一個(gè)整體前景。如果你需要區(qū)分不同的個(gè)體則需要換用實(shí)例分割模型如MediaPipe Holistic或其它模型但那會(huì)復(fù)雜和沉重得多。對于行空板處理多人作為一個(gè)整體前景是更現(xiàn)實(shí)的選擇。一個(gè)實(shí)用的技巧是設(shè)置置信度閾值。模型輸出的掩膜值是置信度。我們可以通過閾值化來獲得一個(gè)更“干凈”的二值掩膜但會(huì)丟失邊緣平滑度。一種折衷是使用閾值來生成一個(gè)“確定前景”區(qū)域然后利用cv2.grabCut算法進(jìn)行精細(xì)優(yōu)化但這在行空板上計(jì)算成本較高。def threshold_mask(mask, low_thresh0.3, high_thresh0.7): 使用雙閾值生成三區(qū)域掩膜確定前景/確定背景/不確定。 可用于后續(xù)的grabCut優(yōu)化。 h, w mask.shape sure_fg np.zeros((h, w), np.uint8) sure_bg np.zeros((h, w), np.uint8) uncertain np.zeros((h, w), np.uint8) sure_fg[mask high_thresh * 255] 1 sure_bg[mask low_thresh * 255] 1 uncertain[(mask low_thresh*255) (mask high_thresh*255)] 1 return sure_fg, sure_bg, uncertain6. 項(xiàng)目集成與進(jìn)階應(yīng)用思路一個(gè)基礎(chǔ)的實(shí)時(shí)摳圖系統(tǒng)已經(jīng)完成。我們可以把它作為核心模塊集成到更大的行空板項(xiàng)目中。思路一虛擬背景視頻通話將摳出的人像與一張靜態(tài)圖片或動(dòng)態(tài)視頻流進(jìn)行混合實(shí)現(xiàn)虛擬背景。在行空板上可以預(yù)加載幾張背景圖通過按鍵切換。思路二互動(dòng)藝術(shù)裝置將摳出的人物輪廓用于交互。例如計(jì)算輪廓的中心點(diǎn)或外接矩形用來控制一個(gè)屏幕上的虛擬物體如一個(gè)隨著你移動(dòng)而移動(dòng)的光斑。OpenCV的cv2.findContours函數(shù)可以很容易地從二值化掩膜中提取輪廓。def get_largest_contour(mask): # 將掩膜二值化 _, binary_mask cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY) # 查找輪廓 contours, _ cv2.findContours(binary_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if contours: # 找到面積最大的輪廓 largest_contour max(contours, keycv2.contourArea) # 計(jì)算輪廓的矩可以獲取質(zhì)心 M cv2.moments(largest_contour) if M[m00] ! 0: cx int(M[m10] / M[m00]) cy int(M[m01] / M[m00]) return largest_contour, (cx, cy) return None, None思路三姿態(tài)觸發(fā)拍照結(jié)合MediaPipe的其他模型如Pose Detection在檢測到特定姿勢如舉手時(shí)自動(dòng)保存一張當(dāng)前摳好圖的照片到行空板的存儲(chǔ)中。這就需要同時(shí)運(yùn)行兩個(gè)輕量級模型對行空板的算力是一個(gè)考驗(yàn)可能需要采用交替運(yùn)行或降低檢測頻率的策略。部署與打包為了讓項(xiàng)目脫離開發(fā)環(huán)境運(yùn)行可以將所有依賴和代碼打包。使用pip freeze requirements.txt生成依賴列表。對于行空板更徹底的方式是使用Docker構(gòu)建一個(gè)包含所有環(huán)境的鏡像或者利用行空板支持的應(yīng)用打包方式創(chuàng)建一個(gè)一鍵運(yùn)行的腳本或應(yīng)用。在整個(gè)開發(fā)過程中最大的體會(huì)是“平衡”。在嵌入式設(shè)備上精度、速度和資源占用永遠(yuǎn)是一個(gè)需要權(quán)衡的三角。MediaPipe Selfie Segmentation模型提供了一個(gè)極佳的起點(diǎn)它在三者之間取得了很好的平衡。而行空板作為載體讓這個(gè)平衡得以在真實(shí)的物理世界中實(shí)現(xiàn)。從一行行代碼到屏幕上實(shí)時(shí)分離出的人像這個(gè)過程本身就是邊緣智能魅力的最佳詮釋。

相關(guān)新聞

數(shù)字生命技能工具:動(dòng)態(tài)流程引擎與協(xié)作效率提升

數(shù)字生命技能工具:動(dòng)態(tài)流程引擎與協(xié)作效率提升

1. 數(shù)字生命技能工具的核心價(jià)值解析在2023年Q3的團(tuán)隊(duì)效率調(diào)研報(bào)告中,一個(gè)令人震驚的數(shù)據(jù)浮現(xiàn):知識工作者平均每天要花費(fèi)2.1小時(shí)在重復(fù)性的流程溝通上。這正是我們團(tuán)隊(duì)開發(fā)數(shù)字生命技能工具的初衷——將那些"只存在于老員工腦子里"的協(xié)作經(jīng)驗(yàn)轉(zhuǎn)…

2026/7/29 15:07:17 閱讀更多
如何永久保存微信聊天記錄:5步完整數(shù)據(jù)留痕指南

如何永久保存微信聊天記錄:5步完整數(shù)據(jù)留痕指南

如何永久保存微信聊天記錄:5步完整數(shù)據(jù)留痕指南 【免費(fèi)下載鏈接】WeChatMsg 提取微信聊天記錄,將其導(dǎo)出成HTML、Word、CSV文檔永久保存,對聊天記錄進(jìn)行分析生成年度聊天報(bào)告 項(xiàng)目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …

2026/7/29 16:17:23 閱讀更多
網(wǎng)盤直鏈下載助手終極指南:9大網(wǎng)盤免客戶端下載全攻略

網(wǎng)盤直鏈下載助手終極指南:9大網(wǎng)盤免客戶端下載全攻略

網(wǎng)盤直鏈下載助手終極指南:9大網(wǎng)盤免客戶端下載全攻略 【免費(fèi)下載鏈接】Online-disk-direct-link-download-assistant 一個(gè)基于 JavaScript 的網(wǎng)盤文件下載地址獲取工具?;凇揪W(wǎng)盤直鏈下載助手】修改 ,支持 百度網(wǎng)盤 / 阿里云盤 / 中國移動(dòng)云盤 / 天翼…

2026/7/29 16:17:23 閱讀更多
智慧水利數(shù)字化轉(zhuǎn)型,別忽略數(shù)字孿生渲染的核心價(jià)值

智慧水利數(shù)字化轉(zhuǎn)型,別忽略數(shù)字孿生渲染的核心價(jià)值

智慧水利數(shù)字化轉(zhuǎn)型進(jìn)程中,數(shù)字孿生完成流域、水庫、灌區(qū)實(shí)體的數(shù)字化復(fù)刻,支撐預(yù)報(bào)、預(yù)警、預(yù)演、預(yù)案全業(yè)務(wù)閉環(huán)。大量項(xiàng)目落地反饋顯示,三維場景卡頓、弱網(wǎng)畫面模糊、多終端并發(fā)受限等可視化問題,會(huì)直接削弱數(shù)字孿生的調(diào)度研判…

2026/7/29 16:17:23 閱讀更多
法務(wù)總監(jiān)私藏工具箱曝光:用這6個(gè)開源+商用AI合同生成器,年省律師費(fèi)超86萬元

法務(wù)總監(jiān)私藏工具箱曝光:用這6個(gè)開源+商用AI合同生成器,年省律師費(fèi)超86萬元

更多請點(diǎn)擊: https://codechina.net 第一章:AI合同模板生成的法律與技術(shù)雙重視角 AI驅(qū)動(dòng)的合同模板生成正迅速從實(shí)驗(yàn)性工具演變?yōu)槠髽I(yè)法務(wù)與IT部門協(xié)同落地的關(guān)鍵基礎(chǔ)設(shè)施。其核心價(jià)值不僅在于提升起草效率,更在于彌合法律嚴(yán)謹(jǐn)性與技術(shù)可擴(kuò)展…

2026/7/29 16:17:23 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個(gè)問題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動(dòng)畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動(dòng)畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫效果?!?/p>

2026/7/29 0:15:24 閱讀更多