ZMES Install Feat GPU Support Ubuntu 20.04 - Solved Guide Within

Discussion topics related to mobile applications and ZoneMinder Event Server (including machine learning)
Magic919
Posts: 1381
Joined: Wed Sep 18, 2013 6:56 am

Re: Looking for a zmes installation Feat GPU support

Post by Magic919 »

Ok. Fix that.
-
kaltertod
Posts: 38
Joined: Fri Jun 03, 2022 9:42 pm

Re: Looking for a zmes installation Feat GPU support

Post by kaltertod »

Magic919 wrote: Tue Jun 07, 2022 4:34 pm Ok. Fix that.
currently recompiling dlib from source we shall see how it goes
kaltertod
Posts: 38
Joined: Fri Jun 03, 2022 9:42 pm

Re: Looking for a zmes installation Feat GPU support

Post by kaltertod »

Started last night from scratch again. I used the guide with some modifications. I used compiled opencv and dlib with cudnn v8 and used cuda 10.1 as provided with ubuntu 20.04 repos. I have not yet configured face recognition... I have a few more hrs before I have to head off to work. I will give it a go before I head off to work. Here are the results:

Code: Select all

sudo -u www-data /var/lib/zmeventnotification/bin/zm_detect.py --config /etc/zm/objectconfig.ini --debug --eventid 2  --monitorid 5 --eventpath=/tmp
06/08/22 11:13:13 zmesdetect_m5[94441] INF ZMLog.py:292 [Setting up signal handler for logs]

06/08/22 11:13:13 zmesdetect_m5[94441] INF ZMLog.py:301 [Switching global logger to ZMLog]

06/08/22 11:13:13 zmesdetect_m5[94441] INF zm_detect.py:284 [---------| app:6.1.28, pyzm:0.3.56, ES:6.1.28
 , OpenCV:4.5.5|------------]

06/08/22 11:13:13 zmesdetect_m5[94441] INF utils.py:405 [Reading config from: /etc/zm/objectconfig.ini]

06/08/22 11:13:13 zmesdetect_m5[94441] INF utils.py:410 [Reading secrets from: /etc/zm/secrets.ini]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ZM_PORTAL]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ZM_USER]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ZM_PASSWORD]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ZM_API_PORTAL]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ML_USER]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !ML_PASSWORD]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:382 [Secret token found in config: !PLATEREC_ALPR_KEY]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG1 utils.py:445 [allowing self-signed certs to work...]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG2 utils.py:455 [Now checking for monitor overrides]

06/08/22 11:13:13 zmesdetect_m5[94441] DBG3 utils.py:522 [Finally, doing parameter substitution]

06/08/22 11:13:13 zmesdetect_m5[94441] INF zm_detect.py:309 [Importing local classes for Object/Face]

