copy from herb_ai.py
copy to onnx/herb_ai_.py
Îļþ´Ó herb_ai.py ¸´ÖÆ |
| | |
| | | import win32gui |
| | | import multiprocessing |
| | | from safety_detect import SAFETY_DETECT |
| | | from cam_util import CAM_UTIL |
| | | from identifier import IDENTIFIER |
| | | import os |
| | | from logger_config import logger |
| | |
| | | def variance_of_laplacian(image): |
| | | # 计ç®è¾å
¥å¾åçææ®ææ¯ååºçæ¹å·® |
| | | return cv2.Laplacian(image, cv2.CV_64F).var() |
| | | |
| | | |
| | | def clean_directory(path, days_threshold, max_files): |
| | | """æ¸
çè¶
è¿æ¶é´ææ°éçæä»¶""" |
| | | now = time.time() |
| | | threshold = now - days_threshold * 24 * 3600 |
| | | files = [] |
| | | for f in os.listdir(path): |
| | | file_path = os.path.join(path, f) |
| | | if os.path.isfile(file_path): |
| | | files.append((file_path, os.path.getmtime(file_path))) |
| | | # æä¿®æ¹æ¶é´éåºæåºï¼ä¿çææ°æä»¶ |
| | | files.sort(key=lambda x: x[1], reverse=True) |
| | | # å é¤è¿ææä»¶ |
| | | for file_info in files: |
| | | if file_info[1] < threshold: |
| | | os.remove(file_info[0]) |
| | | # ä¿çææ°æä»¶ï¼å é¤å¤ä½æä»¶ |
| | | for file_info in files[max_files:]: |
| | | os.remove(file_info[0]) |
| | | |
| | | |
| | | # è°ç¨å¦ä¸ä¸ªé¿ç¦éå¤´ï¼æææ¸
æ°çå±é¨è¯æå¾ç |
| | | def get_image(): |
| | | herb_identifier = IDENTIFIER("model/herb_identify.onnx") |
| | | logger.info("è¯å«çº¿ç¨å¯å¨") |
| | | global is_loaded, class_count, class_count_max, class_sum |
| | | camera2_index = config['cam']['cam2'] |
| | | camera2_index = 1 |
| | | print("第äºä¸ªæå头索å¼ï¼" + str(camera2_index)) |
| | | # æå¼æå头 |
| | | capture = cv2.VideoCapture(camera2_index, cv2.CAP_DSHOW) |
| | |
| | | break |
| | | count += 1 |
| | | |
| | | if count == config['cam']['frames']: |
| | | if count == 10: |
| | | herb_probabilities = herb_identifier(frame2) |
| | | top_five_classes = np.argsort(herb_probabilities, axis=1)[0][-5:][::-1] |
| | | name = "" |
| | |
| | | # è®¡ç®ææ®ææ¯ååºçæ¹å·® |
| | | laplacian = variance_of_laplacian(frame2) |
| | | # çæä¿åæä»¶åï¼ä»¥å½åæ¶é´å½å |
| | | save_name2 = time.strftime("%Y%m%d%H%M%S", time.localtime()) + "_" +name +"_["+ str(round(laplacian, 2)) +"]"+ ".jpg" |
| | | save_name2 = name +"_["+ str(round(laplacian, 2)) +"]_"+ time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".jpg" |
| | | logger.info(f"è¯å«ç»æè½¬æ¢ä¸ºä¿åå¾çåç§°:, {save_name2}") |
| | | # 夿å¾åçæ¸
æ°åº¦ |
| | | # ä¿åè°æ´å°ºå¯¸åçå¾ç |
| | | if laplacian > 200: |
| | | c_ = save_path + "2/c/" |
| | | # 夿æä»¶æ¯å¦åå¨ï¼ä¸åå¨åå建 |
| | | if not os.path.exists(c_): |
| | | os.makedirs(c_) |
| | | cv2.imwrite(c_ + save_name2, frame2) |
| | | # æ°å¢æ¸
çè°ç¨ |
| | | clean_directory(c_, config['cam']['days_threshold'], config['cam']['max_files']) |
| | | # æ¸
æ°æ¡ä»¶ä¸ç´¯è®¡è¯å«ç»æä¸è¯æåç§°åºç°çæ¬¡æ° |
| | | # 累计æ¯ç§è¯æä¸è®ºå次åºç°ç次æ°,累计æ¯ç§è¯æç½®ä¿¡åº¦æé«ç次æ°,累计æ¯ç§è¯æç置信度æ»å |
| | | # class_count = {} |
| | |
| | | is_loaded = True |
| | | else: |
| | | n_ = save_path + "2/n/" |
| | | # 夿æä»¶æ¯å¦åå¨ï¼ä¸åå¨åå建 |
| | | if not os.path.exists(n_): |
| | | os.makedirs(n_) |
| | | cv2.imwrite(n_ + save_name2, frame2) |
| | | # æ°å¢æ¸
çè°ç¨ |
| | | clean_directory(n_, config['cam']['days_threshold'], config['cam']['max_files']) |
| | | # cv2.imshow("Camera", resized_frame2) |
| | | print("ä¿åå¾ç:", save_name2) |
| | | break |
| | |
| | | capture.release() |
| | | def send_result(): |
| | | global is_loaded,class_count, class_count_max, class_sum |
| | | # 对class_countè¿è¡æåºï¼æç
§å¼ä»å¤§å°å°æåº,è¿å弿大çåäºä¸ª |
| | | sorted_class_count = dict(sorted(class_count.items(), key=lambda x: x[1], reverse=True)[:5]) |
| | | # 对class_count_maxè¿è¡æåºï¼æç
§å¼ä»å¤§å°å°æåº,è¿å弿大çåäºä¸ª |
| | | sorted_class_count_max = dict(sorted(class_count_max.items(), key=lambda x: x[1], reverse=True)[:5]) |
| | | # 对 class_sumè¿è¡æåºï¼æç
§å¼ä»å¤§å°å°æåº,è¿å弿大çåäºä¸ª |
| | | sorted_class_sum = dict(sorted(class_sum.items(), key=lambda x: x[1], reverse=True)[:5]) |
| | | # å°ä¸ç§ç»è®¡ç»æè¾åºå°æ¥å¿ä¸ |
| | | logger.info("class_count:"+str(class_count)) |
| | | logger.info("sorted_class_count:"+str(sorted_class_count)) |
| | | logger.info("class_count_max:"+str(class_count_max)) |
| | | logger.info("sorted_class_count_max:"+str(sorted_class_count_max)) |
| | | logger.info("class_sum:"+str(class_sum)) |
| | | logger.info("sorted_class_sum:"+str(sorted_class_sum)) |
| | | is_loaded = False |
| | | count_msg = "airecognize," + f"{sorted_class_count}" |
| | | logger.info("åéè¯æè¯å«ç»æï¼"+str(count_msg)) |
| | | l.send_msg(count_msg) |
| | | l.send_msg("airecognize," + f"{class_count}") |
| | | pass |
| | | |
| | | |
| | | def load_identify(): |
| | | global is_loaded |
| | | global is_loaded, frame |
| | | # æå头索å¼å·ï¼é常为0表示第ä¸ä¸ªæå头 |
| | | camera_index = config['cam']['cam1'] |
| | | camera_index = 0 |
| | | print("第ä¸ä¸ªæå头索å¼ï¼" + str(camera_index)) |
| | | # æå¼æå头 |
| | | cap = cv2.VideoCapture(camera_index, cv2.CAP_DSHOW) |
| | |
| | | # 计æ¶å¨ |
| | | frame_count = 0 |
| | | start_time = time.time() |
| | | stime = time.time() |
| | | sstime = time.time() |
| | | |
| | | if not os.path.exists(save_path): |
| | | os.makedirs(save_path) |
| | | # 䏿¬¡è¯å«ç»æ |
| | | class_old = "1" |
| | | # ç´¯è®¡æ¬¡æ° |
| | | count = 0 |
| | | |
| | | |
| | | # ä¸æç¶æ |
| | | status = "没æä¸æ" |
| | | |
| | | # å建çªå£å¹¶è®¾ç½®ä¸ºå¯è°æ´å¤§å° |
| | | cv2.namedWindow("AICamera", cv2.WINDOW_NORMAL) |
| | | |
| | | # 循ç¯è¯»åæå头ç»é¢ |
| | | while True: |
| | | logger.info("循ç¯è¯»åæå头ç»é¢") |
| | | # logger.info("循ç¯è¯»åæå头ç»é¢") |
| | | # ç¡ç 100æ¯«ç§ |
| | | time.sleep(config['cam']['sleep']) |
| | | time.sleep(0.1) |
| | | ret, frame = cap.read() |
| | | if not ret: |
| | | print("æ æ³è¯»åæå头ç»é¢") |
| | |
| | | break |
| | | # è·åå½åæ¶é´ |
| | | current_time = time.time() |
| | | # æ¯é3ç§åä¸å¸§å¾å |
| | | # æ¯énç§åä¸å¸§å¾å |
| | | if current_time - sstime >= config['cam']['sleep']: |
| | | sstime = current_time |
| | | |
| | | # å®å
¨æ£æµ |
| | | boxes, scores, class_ids = safety_detect(frame) |
| | | draw_img = safety_detect.draw_detections(frame, boxes, scores, class_ids) |
| | | |
| | | det_res = {} |
| | | if class_ids is not None: |
| | | # éåclass_ids è½¬æ¢æç±»å«åç§° |
| | | for i in range(len(class_ids)): |
| | | class_id = class_ids[i] |
| | | class_name = safety_detect.class_names[class_id] |
| | | # åå
¥å°det_resä¸ |
| | | if class_name in det_res: |
| | | det_res[class_name] = det_res[class_name] if det_res[class_name] > scores[i] else scores[i] |
| | | else: |
| | | det_res[class_name] = scores[i] |
| | | print(det_res) |
| | | logger.info(f"å®å
¨æ£æµè¯å«ç»æ, {det_res}") |
| | | # 妿cass_idsä¸å
å«0ï¼å表示æå®å
¨æ£æµå°äººä½ |
| | | if 0 in class_ids: |
| | | res_ = "aidetect," + f"{det_res}" |
| | | logger.info("åéå®å
¨æ£æµç»æï¼"+str(res_)) |
| | | l.send_msg(res_) |
| | | |
| | | # 䏿è¯å« |
| | | probabilities = load_identifier(frame) |
| | | # æ¾å°æå¤§æ¦ççç±»å« |
| | | predicted_class = np.argmax(probabilities, axis=1)[0] |
| | | max_probability = np.max(probabilities, axis=1)[0] |
| | | class_ = load_identifier.class_names[predicted_class] |
| | | # 计ç®ç±»åéå¤ç次æ°ï¼ç±»å«æ´æ¢ä¹åéæ°è®¡æ° |
| | | if class_ != class_old: |
| | | count = 0 |
| | | else: |
| | | count += 1 |
| | | class_old = class_ |
| | | print(f"{class_}:{count}: {max_probability}") |
| | | logger.info(f"{class_}:{count}: {max_probability}") |
| | | # 夿æ¯å¦ä¸æå¹¶ä¸ä¸ææ¬¡æ°å¤§äº10次 |
| | | if class_ == "shangliao" and count > 10: |
| | | status = "æ£å¨ä¸æ" |
| | | # æ¯é3ç§åä¸å¸§å¾å |
| | | # 妿è·ç¦»ä¸ä¸æ¬¡ä¿åå·²ç»è¿å»1ç§ï¼åä¿åå½åç»é¢ |
| | | if current_time - stime >= 10.0: |
| | | save_name = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".jpg" |
| | | # ä¿åè°æ´å°ºå¯¸åçå¾ç |
| | | path_ = save_path + "1/" |
| | | if not os.path.exists(path_): |
| | | os.makedirs(path_) |
| | | cv2.imwrite(path_ + save_name, frame) |
| | | # æ°å¢æ¸
çè°ç¨ |
| | | clean_directory(path_, config['cam']['days_threshold'], config['cam']['max_files']) |
| | | # é置计æ¶å¨ |
| | | stime = time.time() |
| | | |
| | | thread = threading.Thread(target=get_image) |
| | | thread.start() |
| | | |
| | | else: |
| | | status = "没æä¸æ" |
| | | if class_ == "meishangliao" and count == 3 and is_loaded: |
| | | logger.info("忢䏿ååéè¯å«ç»æ") |
| | | send_result() |
| | | if class_ == "meishangliao" and count == 1000: |
| | | is_loaded = False |
| | | logger.info("é¿æ¶é´æªä¸æï¼éç½®æ£å¨ä¸æç¶æ") |
| | | thread1 = threading.Thread(target=method_name) |
| | | thread1.start() |
| | | # frame = draw_img |
| | | # print(status) |
| | | |
| | | # 䏿æºä½ç½®è¯å« |
| | | probabilities2 = hoister_position(frame); |
| | | predicted_class2 = np.argmax(probabilities2, axis=1)[0] |
| | | max_probability2 = np.max(probabilities2, axis=1)[0] |
| | | class_2 = hoister_position.class_names[predicted_class2] |
| | | print(f"-----------{class_2}:{predicted_class2}: {max_probability2}") |
| | | logger.info(f"-----------{class_2}:{predicted_class2}: {max_probability2}") |
| | | |
| | | if predicted_class2 == 0: |
| | | feeder_res = {class_2: max_probability2} |
| | | class_feeder = "aifeeder," + f"{feeder_res}" |
| | | print("send_msg", class_feeder) |
| | | logger.info("åé䏿æºä½ç½®è¯å«ç»æï¼"+str(class_feeder)) |
| | | l.send_msg(class_feeder) |
| | | # 计ç®å¸§éç |
| | | frame_count += 1 |
| | | end_time = time.time() |
| | | elapsed_time = end_time - start_time |
| | | fps = frame_count / elapsed_time |
| | | # print(f"FPS: {fps:.2f}") |
| | | # å°FPSç»å¶å¨å¾åä¸ |
| | | cv2.putText(draw_img, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, |
| | | cv2.LINE_AA) |
| | | # frame_count += 1 |
| | | # end_time = time.time() |
| | | # elapsed_time = end_time - start_time |
| | | # fps = frame_count / elapsed_time |
| | | # # print(f"FPS: {fps:.2f}") |
| | | # # å°FPSç»å¶å¨å¾åä¸ |
| | | # cv2.putText(frame, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, |
| | | # cv2.LINE_AA) |
| | | # æ¾ç¤ºç»é¢ |
| | | # è·åå½åçªå£å¤§å° |
| | | width = cv2.getWindowImageRect("AICamera")[2] |
| | | height = cv2.getWindowImageRect("AICamera")[3] |
| | | |
| | | # è°æ´å¾å大å°ä»¥éåºçªå£ |
| | | resized_frame = cv2.resize(draw_img, (width, height)) |
| | | |
| | | cv2.imshow("AICamera", resized_frame) |
| | | cv2.imshow("AICamera", frame) |
| | | # æ£æµæé®ï¼å¦ææä¸qé®åéåºå¾ªç¯ |
| | | if cv2.waitKey(1) & 0xFF == ord('q'): |
| | | break |
| | |
| | | # å
³éææçªå£ |
| | | cv2.destroyAllWindows() |
| | | |
| | | |
| | | def method_name( ): |
| | | global is_loaded,count,class_old,stime,frame |
| | | # å®å
¨æ£æµ |
| | | boxes, scores, class_ids = safety_detect(frame) |
| | | draw_img = safety_detect.draw_detections(frame, boxes, scores, class_ids) |
| | | print(boxes, scores, class_ids) |
| | | det_res = {} |
| | | if class_ids is not None: |
| | | # éåclass_ids è½¬æ¢æç±»å«åç§° |
| | | for i in range(len(class_ids)): |
| | | class_id = class_ids[i] |
| | | class_name = safety_detect.class_names[class_id] |
| | | # åå
¥å°det_resä¸ |
| | | if class_name in det_res: |
| | | det_res[class_name] = det_res[class_name] if det_res[class_name] > scores[i] else scores[i] |
| | | else: |
| | | det_res[class_name] = scores[i] |
| | | logger.info(f"å®å
¨æ£æµè¯å«ç»æ, {det_res}") |
| | | # 妿cass_idsä¸å
å«0ï¼å表示æå®å
¨æ£æµå°äººä½ |
| | | if 0 in class_ids: |
| | | l.send_msg("aidetect," + f"{det_res}") |
| | | # 䏿è¯å« |
| | | probabilities = load_identifier(frame) |
| | | # æ¾å°æå¤§æ¦ççç±»å« |
| | | predicted_class = np.argmax(probabilities, axis=1)[0] |
| | | max_probability = np.max(probabilities, axis=1)[0] |
| | | class_ = load_identifier.class_names[predicted_class] |
| | | # 计ç®ç±»åéå¤ç次æ°ï¼ç±»å«æ´æ¢ä¹åéæ°è®¡æ° |
| | | if class_ != class_old: |
| | | count = 0 |
| | | else: |
| | | count += 1 |
| | | class_old = class_ |
| | | print(f"{class_}:{count}: {max_probability}") |
| | | logger.info(f"{class_}:{count}: {max_probability}") |
| | | # 夿æ¯å¦ä¸æå¹¶ä¸ä¸ææ¬¡æ°å¤§äº10次 |
| | | if class_ == "shangliao" and count > 10: |
| | | status = "æ£å¨ä¸æ" |
| | | # æ¯é3ç§åä¸å¸§å¾å |
| | | # 妿è·ç¦»ä¸ä¸æ¬¡ä¿åå·²ç»è¿å»1ç§ï¼åä¿åå½åç»é¢ |
| | | current_time = time.time() |
| | | if current_time - stime >= 10.0: |
| | | save_name = time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".jpg" |
| | | # ä¿åè°æ´å°ºå¯¸åçå¾ç |
| | | path_ = save_path + "1/" |
| | | if not os.path.exists(path_): |
| | | os.makedirs(path_) |
| | | cv2.imwrite(path_ + save_name, frame) |
| | | # é置计æ¶å¨ |
| | | stime = time.time() |
| | | |
| | | thread = threading.Thread(target=get_image) |
| | | thread.start() |
| | | |
| | | else: |
| | | status = "没æä¸æ" |
| | | if class_ == "meishangliao" and count == 3 and is_loaded: |
| | | logger.info("忢䏿ååéè¯å«ç»æ") |
| | | send_result() |
| | | if class_ == "meishangliao" and count == 1000: |
| | | is_loaded = False |
| | | logger.info("é¿æ¶é´æªä¸æï¼éç½®æ£å¨ä¸æç¶æ") |
| | | |
| | | |
| | | # 读åé
ç½®æä»¶ |
| | |
| | | def OnCopyData(self, hwnd, msg, wparam, lparam): |
| | | try: |
| | | # è®°å½å¼å§æ¶é´ |
| | | start_time = time.time() |
| | | startTime = time.time() |
| | | pCDS = ctypes.cast(lparam, PCOPYDATASTRUCT) |
| | | s = ctypes.string_at(pCDS.contents.lpData).decode() |
| | | strArr = s.split(",") |
| | |
| | | logger.info(f"è¯å«ç»æï¼{res}") |
| | | self.send_msg(msg) |
| | | # è®°å½ç»ææ¶é´ |
| | | end_time = time.time() |
| | | endTime = time.time() |
| | | # è®¡ç®æ§è¡æ¶é´ |
| | | execution_time = end_time - start_time |
| | | execution_time = endTime - startTime |
| | | # æå°æ§è¡æ¶é´ |
| | | print(f"ç¨åºæ§è¡æ¶é´ä¸º:{execution_time}ç§") |
| | | logger.info(f"ç¨åºæ§è¡æ¶é´ä¸º:{execution_time,}ç§") |
| | |
| | | class_count_max = {} |
| | | # 累计æ¯ç§è¯æç置信度æ»å |
| | | class_sum = {} |
| | | # 䏿¬¡è¯å«ç»æ |
| | | class_old = "1" |
| | | # ç´¯è®¡æ¬¡æ° |
| | | count = 0 |
| | | stime = time.time() |
| | | frame = None |
| | | # cam1 = "USB Camera" |
| | | # cam2 = "USB ZOOM Camera" |
| | | # camUtil = CAM_UTIL(cam1, cam2) |
| | |
| | | # æ¯å¦ä¸è¿æ |
| | | is_loaded = False |
| | | # å è½½ONNX模å |
| | | |
| | | herb_identifier = IDENTIFIER("model/herb_identify.onnx") |
| | | load_identifier = IDENTIFIER("model/loading.onnx") |
| | | hoister_position = IDENTIFIER("model/hl.onnx") |
| | | safety_detect = SAFETY_DETECT("model/safety_det.onnx") |
| | | config = read_config() |
| | | PCOPYDATASTRUCT = ctypes.POINTER(COPYDATASTRUCT) |