{"id":84800,"date":"2026-07-26T18:17:54","date_gmt":"2026-07-26T10:17:54","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/84800.html"},"modified":"2026-07-26T18:17:54","modified_gmt":"2026-07-26T10:17:54","slug":"ai%e7%ac%94%e8%ae%b0%e4%b8%89%e5%8d%81%e4%b8%83%ef%bc%9aai%e8%be%b9%e7%bc%98%e7%ab%af%e9%81%93%e6%a1%a5%e5%ae%89%e5%85%a8%e7%9b%91%e6%b5%8b%e7%b3%bb%e7%bb%9f%ef%bc%9ayolov8n%e6%8e%a8%e7%90%86%e4%b8%8e","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/84800.html","title":{"rendered":"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790"},"content":{"rendered":"<p>\u82e5\u8be5\u6587\u4e3a\u539f\u521b\u6587\u7ae0&#xff0c;\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u539f\u6587\u51fa\u5904\u3002<\/p>\n<\/p>\n<h3>\u4e00\u3001\u5f15\u8a00<\/h3>\n<p>\u5728\u8fb9\u7f18AI\u5e94\u7528\u4e2d&#xff0c;RK3568\u7b49NPU\u5e73\u53f0\u51ed\u501f\u4f4e\u529f\u8017\u548c\u9ad8\u7b97\u529b\u6027\u4ef7\u6bd4\u5907\u53d7\u9752\u7750\u3002\u7136\u800c&#xff0c;\u5f00\u53d1\u8c03\u8bd5\u3001\u6a21\u578b\u8fed\u4ee3\u548c\u529f\u80fd\u6269\u5c55\u5f80\u5f80\u5728PC\u7aef\u66f4\u4e3a\u4fbf\u6377\u3002\u672c\u6587\u5c06\u5206\u4eab\u4e00\u5957\u5b8c\u6574\u7684\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0\u4eceRK3568&#xff08;RKNN NPU&#xff09;\u79fb\u690d\u5230PC\u7aef&#xff08;PyTorch &#043;\u00a0YOLOv8n.pt&#xff09;\u7684\u5b9e\u8df5\u65b9\u6848&#xff0c;\u5e76\u9644\u5e26\u5168\u6808\u4ee3\u7801&#xff08;\u540e\u7aefFlask\u00a0&#043; \u524d\u7aef\u5b9e\u65f6\u76d1\u63a7\u770b\u677f&#xff09;\u3002\u65e0\u8bba\u4f60\u662f\u60f3\u5feb\u901f\u5728PC\u4e0a\u590d\u73b0\u9879\u76ee&#xff0c;\u8fd8\u662f\u60f3\u4ee5\u6b64\u4e3a\u57fa\u7840\u8fdb\u884c\u4e8c\u6b21\u5f00\u53d1&#xff0c;\u672c\u6587\u90fd\u53ef\u4f9b\u53c2\u8003\u3002<\/p>\n<hr \/>\n<h3>\u4e8c\u3001\u9879\u76ee\u539f\u59cb\u67b6\u6784<\/h3>\n<p>\u539f\u59cb\u7cfb\u7edf\u8fd0\u884c\u5728RK3568\u5f00\u53d1\u677f\u4e0a&#xff0c;\u4e3b\u8981\u7ec4\u4ef6&#xff1a;<\/p>\n<ul>\n<li>\n<p>\u63a8\u7406\u5f15\u64ce&#xff1a;rknnlite&#xff0c;\u52a0\u8f7dyolov8.rknn\u91cf\u5316\u6a21\u578b\u3002<\/p>\n<\/li>\n<li>\n<p>\u6444\u50cf\u5934&#xff1a;USB\u6216CSI\u6444\u50cf\u5934&#xff0c;\u5206\u8fa8\u7387640\u00d7480\u3002<\/p>\n<\/li>\n<li>\n<p>\u4e3b\u7a0b\u5e8f&#xff1a;main.py&#xff0c;\u4f7f\u7528\u7ebf\u7a0b\u6c60&#xff08;rknnpool.py&#xff09;\u5f02\u6b65\u63a8\u7406&#xff0c;\u6bcf10\u5e27\u4e0a\u4f20\u7ed3\u679c\u81f3\u4e91\u7aef\u670d\u52a1\u5668\u3002<\/p>\n<\/li>\n<li>\n<p>\u540e\u7aef\u670d\u52a1&#xff1a;server.py&#xff08;Flask&#xff09;&#xff0c;\u63a5\u6536\u56fe\u7247\u548c\u7f6e\u4fe1\u5ea6&#xff0c;\u5b58\u50a8\u4e3acam.jpg\u548cconf.txt\u3002<\/p>\n<\/li>\n<li>\n<p>\u524d\u7aef\u76d1\u63a7&#xff1a;index.html&#xff08;V3\/V4\u7248\u672c&#xff09;&#xff0c;\u901a\u8fc7\u8f6e\u8be2\u9759\u6001\u8d44\u6e90\u5b9e\u65f6\u66f4\u65b0\u753b\u9762\u548c\u9884\u8b66\u72b6\u6001\u3002<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u4e09\u3001\u79fb\u690d\u76ee\u6807\u4e0e\u6539\u52a8\u6982\u89c8<\/h3>\n<p>\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728PC&#xff08;Windows\/Linux&#xff0c;\u6709\u6216\u65e0GPU&#xff09;\u4e0a\u8fd0\u884c\u76f8\u540c\u529f\u80fd&#xff0c;\u4f7f\u7528\u5b98\u65b9yolov8n.pt\u6743\u91cd&#xff0c;\u63a8\u7406\u6846\u67b6\u91c7\u7528Ultralytics YOLO\u3002\u9700\u8981\u4fee\u6539\u7684\u6838\u5fc3\u6587\u4ef6&#xff1a;<\/p>\n<table>\n<tr>\u6587\u4ef6\u6539\u52a8\u5185\u5bb9<\/tr>\n<tbody>\n<tr>\n<td>func.py<\/td>\n<td>\u66ff\u6362RKNN\u63a8\u7406\u4e3amodel.predict()&#xff0c;\u4fdd\u7559\u7ed8\u56fe\u903b\u8f91\u3002<\/td>\n<\/tr>\n<tr>\n<td>rknnpool.py<\/td>\n<td>\u79fb\u9664RKNN\u4f9d\u8d56&#xff0c;\u6539\u4e3a\u52a0\u8f7dYOLO\u6a21\u578b\u5b9e\u4f8b&#xff0c;\u4fdd\u6301\u7ebf\u7a0b\u6c60\u8bbe\u8ba1\u3002<\/td>\n<\/tr>\n<tr>\n<td>main.py<\/td>\n<td>\u4ec5\u66f4\u6539\u6a21\u578b\u6587\u4ef6\u540d\u548c\u6444\u50cf\u5934\u7d22\u5f15&#xff08;\u901a\u5e38\u4e3a0&#xff09;\u3002<\/td>\n<\/tr>\n<tr>\n<td>server.py<\/td>\n<td>\u65e0\u9700\u6539\u52a8&#xff08;\u82e5\u9700\u672c\u5730\u8bbf\u95ee&#xff0c;\u8c03\u6574UPLOAD_FOLDER\u4e3a\u76f8\u5bf9\u8def\u5f84&#xff09;\u3002<\/td>\n<\/tr>\n<tr>\n<td>templates\/index.html<\/td>\n<td>\u4f7f\u7528V3\u7248\u672c&#xff0c;\u65e0\u9700\u4fee\u6539\u3002<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6240\u6709\u4ee3\u7801\u548c\u76ee\u5f55\u7ed3\u6784\u89c1\u4e0b\u6587\u3002<\/p>\n<h3>\u56db\u3001\u73af\u5883\u51c6\u5907<\/h3>\n<h4>4.1 \u5b89\u88c5\u4f9d\u8d56<\/h4>\n<p>\u521b\u5efa\u865a\u62df\u73af\u5883&#xff08;\u63a8\u8350&#xff09;&#xff0c;\u5b89\u88c5\u4ee5\u4e0b\u5305&#xff1a;<\/p>\n<p>pip install torch ultralytics opencv-python numpy requests flask <\/p>\n<p>\u5982\u9700GPU\u52a0\u901f&#xff0c;\u8bf7\u5b89\u88c5\u5bf9\u5e94CUDA\u7248\u672c\u7684PyTorch\u3002<\/p>\n<h4>4.2 \u4e0b\u8f7d\u6743\u91cd\u6587\u4ef6<\/h4>\n<p>\u4ece\u5b98\u65b9\u4ed3\u5e93\u4e0b\u8f7dyolov8n.pt&#xff0c;\u653e\u7f6e\u4e8e\u9879\u76ee\u6839\u76ee\u5f55&#xff1a;<\/p>\n<p>wget https:\/\/github.com\/ultralytics\/assets\/releases\/download\/v0.0.0\/yolov8n.pt <\/p>\n<h3>\u4e94\u3001\u9879\u76ee\u76ee\u5f55\u7ed3\u6784<\/h3>\n<p>project\/<br \/>\n\u251c\u2500\u2500 main.py                 # \u4e3b\u7a0b\u5e8f&#xff08;\u6444\u50cf\u5934\/\u89c6\u9891\u6d41\u63a8\u7406\u4e0e\u4e0a\u4f20&#xff09;<br \/>\n\u251c\u2500\u2500 func.py                 # \u63a8\u7406\u51fd\u6570&#xff08;YOLO\u6a21\u578b\u8c03\u7528 &#043; \u7ed8\u56fe&#xff09;<br \/>\n\u251c\u2500\u2500 rknnpool.py             # \u7ebf\u7a0b\u6c60\u4e0e\u6a21\u578b\u7ba1\u7406&#xff08;\u9002\u914dPC&#xff09;<br \/>\n\u251c\u2500\u2500 server.py               # Flask\u540e\u7aef&#xff08;\u4e0a\u4f20\u63a5\u53e3\u3001\u9759\u6001\u8d44\u6e90&#xff09;<br \/>\n\u251c\u2500\u2500 templates\/<br \/>\n\u2502   \u2514\u2500\u2500 index.html          # \u524d\u7aef\u76d1\u63a7\u9762\u677f&#xff08;\u5b8c\u6574\u7248&#xff09;<br \/>\n\u251c\u2500\u2500 static\/                 # \u81ea\u52a8\u521b\u5efa&#xff0c;\u5b58\u653ecam.jpg\u548cconf.txt<br \/>\n\u251c\u2500\u2500 yolov8n.pt              # \u6743\u91cd\u6587\u4ef6<br \/>\n\u2514\u2500\u2500 requirements.txt        # \u4f9d\u8d56\u5217\u8868 <\/p>\n<h3>\u516d\u3001\u6838\u5fc3\u4ee3\u7801\u8be6\u89e3<\/h3>\n<h4>6.1\u00a0func.py\u00a0\u2013 \u63a8\u7406\u4e0e\u7ed8\u56fe<\/h4>\n<p>import cv2<br \/>\nimport numpy as np<br \/>\nfrom ultralytics import YOLO<\/p>\n<p>OBJ_THRESH, NMS_THRESH, IMG_SIZE &#061; 0.25, 0.45, 640<\/p>\n<p>CLASSES &#061; (&#034;person&#034;, &#034;bicycle&#034;, &#034;car&#034;, &#8230; )   # 80\u7c7bCOCO<\/p>\n<p>def draw(image, boxes, scores, classes, ratio, padding):<br \/>\n    for box, score, cl in zip(boxes, scores, classes):<br \/>\n        top &#061; int((box[0] &#8211; padding[0]) \/ ratio[0])<br \/>\n        left &#061; int((box[1] &#8211; padding[1]) \/ ratio[1])<br \/>\n        right &#061; int((box[2] &#8211; padding[0]) \/ ratio[0])<br \/>\n        bottom &#061; int((box[3] &#8211; padding[1]) \/ ratio[1])<br \/>\n        cv2.rectangle(image, (top, left), (right, bottom), (0, 0, 255), 2)<br \/>\n        cv2.putText(image, f&#039;{CLASSES[cl]} {score:.2f}&#039;, (top, left &#8211; 6),<br \/>\n                    cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)<\/p>\n<p>def myFunc(model, IMG):<br \/>\n    &#034;&#034;&#034;<br \/>\n    PC\u7aef\u63a8\u7406\u51fd\u6570<br \/>\n    model: YOLO\u5b9e\u4f8b<br \/>\n    IMG:   BGR\u56fe\u50cf (numpy array)<br \/>\n    \u8fd4\u56de:  \u7ed8\u5236\u540e\u7684\u56fe\u50cf, \u6700\u5927\u7f6e\u4fe1\u5ea6<br \/>\n    &#034;&#034;&#034;<br \/>\n    results &#061; model(IMG, imgsz&#061;IMG_SIZE, verbose&#061;False)<br \/>\n    boxes, scores, classes &#061; None, None, None<br \/>\n    if results and results[0].boxes is not None:<br \/>\n        boxes &#061; results[0].boxes.xyxy.cpu().numpy()<br \/>\n        scores &#061; results[0].boxes.conf.cpu().numpy()<br \/>\n        classes &#061; results[0].boxes.cls.cpu().numpy().astype(int)<br \/>\n    max_conf &#061; 0.0<br \/>\n    if boxes is not None and len(boxes) &gt; 0:<br \/>\n        # \u5750\u6807\u5df2\u5728\u539f\u59cb\u56fe\u50cf\u4e0a&#xff0c;ratio&#061;1, padding&#061;0<br \/>\n        draw(IMG, boxes, scores, classes, (1, 1), (0, 0))<br \/>\n        max_conf &#061; float(np.max(scores))<br \/>\n    return IMG, max_conf <\/p>\n<p>\u5173\u952e\u70b9&#xff1a;<\/p>\n<ul>\n<li>\n<p>\u4e0d\u518d\u624b\u52a8\u8fdb\u884cletterbox\u548c\u5750\u6807\u53cd\u7b97&#xff0c;Ultralytics\u5185\u90e8\u5df2\u5904\u7406\u3002<\/p>\n<\/li>\n<li>\n<p>\u6a21\u578b\u8f93\u51fa\u76f4\u63a5\u4e3axyxy\u683c\u5f0f&#xff0c;\u4e14\u5750\u6807\u5bf9\u5e94\u539f\u59cb\u56fe\u50cf\u5c3a\u5bf8\u3002<\/p>\n<\/li>\n<\/ul>\n<h4>6.2\u00a0rknnpool.py\u00a0\u2013 \u7ebf\u7a0b\u6c60\u4e0e\u6a21\u578b\u7ba1\u7406<\/h4>\n<p>from queue import Queue<br \/>\nfrom concurrent.futures import ThreadPoolExecutor<br \/>\nfrom ultralytics import YOLO<\/p>\n<p>def initModel(model_path, device&#061;&#039;cpu&#039;):<br \/>\n    return YOLO(model_path)<\/p>\n<p>def initModels(model_path, TPEs&#061;1, device&#061;&#039;cpu&#039;):<br \/>\n    # \u6bcf\u4e2a\u7ebf\u7a0b\u72ec\u7acb\u6a21\u578b\u5b9e\u4f8b&#xff0c;\u907f\u514dGIL\u51b2\u7a81<br \/>\n    return [initModel(model_path, device) for _ in range(TPEs)]<\/p>\n<p>class rknnPoolExecutor:<br \/>\n    def __init__(self, rknnModel, TPEs, func, device&#061;&#039;cpu&#039;):<br \/>\n        self.queue &#061; Queue()<br \/>\n        self.modelPool &#061; initModels(rknnModel, TPEs, device)<br \/>\n        self.pool &#061; ThreadPoolExecutor(max_workers&#061;TPEs)<br \/>\n        self.func &#061; func<br \/>\n        self.num &#061; 0<\/p>\n<p>    def put(self, frame):<br \/>\n        self.queue.put(self.pool.submit(self.func, self.modelPool[self.num % len(self.modelPool)], frame))<br \/>\n        self.num &#043;&#061; 1<\/p>\n<p>    def get(self):<br \/>\n        if self.queue.empty():<br \/>\n            return None, None, False<br \/>\n        result &#061; self.queue.get().result()<br \/>\n        if isinstance(result, tuple):<br \/>\n            return result[0], result[1], True<br \/>\n        return result, 0.0, True<\/p>\n<p>    def release(self):<br \/>\n        self.pool.shutdown() <\/p>\n<p>\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>\n<p>\u4e3a\u6bcf\u4e2a\u7ebf\u7a0b\u521b\u5efa\u72ec\u7acbYOLO\u6a21\u578b\u5b9e\u4f8b&#xff0c;\u786e\u4fdd\u7ebf\u7a0b\u5b89\u5168\u3002<\/p>\n<\/li>\n<li>\n<p>\u652f\u6301\u6307\u5b9adevice&#061;&#039;cuda&#039;\u4ee5\u542f\u7528GPU\u52a0\u901f\u3002<\/p>\n<\/li>\n<\/ul>\n<h4>6.3\u00a0main.py\u00a0\u2013 \u4e3b\u7a0b\u5e8f<\/h4>\n<p>import cv2, time, requests, threading<br \/>\nfrom rknnpool import rknnPoolExecutor<br \/>\nfrom func import myFunc<\/p>\n<p>UPLOAD_URL &#061; &#034;http:\/\/127.0.0.1:8000\/upload&#034;<br \/>\nUPLOAD_INTERVAL &#061; 10<\/p>\n<p>def upload_frame(frame, url, frame_id, conf_val):<br \/>\n    try:<br \/>\n        _, enc &#061; cv2.imencode(&#039;.jpg&#039;, frame, [cv2.IMWRITE_JPEG_QUALITY, 40])<br \/>\n        r &#061; requests.post(url, files&#061;{&#039;file&#039;: (&#039;cam.jpg&#039;, enc.tobytes(), &#039;image\/jpeg&#039;)},<br \/>\n                          data&#061;{&#039;conf&#039;: str(conf_val)}, timeout&#061;10,<br \/>\n                          headers&#061;{&#039;Connection&#039;: &#039;close&#039;})<br \/>\n        if r.status_code &#061;&#061; 200:<br \/>\n            print(f&#034;[\u4e0a\u4f20] \u5e27{frame_id} \u6210\u529f, \u7f6e\u4fe1\u5ea6: {conf_val:.2f}&#034;)<br \/>\n    except Exception as e:<br \/>\n        print(f&#034;[\u4e0a\u4f20] \u5e27{frame_id} \u5931\u8d25: {e}&#034;)<\/p>\n<p>cap &#061; cv2.VideoCapture(0)   # PC\u9ed8\u8ba4\u6444\u50cf\u5934<br \/>\ncap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)<br \/>\ncap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)<\/p>\n<p>pool &#061; rknnPoolExecutor(rknnModel&#061;&#034;yolov8n.pt&#034;, TPEs&#061;1, func&#061;myFunc, device&#061;&#039;cpu&#039;)<\/p>\n<p>if cap.isOpened():<br \/>\n    for _ in range(2):<br \/>\n        ret, frame &#061; cap.read()<br \/>\n        if ret: pool.put(frame)<\/p>\n<p>cv2.namedWindow(&#039;yolov8&#039;, cv2.WINDOW_NORMAL)<br \/>\ncv2.resizeWindow(&#039;yolov8&#039;, 1024, 600)<\/p>\n<p>frames, loopTime, initTime &#061; 0, time.time(), time.time()<\/p>\n<p>while cap.isOpened():<br \/>\n    frames &#043;&#061; 1<br \/>\n    ret, frame &#061; cap.read()<br \/>\n    if not ret: break<br \/>\n    pool.put(frame)<br \/>\n    frame, conf, flag &#061; pool.get()<br \/>\n    if not flag or frame is None: break<\/p>\n<p>    if frames % UPLOAD_INTERVAL &#061;&#061; 0:<br \/>\n        threading.Thread(target&#061;upload_frame, args&#061;(frame.copy(), UPLOAD_URL, frames, conf), daemon&#061;True).start()<\/p>\n<p>    cv2.imshow(&#039;yolov8&#039;, frame)<br \/>\n    if cv2.waitKey(1) &amp; 0xFF &#061;&#061; ord(&#039;q&#039;): break<br \/>\n    if frames % 30 &#061;&#061; 0:<br \/>\n        print(&#034;30\u5e27\u5e73\u5747\u5e27\u7387:\\\\t&#034;, 30 \/ (time.time() &#8211; loopTime), &#034;\u5e27&#034;)<br \/>\n        loopTime &#061; time.time()<\/p>\n<p>print(&#034;\u603b\u5e73\u5747\u5e27\u7387\\\\t&#034;, frames \/ (time.time() &#8211; initTime))<br \/>\ncap.release()<br \/>\ncv2.destroyAllWindows()<br \/>\npool.release() <\/p>\n<p>\u6ce8\u610f&#xff1a;UPLOAD_URL\u6307\u5411\u672c\u5730Flask\u670d\u52a1&#xff08;127.0.0.1:8000&#xff09;&#xff0c;\u82e5\u90e8\u7f72\u5230\u8fdc\u7a0b\u8bf7\u4fee\u6539IP\u3002<\/p>\n<h4>6.4\u00a0server.py\u00a0\u2013 Flask\u540e\u7aef<\/h4>\n<p>from flask import Flask, send_file, request, send_from_directory<br \/>\nimport os<\/p>\n<p>app &#061; Flask(__name__)<\/p>\n<p>UPLOAD_FOLDER &#061; os.path.join(os.path.dirname(__file__), &#034;static&#034;)<br \/>\nos.makedirs(UPLOAD_FOLDER, exist_ok&#061;True)<\/p>\n<p>conf_path &#061; os.path.join(UPLOAD_FOLDER, &#034;conf.txt&#034;)<br \/>\nif not os.path.exists(conf_path):<br \/>\n    with open(conf_path, &#034;w&#034;) as f:<br \/>\n        f.write(&#034;0.0&#034;)<\/p>\n<p>&#064;app.route(&#034;\/upload&#034;, methods&#061;[&#034;POST&#034;])<br \/>\ndef upload():<br \/>\n    if &#039;file&#039; not in request.files:<br \/>\n        return &#034;no file&#034;, 400<br \/>\n    file &#061; request.files[&#039;file&#039;]<br \/>\n    file.save(os.path.join(UPLOAD_FOLDER, &#034;cam.jpg&#034;))<br \/>\n    conf &#061; request.form.get(&#039;conf&#039;, &#039;0.0&#039;)<br \/>\n    with open(os.path.join(UPLOAD_FOLDER, &#034;conf.txt&#034;), &#034;w&#034;) as f:<br \/>\n        f.write(conf)<br \/>\n    return &#034;ok&#034;<\/p>\n<p>&#064;app.route(&#034;\/static\/cam.jpg&#034;)<br \/>\ndef get_img():<br \/>\n    path &#061; os.path.join(UPLOAD_FOLDER, &#034;cam.jpg&#034;)<br \/>\n    if os.path.exists(path):<br \/>\n        return send_file(path)<br \/>\n    return &#034;no image&#034;, 404<\/p>\n<p>&#064;app.route(&#034;\/static\/conf.txt&#034;)<br \/>\ndef get_conf():<br \/>\n    path &#061; os.path.join(UPLOAD_FOLDER, &#034;conf.txt&#034;)<br \/>\n    if os.path.exists(path):<br \/>\n        with open(path) as f:<br \/>\n            return f.read()<br \/>\n    return &#034;0.0&#034;<\/p>\n<p>&#064;app.route(&#034;\/&#034;)<br \/>\ndef index():<br \/>\n    return send_from_directory(&#034;templates&#034;, &#034;index.html&#034;)<\/p>\n<p>if __name__ &#061;&#061; &#034;__main__&#034;:<br \/>\n    app.run(host&#061;&#034;0.0.0.0&#034;, port&#061;8000, debug&#061;False) <\/p>\n<h4>6.5\u00a0templates\/index.html\u00a0\u2013 \u524d\u7aef\u76d1\u63a7\u9762\u677f<\/h4>\n<p>&lt;!DOCTYPE html&gt;<br \/>\n&lt;html lang&#061;&#034;zh-CN&#034;&gt;<br \/>\n&lt;head&gt;<br \/>\n&lt;meta charset&#061;&#034;UTF-8&#034;&gt;<br \/>\n&lt;meta name&#061;&#034;viewport&#034; content&#061;&#034;width&#061;device-width, initial-scale&#061;1.0&#034;&gt;<br \/>\n&lt;title&gt;\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0&lt;\/title&gt;<br \/>\n&lt;style&gt;<br \/>\n:root{<br \/>\n  &#8211;bg:#eceff3; &#8211;panel:#ffffff; &#8211;panel-2:#f4f6f9;<br \/>\n  &#8211;border:#e2e7ec; &#8211;border-2:#d4dbe3;<br \/>\n  &#8211;text:#2a3340; &#8211;muted:#6c7886; &#8211;dim:#9aa6b3;<br \/>\n  &#8211;accent:#4f6d8c; &#8211;accent-soft:#eef2f6;<br \/>\n  &#8211;ok:#3f9a63; &#8211;ok-bg:#e9f3ec; &#8211;ok-bd:#bfe0cb; &#8211;ok-t:#2c7a49;<br \/>\n  &#8211;warn:#c08a2e; &#8211;warn-bg:#f6efe0; &#8211;warn-bd:#e7d3a6; &#8211;warn-t:#956414;<br \/>\n  &#8211;alarm:#c1504a; &#8211;alarm-bg:#f7e9e8; &#8211;alarm-bd:#e9c3c0; &#8211;alarm-t:#a23a35;<br \/>\n  &#8211;mono:ui-monospace,&#034;SF Mono&#034;,&#034;JetBrains Mono&#034;,&#034;Roboto Mono&#034;,Menlo,Consolas,monospace;<br \/>\n  &#8211;sans:&#034;PingFang SC&#034;,&#034;Microsoft YaHei&#034;,&#034;Noto Sans SC&#034;,&#034;Helvetica Neue&#034;,system-ui,sans-serif;<br \/>\n  &#8211;sh:0 1px 2px rgba(40,55,75,.04),0 2px 8px rgba(40,55,75,.04);<br \/>\n}<br \/>\n*{box-sizing:border-box;margin:0;padding:0}<br \/>\nhtml,body{background:var(&#8211;bg);color:var(&#8211;text);font-family:var(&#8211;sans);-webkit-font-smoothing:antialiased}<br \/>\nbody{min-height:100vh}<br \/>\n.wrap{max-width:1320px;margin:0 auto;padding:20px 24px 30px}<\/p>\n<p>header{display:flex;align-items:center;gap:16px;padding:4px 2px 20px;flex-wrap:wrap}<br \/>\n.brand{display:flex;align-items:center;gap:13px;min-width:0}<br \/>\n.logo{width:42px;height:42px;border-radius:11px;background:linear-gradient(150deg,#5b7c9d,#3c5a78);display:flex;align-items:center;justify-content:center;flex:0 0 auto}<br \/>\n.logo svg{width:25px;height:25px}<br \/>\n.titles h1{font-size:19px;font-weight:600;letter-spacing:.2px;line-height:1.2;color:#222c38}<br \/>\n.titles .sub{font-size:12.5px;color:var(&#8211;muted);margin-top:3px}<br \/>\n.hdr-right{margin-left:auto;display:flex;align-items:center;gap:18px;flex-wrap:wrap}<br \/>\n.loc{font-size:13px;color:var(&#8211;muted)}<br \/>\n.loc b{color:var(&#8211;text);font-weight:600}<br \/>\n.clock{font-family:var(&#8211;mono);font-size:15px;letter-spacing:.4px;color:var(&#8211;text)}<br \/>\n.clock .date{color:var(&#8211;dim);font-size:12px;margin-right:8px}<br \/>\n.online{display:flex;align-items:center;gap:7px;font-size:13px;color:var(&#8211;ok-t);background:var(&#8211;ok-bg);border:1px solid var(&#8211;ok-bd);padding:5px 12px;border-radius:20px}<br \/>\n.dot{width:8px;height:8px;border-radius:50%;background:var(&#8211;ok);animation:pulse 2.6s infinite}<br \/>\n&#064;keyframes pulse{0%{box-shadow:0 0 0 0 rgba(63,154,99,.4)}70%{box-shadow:0 0 0 6px rgba(63,154,99,0)}100%{box-shadow:0 0 0 0 rgba(63,154,99,0)}}<\/p>\n<p>.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:16px}<br \/>\n.kpi{background:var(&#8211;panel);border:1px solid var(&#8211;border);border-radius:14px;padding:16px 18px;box-shadow:var(&#8211;sh)}<br \/>\n.kpi .k-lab{font-size:12.5px;color:var(&#8211;muted);display:flex;align-items:center;gap:7}<br \/>\n.kpi .k-val{font-family:var(&#8211;mono);font-size:29px;font-weight:600;margin-top:10px;line-height:1;letter-spacing:.3px;color:#222c38}<br \/>\n.kpi .k-sub{font-size:12px;color:var(&#8211;dim);margin-top:9px}<br \/>\n.kpi .bar{height:6px;border-radius:4px;background:#e7ebf0;margin-top:11px;overflow:hidden}<br \/>\n.kpi .bar i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#3f9a63,#67c089)}<br \/>\n.statuschip{display:inline-flex;align-items:center;gap:9px;font-size:22px;font-weight:600;margin-top:8px}<br \/>\n.statuschip .sd{width:13px;height:13px;border-radius:50%}<br \/>\n#kpi-status{display:flex;flex-direction:column}<br \/>\n#kpi-status .statuschip{align-self:center}<br \/>\n.kpi.alarm-on{border-color:var(&#8211;alarm-bd);background:linear-gradient(180deg,#fcf3f2,#ffffff)}<br \/>\n.kpi.alarm-on .ring{animation:ring 1.5s infinite}<br \/>\n&#064;keyframes ring{0%{box-shadow:0 0 0 0 rgba(193,80,74,.35)}70%{box-shadow:0 0 0 8px rgba(193,80,74,0)}100%{box-shadow:0 0 0 0 rgba(193,80,74,0)}}<\/p>\n<p>.layout{display:grid;grid-template-columns:1.55fr 1fr;gap:16px}<br \/>\n.col{display:flex;flex-direction:column;gap:16px}<br \/>\n.card{background:var(&#8211;panel);border:1px solid var(&#8211;border);border-radius:14px;overflow:hidden;box-shadow:var(&#8211;sh)}<br \/>\n.card-h{display:flex;align-items:center;gap:9px;padding:13px 16px;border-bottom:1px solid var(&#8211;border);font-size:14px;font-weight:600;color:#2a3340}<br \/>\n.card-h .ic{color:var(&#8211;accent);display:flex}<br \/>\n.tag{margin-left:auto;font-family:var(&#8211;mono);font-size:14px;font-weight:600;color:#2d5078;background:#eef2f7;border:1px solid var(&#8211;accent);padding:5px 12px;border-radius:9px;letter-spacing:0.3px}<br \/>\n.card-b{padding:0}<\/p>\n<p>.cam{position:relative;aspect-ratio:16\/9;background:#cfd6dd;overflow:hidden}<br \/>\n#show-img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}<br \/>\n.cam .grade{position:absolute;inset:0;background:linear-gradient(180deg,rgba(20,28,38,.28),transparent 22%,transparent 70%,rgba(20,28,38,.34))}<br \/>\n.bbox{position:absolute;left:39%;top:6%;width:38%;height:88%;border:2px solid var(&#8211;alarm);border-radius:2px;opacity:0;transform:scale(1.06);transition:opacity .35s,transform .35s}<br \/>\n.cam.found .bbox{opacity:1;transform:scale(1)}<br \/>\n.bbox .blab{position:absolute;top:-22px;left:-2px;background:var(&#8211;alarm);color:#fff;font-family:var(&#8211;mono);font-size:11.5px;padding:2px 7px;border-radius:4px 4px 4px 0;white-space:nowrap}<br \/>\n.hud{position:absolute;font-size:11.5px;font-family:var(&#8211;mono);color:#f0f4f8;text-shadow:0 1px 4px rgba(0,0,0,.55);z-index:3}<br \/>\n.hud.tl{top:11px;left:13px}<br \/>\n.hud.tr{top:11px;right:13px;display:flex;align-items:center;gap:6px}<br \/>\n.hud.bl{bottom:11px;left:13px;color:#dce8f1}<br \/>\n.hud.br{bottom:11px;right:13px}<br \/>\n.rec{width:9px;height:9px;border-radius:50%;background:var(&#8211;alarm);animation:blink 1.5s infinite}<br \/>\n&#064;keyframes blink{0%,100%{opacity:1}50%{opacity:.3}}<br \/>\n.det-state{padding:3px 10px;border-radius:6px;background:rgba(63,154,99,.85);color:#fff}<br \/>\n.det-state.found{background:rgba(193,80,74,.92)}<\/p>\n<p>.strain-head{display:flex;align-items:baseline;gap:14px;padding:0 0 12px}<br \/>\n.strain-head .now{font-family:var(&#8211;mono);font-size:31px;font-weight:600;letter-spacing:.3px;color:#222c38}<br \/>\n.strain-head .unit{color:var(&#8211;dim);font-size:13px}<br \/>\n.strain-head .ch-lvl{margin-left:auto;font-size:13px;color:var(&#8211;muted)}<br \/>\n.chart-box{position:relative;height:188px}<br \/>\ncanvas{display:block;width:100%;height:100%}<br \/>\n.legend{display:flex;gap:18px;margin-top:11px;font-size:12px;color:var(&#8211;muted);flex-wrap:wrap}<br \/>\n.legend span{display:flex;align-items:center;gap:6px}<br \/>\n.legend i{width:16px;height:0;border-top:2px dashed currentColor;display:inline-block}<\/p>\n<p>.fusion{display:flex;align-items:center;justify-content:space-between;gap:6px}<br \/>\n.fnode{flex:1;text-align:center}<br \/>\n.fnode .fl{font-size:12px;color:var(&#8211;muted);margin-bottom:8px}<br \/>\n.pill{display:inline-flex;align-items:center;gap:7px;font-size:13.5px;font-weight:600;padding:7px 12px;border-radius:9px;border:1px solid;min-width:72px;justify-content:center}<br \/>\n.pill .pd{width:9px;height:9px;border-radius:50%}<br \/>\n.lv-ok{background:var(&#8211;ok-bg);border-color:var(&#8211;ok-bd);color:var(&#8211;ok-t)} .lv-ok .pd{background:var(&#8211;ok)}<br \/>\n.lv-warn{background:var(&#8211;warn-bg);border-color:var(&#8211;warn-bd);color:var(&#8211;warn-t)} .lv-warn .pd{background:var(&#8211;warn)}<br \/>\n.lv-alarm{background:var(&#8211;alarm-bg);border-color:var(&#8211;alarm-bd);color:var(&#8211;alarm-t)} .lv-alarm .pd{background:var(&#8211;alarm)}<br \/>\n.op{font-size:17px;color:var(&#8211;dim);padding-top:18px}<br \/>\n.arrow{font-size:19px;color:var(&#8211;accent);padding-top:16px}<\/p>\n<p>.alert-empty{display:flex;align-items:center;gap:10px;color:var(&#8211;muted);font-size:13.5px;padding:6px 2px}<br \/>\n.alert-empty .ed{width:9px;height:9px;border-radius:50%;background:var(&#8211;ok)}<br \/>\n.alert-card{display:none}<br \/>\n.alert-card.show{display:block}<br \/>\n.alert-top{display:flex;align-items:center;gap:11px;margin-bottom:13px}<br \/>\n.lvl-badge{font-size:15px;font-weight:600;padding:6px 13px;border-radius:9px}<br \/>\n.alert-rows{display:grid;grid-template-columns:auto 1fr;gap:9px 16px;font-size:13px}<br \/>\n.alert-rows .lk{color:var(&#8211;muted)}<br \/>\n.alert-rows .vv{color:var(&#8211;text);font-family:var(&#8211;mono)}<\/p>\n<p>.pwr{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}<br \/>\n.pwr .cell{background:var(&#8211;panel-2);border:1px solid var(&#8211;border);border-radius:10px;padding:11px 13px}<br \/>\n.pwr .cl{font-size:11.5px;color:var(&#8211;muted);display:flex;align-items:center;gap:6px}<br \/>\n.pwr .cv{font-family:var(&#8211;mono);font-size:19px;font-weight:600;margin-top:6px;color:#222c38}<br \/>\n.pwr .cv small{font-size:12px;color:var(&#8211;dim);font-weight:400}<br \/>\n.flow{display:flex;align-items:center;justify-content:center;gap:9px;margin-top:13px;font-size:12px;color:var(&#8211;muted);flex-wrap:wrap}<br \/>\n.flow .fchip{display:flex;align-items:center;gap:6px;background:var(&#8211;panel-2);border:1px solid var(&#8211;border);border-radius:8px;padding:6px 10px}<br \/>\n.flow .ar{color:var(&#8211;accent)}<br \/>\n.solar{color:var(&#8211;warn-t)}<\/p>\n<p>.hist{margin-top:16px}<br \/>\ntable{width:100%;border-collapse:collapse;font-size:13px}<br \/>\nthead th{text-align:left;color:var(&#8211;muted);font-weight:500;font-size:12px;padding:10px 14px;border-bottom:1px solid var(&#8211;border);white-space:nowrap}<br \/>\ntbody td{padding:11px 14px;border-bottom:1px solid #eef1f4;color:var(&#8211;text)}<br \/>\ntbody tr:last-child td{border-bottom:none}<br \/>\ntbody tr.new td{animation:flashrow 1.5s ease-out}<br \/>\n&#064;keyframes flashrow{0%{background:rgba(79,109,140,.1)}100%{background:transparent}}<br \/>\ntd.time{font-family:var(&#8211;mono);color:var(&#8211;muted);white-space:nowrap}<br \/>\n.lpill{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;padding:3px 9px;border-radius:7px}<br \/>\n.lpill .pd{width:8px;height:8px;border-radius:50%}<br \/>\n.st-done{color:var(&#8211;ok-t)} .st-pending{color:var(&#8211;alarm-t)}<\/p>\n<p>footer{margin-top:20px;display:flex;align-items:center;gap:10px 22px;flex-wrap:wrap;font-size:12px;color:var(&#8211;dim);border-top:1px solid var(&#8211;border);padding-top:16px}<br \/>\nfooter .ft{display:flex;align-items:center;gap:7px}<br \/>\nfooter .ft b{color:var(&#8211;muted);font-weight:500}<\/p>\n<p>&#064;media (max-width:1080px){.layout{grid-template-columns:1fr}.kpis{grid-template-columns:repeat(2,1fr)}}<br \/>\n&#064;media (prefers-reduced-motion:reduce){*{animation:none!important}}<br \/>\n&lt;\/style&gt;<br \/>\n&lt;\/head&gt;<br \/>\n&lt;body&gt;<br \/>\n&lt;div class&#061;&#034;wrap&#034;&gt;<\/p>\n<p>&lt;header&gt;<br \/>\n&lt;div class&#061;&#034;brand&#034;&gt;<br \/>\n&lt;div class&#061;&#034;logo&#034;&gt;&lt;svg viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;#fff&#034; stroke-width&#061;&#034;1.7&#034; stroke-linecap&#061;&#034;round&#034;&gt;&lt;path d&#061;&#034;M2 16h20&#034;\/&gt;&lt;path d&#061;&#034;M4 16v-3&#034;\/&gt;&lt;path d&#061;&#034;M20 16v-3&#034;\/&gt;&lt;path d&#061;&#034;M2 13c3.5 0 4-5 10-5s6.5 5 10 5&#034;\/&gt;&lt;path d&#061;&#034;M8 13v3M12 11v5M16 13v3&#034;\/&gt;&lt;\/svg&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;titles&#034;&gt;&lt;h1&gt;\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0&lt;\/h1&gt;&lt;div class&#061;&#034;sub&#034;&gt;\u8fb9\u7f18\u667a\u80fd \u00b7 \u5149\u50a8\u6df7\u5408\u4f9b\u80fd \u00b7 \u56fe\u50cf\u2014\u5e94\u53d8\u591a\u6a21\u6001\u878d\u5408&lt;\/div&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;hdr-right&#034;&gt;<br \/>\n&lt;div class&#061;&#034;loc&#034;&gt;\u76d1\u6d4b\u70b9 \u00b7 &lt;b&gt;\u6bd5\u8282\u00b7\u5c71\u533a\u8de8\u8c37\u6865&lt;\/b&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;clock&#034;&gt;&lt;span class&#061;&#034;date&#034; id&#061;&#034;date&#034;&gt;\u2014&lt;\/span&gt;&lt;span id&#061;&#034;time&#034;&gt;\u2014&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;online&#034;&gt;&lt;span class&#061;&#034;dot&#034;&gt;&lt;\/span&gt;\u8bbe\u5907\u5728\u7ebf \u00b7 4G&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/header&gt;<\/p>\n<p>&lt;div class&#061;&#034;kpis&#034;&gt;<br \/>\n&lt;div class&#061;&#034;kpi&#034; id&#061;&#034;kpi-status&#034;&gt;<br \/>\n&lt;div class&#061;&#034;k-lab&#034;&gt;&lt;span class&#061;&#034;ring&#034; id&#061;&#034;kpi-dot&#034; style&#061;&#034;width:8px;height:8px;border-radius:50%;background:var(&#8211;ok)&#034;&gt;&lt;\/span&gt;\u9884\u8b66\u72b6\u6001&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;statuschip&#034;&gt;&lt;span class&#061;&#034;sd&#034; id&#061;&#034;st-sd&#034; style&#061;&#034;background:var(&#8211;ok)&#034;&gt;&lt;\/span&gt;&lt;span id&#061;&#034;st-text&#034; style&#061;&#034;color:var(&#8211;ok-t)&#034;&gt;\u6b63\u5e38&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;kpi&#034;&gt;<br \/>\n&lt;div class&#061;&#034;k-lab&#034;&gt;\u9502\u7535\u6c60\u7535\u91cf&#xff08;12V\/3A\u00b7h&#xff09;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;k-val&#034;&gt;89&lt;small style&#061;&#034;font-size:16px&#034;&gt;%&lt;\/small&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;bar&#034;&gt;&lt;i style&#061;&#034;width:86%&#034;&gt;&lt;\/i&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;kpi&#034;&gt;<br \/>\n&lt;div class&#061;&#034;k-lab&#034;&gt;\u4f9b\u7535\u6765\u6e90&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;k-val&#034; style&#061;&#034;font-size:21px&#034;&gt;\u2600 \u5149\u4f0f\u4f9b\u7535&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;k-sub&#034;&gt;MPPT \u5145\u7535\u4e2d&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;kpi&#034;&gt;<br \/>\n&lt;div class&#061;&#034;k-lab&#034;&gt;\u7cfb\u7edf\u8d1f\u8377 \/ \u901a\u4fe1&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;k-val&#034;&gt;&lt;span id&#061;&#034;sys-load-val&#034;&gt;9.8&lt;\/span&gt;&lt;small style&#061;&#034;font-size:15px&#034;&gt; W&lt;\/small&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;k-sub&#034;&gt;RK3568 \u6309\u9700\u4e0a\u7535 \u00b7 4G \u4fe1\u53f7\u826f\u597d&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;layout&#034;&gt;<br \/>\n&lt;div class&#061;&#034;col&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;rect x&#061;&#034;2&#034; y&#061;&#034;6&#034; width&#061;&#034;14&#034; height&#061;&#034;12&#034; rx&#061;&#034;2&#034;\/&gt;&lt;path d&#061;&#034;M16 10l6-3v10l-6-3&#034;\/&gt;&lt;\/svg&gt;&lt;\/span&gt;\u5b9e\u65f6\u76d1\u63a7\u753b\u9762&lt;span class&#061;&#034;tag&#034;&gt;YOLOv8n \u00b7 RK3568 NPU&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034;&gt;<br \/>\n&lt;div class&#061;&#034;cam&#034; id&#061;&#034;cam&#034;&gt;<br \/>\n&lt;img id&#061;&#034;show-img&#034; alt&#061;&#034;\u6865\u6881\u76d1\u63a7\u753b\u9762&#034;&gt;<br \/>\n&lt;div class&#061;&#034;grade&#034;&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;hud tr&#034;&gt;&lt;span class&#061;&#034;rec&#034;&gt;&lt;\/span&gt;&lt;span id&#061;&#034;cam-time&#034;&gt;&#8211;:&#8211;:&#8211;&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;hud bl&#034;&gt;AI \u63a8\u7406&#xff1a;YOLOv8n \u00b7 INT8 \u00b7 \u7aef\u4fa7 NPU&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;hud br&#034;&gt;&lt;span class&#061;&#034;det-state&#034; id&#061;&#034;det-state&#034;&gt;\u672a\u68c0\u51fa\u88c2\u7f1d&lt;\/span&gt;&lt;span style&#061;&#034;margin-left:8px;font-family:var(&#8211;mono);color:#fff;background:rgba(0,0,0,0.6);padding:3px 8px;border-radius:5px&#034;&gt;\u7f6e\u4fe1\u5ea6: &lt;span id&#061;&#034;conf-value&#034;&gt;0.00&lt;\/span&gt;&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;path d&#061;&#034;M3 16l4-6 4 4 4-9 4 7 2-2&#034;\/&gt;&lt;\/svg&gt;\u5b9e\u65f6\u5e94\u53d8\u76d1\u6d4b&lt;span class&#061;&#034;tag&#034;&gt;\u5206\u5e03\u5f0f\u5e94\u53d8\u4f20\u611f\u7f51\u7edc&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034;&gt;<br \/>\n&lt;div class&#061;&#034;strain-head&#034;&gt;<br \/>\n&lt;div&gt;&lt;span class&#061;&#034;now&#034; id&#061;&#034;strain-now&#034;&gt;\u2014&lt;\/span&gt; &lt;span class&#061;&#034;unit&#034;&gt;\u03bc\u03b5&#xff08;\u5fae\u5e94\u53d8&#xff09;&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;ch-lvl&#034;&gt;\u5e94\u53d8\u901a\u9053&#xff1a;&lt;span class&#061;&#034;lpill lv-ok&#034; id&#061;&#034;strain-lvl&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;\u6b63\u5e38&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;chart-box&#034;&gt;&lt;canvas id&#061;&#034;chart&#034;&gt;&lt;\/canvas&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;legend&#034;&gt;<br \/>\n&lt;span style&#061;&#034;color:#8a96a3&#034;&gt;&lt;i&gt;&lt;\/i&gt;\u5b89\u5168\u9608\u503c 600&lt;\/span&gt;<br \/>\n&lt;span style&#061;&#034;color:var(&#8211;warn-t)&#034;&gt;&lt;i&gt;&lt;\/i&gt;\u9884\u8b66\u9608\u503c 720&lt;\/span&gt;<br \/>\n&lt;span style&#061;&#034;color:var(&#8211;alarm-t)&#034;&gt;&lt;i&gt;&lt;\/i&gt;\u62a5\u8b66\u9608\u503c 1000&lt;\/span&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;col&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;path d&#061;&#034;M7 8a4 4 0 1 0 0 8M17 8a4 0 1 1 0 8&#034;\/&gt;&lt;path d&#061;&#034;M11 12h2&#034;\/&gt;&lt;\/svg&gt;\u591a\u6a21\u6001\u878d\u5408\u5224\u522b&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034;&gt;<br \/>\n&lt;div class&#061;&#034;fusion&#034;&gt;<br \/>\n&lt;div class&#061;&#034;fnode&#034;&gt;&lt;div class&#061;&#034;fl&#034;&gt;\u56fe\u50cf\u901a\u9053&lt;\/div&gt;&lt;span class&#061;&#034;pill lv-ok&#034; id&#061;&#034;f-img&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;\u6b63\u5e38&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;op&#034;&gt;\u2295&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;fnode&#034;&gt;&lt;div class&#061;&#034;fl&#034;&gt;\u5e94\u53d8\u901a\u9053&lt;\/div&gt;&lt;span class&#061;&#034;pill lv-ok&#034; id&#061;&#034;f-str&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;-&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;arrow&#034;&gt;\u2192&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;fnode&#034;&gt;&lt;div class&#061;&#034;fl&#034;&gt;\u7efc\u5408\u9884\u8b66&lt;\/div&gt;&lt;span class&#061;&#034;pill lv-ok&#034; id&#061;&#034;f-out&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;-&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;path d&#061;&#034;M12 9v4M12 17h.01M10.3 4.3 2.8 17a1.5 1.5 0 0 0 1.3 2.3h15.8a1.5 1.5 0 0 0 1.3-2.3L13.7 4.3a1.5 1.5 0 0 0-2.6 0z&#034;\/&gt;&lt;\/svg&gt;\u5f53\u524d\u9884\u8b66&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034;&gt;<br \/>\n&lt;div class&#061;&#034;alert-empty&#034; id&#061;&#034;alert-empty&#034;&gt;&lt;span class&#061;&#034;ed&#034;&gt;&lt;\/span&gt;\u5f53\u524d\u65e0\u9884\u8b66&#xff0c;\u7ed3\u6784\u4e0e\u8bbe\u5907\u8fd0\u884c\u6b63\u5e38&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;alert-card&#034; id&#061;&#034;alert-card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;alert-top&#034;&gt;&lt;span class&#061;&#034;lvl-badge&#034; id&#061;&#034;ac-badge&#034;&gt;\u62a5\u8b66&lt;\/span&gt;&lt;span style&#061;&#034;color:var(&#8211;muted);font-size:13px&#034; id&#061;&#034;ac-type&#034;&gt;\u88c2\u7f1d &#043; \u5e94\u53d8\u8d8a\u9650&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;alert-rows&#034;&gt;<br \/>\n&lt;span class&#061;&#034;lk&#034;&gt;\u53d1\u751f\u65f6\u95f4&lt;\/span&gt;&lt;span class&#061;&#034;vv&#034; id&#061;&#034;ac-time&#034;&gt;\u2014&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;lk&#034;&gt;\u6865\u6881\u4f4d\u7f6e&lt;\/span&gt;&lt;span class&#061;&#034;vv&#034;&gt;\u4e3b\u8de8\u8de8\u4e2d \u00b7 \u7bb1\u6881\u8179\u677f&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;lk&#034;&gt;\u68c0\u6d4b\u4f9d\u636e&lt;\/span&gt;&lt;span class&#061;&#034;vv&#034; id&#061;&#034;ac-basis&#034;&gt;YOLOv8 \u88c2\u7f1d 0.92 \u00b7 \u5e94\u53d8 770\u03bc\u03b5&lt;\/span&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;card&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;path d&#061;&#034;M13 2 4 14h7l-1 8 9-12h-7z&#034;\/&gt;&lt;\/svg&gt;\u5149\u50a8\u6df7\u5408\u4f9b\u80fd&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034;&gt;<br \/>\n&lt;div class&#061;&#034;pwr&#034;&gt;<br \/>\n&lt;div class&#061;&#034;cell&#034;&gt;&lt;div class&#061;&#034;cl solar&#034;&gt;\u2600 \u5149\u4f0f\u8f93\u5165&lt;\/div&gt;&lt;div class&#061;&#034;cv&#034;&gt;&lt;span id&#061;&#034;pv-val&#034;&gt;-&lt;\/span&gt;&lt;small&gt;V&lt;\/small&gt;&lt;\/div&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;cell&#034;&gt;&lt;div class&#061;&#034;cl&#034;&gt;\u9502\u7535\u6c60&lt;\/div&gt;&lt;div class&#061;&#034;cv&#034;&gt;&lt;span id&#061;&#034;bat-val&#034;&gt;-&lt;\/span&gt;&lt;small&gt;V&lt;\/small&gt;&lt;\/div&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;cell&#034;&gt;&lt;div class&#061;&#034;cl&#034;&gt;\u8d85\u7ea7\u7535\u5bb9&lt;\/div&gt;&lt;div class&#061;&#034;cv&#034;&gt;- &lt;small&gt;V&lt;\/small&gt;&lt;\/div&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;cell&#034;&gt;&lt;div class&#061;&#034;cl&#034;&gt;\u8d1f\u8f7d\u529f\u8017&lt;\/div&gt;&lt;div class&#061;&#034;cv&#034;&gt;&lt;span id&#061;&#034;load-val&#034;&gt;-&lt;\/span&gt;&lt;small&gt;W&lt;\/small&gt;&lt;\/div&gt;&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;flow&#034;&gt;<br \/>\n&lt;span class&#061;&#034;fchip solar&#034;&gt;\u2600 \u5149\u4f0f&lt;\/span&gt;&lt;span class&#061;&#034;ar&#034;&gt;\u2192&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;fchip&#034;&gt;\u9502\u7535\u6c60 \/ \u8d85\u5bb9&lt;\/span&gt;&lt;span class&#061;&#034;ar&#034;&gt;\u2192&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;fchip&#034;&gt;\u8d1f\u8f7d&#xff08;\u8fb9\u7f18\u8ba1\u7b97\u00b7\u6444\u50cf\u5934\u00b7\u901a\u4fe1&#xff09;&lt;\/span&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;div class&#061;&#034;card hist&#034;&gt;<br \/>\n&lt;div class&#061;&#034;card-h&#034;&gt;&lt;span class&#061;&#034;ic&#034;&gt;&lt;svg width&#061;&#034;17&#034; height&#061;&#034;17&#034; viewBox&#061;&#034;0 0 24 24&#034; fill&#061;&#034;none&#034; stroke&#061;&#034;currentColor&#034; stroke-width&#061;&#034;1.8&#034;&gt;&lt;path d&#061;&#034;M3 4h18M3 12h18M3 20h18&#034;\/&gt;&lt;\/span&gt;\u5386\u53f2\u9884\u8b66\u8bb0\u5f55&lt;span class&#061;&#034;tag&#034;&gt;\u652f\u6301\u6309\u65f6\u95f4 \/ \u7c7b\u578b\u67e5\u8be2&lt;\/span&gt;&lt;\/div&gt;<br \/>\n&lt;div class&#061;&#034;card-b&#034; style&#061;&#034;padding:4px 4px 8px&#034;&gt;<br \/>\n&lt;table&gt;<br \/>\n&lt;thead&gt;&lt;tr&gt;&lt;th&gt;\u53d1\u751f\u65f6\u95f4&lt;\/th&gt;&lt;th&gt;\u9884\u8b66\u7c7b\u578b&lt;\/th&gt;&lt;th&gt;\u9884\u8b66\u7b49\u7ea7&lt;\/th&gt;&lt;th&gt;\u68c0\u6d4b\u4f9d\u636e&lt;\/th&gt;&lt;th&gt;\u5904\u7406\u72b6\u6001&lt;\/th&gt;&lt;\/tr&gt;&lt;\/thead&gt;<br \/>\n&lt;tbody id&#061;&#034;hist-body&#034;&gt;<br \/>\n&lt;tr&gt;&lt;td class&#061;&#034;time&#034;&gt;2024-05-10 09:14:22&lt;\/td&gt;&lt;td&gt;\u6865\u9762\u7ed3\u51b0&lt;\/td&gt;&lt;td&gt;&lt;span class&#061;&#034;lpill lv-warn&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;\u9884\u8b66&lt;\/span&gt;&lt;\/td&gt;&lt;td&gt;\u7f6e\u4fe1\u5ea6 0.91&lt;\/td&gt;&lt;td class&#061;&#034;st-pending&#034;&gt;\u5f85\u590d\u6838&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td class&#061;&#034;time&#034;&gt;2024-04-22 17:38:05&lt;\/td&gt;&lt;td&gt;\u5e94\u53d8\u8d8a\u9650&lt;\/td&gt;&lt;td&gt;&lt;span class&#061;&#034;lpill lv-warn&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;\u9884\u8b66&lt;\/span&gt;&lt;\/td&gt;&lt;td&gt;\u7f6e\u4fe1\u5ea6 0.73&lt;\/td&gt;&lt;td class&#061;&#034;st-done&#034;&gt;\u5df2\u4e0a\u62a5&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;tr&gt;&lt;td class&#061;&#034;time&#034;&gt;2024-03-08 11:02:47&lt;\/td&gt;&lt;td&gt;\u88c2\u7f1d&lt;\/td&gt;&lt;td&gt;&lt;span class&#061;&#034;lpill lv-warn&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;\u9884\u8b66&lt;\/span&gt;&lt;\/td&gt;&lt;td&gt;\u7f6e\u4fe1\u5ea6 0.88&lt;\/td&gt;&lt;td class&#061;&#034;st-done&#034;&gt;\u6062\u590d\u6b63\u5e38&lt;\/td&gt;&lt;\/tr&gt;<br \/>\n&lt;\/tbody&gt;<br \/>\n&lt;\/table&gt;<br \/>\n&lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;footer&gt;<br \/>\n&lt;span class&#061;&#034;ft&#034;&gt;&lt;b&gt;\u8fb9\u7f18\u8ba1\u7b97&lt;\/b&gt; RK3568&#xff08;CPU&#043;NPU \u00b7 0.8TOPS&#xff09;&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;ft&#034;&gt;&lt;b&gt;\u68c0\u6d4b\u6a21\u578b&lt;\/b&gt; YOLOv8 \u00b7 ONNX\u2192RKNN \u00b7 INT8&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;ft&#034;&gt;&lt;b&gt;\u56de\u4f20&lt;\/b&gt; 4G \u8f7b\u91cf\u56de\u4f20&#xff08;\u7ed3\u679c\u7ea7&#xff09;&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;ft&#034;&gt;&lt;b&gt;\u4f9b\u80fd&lt;\/b&gt; \u5149\u4f0f &#043; \u9502\u7535\u6c60 &#043; \u8d85\u7ea7\u7535\u5bb9&lt;\/span&gt;<br \/>\n&lt;span class&#061;&#034;ft&#034; style&#061;&#034;margin-left:auto&#034;&gt;\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u5e73\u53f0 v1.0&lt;\/span&gt;<br \/>\n&lt;\/footer&gt;<\/p>\n<p>&lt;\/div&gt;<\/p>\n<p>&lt;script&gt;<br \/>\nfunction pad(n){return String(n).padStart(2,&#039;0&#039;)}<br \/>\nfunction tick(){<br \/>\n  const d&#061;new Date();<br \/>\n  document.getElementById(&#039;date&#039;).textContent&#061;&#096;${d.getFullYear()}-${pad(d.getMonth()&#043;1)}-${pad(d.getDate())}&#096;;<br \/>\n  const t&#061;&#096;${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}&#096;;<br \/>\n  document.getElementById(&#039;time&#039;).textContent&#061;t;<br \/>\n  document.getElementById(&#039;cam-time&#039;).textContent&#061;t;<br \/>\n}<br \/>\ntick(); setInterval(tick,1000);<\/p>\n<p>const NAME&#061;[&#039;\u6b63\u5e38&#039;,&#039;\u9884\u8b66&#039;,&#039;\u62a5\u8b66&#039;], CLS&#061;[&#039;lv-ok&#039;,&#039;lv-warn&#039;,&#039;lv-alarm&#039;];<br \/>\nconst COL&#061;[&#039;var(&#8211;ok)&#039;,&#039;var(&#8211;warn)&#039;,&#039;var(&#8211;alarm)&#039;];<br \/>\nconst BADGEBG&#061;[&#039;var(&#8211;ok-bg)&#039;,&#039;var(&#8211;warn-bg)&#039;,&#039;var(&#8211;alarm-bg)&#039;];<br \/>\nconst BADGECO&#061;[&#039;var(&#8211;ok-t)&#039;,&#039;var(&#8211;warn-t)&#039;,&#039;var(&#8211;alarm-t)&#039;];<br \/>\nlet imgLevel&#061;0, strLevel&#061;0, strainTarget&#061;480;<\/p>\n<p>let alertCounter &#061; 0;<br \/>\nlet normalCounter &#061; 0;<br \/>\nlet currentState &#061; 0;<\/p>\n<p>function setPill(el,rank){el.className&#061;&#039;pill &#039;&#043;CLS[rank];el.innerHTML&#061;&#096;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;${NAME[rank]}&#096;;}<br \/>\nfunction setLpill(el,rank){el.className&#061;&#039;lpill &#039;&#043;CLS[rank];el.innerHTML&#061;&#096;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;${NAME[rank]}&#096;;}<\/p>\n<p>function render(){<br \/>\n  const out &#061; currentState;<br \/>\n  setPill(document.getElementById(&#039;f-img&#039;),out);<br \/>\n  setLpill(document.getElementById(&#039;strain-lvl&#039;),strLevel);<br \/>\n  document.getElementById(&#039;st-sd&#039;).style.background&#061;COL[out];<br \/>\n  document.getElementById(&#039;kpi-dot&#039;).style.background&#061;COL[out];<br \/>\n  const stt&#061;document.getElementById(&#039;st-text&#039;); stt.textContent&#061;NAME[out]; stt.style.color&#061;BADGECO[out];<br \/>\n  document.getElementById(&#039;kpi-status&#039;).classList.toggle(&#039;alarm-on&#039;,out&#061;&#061;&#061;2);<br \/>\n  const found &#061; out &gt;&#061; 1;<br \/>\n  document.getElementById(&#039;cam&#039;).classList.toggle(&#039;found&#039;,found);<br \/>\n  const ds&#061;document.getElementById(&#039;det-state&#039;);<br \/>\n  ds.textContent&#061;found?&#039;\u68c0\u51fa\u88c2\u7f1d \u00b7 \u5df2\u6807\u6ce8&#039;:&#039;\u672a\u68c0\u51fa\u88c2\u7f1d&#039;; ds.classList.toggle(&#039;found&#039;,found);<br \/>\n  const empty&#061;document.getElementById(&#039;alert-empty&#039;), card&#061;document.getElementById(&#039;alert-card&#039;);<br \/>\n  if(out&#061;&#061;&#061;0){empty.style.display&#061;&#039;flex&#039;;card.classList.remove(&#039;show&#039;);}<br \/>\n  else{<br \/>\n    empty.style.display&#061;&#039;none&#039;;card.classList.add(&#039;show&#039;);<br \/>\n    const b&#061;document.getElementById(&#039;ac-badge&#039;);<br \/>\n    b.textContent&#061;NAME[out]; b.style.background&#061;BADGEBG[out]; b.style.color&#061;BADGECO[out];<br \/>\n    document.getElementById(&#039;ac-type&#039;).textContent &#061; out&#061;&#061;&#061;2 ? &#039;\u88c2\u7f1d\u6301\u7eed\u68c0\u51fa&#039; : &#039;\u88c2\u7f1d\u68c0\u51fa&#039;;<br \/>\n    document.getElementById(&#039;ac-basis&#039;).textContent &#061; &#039;YOLOv8 \u88c2\u7f1d\u68c0\u6d4b&#039;;<br \/>\n    document.getElementById(&#039;ac-time&#039;).textContent&#061;document.getElementById(&#039;time&#039;).textContent;<br \/>\n  }<br \/>\n}<\/p>\n<p>function addHistory(typeText,rank,basis,status,statusClass){<br \/>\n  const t&#061;new Date();<br \/>\n  const ts&#061;&#096;${t.getFullYear()}-${pad(t.getMonth()&#043;1)}-${pad(t.getDate())} ${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}&#096;;<br \/>\n  const tr&#061;document.createElement(&#039;tr&#039;); tr.className&#061;&#039;new&#039;;<br \/>\n  tr.innerHTML&#061;&#096;&lt;td class&#061;&#034;time&#034;&gt;${ts}&lt;\/td&gt;&lt;td&gt;${typeText}&lt;\/td&gt;&lt;td&gt;&lt;span class&#061;&#034;lpill ${CLS[rank]}&#034;&gt;&lt;span class&#061;&#034;pd&#034;&gt;&lt;\/span&gt;${NAME[rank]}&lt;\/span&gt;&lt;\/td&gt;&lt;td&gt;\u7f6e\u4fe1\u5ea6 ${basis}&lt;\/td&gt;&lt;td class&#061;&#034;${statusClass}&#034;&gt;${status}&lt;\/td&gt;&#096;;<br \/>\n  const body&#061;document.getElementById(&#039;hist-body&#039;); body.insertBefore(tr,body.firstChild);<br \/>\n}<\/p>\n<p>function fetchConf() {<br \/>\n  fetch(&#034;\/static\/conf.txt?t&#061;&#034; &#043; Date.now())<br \/>\n    .then(res &#061;&gt; res.text())<br \/>\n    .then(text &#061;&gt; {<br \/>\n      const conf &#061; parseFloat(text);<br \/>\n      document.getElementById(&#039;conf-value&#039;).textContent &#061; conf.toFixed(2);<br \/>\n      if (conf &gt;&#061; 0.6) {<br \/>\n        alertCounter&#043;&#043;;<br \/>\n        normalCounter &#061; 0;<br \/>\n        if (alertCounter &gt;&#061; 10 &amp;&amp; currentState &lt; 2) {<br \/>\n          currentState &#061; 2;<br \/>\n          addHistory(&#034;\u88c2\u7f1d\u6301\u7eed\u68c0\u51fa&#034;, 2, conf.toFixed(2), &#034;\u5df2\u4e0a\u62a5&#034;, &#034;st-pending&#034;);<br \/>\n        } else if (alertCounter &gt;&#061; 1 &amp;&amp; currentState &lt; 1) {<br \/>\n          currentState &#061; 1;<br \/>\n          addHistory(&#034;\u88c2\u7f1d\u68c0\u51fa&#034;, 1, conf.toFixed(2), &#034;\u5f85\u590d\u6838&#034;, &#034;st-pending&#034;);<br \/>\n        }<br \/>\n      } else {<br \/>\n        alertCounter &#061; 0;<br \/>\n        if (currentState &gt; 0) {<br \/>\n          normalCounter&#043;&#043;;<br \/>\n          if (normalCounter &gt;&#061; 9) {<br \/>\n            if (currentState &gt; 0) {<br \/>\n              addHistory(&#034;\u6062\u590d\u6b63\u5e38&#034;, 0, conf.toFixed(2), &#034;\u6062\u590d\u6b63\u5e38&#034;, &#034;st-done&#034;);<br \/>\n            }<br \/>\n            currentState &#061; 0;<br \/>\n            normalCounter &#061; 0;<br \/>\n          }<br \/>\n        }<br \/>\n      }<br \/>\n      imgLevel &#061; currentState;<br \/>\n      render();<br \/>\n    })<br \/>\n    .catch(err &#061;&gt; console.log(&#034;\u8bfb\u53d6\u7f6e\u4fe1\u5ea6\u5931\u8d25&#034;));<br \/>\n}<\/p>\n<p>const showImg &#061; document.getElementById(&#039;show-img&#039;);<br \/>\nfunction refreshCamImage(){<br \/>\n  showImg.src &#061; &#096;\/static\/cam.jpg?t&#061;${Date.now()}&#096;;<br \/>\n}<br \/>\nrefreshCamImage();<\/p>\n<p>function updatePvVoltage(){<br \/>\n  document.getElementById(&#034;pv-val&#034;).textContent &#061; (Math.random()*0.3&#043;17.80).toFixed(2);<br \/>\n}<br \/>\nfunction updateBatVoltage(){<br \/>\n  document.getElementById(&#034;bat-val&#034;).textContent &#061; (Math.random()*0.06&#043;12.14).toFixed(2);<br \/>\n}<br \/>\nfunction updateLoadPower(){<br \/>\n  const v &#061; (Math.random()*0.1&#043;9.70).toFixed(2);<br \/>\n  document.getElementById(&#034;load-val&#034;).textContent &#061; v;<br \/>\n  document.getElementById(&#034;sys-load-val&#034;).textContent &#061; v;<br \/>\n}<\/p>\n<p>setInterval(function(){<br \/>\n  refreshCamImage();<br \/>\n  fetchConf();<br \/>\n  updatePvVoltage();<br \/>\n  updateBatVoltage();<br \/>\n  updateLoadPower();<br \/>\n}, 500);<\/p>\n<p>const cv&#061;document.getElementById(&#039;chart&#039;), ctx&#061;cv.getContext(&#039;2d&#039;);<br \/>\nconst YMAX&#061;1100,SAFE&#061;600,WARN&#061;720,ALARM&#061;1000;<br \/>\nlet data&#061;Array.from({length:70},()&#061;&gt;460&#043;Math.random()*60);<br \/>\nfunction resize(){const r&#061;cv.getBoundingClientRect(),dpr&#061;window.devicePixelRatio||1;cv.width&#061;r.width*dpr;cv.height&#061;r.height*dpr;ctx.setTransform(dpr,0,0,dpr,0,0)}<br \/>\nfunction yPos(v,h){return h-(v\/YMAX)*h}<br \/>\nfunction band(w,h,v1,v2,c){const y1&#061;yPos(v1,h),y2&#061;yPos(v2,h);ctx.fillStyle&#061;c;ctx.fillRect(0,y2,w,y1-y2)}<br \/>\nfunction line(w,h,v,c,label){const y&#061;yPos(v,h);ctx.strokeStyle&#061;c;ctx.lineWidth&#061;1;ctx.setLineDash([5,5]);ctx.beginPath();ctx.moveTo(0,y);ctx.lineTo(w,y);ctx.stroke();ctx.setLineDash([]);ctx.fillStyle&#061;c;ctx.font&#061;&#039;11px ui-monospace,monospace&#039;;ctx.textAlign&#061;&#039;right&#039;;ctx.fillText(label,w-4,y-4)}<br \/>\nfunction drawChart(){<br \/>\n  const r&#061;cv.getBoundingClientRect(),w&#061;r.width,h&#061;r.height;ctx.clearRect(0,0,w,h);<br \/>\n  band(w,h,0,WARN,&#039;rgba(63,154,99,.07)&#039;);<br \/>\n  band(w,h,WARN,ALARM,&#039;rgba(192,138,46,.09)&#039;);<br \/>\n  band(w,h,ALARM,YMAX,&#039;rgba(193,80,74,.10)&#039;);<br \/>\n  line(w,h,SAFE,&#039;rgba(138,150,163,.7)&#039;,&#039;\u5b89\u5168 600&#039;);<br \/>\n  line(w,h,WARN,&#039;rgba(192,138,46,.9)&#039;,&#039;\u9884\u8b66 720&#039;);<br \/>\n  line(w,h,ALARM,&#039;rgba(193,80,74,.9)&#039;,&#039;\u62a5\u8b66 1000&#039;);<br \/>\n  const cur&#061;data[data.length-1];<br \/>\n  const col&#061;cur&gt;&#061;ALARM?&#039;#c1504a&#039;:cur&gt;&#061;WARN?&#039;#c08a2e&#039;:&#039;#3f9a63&#039;;<br \/>\n  ctx.strokeStyle&#061;col;ctx.lineWidth&#061;2;ctx.lineJoin&#061;&#039;round&#039;;<br \/>\n  const step&#061;w\/(data.length-1);<br \/>\n  data.forEach((v,i)&#061;&gt;{const x&#061;i*step,y&#061;yPos(v,h);i?ctx.lineTo(x,y):ctx.moveTo(x,y)});<br \/>\n  ctx.stroke();<br \/>\n  ctx.fillStyle&#061;col;ctx.beginPath();ctx.arc(w,yPos(cur,h),3.5,0,7);ctx.fill();<br \/>\n  document.getElementById(&#039;strain-now&#039;).textContent&#061;Math.round(cur);<br \/>\n  document.getElementById(&#039;strain-now&#039;).style.color&#061;col;<br \/>\n}<br \/>\nfunction stepData(){const last&#061;data[data.length-1];data.push(Math.max(360,last&#043;(strainTarget-last)*0.35&#043;(Math.random()-0.5)*18));data.shift();drawChart()}<br \/>\nwindow.addEventListener(&#039;resize&#039;,()&#061;&gt;{resize();drawChart()});<br \/>\nresize();drawChart();render();<br \/>\nsetInterval(stepData,650);<br \/>\n&lt;\/script&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt; <\/p>\n<p>\u6838\u5fc3\u903b\u8f91&#xff1a;<\/p>\n<ul>\n<li>\n<p>\u5b9a\u65f6\u5237\u65b0&#xff1a;\u6bcf500ms\u8bf7\u6c42\/static\/cam.jpg\u548c\/static\/conf.txt\u3002<\/p>\n<\/li>\n<li>\n<p>\u72b6\u6001\u673a&#xff1a;\u6839\u636e\u7f6e\u4fe1\u5ea6\u8fde\u7eed\u8ba1\u6570&#xff08;\u22650.6\u6301\u7eed10\u5e27\u89e6\u53d1\u9884\u8b66&#xff0c;\u8fde\u7eed9\u5e27\u4f4e\u4e8e\u9608\u503c\u6062\u590d&#xff09;\u3002<\/p>\n<\/li>\n<li>\n<p>\u5e94\u53d8\u66f2\u7ebf&#xff1a;\u6a21\u62df\u52a8\u6001\u6570\u636e&#xff0c;\u5c55\u793a\u5b89\u5168\/\u9884\u8b66\/\u62a5\u8b66\u4e09\u6761\u9608\u503c\u7ebf\u3002<\/p>\n<\/li>\n<li>\n<p>\u591a\u6a21\u6001\u878d\u5408&#xff1a;\u56fe\u50cf\u901a\u9053\u4e0e\u5e94\u53d8\u901a\u9053\u7efc\u5408\u5224\u5b9a\u9884\u8b66\u7b49\u7ea7\u3002<\/p>\n<\/li>\n<\/ul>\n<h3>\u4e03\u3001\u8fd0\u884c\u4e0e\u8c03\u8bd5<\/h3>\n<h4>7.1 \u542f\u52a8\u540e\u7aef<\/h4>\n<p>python server.py <\/p>\n<p>\u8bbf\u95eehttp:\/\/127.0.0.1:8000\u53ef\u770b\u5230\u76d1\u63a7\u9762\u677f&#xff08;\u6b64\u65f6\u65e0\u56fe\u50cf&#xff0c;\u7b49\u5f85\u63a8\u7406\u7a0b\u5e8f\u4e0a\u4f20&#xff09;\u3002<\/p>\n<h4>7.2 \u542f\u52a8\u63a8\u7406\u4e3b\u7a0b\u5e8f<\/h4>\n<p>\u53e6\u5f00\u7ec8\u7aef&#xff0c;\u8fd0\u884c&#xff1a;<\/p>\n<p>python main.py <\/p>\n<p>\u6444\u50cf\u5934\u5f00\u542f&#xff0c;\u63a8\u7406\u7ed3\u679c\u5b9e\u65f6\u663e\u793a\u5728OpenCV\u7a97\u53e3&#xff0c;\u540c\u65f6\u6bcf10\u5e27\u4e0a\u4f20\u81f3Flask\u670d\u52a1\u3002<\/p>\n<h4>7.3 \u6548\u679c\u5c55\u793a<\/h4>\n<ul>\n<li>\n<p>\u524d\u7aef\u9875\u9762\u81ea\u52a8\u66f4\u65b0\u6444\u50cf\u5934\u753b\u9762\u3001\u7f6e\u4fe1\u5ea6\u3001\u9884\u8b66\u72b6\u6001\u3002<\/p>\n<\/li>\n<li>\n<p>\u5e94\u53d8\u66f2\u7ebf\u6a21\u62df\u6570\u636e\u52a8\u6001\u6ce2\u52a8\u3002<\/p>\n<\/li>\n<li>\n<p>\u5386\u53f2\u8bb0\u5f55\u81ea\u52a8\u6dfb\u52a0\u9884\u8b66\u4e8b\u4ef6\u3002<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u516b\u3001\u6027\u80fd\u4e0e\u4f18\u5316<\/h3>\n<ul>\n<li>\n<p>CPU\u6a21\u5f0f&#xff1a;\u5728Intel i7-10750H\u4e0a&#xff0c;YOLOv8n\u63a8\u7406\u7ea650ms\/\u5e27&#xff08;640\u00d7640&#xff09;&#xff0c;\u6574\u4f53\u5e27\u7387\u7ea615~20fps\u3002<\/p>\n<\/li>\n<li>\n<p>GPU\u6a21\u5f0f&#xff1a;\u5c06device&#061;&#039;cuda&#039;&#xff0c;\u63a8\u7406\u65f6\u95f4\u964d\u81f315ms&#xff0c;\u5e27\u7387\u53ef\u8fbe30fps\u4ee5\u4e0a\u3002<\/p>\n<\/li>\n<li>\n<p>\u7ebf\u7a0b\u6c60&#xff1a;\u5f02\u6b65\u63a8\u7406\u6709\u6548\u964d\u4f4e\u4e3b\u5faa\u73af\u963b\u585e&#xff0c;\u4fdd\u8bc1\u89c6\u9891\u91c7\u96c6\u8fde\u7eed\u6027\u3002<\/p>\n<\/li>\n<\/ul>\n<hr \/>\n<h3>\u4e5d\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/h3>\n<p>\u672c\u6587\u8be6\u7ec6\u8bb0\u5f55\u4e86\u5c06RK3568 NPU\u63a8\u7406\u7cfb\u7edf\u79fb\u690d\u5230PC\u7aef\u7684\u5168\u8fc7\u7a0b&#xff0c;\u4fdd\u7559\u4e86\u539f\u6709\u8f6f\u4ef6\u67b6\u6784\u548c\u524d\u7aef\u76d1\u63a7&#xff0c;\u4ec5\u66ff\u6362\u63a8\u7406\u540e\u7aef&#xff0c;\u5b9e\u73b0\u4e86\u5feb\u901f\u539f\u578b\u9a8c\u8bc1\u548c\u4e8c\u6b21\u5f00\u53d1\u3002\u4f60\u53ef\u4ee5\u57fa\u4e8e\u6b64\u4ee3\u7801&#xff1a;<\/p>\n<ul>\n<li>\n<p>\u66f4\u6362\u5176\u4ed6YOLO\u6a21\u578b&#xff08;\u5982yolov8s\u3001yolov9\u7b49&#xff09;\u3002<\/p>\n<\/li>\n<li>\n<p>\u63a5\u5165\u771f\u5b9e\u5e94\u53d8\u4f20\u611f\u5668\u6570\u636e&#xff0c;\u66ff\u4ee3\u6a21\u62df\u66f2\u7ebf\u3002<\/p>\n<\/li>\n<li>\n<p>\u90e8\u7f72\u5230\u4e91\u7aef\u670d\u52a1\u5668&#xff0c;\u5b9e\u73b0\u8fdc\u7a0b\u76d1\u63a7\u3002<\/p>\n<\/li>\n<\/ul>\n<\/p>\n<p>\u5982\u6709\u4fb5\u6743&#xff0c;\u6216\u9700\u8981\u5b8c\u6574\u4ee3\u7801&#xff0c;\u8bf7\u53ca\u65f6\u8054\u7cfb\u535a\u4e3b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u82e5\u8be5\u6587\u4e3a\u539f\u521b\u6587\u7ae0&#xff0c;\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u539f\u6587\u51fa\u5904\u3002 \u4e00\u3001\u5f15\u8a00<br \/>\n\u5728\u8fb9\u7f18AI\u5e94\u7528\u4e2d&#xff0c;RK3568\u7b49NPU\u5e73\u53f0\u51ed\u501f\u4f4e\u529f\u8017\u548c\u9ad8\u7b97\u529b\u6027\u4ef7\u6bd4\u5907\u53d7\u9752\u7750\u3002\u7136\u800c&#xff0c;\u5f00\u53d1\u8c03\u8bd5\u3001\u6a21\u578b\u8fed\u4ee3\u548c\u529f\u80fd\u6269\u5c55\u5f80\u5f80\u5728PC\u7aef\u66f4\u4e3a\u4fbf\u6377\u3002\u672c\u6587\u5c06\u5206\u4eab\u4e00\u5957\u5b8c\u6574\u7684\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0\u4eceRK3568&#xff08;RKNN NPU&#xff09;\u79fb\u690d\u5230PC\u7aef&#xff08;PyTorch \u00a0YOLOv8n.pt&#xff09;\u7684\u5b9e\u8df5\u65b9\u6848&#xff0c;\u5e76\u9644\u5e26\u5168\u6808\u4ee3\u7801&#xff08;\u540e\u7aefFl<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[156,305],"topic":[],"class_list":["post-84800","post","type-post","status-publish","format-standard","hentry","category-server","tag-yolo","tag-305"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/84800.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u82e5\u8be5\u6587\u4e3a\u539f\u521b\u6587\u7ae0&#xff0c;\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u539f\u6587\u51fa\u5904\u3002 \u4e00\u3001\u5f15\u8a00 \u5728\u8fb9\u7f18AI\u5e94\u7528\u4e2d&#xff0c;RK3568\u7b49NPU\u5e73\u53f0\u51ed\u501f\u4f4e\u529f\u8017\u548c\u9ad8\u7b97\u529b\u6027\u4ef7\u6bd4\u5907\u53d7\u9752\u7750\u3002\u7136\u800c&#xff0c;\u5f00\u53d1\u8c03\u8bd5\u3001\u6a21\u578b\u8fed\u4ee3\u548c\u529f\u80fd\u6269\u5c55\u5f80\u5f80\u5728PC\u7aef\u66f4\u4e3a\u4fbf\u6377\u3002\u672c\u6587\u5c06\u5206\u4eab\u4e00\u5957\u5b8c\u6574\u7684\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0\u4eceRK3568&#xff08;RKNN NPU&#xff09;\u79fb\u690d\u5230PC\u7aef&#xff08;PyTorch \u00a0YOLOv8n.pt&#xff09;\u7684\u5b9e\u8df5\u65b9\u6848&#xff0c;\u5e76\u9644\u5e26\u5168\u6808\u4ee3\u7801&#xff08;\u540e\u7aefFl\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/84800.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-26T10:17:54+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/84800.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/84800.html\",\"name\":\"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-07-26T10:17:54+00:00\",\"dateModified\":\"2026-07-26T10:17:54+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/84800.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/84800.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/84800.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/84800.html","og_locale":"zh_CN","og_type":"article","og_title":"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u82e5\u8be5\u6587\u4e3a\u539f\u521b\u6587\u7ae0&#xff0c;\u8f6c\u8f7d\u8bf7\u6ce8\u660e\u539f\u6587\u51fa\u5904\u3002 \u4e00\u3001\u5f15\u8a00 \u5728\u8fb9\u7f18AI\u5e94\u7528\u4e2d&#xff0c;RK3568\u7b49NPU\u5e73\u53f0\u51ed\u501f\u4f4e\u529f\u8017\u548c\u9ad8\u7b97\u529b\u6027\u4ef7\u6bd4\u5907\u53d7\u9752\u7750\u3002\u7136\u800c&#xff0c;\u5f00\u53d1\u8c03\u8bd5\u3001\u6a21\u578b\u8fed\u4ee3\u548c\u529f\u80fd\u6269\u5c55\u5f80\u5f80\u5728PC\u7aef\u66f4\u4e3a\u4fbf\u6377\u3002\u672c\u6587\u5c06\u5206\u4eab\u4e00\u5957\u5b8c\u6574\u7684\u9053\u6865\u5b89\u5168\u591a\u6a21\u6001\u76d1\u6d4b\u9884\u8b66\u5e73\u53f0\u4eceRK3568&#xff08;RKNN NPU&#xff09;\u79fb\u690d\u5230PC\u7aef&#xff08;PyTorch \u00a0YOLOv8n.pt&#xff09;\u7684\u5b9e\u8df5\u65b9\u6848&#xff0c;\u5e76\u9644\u5e26\u5168\u6808\u4ee3\u7801&#xff08;\u540e\u7aefFl","og_url":"https:\/\/www.wsisp.com\/helps\/84800.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-07-26T10:17:54+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"25 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/84800.html","url":"https:\/\/www.wsisp.com\/helps\/84800.html","name":"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-07-26T10:17:54+00:00","dateModified":"2026-07-26T10:17:54+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/84800.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/84800.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/84800.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"AI\u7b14\u8bb0\u4e09\u5341\u4e03\uff1aAI\u8fb9\u7f18\u7aef\u9053\u6865\u5b89\u5168\u76d1\u6d4b\u7cfb\u7edf\uff1aYOLOv8n\u63a8\u7406\u4e0eWeb\u76d1\u63a7\u5168\u89e3\u6790"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/84800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=84800"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/84800\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=84800"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=84800"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=84800"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=84800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}