06/08/22 11:13:14 zmesdetect_m5[94441] INF zm_detect.py:334 [Connecting with ZM APIs]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 api.py:72 [API SSL certificate check has been disbled]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 api.py:181 [using username/password for login]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 api.py:210 [Using new token API]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 api.py:217 [Access token expires on:2022-06-08 13:13:14.429674 [7200s]]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 api.py:221 [Refresh token expires on:2022-06-09 11:13:14.430473 [86400s]]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 zm_detect.py:342 [using ml_sequence]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 zm_detect.py:354 [using stream_sequence]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 detect_sequence.py:160 [Resetting models, will be loaded on next run]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 detect_sequence.py:634 [Using automatic locking as we are switching between models]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 Media.py:51 [Media get SSL certificate check has been disbled]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 Media.py:99 [Using URL 2 for stream]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 Media.py:114 [We will only process frames: ['snapshot', 'alarm']]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 Media.py:137 [No need to start streams, we are picking images from https://192.168.0.9/zm/index.php?view=image&eid=2]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 Media.py:271 [Reading https://192.168.0.9/zm/index.php?view=image&eid=2&fid=snapshot]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 api.py:144 [No need to relogin as access token still has 119.99980951666666 minutes remaining]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 api.py:272 [make_request called with url=https://192.168.0.9/zm/index.php?view=image&eid=2&fid=snapshot payload={} type=get query={'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJab25lTWluZGVyIiwiaWF0IjoxNjU0NzA4Mzk0LCJleHAiOjE2NTQ3MTU1OTQsInVzZXIiOiJaTUVTIiwidHlwZSI6ImFjY2VzcyJ9.Jbcgnh-zZSTWUopIj6NE__G0Qotkn451tUGLULMryR4'}]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 detect_sequence.py:654 [perf: Starting for frame:snapshot]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 detect_sequence.py:664 [Sequence of detection types to execute: ['object', 'face', 'alpr']]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: snapshot Running object detection type in sequence ==================]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 detect_sequence.py:174 [Skipping TPU object detection as it is disabled]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 detect_sequence.py:178 [Loading sequence: YoloV4 GPU/CPU]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 detect_sequence.py:179 [Initializing model  type:object with options:{'name': 'YoloV4 GPU/CPU', 'enabled': 'yes', 'object_config': '/var/lib/zmeventnotification/models/yolov4/yolov4.cfg', 'object_weights': '/var/lib/zmeventnotification/models/yolov4/yolov4.weights', 'object_labels': '/var/lib/zmeventnotification/models/yolov4/coco.names', 'object_min_confidence': 0.3, 'object_framework': 'opencv', 'object_processor': 'gpu', 'gpu_max_processes': 1, 'gpu_max_lock_wait': 100, 'cpu_max_processes': 3, 'cpu_max_lock_wait': 100, 'max_detection_size': '90%', 'disable_locks': 'no'}]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 yolo.py:38 [portalock: max:1, name:pyzm_uid33_gpu_lock, timeout:100]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [object has a same_model_sequence strategy of first]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:snapshot Running variation: #1 -------------]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 yolo.py:136 [detect extracted image dimensions as: 800wx450h]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 yolo.py:50 [Waiting for pyzm_uid33_gpu_lock portalock...]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 yolo.py:52 [Got pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 yolo.py:85 [|--------- Loading "YoloV4 GPU/CPU" model from disk -------------|]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 yolo.py:98 [You are using OpenCV >= 4.5.4, making sure we fix getUnconnectedOutLayers() API]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 yolo.py:100 [perf: processor:gpu Yolo initialization (loading /var/lib/zmeventnotification/models/yolov4/yolov4.weights model from disk) took: 126.17 ms]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG2 yolo.py:115 [Setting CUDA backend for OpenCV]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG3 yolo.py:116 [If you did not set your CUDA_ARCH_BIN correctly during OpenCV compilation, you will get errors during detection related to invalid device/make_policy]

06/08/22 11:13:14 zmesdetect_m5[94441] DBG1 yolo.py:160 [|---------- YOLO (input image: 800w*450h, model resize dimensions: 416w*416h) ----------|]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 yolo.py:68 [Released pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG1 yolo.py:185 [perf: processor:gpu Yolo detection took: 1568.19 ms]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 yolo.py:220 [perf: processor:gpu Yolo NMS filtering took: 1.10 ms]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 object.py:66 [core model detection over, got 6 objects. Now filtering]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 object.py:70 [Max object size found to be: 90%]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 object.py:78 [Converted 90% to 324000.0]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 object.py:103 [Returning filtered list of 6 objects.]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside object found: labels: ['car', 'truck', 'car', 'car', 'person', 'car'],conf:[0.9954595565795898, 0.9149943590164185, 0.8078308701515198, 0.7353916764259338, 0.6761721968650818, 0.4781055450439453]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:448 [No polygons, adding full image polygon: {'name': 'full_image', 'value': [(0, 0), (1920, 0), (1920, 1080), (0, 1080)], 'pattern': None}]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG3 detect_sequence.py:228 [resized polygons x=0.4166666666666667/y=0.4166666666666667: [{'name': 'full_image', 'value': [(0, 0), (800, 0), (800, 450), (0, 450)], 'pattern': None}]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((200 90, 356 90, 356 168, 200 168, 200 90)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(200, 90), (356, 90), (356, 168), (200, 168)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:truck,POLYGON ((1 106, 175 106, 175 208, 1 208, 1 106)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:truck[[(1, 106), (175, 106), (175, 208), (1, 208)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((46 56, 108 56, 108 102, 46 102, 46 56)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(46, 56), (108, 56), (108, 102), (46, 102)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((676 74, 710 74, 710 94, 676 94, 676 74)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(676, 74), (710, 74), (710, 94), (676, 94)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:person,POLYGON ((697 139, 767 139, 767 281, 697 281, 697 139)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:person[[(697, 139), (767, 139), (767, 281), (697, 281)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((-1 58, 43 58, 43 108, -1 108, -1 58)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(-1, 58), (43, 58), (43, 108), (-1, 108)]]]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:753 [breaking out of same model loop, as matches found and strategy is "first"]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: snapshot Running face detection type in sequence ==================]

06/08/22 11:13:16 zmesdetect_m5[94441] DBG2 detect_sequence.py:190 [Skipping TPU face detection as it is disabled]

/usr/local/lib/python3.8/dist-packages/numpy/core/getlimits.py:499: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero.
  setattr(self, word, getattr(machar, word).flat[0])
/usr/local/lib/python3.8/dist-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float64'> type is zero.
  return self._float_to_str(self.smallest_subnormal)
/usr/local/lib/python3.8/dist-packages/numpy/core/getlimits.py:499: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero.
  setattr(self, word, getattr(machar, word).flat[0])
/usr/local/lib/python3.8/dist-packages/numpy/core/getlimits.py:89: UserWarning: The value of the smallest subnormal for <class 'numpy.float32'> type is zero.
  return self._float_to_str(self.smallest_subnormal)
06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_dlib.py:42 [perf: processor:gpu Face Recognition library load time took: 0.00 ms ]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_dlib.py:50 [Initializing face recognition with model:cnn upsample:1, jitters:0]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG2 face_dlib.py:73 [portalock: max:1, name:pyzm_uid33_gpu_lock, timeout:100]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_dlib.py:97 [trained file not found, reading from images and doing training...]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_dlib.py:100 [If you are using a GPU and run out of memory, do the training using zm_train_faces.py. In this case, other models like yolo may already take up a lot of GPU memory]

06/08/22 11:13:19 zmesdetect_m5[94441] ERR face_train_dlib.py:135 [No known faces found to train, encoding file not created]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_train_dlib.py:152 [perf: Face Recognition training took: 36.25 ms]

06/08/22 11:13:19 zmesdetect_m5[94441] ERR face_dlib.py:110 [Error loading KNN model: [Errno 2] No such file or directory: '/var/lib/zmeventnotification/known_faces/faces.dat']

06/08/22 11:13:19 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [face has a same_model_sequence strategy of union]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:snapshot Running variation: #1 -------------]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG1 face_dlib.py:164 [|---------- Dlib Face recognition (input image: 800w*450h) ----------|]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG3 face_dlib.py:174 [Face options={'name': 'DLIB based face recognition', 'enabled': 'yes', 'save_unknown_faces': 'yes', 'save_unknown_faces_leeway_pixels': 100, 'face_detection_framework': 'dlib', 'known_images_path': '/var/lib/zmeventnotification/known_faces', 'unknown_images_path': '/var/lib/zmeventnotification/unknown_faces', 'face_model': 'cnn', 'face_train_model': 'cnn', 'face_recog_dist_threshold': '0.6', 'face_num_jitters': '1', 'face_upsample_times': '1', 'gpu_max_processes': 1, 'gpu_max_lock_wait': 100, 'cpu_max_processes': 3, 'cpu_max_lock_wait': 100, 'max_size': 800, 'disable_locks': 'no'}]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG2 face_dlib.py:123 [Waiting for pyzm_uid33_gpu_lock portalock...]

06/08/22 11:13:19 zmesdetect_m5[94441] DBG2 face_dlib.py:125 [Got pyzm_uid33_gpu_lock lock...]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 face_dlib.py:206 [perf: processor:gpu Finding faces took 1006.28 ms]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 face_dlib.py:141 [Released pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 face_dlib.py:218 [perf: processor:gpu Computing face recognition distances took 0.79 ms]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside face found: labels: [],conf:[]]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 detect_sequence.py:770 [We did not find any face matches in frame: snapshot]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: snapshot Running alpr detection type in sequence ==================]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 detect_sequence.py:672 [Making sure we have matched one of ['car', 'motorbike', 'bus', 'truck', 'boat'] in ['car', 'truck', 'car', 'car', 'person', 'car'] before we proceed]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 alpr.py:24 [Initializing ALPR:Platerecognizer cloud with options:{'name': 'Platerecognizer cloud', 'enabled': 'yes', 'alpr_api_type': 'cloud', 'alpr_service': 'plate_recognizer', 'alpr_key': 'your_plate_recognizer_api_key', 'platrec_stats': 'yes', 'platerec_min_dscore': 0.1, 'platerec_min_score': 0.2, 'max_size': 1600, 'disable_locks': 'no'}]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 alpr.py:24 [Initializing ALPR:Platerecognizer cloud with options:{'name': 'Platerecognizer cloud', 'enabled': 'yes', 'alpr_api_type': 'cloud', 'alpr_service': 'plate_recognizer', 'alpr_key': 'your_plate_recognizer_api_key', 'platrec_stats': 'yes', 'platerec_min_dscore': 0.1, 'platerec_min_score': 0.2, 'max_size': 1600, 'disable_locks': 'no'}]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 alpr.py:141 [PlateRecognizer ALPR initialized with url: https://api.platerecognizer.com/v1]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [alpr has a same_model_sequence strategy of first]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:snapshot Running variation: #1 -------------]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG1 alpr.py:50 [Supplied object is not a file, assuming blob and creating file]

06/08/22 11:13:20 zmesdetect_m5[94441] DBG2 alpr.py:54 [resizing image blob to 1600]

06/08/22 11:13:21 zmesdetect_m5[94441] ERR alpr.py:219 [Plate recognizer rejected the upload with 403 Client Error: Forbidden for url: https://api.platerecognizer.com/v1/plate-reader and body:b'{"detail":"Invalid token.","status_code":403}']

06/08/22 11:13:21 zmesdetect_m5[94441] DBG2 alpr.py:251 [Exiting ALPR with labels:[]]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside alpr found: labels: [],conf:[]]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG2 detect_sequence.py:770 [We did not find any alpr matches in frame: snapshot]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG3 Media.py:271 [Reading https://192.168.0.9/zm/index.php?view=image&eid=2&fid=alarm]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG3 api.py:144 [No need to relogin as access token still has 119.87540513333333 minutes remaining]

06/08/22 11:13:21 zmesdetect_m5[94441] DBG3 api.py:272 [make_request called with url=https://192.168.0.9/zm/index.php?view=image&eid=2&fid=alarm payload={} type=get query={'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJab25lTWluZGVyIiwiaWF0IjoxNjU0NzA4Mzk0LCJleHAiOjE2NTQ3MTU1OTQsInVzZXIiOiJaTUVTIiwidHlwZSI6ImFjY2VzcyJ9.Jbcgnh-zZSTWUopIj6NE__G0Qotkn451tUGLULMryR4'}]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:654 [perf: Starting for frame:alarm]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:664 [Sequence of detection types to execute: ['object', 'face', 'alpr']]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: alarm Running object detection type in sequence ==================]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [object has a same_model_sequence strategy of first]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:alarm Running variation: #1 -------------]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 yolo.py:136 [detect extracted image dimensions as: 800wx450h]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 yolo.py:50 [Waiting for pyzm_uid33_gpu_lock portalock...]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 yolo.py:52 [Got pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 yolo.py:160 [|---------- YOLO (input image: 800w*450h, model resize dimensions: 416w*416h) ----------|]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 yolo.py:68 [Released pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 yolo.py:185 [perf: processor:gpu Yolo detection took: 38.76 ms]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 yolo.py:220 [perf: processor:gpu Yolo NMS filtering took: 1.13 ms]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 object.py:66 [core model detection over, got 6 objects. Now filtering]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 object.py:70 [Max object size found to be: 90%]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 object.py:78 [Converted 90% to 324000.0]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 object.py:103 [Returning filtered list of 6 objects.]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside object found: labels: ['car', 'truck', 'car', 'car', 'person', 'car'],conf:[0.9955545663833618, 0.9052786827087402, 0.7876212000846863, 0.6594511270523071, 0.6286739110946655, 0.48158690333366394]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((200 90, 356 90, 356 168, 200 168, 200 90)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(200, 90), (356, 90), (356, 168), (200, 168)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:truck,POLYGON ((1 107, 173 107, 173 211, 1 211, 1 107)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:truck[[(1, 107), (173, 107), (173, 211), (1, 211)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((46 56, 108 56, 108 102, 46 102, 46 56)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(46, 56), (108, 56), (108, 102), (46, 102)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((676 74, 710 74, 710 94, 676 94, 676 74)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(676, 74), (710, 74), (710, 94), (676, 94)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:person,POLYGON ((702 147, 766 147, 766 281, 702 281, 702 147)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:person[[(702, 147), (766, 147), (766, 281), (702, 281)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:502 [intersection: object:car,POLYGON ((-1 58, 43 58, 43 108, -1 108, -1 58)) intersects polygon:full_image,POLYGON ((0 0, 800 0, 800 450, 0 450, 0 0))]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:518 [Using global match pattern: (person|car|motorbike|bus|truck|boat)]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:526 [full_image intersects object:car[[(-1, 58), (43, 58), (43, 108), (-1, 108)]]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:753 [breaking out of same model loop, as matches found and strategy is "first"]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: alarm Running face detection type in sequence ==================]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [face has a same_model_sequence strategy of union]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:alarm Running variation: #1 -------------]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 face_dlib.py:164 [|---------- Dlib Face recognition (input image: 800w*450h) ----------|]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG3 face_dlib.py:174 [Face options={'name': 'DLIB based face recognition', 'enabled': 'yes', 'save_unknown_faces': 'yes', 'save_unknown_faces_leeway_pixels': 100, 'face_detection_framework': 'dlib', 'known_images_path': '/var/lib/zmeventnotification/known_faces', 'unknown_images_path': '/var/lib/zmeventnotification/unknown_faces', 'face_model': 'cnn', 'face_train_model': 'cnn', 'face_recog_dist_threshold': '0.6', 'face_num_jitters': '1', 'face_upsample_times': '1', 'gpu_max_processes': 1, 'gpu_max_lock_wait': 100, 'cpu_max_processes': 3, 'cpu_max_lock_wait': 100, 'max_size': 800, 'disable_locks': 'no'}]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 face_dlib.py:123 [Waiting for pyzm_uid33_gpu_lock portalock...]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 face_dlib.py:125 [Got pyzm_uid33_gpu_lock lock...]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 face_dlib.py:206 [perf: processor:gpu Finding faces took 74.98 ms]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 face_dlib.py:141 [Released pyzm_uid33_gpu_lock portalock]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 face_dlib.py:218 [perf: processor:gpu Computing face recognition distances took 0.47 ms]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside face found: labels: [],conf:[]]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:770 [We did not find any face matches in frame: alarm]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:669 [============ Frame: alarm Running alpr detection type in sequence ==================]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 detect_sequence.py:672 [Making sure we have matched one of ['car', 'motorbike', 'bus', 'truck', 'boat'] in ['car', 'truck', 'car', 'car', 'person', 'car'] before we proceed]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG3 detect_sequence.py:689 [alpr has a same_model_sequence strategy of first]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 detect_sequence.py:701 [--------- Frame:alarm Running variation: #1 -------------]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG1 alpr.py:50 [Supplied object is not a file, assuming blob and creating file]

06/08/22 11:13:22 zmesdetect_m5[94441] DBG2 alpr.py:54 [resizing image blob to 1600]

06/08/22 11:13:23 zmesdetect_m5[94441] ERR alpr.py:219 [Plate recognizer rejected the upload with 403 Client Error: Forbidden for url: https://api.platerecognizer.com/v1/plate-reader and body:b'{"detail":"Invalid token.","status_code":403}']

06/08/22 11:13:23 zmesdetect_m5[94441] DBG2 alpr.py:251 [Exiting ALPR with labels:[]]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG2 detect_sequence.py:711 [This model iteration inside alpr found: labels: [],conf:[]]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG2 detect_sequence.py:424 [Max object size found to be: 90%]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG2 detect_sequence.py:432 [Converted 90% to 324000.0]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG2 detect_sequence.py:770 [We did not find any alpr matches in frame: alarm]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG1 detect_sequence.py:827 [perf: TOTAL detection sequence (with image loads) took: 9045.17 ms  to process 2]

06/08/22 11:13:23 zmesdetect_m5[94441] INF zm_detect.py:479 [Prediction string:[s] detected:car:100% truck:91% person:68% ]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG1 zm_detect.py:481 [Prediction string JSON:{"labels": ["car", "truck", "car", "car", "person", "car"], "boxes": [[200, 90, 356, 168], [1, 106, 175, 208], [46, 56, 108, 102], [676, 74, 710, 94], [697, 139, 767, 281], [-1, 58, 43, 108]], "frame_id": "snapshot", "confidences": [0.9954595565795898, 0.9149943590164185, 0.8078308701515198, 0.7353916764259338, 0.6761721968650818, 0.4781055450439453], "image_dimensions": {"original": [1080, 1920], "resized": [450, 800]}}]

[s] detected:car:100% truck:91% person:68% --SPLIT--{"labels": ["car", "truck", "car", "car", "person", "car"], "boxes": [[200, 90, 356, 168], [1, 106, 175, 208], [46, 56, 108, 102], [676, 74, 710, 94], [697, 139, 767, 281], [-1, 58, 43, 108]], "frame_id": "snapshot", "confidences": [0.9954595565795898, 0.9149943590164185, 0.8078308701515198, 0.7353916764259338, 0.6761721968650818, 0.4781055450439453], "image_dimensions": {"original": [1080, 1920], "resized": [450, 800]}}
06/08/22 11:13:23 zmesdetect_m5[94441] DBG1 zm_detect.py:499 [Writing detected image to /tmp/objdetect.jpg]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG1 zm_detect.py:503 [Writing JSON output to /tmp/objects.json]

06/08/22 11:13:23 zmesdetect_m5[94441] DBG1 zm_detect.py:557 [Closing logs]
Attachments
objdetect.jpg
objdetect.jpg (208 KiB) Viewed 8584 times
Magic919
Posts: 1381
Joined: Wed Sep 18, 2013 6:56 am

Re: Looking for a zmes installation Feat GPU support

Post by Magic919 »

I’m just cooking dinner, but that looks like it’s functioning now.

Only the number plate recognition is raising errors. Not a problem. You can configure it off or set it up.
-
kaltertod
Posts: 38
Joined: Fri Jun 03, 2022 9:42 pm

Re: Looking for a zmes installation Feat GPU support

Post by kaltertod »

The event notifier has been working flawlessly over the last few days,

Quick question regarding object detection. Lets say I want to detect dogs/cats/birds etc where would I change this in the config? would it be located in the objectconfig.ini? Or is this located elsewhere?
kaltertod
Posts: 38
Joined: Fri Jun 03, 2022 9:42 pm

Re: Looking for a zmes installation Feat GPU support

Post by kaltertod »

These are the steps that I used to get ZMES up and running on my box with a gtx 1650, There were no complete guides out there to be found as it came to getting ZMES up and running on Ubuntu 20.04. Here is my steps that I used. If you guys see anything that needs changed please let me know.

Now I just need to find a mlapi guide so I can get this up and running on my remote zm box over vpn.

This is a heavily edited guide taken from https://www.reddit.com/r/ZoneMinder/com ... _with_gpu/

###Install some tools

Code: Select all

sudo apt install vim nfs-kernel-server software-properties-common curl
###Install Nvidia Drivers and Cuda Toolkit

Code: Select all

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-440 nvidia-headless-440 nvidia-cuda-toolkit
sudo reboot
###Download cuDNN that matches "nvcc -V" --> https://developer.nvidia.com/rdp/cudnn-download
###Make sure that you download version 8.0.5 Previous Versions would not work with my install but this one worked out of the box

###Install CUDNN:

Code: Select all

cd ~/Downloads
tar -zxvf cudnn-10.1-linux-x64-v7.6.5.32.tgz
cd ~/Downloads/cuda
sudo cp -P lib64/* /usr/lib/x86_64-linux-gnu/
sudo cp -P include/* /usr/include/x86_64-linux-gnu/
cd ~
###Download compile and install OpenCV with cuda and cuDNN####

#REF: https://cuda-chen.github.io/image%20pro ... -1804.html

##Install OpenCV dependencies

Code: Select all

sudo apt-get install build-essential cmake unzip pkg-config git \
    libjpeg-dev libpng-dev libtiff-dev \
    libavcodec-dev libavformat-dev libswscale-dev \
    libv4l-dev libxvidcore-dev libx264-dev \libgtk-3-dev \
    libatlas-base-dev gfortran \
    python3-dev python3-pip python2
##Installing pip and numpy

Code: Select all

curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
sudo python3 get-pip.py
pip install numpy
#Ubuntu 20.04 uses gcc version 9 which is not compatible with OpenCV source code###Change version using update-alternatives

#REF: https://linuxconfig.org/how-to-switch-b ... ocal-fossa

Code: Select all

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 8
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9
sudo update-alternatives --config gcc
###select (gcc-8)

###Download OpenCV Source Code

Code: Select all

cd ~
mkdir git
cd git
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv
git checkout 4.5.5
cd ..
cd opencv_contrib
git checkout 4.5.5
cd .. ~/git/opencv
###Configure OpenCV

Code: Select all

mkdir build && cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE \
	-D CMAKE_INSTALL_PREFIX=/usr \
	-D INSTALL_PYTHON_EXAMPLES=ON \
	-D INSTALL_C_EXAMPLES=OFF \
	-D OPENCV_ENABLE_NONFREE=ON \
	-D WITH_CUDA=ON \
	-D WITH_CUDNN=ON \
	-D OPENCV_DNN_CUDA=ON \
	-D ENABLE_FAST_MATH=1 \
	-D CUDA_FAST_MATH=1 \
	-D CUDA_ARCH_BIN=7.5 \
	-D WITH_CUBLAS=1 \
	-D OPENCV_EXTRA_MODULES_PATH=~/git/opencv_contrib/modules/ \
	-D HAVE_opencv_python3=ON \
	-D PYTHON_EXECUTABLE=/usr/bin \
	-D BUILD_EXAMPLES=ON ..
###Use nproc to display number of available cores. In my case I use "-j12" to compile with 12 cores.

Code: Select all

make -j12
sudo make install
sudo ldconfig
### you might have to copy cv2 to the correct directory. I could not figure out how to make it install to the correct path but I did a quick search of the hdd to find cv2.so and copied the directory 'cv2' to /usr/lib/python3.8/dist-packages/ This should get rid of the import error in python3.

###Install Face Recognition

Code: Select all

sudo -H pip3 install face_recognition
###Install zoneminder follow directions at link below

https://wiki.zoneminder.com/Ubuntu_Serv ... der_1.36.x

###Create selfsinged ssl certificates and setup HTTPS#Side note: you'll need to use letsencrypt with a domain name if you plan on pushing notification with alert photos. It won't work with self signed and IP addresses.

#For the purposes of these notes however I'm going to use a self signed certificate.

Code: Select all

sudo mkdir /etc/zm/apache2
sudo mkdir /etc/zm/apache2/ssl
sudo openssl req -x509 -nodes -days 4096 -newkey rsa:2048 -keyout /etc/zm/apache2/ssl/zoneminder.key -out /etc/zm/apache2/ssl/zoneminder.crt
sudo chown www-data:www-data /etc/zm/apache2/ssl/*
sudo a2enmod ssl
sudo nano /etc/apache2/sites-enabled/000-default.conf
#Replace / Add the following (Change IP address to suite your environment)

Code: Select all

<VirtualHost *:80>
   Redirect / https://10.0.0.18/
</VirtualHost>

<VirtualHost *:443>

	SSLEngine on
	SSLCertificateFile /etc/zm/apache2/ssl/zoneminder.crt
        SSLCertificateKeyFile /etc/zm/apache2/ssl/zoneminder.key
	
	# The ServerName directive sets the request scheme, hostname and port that
	# the server uses to identify itself. This is used when creating
	# redirection URLs. In the context of virtual hosts, the ServerName
	# specifies what hostname must appear in the request's Host: header to
	# match this virtual host. For the default virtual host (this file) this
	# value is not decisive as it is used as a last resort host regardless.
	# However, you must set it for any further virtual host explicitly.
	#ServerName www.example.com

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

	# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
	# error, crit, alert, emerg.
	# It is also possible to configure the loglevel for particular
	# modules, e.g.
	#LogLevel info ssl:warn

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	# For most configuration files from conf-available/, which are
	# enabled or disabled at a global level, it is possible to
	# include a line for only one particular virtual host. For example the
	# following line enables the CGI configuration for this host only
	# after it has been globally disabled with "a2disconf".
	#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
###Restart apache2 server

Code: Select all

sudo systemctl restart apache2
### Compile Dlib from source

https://gist.github.com/smitshilu/7b210 ... 045a8c21ff

###Install zmeventnotification#REF: https://zmeventnotification.readthedocs ... stall.html

Code: Select all

cd ~/git
git clone https://github.com/pliablepixels/zmeventnotification.git
cd zmeventnotificationgit fetch --tagsgit checkout $(git describe --tags $(git rev-list --tags --max-count=1))
###Edit the following entries from secrets.ini file

Code: Select all

nano secrets.ini
ZMES_PICTURE_URL=https://localhost/zm/index.php?view=ima ... &width=600
ZM_USER=user
ZM_PASSWORD=password
ZM_PORTAL=https://localhost/zm
ZM_API_PORTAL=https://localhost/zm/api
ES_CERT_FILE=/etc/zm/apache2/ssl/zoneminder.crt
ES_KEY_FILE=/etc/zm/apache2/ssl/zoneminder.key

###Install Dependencies for zmeventnotifications

Code: Select all

sudo perl -MCPAN -e "install Crypt::MySQL"
sudo perl -MCPAN -e "install Config::IniFiles"
sudo perl -MCPAN -e "install Crypt::Eksblowfish::Bcrypt"

sudo apt-get install libyaml-perl
sudo perl -MCPAN -e "install Net::WebSocket::Server"
sudo apt-get install libjson-perl
perl -MCPAN -e "install LWP::Protocol::https"
#If you want to use MQTT:

Code: Select all

perl -MCPAN -e "install Net::MQTT::Simple"
### Install zmeventserver

Code: Select all

sudo ./install.sh
###Test zmeventserver

Code: Select all

sudo -u www-data zmeventnotification.pl --config /etc/zm/zmeventnotification.ini
### If everything works ctrl+c to close

#Navigate to your zoneminder url http://ipaddress/zm and verify it gets redirected to https://ipaddress/zm and accept the self-signed certificate.

#Go to Options > System and enable "OPT_USE_EVENTNOTIFICATION"

#Also ensure to enable "AUTH_HASH_LOGINS"

#Setup Zoneminder as per:

https://zoneminder.readthedocs.io/en/st ... arted.html
Post Reply