├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .idea ├── .gitignore ├── bb_.iml ├── inspectionProfiles │ └── profiles_settings.xml ├── misc.xml ├── modules.xml └── vcs.xml ├── LICENSE ├── README.md ├── __pycache__ └── user_hooks.cpython-36.pyc ├── clients ├── _config.json └── view.py ├── config.json ├── install.sh ├── libs ├── __pycache__ │ ├── data.cpython-36.pyc │ ├── filters.cpython-36.pyc │ ├── hooks.cpython-36.pyc │ ├── log.cpython-36.pyc │ └── requests_.cpython-36.pyc ├── data.py ├── filters.py ├── hooks.py ├── log.py └── requests_.py ├── main.py ├── models ├── MobileNetSSD_deploy.caffemodel ├── MobileNetSSD_deploy.prototxt.txt ├── haarcascade_cars3.xml ├── haarcascade_frontalface.xml ├── haarcascade_frontalface_alt.xml ├── haarcascade_frontalface_alt2.xml ├── haarcascade_frontalface_default.xml └── hog.xml ├── resourse └── wait.png ├── start.sh ├── templates └── records.html └── user_hooks.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: https://www.paypal.com/paypalme/masloffkz 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/bb_.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 iRTEX-Creative 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenCV CCTV 2 | 3 | A small software to create CCTV for single camera. Completely created on __Python 3.6__, can detect faces, people and movements, stream video. Recorded videos have an info plate on top of the screen, which you can change from the configuration variable. The system can recognize movement and record the moving object as it moves, or it can record video continuously. The code also supports custom hooks. The software was tested on Raspberry Pi 4 | 5 | 6 | 7 | ## How to install camera server 8 | 9 | Copy the repository to your Linux system. 10 | 11 | ``` 12 | git clone https://github.com/iRTEX-MIT/OpenCV-Webcam-Recorder-and-Streamer.git 13 | ``` 14 | 15 | Browse to the repository folder. 16 | 17 | ``` 18 | cd OpenCV-Webcam-Recorder-and-Streamer 19 | ``` 20 | 21 | Install Python libraries 22 | 23 | ``` 24 | ./install.sh 25 | ``` 26 | 27 | Start ```main.py``` or ```start.sh``` 28 | 29 | ``` 30 | python3 main.py 31 | ``` 32 | 33 | or 34 | 35 | ``` 36 | ./start.sh 37 | ``` 38 | 39 | ## Examples 40 | 41 | 42 | ### Hooks and filters 43 | The system sends signals at every activity by hooking. You can hang your functions on these hooks. 44 | To create a hook or filter, enter the file `user_hooks.py` and create and register a function in the _user_hooks function. 45 | There are examples in `user_hooks.py` file. 46 | 47 | __Hook__ - is a function that works on some action 48 | 49 | __Filter__ - processing some action through a user-defined function 50 | 51 | __Request__ - A web request that is executed during any action 52 | 53 | ### Table of filters 54 | 55 | | Filter | Arg | Description| 56 | | ------ | ------ | ------ | 57 | |on_frame_record | frame | Processes the frame before recording | 58 | |on_frame_text | text | Processes the text before recording | 59 | |on_frame_motion_detect_record | frame | Processes the frame before recording | 60 | |on_socket_frame | base64.b64encode(frame) | Processes the frame before streaming (base64) | 61 | |on_socket_frame_encoded | frame | Processes the frame before streaming | 62 | |on_config | Configuration object | Processes the configuration file after loading | 63 | |on_reserve_videofile | Configuration object | The third priority file, which will be downloaded as a video file, if the main file is not available | 64 | 65 | 66 | ### Table of web requests 67 | 68 | | Hook | Arg | Description| 69 | | ------ | ------ | ------ | 70 | | on_face_detect | frame with face | Executing when the camera detect the face. | 71 | | on_eye_detect | frame with eye | Executing when the camera detect the eye. | 72 | | on_body_detect | frame with body | Executing when the camera detect the body. | 73 | | on_body_upper_detect | frame with body | Executing when the camera detect the upper body. | 74 | | on_body_lower_detect | frame with body | Executing when the camera detect the lower. | 75 | | on_motion_detect | frame | Executing when the camera detect movement. | 76 | 77 | 78 | ### Table of hooks 79 | 80 | | Hook | Arg | Description| 81 | | ------ | ------ | ------ | 82 | | on_face_detect | frame with face | Executing when the camera detect the face. | 83 | | on_eye_detect | frame with eye | Executing when the camera detect the eye. | 84 | | on_body_detect | frame with body | Executing when the camera detect the body. | 85 | | on_body_upper_detect | frame with body | Executing when the camera detect the upper body. | 86 | | on_body_lower_detect | frame with body | Executing when the camera detect the lower. | 87 | | on_net_*_detect | frame | Executing when the camera detect the * object. | 88 | | on_start_webserver | None | Executing when web server is ready started. | 89 | | on_wait_camera | number camera in for | Executing when system wait camera. To be inside the iteration of the cycle, not outside it. | 90 | | on_init | True | Executing when system started. | 91 | | on_release | None | Executing when OpenCV 'cap' and video record release. | 92 | | on_frame_send_to_server | JPG frame | Executing when web server send frame. | 93 | | on_motion_detect | frame | Executing when the camera detect movement. | 94 | | on_save_video | frame | Executing when the system write frame in video. To be inside the iteration of the cycle, not outside it. | 95 | | on_before_write_frame | frame | Executing when the frame is ready to be recorded, but not yet recorded. | 96 | | on_setup_cfg | Configuration object | Executing when configs ready to use. | 97 | | on_frame_start | UNIX Time | Executing when the frame began to be created | 98 | | on_videofile_created | File path | Executing when video file created. | 99 | | on_reserve_videofile_created | File path | Executing when reserve video file created. | 100 | | on_reserve_videofile_not_created | File path | Executing when reserve video file not created. | 101 | | on_exit | True | Executing when system exiting. | 102 | 103 | ## How to set up remote viewing 104 | 105 | To use the camera remotely (in the local network), you must in the configuration file in the line "web_stream": false, change false to true. 106 | Then reboot the server. In the same repository is a folder clients, it has a file ```view.py```, open it on the computer from which you want to view the camera. You will be asked to enter the IP camera (you can get it in the control panel of your router, or via ```nmap```), port (5555 by default). If all data is entered correctly, the camera will open in a new window! 107 | 108 | Either you can connect to the broadcast via a regular browser or VLC. As a streaming address, use ```http://IP-YOUR-PC:5000/video```. 109 | 110 | ### Table of server URLs 111 | | URL | Description| 112 | | ------ | ------ | 113 | | tcp://0.0.0.0:5555 | Primary video stream. You can connect to it through the tuner client in the ``clients`` folder | 114 | | http://0.0.0.0:5000/video | Secondary video stream Flask. You can connect to it from a VLC or browser. It works with only one client at a time, the second will not be able to connect if the first is watching the broadcast | 115 | | http://0.0.0.0:5000/records | Page for downloading video recordings | 116 | --- 117 | ![Git size](https://img.shields.io/github/languages/code-size/iRTEX-Creative/OpenCV-Webcam-Recorder-and-Streamer) 118 | ![GitHub All Releases](https://img.shields.io/github/downloads/iRTEX-Creative/OpenCV-Webcam-Recorder-and-Streamer/total) 119 | -------------------------------------------------------------------------------- /__pycache__/user_hooks.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/__pycache__/user_hooks.cpython-36.pyc -------------------------------------------------------------------------------- /clients/_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ip": "*", 3 | "port": 5555 4 | } -------------------------------------------------------------------------------- /clients/view.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import zmq 3 | import json 4 | import base64 5 | import numpy as np 6 | 7 | context = zmq.Context() 8 | footage_socket = context.socket(zmq.SUB) 9 | 10 | try: 11 | 12 | with open('_config.json') as config_file: 13 | cfg = json.load(config_file) 14 | 15 | footage_socket.bind('tcp://{ip}:{port}'.format( 16 | ip=str(cfg['ip']), 17 | port=str(cfg['port']) 18 | )) 19 | 20 | except: 21 | 22 | ip = input('IP your camera [* = localhost]: ') 23 | port = input('Port your camera [default: 5555]: ') 24 | 25 | footage_socket.bind('tcp://{ip}:{port}'.format( 26 | ip=str(ip), 27 | port=str(port) 28 | )) 29 | 30 | finally: 31 | 32 | footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode('')) 33 | 34 | while True: 35 | try: 36 | 37 | frame = footage_socket.recv_string() 38 | img = base64.b64decode(frame) 39 | npimg = np.fromstring(img, dtype=np.uint8) 40 | 41 | source = cv2.imdecode(npimg, 1) 42 | 43 | cv2.imshow("Stream", source) 44 | cv2.waitKey(1) 45 | 46 | except KeyboardInterrupt: 47 | cv2.destroyAllWindows() 48 | break 49 | -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "video": false, 3 | "stream": false, 4 | "video_zip": false, 5 | "children_frame_zip": 1, 6 | "motion_detect": false, 7 | "detect_face": false, 8 | "detect_text_labels": true, 9 | "detect_text_labels_color": [255, 255, 255], 10 | "detect_face_boxcolor": [255, 0, 0], 11 | "detect_people": false, 12 | "detect_people_boxcolor": [189, 56, 43], 13 | "detect_body": { 14 | "full": false, 15 | "upper": false, 16 | "lower": false 17 | }, 18 | "detect_body_boxcolor": [251, 176, 8], 19 | "detect_eye": false, 20 | "detect_eye_boxcolor": [255, 255, 255], 21 | "detect_car": false, 22 | "detect_car_boxcolor": [255, 255, 255], 23 | "zoom_body": false, 24 | "zoom_people": false, 25 | "net_detect": { 26 | "enabled": true, 27 | "boxcolor": [255, 255, 255], 28 | "classes": ["background", "aeroplane", "bicycle", "bird", "boat", 29 | "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", 30 | "dog", "horse", "motorbike", "person", "pottedplant", "sheep", 31 | "sofa", "train", "tvmonitor"] 32 | }, 33 | "show_detect_motion_on_frame": false, 34 | "show_time_on_frame": true, 35 | "time_mask": "%x %X", 36 | "show_fps_on_frame": true, 37 | "fps_mask": "FPS: {current} / {max}", 38 | "save_video_on_movies": false, 39 | "save_video": false, 40 | "pixel_update_for_detect": 200, 41 | "recorder_fps": 30, 42 | "record_file_mask": "{d}{m}{Y}_{H}{M}{S}.avi", 43 | "record_file_reserve_mask": "{d}{m}{Y}_{H}{M}{S}.avi", 44 | "text_on_frame": "My Webcam", 45 | "text_on_frame_color": [0, 0, 0], 46 | "text_on_frame_size": 0.4, 47 | "web_stream": true, 48 | "web_ip": "tcp://0.0.0.0:5555", 49 | "show_stream": true, 50 | "fourcc": "DIVX", 51 | "flask_server": true, 52 | "flask_port": 5000, 53 | "flask_ip": "0.0.0.0" 54 | } -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | sudo apt-get install libatlas-base-dev -y 2 | sudo apt-get install libjasper-dev -y 3 | sudo apt-get install libqtgui4 -y 4 | sudo apt-get install python3-pyqt5 -y 5 | sudo apt-get install libqt4-test -y 6 | sudo apt-get install libhdf5-dev -y 7 | sudo apt-get install libhdf5-serial-dev -y 8 | pip3 install opencv-python 9 | pip3 install opencv-contrib-python==4.1.0.25 10 | pip3 install numpy 11 | pip3 install flask 12 | pip3 install imutils 13 | pip3 install zmq -------------------------------------------------------------------------------- /libs/__pycache__/data.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/libs/__pycache__/data.cpython-36.pyc -------------------------------------------------------------------------------- /libs/__pycache__/filters.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/libs/__pycache__/filters.cpython-36.pyc -------------------------------------------------------------------------------- /libs/__pycache__/hooks.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/libs/__pycache__/hooks.cpython-36.pyc -------------------------------------------------------------------------------- /libs/__pycache__/log.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/libs/__pycache__/log.cpython-36.pyc -------------------------------------------------------------------------------- /libs/__pycache__/requests_.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/libs/__pycache__/requests_.cpython-36.pyc -------------------------------------------------------------------------------- /libs/data.py: -------------------------------------------------------------------------------- 1 | class data: 2 | 3 | def __init__(self): 4 | self._ = {} 5 | 6 | def set(self, key, data_): 7 | self._[key] = data_ 8 | return data_ 9 | 10 | def get(self, key): 11 | if key in self._: 12 | return self._[key] 13 | else: 14 | return False 15 | -------------------------------------------------------------------------------- /libs/filters.py: -------------------------------------------------------------------------------- 1 | class filters: 2 | 3 | def __init__(self): 4 | self.filters = {} 5 | 6 | def set (self, name, function): 7 | if not name in self.filters: 8 | self.filters[name] = [] 9 | self.filters[name].append(function) 10 | else: 11 | self.filters[name].append(function) 12 | 13 | def get (self, name): 14 | if name in self.filters: 15 | return self.filters[name] 16 | 17 | def call (self, name, argv): 18 | 19 | r = argv 20 | 21 | if (not self.get(name) == None): 22 | 23 | for _ in self.get(name): 24 | try: 25 | if callable(_): 26 | r = _(r) 27 | except: pass 28 | 29 | return r 30 | 31 | else: 32 | 33 | return argv 34 | -------------------------------------------------------------------------------- /libs/hooks.py: -------------------------------------------------------------------------------- 1 | class hooks: 2 | 3 | def __init__(self): 4 | self.hooks = {} 5 | 6 | def set (self, name, function): 7 | if not name in self.hooks: 8 | self.hooks[name] = [] 9 | self.hooks[name].append(function) 10 | else: 11 | self.hooks[name].append(function) 12 | 13 | def get (self, name): 14 | if name in self.hooks: 15 | return self.hooks[name] 16 | 17 | def call (self, name, argv): 18 | 19 | if (not self.get(name) == None): 20 | 21 | for _ in self.get(name): 22 | try: 23 | if callable(_): 24 | _(argv) 25 | except: pass 26 | -------------------------------------------------------------------------------- /libs/log.py: -------------------------------------------------------------------------------- 1 | class log: 2 | 3 | use_file = False 4 | 5 | def info (self, status, text): 6 | 7 | print ('[{status:>2}]: {text}'.format( 8 | status=status, 9 | text=text 10 | )) 11 | -------------------------------------------------------------------------------- /libs/requests_.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | class requests_: 4 | 5 | def __init__(self): 6 | self.requests = {} 7 | self.r = requests 8 | 9 | def set (self, name, function): 10 | if not name in self.requests: 11 | self.requests[name] = [] 12 | self.requests[name].append(function) 13 | else: 14 | self.requests[name].append(function) 15 | 16 | def get (self, name): 17 | if name in self.requests: 18 | return self.requests[name] 19 | 20 | def call (self, name, argv): 21 | 22 | if (not self.get(name) == None): 23 | 24 | for _ in self.get(name): 25 | try: 26 | 27 | if (_['method'] == 'GET'): 28 | self.r.get(_['url'], auth=_['auth'], params=_['params']) 29 | 30 | elif (_['method'] == 'POST'): 31 | self.r.post(_['url'], auth=_['auth'], params=_['params']) 32 | 33 | elif (_['method'] == 'PUT'): 34 | self.r.post(_['url'], auth=_['auth'], params=_['params']) 35 | 36 | except: pass 37 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | # Software for creating a video server 2 | # for home video surveillance. 3 | # 4 | # version: 1.0.0 5 | # author: iRTEX Creative 6 | 7 | from flask import Flask, render_template, Response 8 | from imutils.object_detection import non_max_suppression 9 | from libs.hooks import hooks 10 | from libs.log import log 11 | from libs.data import data 12 | from libs.requests_ import requests_ 13 | from libs.filters import filters 14 | from user_hooks import _user_hooks as uh 15 | from random import randint 16 | 17 | import imutils 18 | import datetime 19 | import numpy as np 20 | import sys 21 | import cv2 22 | import os 23 | import time 24 | import base64 25 | import zmq 26 | import json 27 | import glob 28 | import threading 29 | 30 | 31 | def main(argv): 32 | 33 | # Log 34 | Log.info('OK', 'System startup') 35 | 36 | # Setup masks 37 | class mask: 38 | 39 | def __init__(self, data): 40 | self.data = data 41 | 42 | def file(self, string): 43 | 44 | return string.format( 45 | time=(datetime.datetime.now()).strftime(cfg['time_mask']), 46 | isotme=(datetime.datetime.now()).isoformat(), 47 | count=str(len(glob.glob('{path}/*'.format( 48 | path=os.path.dirname(os.path.abspath('static/' + cfg['record_file_mask'])) 49 | )))), 50 | d=(datetime.datetime.now()).strftime("%d"), 51 | m=(datetime.datetime.now()).strftime("%m"), 52 | Y=(datetime.datetime.now()).strftime("%Y"), 53 | H=(datetime.datetime.now()).strftime("%H"), 54 | M=(datetime.datetime.now()).strftime("%M"), 55 | S=(datetime.datetime.now()).strftime("%S"), 56 | ) 57 | 58 | def fps(self, string): 59 | 60 | return string.format( 61 | max=str(self.data['max']), 62 | current=str(self.data['current']) 63 | ) 64 | 65 | def server(self, string): 66 | 67 | return string.format( 68 | local='0.0.0.0', 69 | random_port=str(randint(49152,65535)) 70 | ) 71 | 72 | # Try open web server 73 | if cfg['web_stream'] == True: 74 | 75 | Log.info('WAIT', 'Try open socket server') 76 | 77 | context = zmq.Context() 78 | footage_socket = context.socket(zmq.PUB) 79 | footage_socket.connect(cfg['web_ip']) 80 | 81 | Log.info('OK', 'Socket server is started') 82 | Log.info('OK', 'Server: {ip}'.format(ip=str(mask({}).server(cfg['web_ip'])))) 83 | 84 | Hooks.call('on_start_webserver', None) 85 | 86 | # Try open Flask server 87 | if cfg['flask_server'] == True: 88 | 89 | def app(): 90 | 91 | app = Flask(__name__) 92 | 93 | def __stream__(): 94 | 95 | global ready_frame 96 | 97 | Log.info('STREAM', 'Start stream') 98 | 99 | while True: 100 | 101 | try: 102 | 103 | ret, jpeg = cv2.imencode('.jpg', ready_frame) 104 | 105 | yield (b'--frame\r\n' 106 | b'Content-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n\r\n') 107 | 108 | except: 109 | pass 110 | 111 | @app.route('/video') 112 | def __main__(): 113 | return Response(__stream__(), mimetype='multipart/x-mixed-replace; boundary=frame') 114 | 115 | @app.route('/records') 116 | def __records__(): 117 | return render_template('records.html', videos=os.listdir('./static/')) 118 | 119 | if __name__ == '__main__': 120 | app.run(host=str(mask({}).server(cfg['flask_ip'])), port=int(mask({}).server(str(cfg['flask_port'])))) 121 | 122 | threading.Thread(target=app).start() 123 | 124 | # Start window thread 125 | cv2.startWindowThread() 126 | 127 | # Start detector 128 | def detector(): 129 | pass 130 | 131 | threading.Thread(target=detector).start() 132 | 133 | # NET 134 | if cfg['net_detect']['enabled'] == True: 135 | 136 | net = { 137 | "net": cv2.dnn.readNetFromCaffe('models/MobileNetSSD_deploy.prototxt.txt', 'models/MobileNetSSD_deploy.caffemodel'), 138 | "CLASSES": cfg['net_detect']['classes'] 139 | } 140 | 141 | # Mount camera 142 | Log.info('WAIT', 'Wait camera') 143 | 144 | while (True): 145 | 146 | for i in range(0, 3): 147 | 148 | Hooks.call('on_wait_camera', i) 149 | 150 | if (cfg['stream'] == False): 151 | 152 | if (cfg['video'] == False): cap = cv2.VideoCapture(i) 153 | else: cv2.VideoCapture(cfg['video']) 154 | 155 | else: cap = cv2.VideoCapture(cfg['stream']) 156 | 157 | # Main script 158 | if cap.isOpened(): 159 | 160 | Log.info('OK', 'Camera is connected') 161 | 162 | if (cfg['detect_people'] == True): 163 | hog = cv2.HOGDescriptor() 164 | hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) 165 | 166 | if (cfg['fourcc'] == 'MJPG'): 167 | fourcc = cv2.VideoWriter_fourcc('M','J','P','G') 168 | 169 | elif (cfg['fourcc'] == 'FMP4'): 170 | fourcc = cv2.VideoWriter_fourcc('F','M','P','4') 171 | 172 | elif (cfg['fourcc'] == 'MP4V'): 173 | fourcc = cv2.VideoWriter_fourcc(*'mp4v') 174 | 175 | elif (cfg['fourcc'] == 'DIVX'): 176 | fourcc = cv2.VideoWriter_fourcc(*'DIVX') 177 | 178 | elif (cfg['fourcc'] == 'iYUV'): 179 | fourcc = cv2.VideoWriter_fourcc('i', 'Y', 'U', 'V') 180 | 181 | else: 182 | fourcc = cv2.VideoWriter_fourcc(*'XVID') 183 | 184 | 185 | _video = cv2.VideoWriter( 186 | (os.path.dirname(os.path.realpath(__file__))) + '/static/' + mask({}).file(cfg['record_file_mask']), 187 | fourcc, 188 | cfg['recorder_fps'], 189 | (int(cap.get(3)), int(cap.get(4))) 190 | ) 191 | 192 | if _video and os.path.isfile((os.path.dirname(os.path.realpath(__file__))) + '/static/' + mask({}).file(cfg['record_file_mask'])): 193 | 194 | Log.info('OK', 'Video file has been created') 195 | Hooks.call('on_videofile_created', (os.path.dirname(os.path.realpath(__file__))) + '/static/' + mask({}).file(cfg['record_file_mask'])) 196 | 197 | else: 198 | 199 | Log.info('ERROR', 'Folder for recording video is not available! Trying to record a video in an open folder') 200 | 201 | _video = cv2.VideoWriter( 202 | mask({}).file(cfg['record_file_reserve_mask']), 203 | fourcc, 204 | cfg['recorder_fps'], 205 | (int(cap.get(3)), int(cap.get(4))) 206 | ) 207 | 208 | if _video and os.path.isfile(mask({}).file(cfg['record_file_reserve_mask'])): 209 | 210 | Log.info('OK', 'Video file has been created') 211 | Hooks.call('on_reserve_videofile_created', mask({}).file(cfg['record_file_reserve_mask'])) 212 | 213 | else: 214 | 215 | if (Filters.get('on_reserve_videofile')): 216 | 217 | Log.info('INFO', 'Filter found for backup file. Try to use it as a name') 218 | 219 | _video = cv2.VideoWriter( 220 | mask({}).file(Filters.call('on_reserve_videofile', cfg['record_file_reserve_mask'])), 221 | fourcc, 222 | cfg['recorder_fps'], 223 | (int(cap.get(3)), int(cap.get(4))) 224 | ) 225 | 226 | if _video and os.path.isfile(mask({}).file(Filters.call('on_reserve_videofile', cfg['record_file_reserve_mask']))): 227 | 228 | Log.info('OK', 'Video file has been created') 229 | Hooks.call('on_reserve_videofile_created', mask({}).file(cfg['record_file_reserve_mask'])) 230 | 231 | else: 232 | 233 | Log.info('ERROR', 'Video file was not created.') 234 | Hooks.call('on_reserve_videofile_not_created', mask({}).file(cfg['record_file_reserve_mask'])) 235 | 236 | else: 237 | 238 | Log.info('ERROR', 'Video file was not created.') 239 | Hooks.call('on_reserve_videofile_not_created', mask({}).file(cfg['record_file_reserve_mask'])) 240 | 241 | 242 | # Create mask object 243 | if cfg['motion_detect'] == True: 244 | _fgbg = cv2.createBackgroundSubtractorMOG2(False) 245 | 246 | # Set path 247 | cascade_path_face = cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml' 248 | cascade_path_eye = cv2.data.haarcascades + 'haarcascade_eye_tree_eyeglasses.xml' 249 | cascade_path_body = cv2.data.haarcascades + 'haarcascade_fullbody.xml' 250 | cascade_path_upper = cv2.data.haarcascades + 'haarcascade_upperbody.xml' 251 | cascade_path_lower = cv2.data.haarcascades + 'haarcascade_lowerbody.xml' 252 | cascade_path_cars = 'models/haarcascade_cars3.xml' 253 | 254 | # Init cascade 255 | face_cascade = cv2.CascadeClassifier(cascade_path_face) 256 | eye_cascade = cv2.CascadeClassifier(cascade_path_eye) 257 | body_cascade = cv2.CascadeClassifier(cascade_path_body) 258 | upper_cascade = cv2.CascadeClassifier(cascade_path_upper) 259 | lower_cascade = cv2.CascadeClassifier(cascade_path_lower) 260 | cars_cascade = cv2.CascadeClassifier(cascade_path_cars) 261 | 262 | while True: 263 | 264 | global ready_frame 265 | 266 | # Time frame start 267 | _time_frame_start = time.time() 268 | Hooks.call('on_frame_start', _time_frame_start) 269 | 270 | ret, frame = cap.read() 271 | 272 | if ret: 273 | 274 | # ZIP Frame 275 | if (not cfg['video_zip'] == False): 276 | 277 | if (cfg['video_zip'] == 'HD'): 278 | frame = cv2.resize(frame, (int(1080), int(720)), interpolation=cv2.INTER_NEAREST) 279 | 280 | elif (type(cfg['video_zip']) == type(0.1)): 281 | frame = cv2.resize(frame, (0, 0), fx=cfg['video_zip'], fy=cfg['video_zip']) 282 | 283 | else: 284 | frame = cv2.resize(frame, (int(cfg['video_zip'][0]), int(cfg['video_zip'][1])), interpolation=cv2.INTER_NEAREST) 285 | 286 | # Create children frames 287 | frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) 288 | 289 | (_h, _w) = frame.shape[:2] 290 | 291 | 292 | _frame_text = "{value}\n".format(value=cfg['text_on_frame']) 293 | 294 | # Get the foreground mask 295 | if cfg['motion_detect'] == True: 296 | _fgmask = _fgbg.apply(frame_gray) 297 | 298 | # Count all the non zero pixels within the mask 299 | _count = np.count_nonzero(_fgmask) 300 | 301 | if int(_count) > int(cfg['pixel_update_for_detect']): 302 | 303 | if cfg['show_detect_motion_on_frame'] == True: 304 | _frame_text += "Detect motion! Update pixels: {value}\n".format(value=str(_count)) 305 | 306 | if cfg['show_time_on_frame'] == True: 307 | 308 | d = datetime.datetime.now() 309 | _frame_text += "{value}\n".format(value=d.strftime(cfg['time_mask'])) 310 | 311 | if cfg['detect_body'] == True or type(cfg['detect_body']) == type({}): 312 | 313 | if (type(cfg['detect_body']) == type(True)) or (cfg['detect_body']['full'] == True): bodies = body_cascade.detectMultiScale(frame_gray, 1.3, 5) 314 | if (type(cfg['detect_body']) == type(True)) or (cfg['detect_body']['upper'] == True): upper = upper_cascade.detectMultiScale(frame_gray, 1.3, 5) 315 | if (type(cfg['detect_body']) == type(True)) or (cfg['detect_body']['lower'] == True): lower = lower_cascade.detectMultiScale(frame_gray, 1.3, 5) 316 | 317 | if (type(cfg['detect_body']) == type({}) and cfg['detect_body']['full'] == True) or (type(cfg['detect_body']) == type(True)): 318 | 319 | for (x, y, w, h) in bodies: 320 | 321 | cv2.rectangle(frame, (x, y), (x + w, y + h), cfg['detect_body_boxcolor'], 1) 322 | 323 | if cfg['detect_text_labels'] == True: 324 | cv2.putText(frame, 'Body', (x, y - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, cfg['detect_text_labels_color']) 325 | 326 | if (cfg['zoom_body']) == True: 327 | frame = frame[y:y + h, x:x + w] 328 | 329 | Hooks.call('on_body_detect', frame[y:y + h, x:x + w]) 330 | Request.call('on_body_detect', frame[y:y + h, x:x + w]) 331 | 332 | if (type(cfg['detect_body']) == type({}) and cfg['detect_body']['upper'] == True) or (type(cfg['detect_body']) == type(True)): 333 | 334 | for (x, y, w, h) in upper: 335 | 336 | cv2.rectangle(frame, (x, y), (x + w, y + h), cfg['detect_body_boxcolor'], 1) 337 | 338 | if cfg['detect_text_labels'] == True: 339 | cv2.putText(frame, 'Body Upper', (x, y - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 340 | cfg['detect_text_labels_color']) 341 | 342 | Hooks.call('on_body_upper_detect', frame[y:y + h, x:x + w]) 343 | Request.call('on_body_upper_detect', frame[y:y + h, x:x + w]) 344 | 345 | if (type(cfg['detect_body']) == type({}) and cfg['detect_body']['lower'] == True) or (type(cfg['detect_body']) == type(True)): 346 | 347 | for (x, y, w, h) in lower: 348 | 349 | cv2.rectangle(frame, (x, y), (x + w, y + h), cfg['detect_body_boxcolor'], 1) 350 | 351 | if cfg['detect_text_labels'] == True: 352 | cv2.putText(frame, 'Body Lower', (x, y - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 353 | cfg['detect_text_labels_color']) 354 | 355 | Hooks.call('on_body_lower_detect', frame[y:y + h, x:x + w]) 356 | Request.call('on_body_lower_detect', frame[y:y + h, x:x + w]) 357 | 358 | if cfg['detect_people'] == True: 359 | 360 | (rects, weights) = hog.detectMultiScale(frame_gray) 361 | 362 | rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects]) 363 | pick = non_max_suppression(rects, probs=None, overlapThresh=0.65) 364 | 365 | for (xA, yA, xB, yB) in pick: 366 | 367 | cv2.rectangle(frame, (xA, yA), (xB, yB), cfg['detect_people_boxcolor'], 1) 368 | 369 | if cfg['detect_text_labels'] == True: 370 | cv2.putText(frame, 'Human', (xA, yA - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, cfg['detect_text_labels_color']) 371 | 372 | if cfg['zoom_people'] == True: 373 | if len(pick) == 1: 374 | frame = frame[yA:yA + yB, xA:xA + xB] 375 | 376 | if cfg['detect_face'] == True: 377 | 378 | faces = face_cascade.detectMultiScale(frame_gray) 379 | 380 | for (x, y, w, h) in faces: 381 | 382 | cv2.rectangle(frame, (x, y), (x + w, y + h), cfg['detect_face_boxcolor'], 1) 383 | 384 | if cfg['detect_text_labels'] == True: 385 | cv2.putText(frame, 'Face', (x, y - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 386 | cfg['detect_text_labels_color']) 387 | 388 | Hooks.call('on_face_detect', frame[y:y + h, x:x + w]) 389 | Request.call('on_face_detect', frame[y:y + h, x:x + w]) 390 | 391 | if cfg['detect_eye'] == True: 392 | 393 | eye = eye_cascade.detectMultiScale(frame_gray) 394 | 395 | for (x_, y_, w_, h_) in eye: 396 | 397 | cv2.rectangle(frame, (x_, y_), (x_ + w_, y_ + h_), 398 | cfg['detect_body_boxcolor'], 1) 399 | 400 | if cfg['detect_text_labels'] == True: 401 | cv2.putText(frame, 'Eye', (x_, y_ - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 402 | cfg['detect_text_labels_color']) 403 | 404 | Hooks.call('on_eye_detect', frame[y_:y_ + h_, x_:x_ + w_]) 405 | Request.call('on_eye_detect', frame[y_:y_ + h_, x_:x_ + w_]) 406 | 407 | if cfg['detect_car'] == True: 408 | 409 | cars = cars_cascade.detectMultiScale(frame_gray) 410 | 411 | for (x, y, w, h) in cars: 412 | 413 | cv2.rectangle(frame, (x, y), (x + w, y + h), cfg['detect_car_boxcolor'], 1) 414 | 415 | if cfg['detect_text_labels'] == True: 416 | cv2.putText(frame, 'Car', (x, y - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.4, cfg['detect_text_labels_color']) 417 | 418 | Hooks.call('on_car_detect', frame[y:y + h, x:x + w]) 419 | Request.call('on_car_detect', frame[y:y + h, x:x + w]) 420 | 421 | if cfg['net_detect']['enabled'] == True: 422 | 423 | blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 424 | 0.007843, (300, 300), 127.5) 425 | net['net'].setInput(blob) 426 | detections = net['net'].forward() 427 | 428 | for i in np.arange(0, detections.shape[2]): 429 | confidence = detections[0, 0, i, 2] 430 | if confidence > 0: 431 | idx = int(detections[0, 0, i, 1]) 432 | box = detections[0, 0, i, 3:7] * np.array([_w, _h, _w, _h]) 433 | (startX, startY, endX, endY) = box.astype("int") 434 | label = "{}: {:.2f}%".format(net['CLASSES'][idx], confidence * 100) 435 | cv2.rectangle(frame, (startX, startY), (endX, endY), cfg['net_detect']['boxcolor'], 1) 436 | y = startY - 15 if startY - 15 > 15 else startY + 15 437 | cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.4, cfg['net_detect']['boxcolor'], 1) 438 | 439 | Hooks.call("on_net_{}_detect".format(net['CLASSES'][idx]), frame[startY:startY + _h, startX:startX + _w]) 440 | 441 | if cfg['show_fps_on_frame'] == True: 442 | 443 | fps = 60 / (time.time() - _time_frame_start) 444 | 445 | _frame_text += "{value}\n".format(value=mask({ 446 | "max": str(cap.get(cv2.CAP_PROP_FPS)), 447 | "current": str(round(fps, 1)) 448 | }).fps(cfg['fps_mask'])) 449 | 450 | # _frame_text += "{value}\n".format(value=) 451 | 452 | # Put text 453 | y0, dy = 13 * 2, 13 * 2 454 | for i, line in enumerate(Filters.call('on_frame_text', _frame_text).split('\n')): 455 | y = y0 + i * dy 456 | cv2.putText(frame, line, (13, y), cv2.FONT_HERSHEY_SIMPLEX, cfg['text_on_frame_size'], cfg['text_on_frame_color']) 457 | 458 | Hooks.call('on_before_write_frame', frame) 459 | 460 | # Save video 461 | if (cfg['save_video']) == True: 462 | _video.write(Filters.call('on_frame_record', frame)) 463 | Hooks.call('on_save_video', frame) 464 | 465 | # Motion detect 466 | else: 467 | if (cfg['save_video_on_movies'] == True) and cfg['motion_detect'] == True: 468 | if int(_count) > int(cfg['pixel_update_for_detect']): 469 | _video.write(Filters.call('on_frame_motion_detect_record', frame)) 470 | Hooks.call('on_motion_detect', frame) 471 | Hooks.call('on_save_video', frame) 472 | Request.call('on_motion_detect', frame) 473 | 474 | # Send picture to server 475 | if cfg['web_stream'] == True: 476 | 477 | encoded, buffer = cv2.imencode('.jpg', Filters.call('on_socket_frame', frame)) 478 | 479 | jpg_as_text = base64.b64encode(buffer) 480 | footage_socket.send(Filters.call('on_socket_frame_encoded', jpg_as_text)) 481 | 482 | Hooks.call('on_frame_send_to_server', jpg_as_text) 483 | 484 | # Setup ready frame 485 | ready_frame = frame 486 | 487 | # Show picture on PC 488 | if cfg['show_stream'] == True: 489 | cv2.imshow("Video", frame) 490 | 491 | key = cv2.waitKey(10) 492 | 493 | if key == 27: 494 | Hooks.call('on_exit', True) 495 | break 496 | 497 | else: break 498 | 499 | cv2.destroyAllWindows() 500 | 501 | cap.release() 502 | _video.release() 503 | 504 | Hooks.call('on_release', None) 505 | 506 | # Send noise to video server 507 | im = np.empty((720, 1080), np.uint8) 508 | ready_frame = cv2.randn(im, (0), (99)) 509 | 510 | 511 | if __name__ == '__main__': 512 | 513 | # Create env 514 | global ready_frame 515 | ready_frame = False 516 | Hooks = hooks() 517 | Log = log() 518 | Filters = filters() 519 | Request = requests_() 520 | 521 | # Init plugins 522 | uh(cv2, Hooks, Filters) 523 | 524 | # First hook 525 | Hooks.call('on_init', True) 526 | 527 | # Set config 528 | with open('config.json') as config_file: 529 | cfg = Filters.call('on_config', json.load(config_file)) 530 | 531 | Hooks.call('on_setup_cfg', cfg) 532 | 533 | main(sys.argv) 534 | -------------------------------------------------------------------------------- /models/MobileNetSSD_deploy.caffemodel: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/models/MobileNetSSD_deploy.caffemodel -------------------------------------------------------------------------------- /models/MobileNetSSD_deploy.prototxt.txt: -------------------------------------------------------------------------------- 1 | name: "MobileNet-SSD" 2 | input: "data" 3 | input_shape { 4 | dim: 1 5 | dim: 3 6 | dim: 300 7 | dim: 300 8 | } 9 | layer { 10 | name: "conv0" 11 | type: "Convolution" 12 | bottom: "data" 13 | top: "conv0" 14 | param { 15 | lr_mult: 1.0 16 | decay_mult: 1.0 17 | } 18 | param { 19 | lr_mult: 2.0 20 | decay_mult: 0.0 21 | } 22 | convolution_param { 23 | num_output: 32 24 | pad: 1 25 | kernel_size: 3 26 | stride: 2 27 | weight_filler { 28 | type: "msra" 29 | } 30 | bias_filler { 31 | type: "constant" 32 | value: 0.0 33 | } 34 | } 35 | } 36 | layer { 37 | name: "conv0/relu" 38 | type: "ReLU" 39 | bottom: "conv0" 40 | top: "conv0" 41 | } 42 | layer { 43 | name: "conv1/dw" 44 | type: "Convolution" 45 | bottom: "conv0" 46 | top: "conv1/dw" 47 | param { 48 | lr_mult: 1.0 49 | decay_mult: 1.0 50 | } 51 | param { 52 | lr_mult: 2.0 53 | decay_mult: 0.0 54 | } 55 | convolution_param { 56 | num_output: 32 57 | pad: 1 58 | kernel_size: 3 59 | group: 32 60 | engine: CAFFE 61 | weight_filler { 62 | type: "msra" 63 | } 64 | bias_filler { 65 | type: "constant" 66 | value: 0.0 67 | } 68 | } 69 | } 70 | layer { 71 | name: "conv1/dw/relu" 72 | type: "ReLU" 73 | bottom: "conv1/dw" 74 | top: "conv1/dw" 75 | } 76 | layer { 77 | name: "conv1" 78 | type: "Convolution" 79 | bottom: "conv1/dw" 80 | top: "conv1" 81 | param { 82 | lr_mult: 1.0 83 | decay_mult: 1.0 84 | } 85 | param { 86 | lr_mult: 2.0 87 | decay_mult: 0.0 88 | } 89 | convolution_param { 90 | num_output: 64 91 | kernel_size: 1 92 | weight_filler { 93 | type: "msra" 94 | } 95 | bias_filler { 96 | type: "constant" 97 | value: 0.0 98 | } 99 | } 100 | } 101 | layer { 102 | name: "conv1/relu" 103 | type: "ReLU" 104 | bottom: "conv1" 105 | top: "conv1" 106 | } 107 | layer { 108 | name: "conv2/dw" 109 | type: "Convolution" 110 | bottom: "conv1" 111 | top: "conv2/dw" 112 | param { 113 | lr_mult: 1.0 114 | decay_mult: 1.0 115 | } 116 | param { 117 | lr_mult: 2.0 118 | decay_mult: 0.0 119 | } 120 | convolution_param { 121 | num_output: 64 122 | pad: 1 123 | kernel_size: 3 124 | stride: 2 125 | group: 64 126 | engine: CAFFE 127 | weight_filler { 128 | type: "msra" 129 | } 130 | bias_filler { 131 | type: "constant" 132 | value: 0.0 133 | } 134 | } 135 | } 136 | layer { 137 | name: "conv2/dw/relu" 138 | type: "ReLU" 139 | bottom: "conv2/dw" 140 | top: "conv2/dw" 141 | } 142 | layer { 143 | name: "conv2" 144 | type: "Convolution" 145 | bottom: "conv2/dw" 146 | top: "conv2" 147 | param { 148 | lr_mult: 1.0 149 | decay_mult: 1.0 150 | } 151 | param { 152 | lr_mult: 2.0 153 | decay_mult: 0.0 154 | } 155 | convolution_param { 156 | num_output: 128 157 | kernel_size: 1 158 | weight_filler { 159 | type: "msra" 160 | } 161 | bias_filler { 162 | type: "constant" 163 | value: 0.0 164 | } 165 | } 166 | } 167 | layer { 168 | name: "conv2/relu" 169 | type: "ReLU" 170 | bottom: "conv2" 171 | top: "conv2" 172 | } 173 | layer { 174 | name: "conv3/dw" 175 | type: "Convolution" 176 | bottom: "conv2" 177 | top: "conv3/dw" 178 | param { 179 | lr_mult: 1.0 180 | decay_mult: 1.0 181 | } 182 | param { 183 | lr_mult: 2.0 184 | decay_mult: 0.0 185 | } 186 | convolution_param { 187 | num_output: 128 188 | pad: 1 189 | kernel_size: 3 190 | group: 128 191 | engine: CAFFE 192 | weight_filler { 193 | type: "msra" 194 | } 195 | bias_filler { 196 | type: "constant" 197 | value: 0.0 198 | } 199 | } 200 | } 201 | layer { 202 | name: "conv3/dw/relu" 203 | type: "ReLU" 204 | bottom: "conv3/dw" 205 | top: "conv3/dw" 206 | } 207 | layer { 208 | name: "conv3" 209 | type: "Convolution" 210 | bottom: "conv3/dw" 211 | top: "conv3" 212 | param { 213 | lr_mult: 1.0 214 | decay_mult: 1.0 215 | } 216 | param { 217 | lr_mult: 2.0 218 | decay_mult: 0.0 219 | } 220 | convolution_param { 221 | num_output: 128 222 | kernel_size: 1 223 | weight_filler { 224 | type: "msra" 225 | } 226 | bias_filler { 227 | type: "constant" 228 | value: 0.0 229 | } 230 | } 231 | } 232 | layer { 233 | name: "conv3/relu" 234 | type: "ReLU" 235 | bottom: "conv3" 236 | top: "conv3" 237 | } 238 | layer { 239 | name: "conv4/dw" 240 | type: "Convolution" 241 | bottom: "conv3" 242 | top: "conv4/dw" 243 | param { 244 | lr_mult: 1.0 245 | decay_mult: 1.0 246 | } 247 | param { 248 | lr_mult: 2.0 249 | decay_mult: 0.0 250 | } 251 | convolution_param { 252 | num_output: 128 253 | pad: 1 254 | kernel_size: 3 255 | stride: 2 256 | group: 128 257 | engine: CAFFE 258 | weight_filler { 259 | type: "msra" 260 | } 261 | bias_filler { 262 | type: "constant" 263 | value: 0.0 264 | } 265 | } 266 | } 267 | layer { 268 | name: "conv4/dw/relu" 269 | type: "ReLU" 270 | bottom: "conv4/dw" 271 | top: "conv4/dw" 272 | } 273 | layer { 274 | name: "conv4" 275 | type: "Convolution" 276 | bottom: "conv4/dw" 277 | top: "conv4" 278 | param { 279 | lr_mult: 1.0 280 | decay_mult: 1.0 281 | } 282 | param { 283 | lr_mult: 2.0 284 | decay_mult: 0.0 285 | } 286 | convolution_param { 287 | num_output: 256 288 | kernel_size: 1 289 | weight_filler { 290 | type: "msra" 291 | } 292 | bias_filler { 293 | type: "constant" 294 | value: 0.0 295 | } 296 | } 297 | } 298 | layer { 299 | name: "conv4/relu" 300 | type: "ReLU" 301 | bottom: "conv4" 302 | top: "conv4" 303 | } 304 | layer { 305 | name: "conv5/dw" 306 | type: "Convolution" 307 | bottom: "conv4" 308 | top: "conv5/dw" 309 | param { 310 | lr_mult: 1.0 311 | decay_mult: 1.0 312 | } 313 | param { 314 | lr_mult: 2.0 315 | decay_mult: 0.0 316 | } 317 | convolution_param { 318 | num_output: 256 319 | pad: 1 320 | kernel_size: 3 321 | group: 256 322 | engine: CAFFE 323 | weight_filler { 324 | type: "msra" 325 | } 326 | bias_filler { 327 | type: "constant" 328 | value: 0.0 329 | } 330 | } 331 | } 332 | layer { 333 | name: "conv5/dw/relu" 334 | type: "ReLU" 335 | bottom: "conv5/dw" 336 | top: "conv5/dw" 337 | } 338 | layer { 339 | name: "conv5" 340 | type: "Convolution" 341 | bottom: "conv5/dw" 342 | top: "conv5" 343 | param { 344 | lr_mult: 1.0 345 | decay_mult: 1.0 346 | } 347 | param { 348 | lr_mult: 2.0 349 | decay_mult: 0.0 350 | } 351 | convolution_param { 352 | num_output: 256 353 | kernel_size: 1 354 | weight_filler { 355 | type: "msra" 356 | } 357 | bias_filler { 358 | type: "constant" 359 | value: 0.0 360 | } 361 | } 362 | } 363 | layer { 364 | name: "conv5/relu" 365 | type: "ReLU" 366 | bottom: "conv5" 367 | top: "conv5" 368 | } 369 | layer { 370 | name: "conv6/dw" 371 | type: "Convolution" 372 | bottom: "conv5" 373 | top: "conv6/dw" 374 | param { 375 | lr_mult: 1.0 376 | decay_mult: 1.0 377 | } 378 | param { 379 | lr_mult: 2.0 380 | decay_mult: 0.0 381 | } 382 | convolution_param { 383 | num_output: 256 384 | pad: 1 385 | kernel_size: 3 386 | stride: 2 387 | group: 256 388 | engine: CAFFE 389 | weight_filler { 390 | type: "msra" 391 | } 392 | bias_filler { 393 | type: "constant" 394 | value: 0.0 395 | } 396 | } 397 | } 398 | layer { 399 | name: "conv6/dw/relu" 400 | type: "ReLU" 401 | bottom: "conv6/dw" 402 | top: "conv6/dw" 403 | } 404 | layer { 405 | name: "conv6" 406 | type: "Convolution" 407 | bottom: "conv6/dw" 408 | top: "conv6" 409 | param { 410 | lr_mult: 1.0 411 | decay_mult: 1.0 412 | } 413 | param { 414 | lr_mult: 2.0 415 | decay_mult: 0.0 416 | } 417 | convolution_param { 418 | num_output: 512 419 | kernel_size: 1 420 | weight_filler { 421 | type: "msra" 422 | } 423 | bias_filler { 424 | type: "constant" 425 | value: 0.0 426 | } 427 | } 428 | } 429 | layer { 430 | name: "conv6/relu" 431 | type: "ReLU" 432 | bottom: "conv6" 433 | top: "conv6" 434 | } 435 | layer { 436 | name: "conv7/dw" 437 | type: "Convolution" 438 | bottom: "conv6" 439 | top: "conv7/dw" 440 | param { 441 | lr_mult: 1.0 442 | decay_mult: 1.0 443 | } 444 | param { 445 | lr_mult: 2.0 446 | decay_mult: 0.0 447 | } 448 | convolution_param { 449 | num_output: 512 450 | pad: 1 451 | kernel_size: 3 452 | group: 512 453 | engine: CAFFE 454 | weight_filler { 455 | type: "msra" 456 | } 457 | bias_filler { 458 | type: "constant" 459 | value: 0.0 460 | } 461 | } 462 | } 463 | layer { 464 | name: "conv7/dw/relu" 465 | type: "ReLU" 466 | bottom: "conv7/dw" 467 | top: "conv7/dw" 468 | } 469 | layer { 470 | name: "conv7" 471 | type: "Convolution" 472 | bottom: "conv7/dw" 473 | top: "conv7" 474 | param { 475 | lr_mult: 1.0 476 | decay_mult: 1.0 477 | } 478 | param { 479 | lr_mult: 2.0 480 | decay_mult: 0.0 481 | } 482 | convolution_param { 483 | num_output: 512 484 | kernel_size: 1 485 | weight_filler { 486 | type: "msra" 487 | } 488 | bias_filler { 489 | type: "constant" 490 | value: 0.0 491 | } 492 | } 493 | } 494 | layer { 495 | name: "conv7/relu" 496 | type: "ReLU" 497 | bottom: "conv7" 498 | top: "conv7" 499 | } 500 | layer { 501 | name: "conv8/dw" 502 | type: "Convolution" 503 | bottom: "conv7" 504 | top: "conv8/dw" 505 | param { 506 | lr_mult: 1.0 507 | decay_mult: 1.0 508 | } 509 | param { 510 | lr_mult: 2.0 511 | decay_mult: 0.0 512 | } 513 | convolution_param { 514 | num_output: 512 515 | pad: 1 516 | kernel_size: 3 517 | group: 512 518 | engine: CAFFE 519 | weight_filler { 520 | type: "msra" 521 | } 522 | bias_filler { 523 | type: "constant" 524 | value: 0.0 525 | } 526 | } 527 | } 528 | layer { 529 | name: "conv8/dw/relu" 530 | type: "ReLU" 531 | bottom: "conv8/dw" 532 | top: "conv8/dw" 533 | } 534 | layer { 535 | name: "conv8" 536 | type: "Convolution" 537 | bottom: "conv8/dw" 538 | top: "conv8" 539 | param { 540 | lr_mult: 1.0 541 | decay_mult: 1.0 542 | } 543 | param { 544 | lr_mult: 2.0 545 | decay_mult: 0.0 546 | } 547 | convolution_param { 548 | num_output: 512 549 | kernel_size: 1 550 | weight_filler { 551 | type: "msra" 552 | } 553 | bias_filler { 554 | type: "constant" 555 | value: 0.0 556 | } 557 | } 558 | } 559 | layer { 560 | name: "conv8/relu" 561 | type: "ReLU" 562 | bottom: "conv8" 563 | top: "conv8" 564 | } 565 | layer { 566 | name: "conv9/dw" 567 | type: "Convolution" 568 | bottom: "conv8" 569 | top: "conv9/dw" 570 | param { 571 | lr_mult: 1.0 572 | decay_mult: 1.0 573 | } 574 | param { 575 | lr_mult: 2.0 576 | decay_mult: 0.0 577 | } 578 | convolution_param { 579 | num_output: 512 580 | pad: 1 581 | kernel_size: 3 582 | group: 512 583 | engine: CAFFE 584 | weight_filler { 585 | type: "msra" 586 | } 587 | bias_filler { 588 | type: "constant" 589 | value: 0.0 590 | } 591 | } 592 | } 593 | layer { 594 | name: "conv9/dw/relu" 595 | type: "ReLU" 596 | bottom: "conv9/dw" 597 | top: "conv9/dw" 598 | } 599 | layer { 600 | name: "conv9" 601 | type: "Convolution" 602 | bottom: "conv9/dw" 603 | top: "conv9" 604 | param { 605 | lr_mult: 1.0 606 | decay_mult: 1.0 607 | } 608 | param { 609 | lr_mult: 2.0 610 | decay_mult: 0.0 611 | } 612 | convolution_param { 613 | num_output: 512 614 | kernel_size: 1 615 | weight_filler { 616 | type: "msra" 617 | } 618 | bias_filler { 619 | type: "constant" 620 | value: 0.0 621 | } 622 | } 623 | } 624 | layer { 625 | name: "conv9/relu" 626 | type: "ReLU" 627 | bottom: "conv9" 628 | top: "conv9" 629 | } 630 | layer { 631 | name: "conv10/dw" 632 | type: "Convolution" 633 | bottom: "conv9" 634 | top: "conv10/dw" 635 | param { 636 | lr_mult: 1.0 637 | decay_mult: 1.0 638 | } 639 | param { 640 | lr_mult: 2.0 641 | decay_mult: 0.0 642 | } 643 | convolution_param { 644 | num_output: 512 645 | pad: 1 646 | kernel_size: 3 647 | group: 512 648 | engine: CAFFE 649 | weight_filler { 650 | type: "msra" 651 | } 652 | bias_filler { 653 | type: "constant" 654 | value: 0.0 655 | } 656 | } 657 | } 658 | layer { 659 | name: "conv10/dw/relu" 660 | type: "ReLU" 661 | bottom: "conv10/dw" 662 | top: "conv10/dw" 663 | } 664 | layer { 665 | name: "conv10" 666 | type: "Convolution" 667 | bottom: "conv10/dw" 668 | top: "conv10" 669 | param { 670 | lr_mult: 1.0 671 | decay_mult: 1.0 672 | } 673 | param { 674 | lr_mult: 2.0 675 | decay_mult: 0.0 676 | } 677 | convolution_param { 678 | num_output: 512 679 | kernel_size: 1 680 | weight_filler { 681 | type: "msra" 682 | } 683 | bias_filler { 684 | type: "constant" 685 | value: 0.0 686 | } 687 | } 688 | } 689 | layer { 690 | name: "conv10/relu" 691 | type: "ReLU" 692 | bottom: "conv10" 693 | top: "conv10" 694 | } 695 | layer { 696 | name: "conv11/dw" 697 | type: "Convolution" 698 | bottom: "conv10" 699 | top: "conv11/dw" 700 | param { 701 | lr_mult: 1.0 702 | decay_mult: 1.0 703 | } 704 | param { 705 | lr_mult: 2.0 706 | decay_mult: 0.0 707 | } 708 | convolution_param { 709 | num_output: 512 710 | pad: 1 711 | kernel_size: 3 712 | group: 512 713 | engine: CAFFE 714 | weight_filler { 715 | type: "msra" 716 | } 717 | bias_filler { 718 | type: "constant" 719 | value: 0.0 720 | } 721 | } 722 | } 723 | layer { 724 | name: "conv11/dw/relu" 725 | type: "ReLU" 726 | bottom: "conv11/dw" 727 | top: "conv11/dw" 728 | } 729 | layer { 730 | name: "conv11" 731 | type: "Convolution" 732 | bottom: "conv11/dw" 733 | top: "conv11" 734 | param { 735 | lr_mult: 1.0 736 | decay_mult: 1.0 737 | } 738 | param { 739 | lr_mult: 2.0 740 | decay_mult: 0.0 741 | } 742 | convolution_param { 743 | num_output: 512 744 | kernel_size: 1 745 | weight_filler { 746 | type: "msra" 747 | } 748 | bias_filler { 749 | type: "constant" 750 | value: 0.0 751 | } 752 | } 753 | } 754 | layer { 755 | name: "conv11/relu" 756 | type: "ReLU" 757 | bottom: "conv11" 758 | top: "conv11" 759 | } 760 | layer { 761 | name: "conv12/dw" 762 | type: "Convolution" 763 | bottom: "conv11" 764 | top: "conv12/dw" 765 | param { 766 | lr_mult: 1.0 767 | decay_mult: 1.0 768 | } 769 | param { 770 | lr_mult: 2.0 771 | decay_mult: 0.0 772 | } 773 | convolution_param { 774 | num_output: 512 775 | pad: 1 776 | kernel_size: 3 777 | stride: 2 778 | group: 512 779 | engine: CAFFE 780 | weight_filler { 781 | type: "msra" 782 | } 783 | bias_filler { 784 | type: "constant" 785 | value: 0.0 786 | } 787 | } 788 | } 789 | layer { 790 | name: "conv12/dw/relu" 791 | type: "ReLU" 792 | bottom: "conv12/dw" 793 | top: "conv12/dw" 794 | } 795 | layer { 796 | name: "conv12" 797 | type: "Convolution" 798 | bottom: "conv12/dw" 799 | top: "conv12" 800 | param { 801 | lr_mult: 1.0 802 | decay_mult: 1.0 803 | } 804 | param { 805 | lr_mult: 2.0 806 | decay_mult: 0.0 807 | } 808 | convolution_param { 809 | num_output: 1024 810 | kernel_size: 1 811 | weight_filler { 812 | type: "msra" 813 | } 814 | bias_filler { 815 | type: "constant" 816 | value: 0.0 817 | } 818 | } 819 | } 820 | layer { 821 | name: "conv12/relu" 822 | type: "ReLU" 823 | bottom: "conv12" 824 | top: "conv12" 825 | } 826 | layer { 827 | name: "conv13/dw" 828 | type: "Convolution" 829 | bottom: "conv12" 830 | top: "conv13/dw" 831 | param { 832 | lr_mult: 1.0 833 | decay_mult: 1.0 834 | } 835 | param { 836 | lr_mult: 2.0 837 | decay_mult: 0.0 838 | } 839 | convolution_param { 840 | num_output: 1024 841 | pad: 1 842 | kernel_size: 3 843 | group: 1024 844 | engine: CAFFE 845 | weight_filler { 846 | type: "msra" 847 | } 848 | bias_filler { 849 | type: "constant" 850 | value: 0.0 851 | } 852 | } 853 | } 854 | layer { 855 | name: "conv13/dw/relu" 856 | type: "ReLU" 857 | bottom: "conv13/dw" 858 | top: "conv13/dw" 859 | } 860 | layer { 861 | name: "conv13" 862 | type: "Convolution" 863 | bottom: "conv13/dw" 864 | top: "conv13" 865 | param { 866 | lr_mult: 1.0 867 | decay_mult: 1.0 868 | } 869 | param { 870 | lr_mult: 2.0 871 | decay_mult: 0.0 872 | } 873 | convolution_param { 874 | num_output: 1024 875 | kernel_size: 1 876 | weight_filler { 877 | type: "msra" 878 | } 879 | bias_filler { 880 | type: "constant" 881 | value: 0.0 882 | } 883 | } 884 | } 885 | layer { 886 | name: "conv13/relu" 887 | type: "ReLU" 888 | bottom: "conv13" 889 | top: "conv13" 890 | } 891 | layer { 892 | name: "conv14_1" 893 | type: "Convolution" 894 | bottom: "conv13" 895 | top: "conv14_1" 896 | param { 897 | lr_mult: 1.0 898 | decay_mult: 1.0 899 | } 900 | param { 901 | lr_mult: 2.0 902 | decay_mult: 0.0 903 | } 904 | convolution_param { 905 | num_output: 256 906 | kernel_size: 1 907 | weight_filler { 908 | type: "msra" 909 | } 910 | bias_filler { 911 | type: "constant" 912 | value: 0.0 913 | } 914 | } 915 | } 916 | layer { 917 | name: "conv14_1/relu" 918 | type: "ReLU" 919 | bottom: "conv14_1" 920 | top: "conv14_1" 921 | } 922 | layer { 923 | name: "conv14_2" 924 | type: "Convolution" 925 | bottom: "conv14_1" 926 | top: "conv14_2" 927 | param { 928 | lr_mult: 1.0 929 | decay_mult: 1.0 930 | } 931 | param { 932 | lr_mult: 2.0 933 | decay_mult: 0.0 934 | } 935 | convolution_param { 936 | num_output: 512 937 | pad: 1 938 | kernel_size: 3 939 | stride: 2 940 | weight_filler { 941 | type: "msra" 942 | } 943 | bias_filler { 944 | type: "constant" 945 | value: 0.0 946 | } 947 | } 948 | } 949 | layer { 950 | name: "conv14_2/relu" 951 | type: "ReLU" 952 | bottom: "conv14_2" 953 | top: "conv14_2" 954 | } 955 | layer { 956 | name: "conv15_1" 957 | type: "Convolution" 958 | bottom: "conv14_2" 959 | top: "conv15_1" 960 | param { 961 | lr_mult: 1.0 962 | decay_mult: 1.0 963 | } 964 | param { 965 | lr_mult: 2.0 966 | decay_mult: 0.0 967 | } 968 | convolution_param { 969 | num_output: 128 970 | kernel_size: 1 971 | weight_filler { 972 | type: "msra" 973 | } 974 | bias_filler { 975 | type: "constant" 976 | value: 0.0 977 | } 978 | } 979 | } 980 | layer { 981 | name: "conv15_1/relu" 982 | type: "ReLU" 983 | bottom: "conv15_1" 984 | top: "conv15_1" 985 | } 986 | layer { 987 | name: "conv15_2" 988 | type: "Convolution" 989 | bottom: "conv15_1" 990 | top: "conv15_2" 991 | param { 992 | lr_mult: 1.0 993 | decay_mult: 1.0 994 | } 995 | param { 996 | lr_mult: 2.0 997 | decay_mult: 0.0 998 | } 999 | convolution_param { 1000 | num_output: 256 1001 | pad: 1 1002 | kernel_size: 3 1003 | stride: 2 1004 | weight_filler { 1005 | type: "msra" 1006 | } 1007 | bias_filler { 1008 | type: "constant" 1009 | value: 0.0 1010 | } 1011 | } 1012 | } 1013 | layer { 1014 | name: "conv15_2/relu" 1015 | type: "ReLU" 1016 | bottom: "conv15_2" 1017 | top: "conv15_2" 1018 | } 1019 | layer { 1020 | name: "conv16_1" 1021 | type: "Convolution" 1022 | bottom: "conv15_2" 1023 | top: "conv16_1" 1024 | param { 1025 | lr_mult: 1.0 1026 | decay_mult: 1.0 1027 | } 1028 | param { 1029 | lr_mult: 2.0 1030 | decay_mult: 0.0 1031 | } 1032 | convolution_param { 1033 | num_output: 128 1034 | kernel_size: 1 1035 | weight_filler { 1036 | type: "msra" 1037 | } 1038 | bias_filler { 1039 | type: "constant" 1040 | value: 0.0 1041 | } 1042 | } 1043 | } 1044 | layer { 1045 | name: "conv16_1/relu" 1046 | type: "ReLU" 1047 | bottom: "conv16_1" 1048 | top: "conv16_1" 1049 | } 1050 | layer { 1051 | name: "conv16_2" 1052 | type: "Convolution" 1053 | bottom: "conv16_1" 1054 | top: "conv16_2" 1055 | param { 1056 | lr_mult: 1.0 1057 | decay_mult: 1.0 1058 | } 1059 | param { 1060 | lr_mult: 2.0 1061 | decay_mult: 0.0 1062 | } 1063 | convolution_param { 1064 | num_output: 256 1065 | pad: 1 1066 | kernel_size: 3 1067 | stride: 2 1068 | weight_filler { 1069 | type: "msra" 1070 | } 1071 | bias_filler { 1072 | type: "constant" 1073 | value: 0.0 1074 | } 1075 | } 1076 | } 1077 | layer { 1078 | name: "conv16_2/relu" 1079 | type: "ReLU" 1080 | bottom: "conv16_2" 1081 | top: "conv16_2" 1082 | } 1083 | layer { 1084 | name: "conv17_1" 1085 | type: "Convolution" 1086 | bottom: "conv16_2" 1087 | top: "conv17_1" 1088 | param { 1089 | lr_mult: 1.0 1090 | decay_mult: 1.0 1091 | } 1092 | param { 1093 | lr_mult: 2.0 1094 | decay_mult: 0.0 1095 | } 1096 | convolution_param { 1097 | num_output: 64 1098 | kernel_size: 1 1099 | weight_filler { 1100 | type: "msra" 1101 | } 1102 | bias_filler { 1103 | type: "constant" 1104 | value: 0.0 1105 | } 1106 | } 1107 | } 1108 | layer { 1109 | name: "conv17_1/relu" 1110 | type: "ReLU" 1111 | bottom: "conv17_1" 1112 | top: "conv17_1" 1113 | } 1114 | layer { 1115 | name: "conv17_2" 1116 | type: "Convolution" 1117 | bottom: "conv17_1" 1118 | top: "conv17_2" 1119 | param { 1120 | lr_mult: 1.0 1121 | decay_mult: 1.0 1122 | } 1123 | param { 1124 | lr_mult: 2.0 1125 | decay_mult: 0.0 1126 | } 1127 | convolution_param { 1128 | num_output: 128 1129 | pad: 1 1130 | kernel_size: 3 1131 | stride: 2 1132 | weight_filler { 1133 | type: "msra" 1134 | } 1135 | bias_filler { 1136 | type: "constant" 1137 | value: 0.0 1138 | } 1139 | } 1140 | } 1141 | layer { 1142 | name: "conv17_2/relu" 1143 | type: "ReLU" 1144 | bottom: "conv17_2" 1145 | top: "conv17_2" 1146 | } 1147 | layer { 1148 | name: "conv11_mbox_loc" 1149 | type: "Convolution" 1150 | bottom: "conv11" 1151 | top: "conv11_mbox_loc" 1152 | param { 1153 | lr_mult: 1.0 1154 | decay_mult: 1.0 1155 | } 1156 | param { 1157 | lr_mult: 2.0 1158 | decay_mult: 0.0 1159 | } 1160 | convolution_param { 1161 | num_output: 12 1162 | kernel_size: 1 1163 | weight_filler { 1164 | type: "msra" 1165 | } 1166 | bias_filler { 1167 | type: "constant" 1168 | value: 0.0 1169 | } 1170 | } 1171 | } 1172 | layer { 1173 | name: "conv11_mbox_loc_perm" 1174 | type: "Permute" 1175 | bottom: "conv11_mbox_loc" 1176 | top: "conv11_mbox_loc_perm" 1177 | permute_param { 1178 | order: 0 1179 | order: 2 1180 | order: 3 1181 | order: 1 1182 | } 1183 | } 1184 | layer { 1185 | name: "conv11_mbox_loc_flat" 1186 | type: "Flatten" 1187 | bottom: "conv11_mbox_loc_perm" 1188 | top: "conv11_mbox_loc_flat" 1189 | flatten_param { 1190 | axis: 1 1191 | } 1192 | } 1193 | layer { 1194 | name: "conv11_mbox_conf" 1195 | type: "Convolution" 1196 | bottom: "conv11" 1197 | top: "conv11_mbox_conf" 1198 | param { 1199 | lr_mult: 1.0 1200 | decay_mult: 1.0 1201 | } 1202 | param { 1203 | lr_mult: 2.0 1204 | decay_mult: 0.0 1205 | } 1206 | convolution_param { 1207 | num_output: 63 1208 | kernel_size: 1 1209 | weight_filler { 1210 | type: "msra" 1211 | } 1212 | bias_filler { 1213 | type: "constant" 1214 | value: 0.0 1215 | } 1216 | } 1217 | } 1218 | layer { 1219 | name: "conv11_mbox_conf_perm" 1220 | type: "Permute" 1221 | bottom: "conv11_mbox_conf" 1222 | top: "conv11_mbox_conf_perm" 1223 | permute_param { 1224 | order: 0 1225 | order: 2 1226 | order: 3 1227 | order: 1 1228 | } 1229 | } 1230 | layer { 1231 | name: "conv11_mbox_conf_flat" 1232 | type: "Flatten" 1233 | bottom: "conv11_mbox_conf_perm" 1234 | top: "conv11_mbox_conf_flat" 1235 | flatten_param { 1236 | axis: 1 1237 | } 1238 | } 1239 | layer { 1240 | name: "conv11_mbox_priorbox" 1241 | type: "PriorBox" 1242 | bottom: "conv11" 1243 | bottom: "data" 1244 | top: "conv11_mbox_priorbox" 1245 | prior_box_param { 1246 | min_size: 60.0 1247 | aspect_ratio: 2.0 1248 | flip: true 1249 | clip: false 1250 | variance: 0.1 1251 | variance: 0.1 1252 | variance: 0.2 1253 | variance: 0.2 1254 | offset: 0.5 1255 | } 1256 | } 1257 | layer { 1258 | name: "conv13_mbox_loc" 1259 | type: "Convolution" 1260 | bottom: "conv13" 1261 | top: "conv13_mbox_loc" 1262 | param { 1263 | lr_mult: 1.0 1264 | decay_mult: 1.0 1265 | } 1266 | param { 1267 | lr_mult: 2.0 1268 | decay_mult: 0.0 1269 | } 1270 | convolution_param { 1271 | num_output: 24 1272 | kernel_size: 1 1273 | weight_filler { 1274 | type: "msra" 1275 | } 1276 | bias_filler { 1277 | type: "constant" 1278 | value: 0.0 1279 | } 1280 | } 1281 | } 1282 | layer { 1283 | name: "conv13_mbox_loc_perm" 1284 | type: "Permute" 1285 | bottom: "conv13_mbox_loc" 1286 | top: "conv13_mbox_loc_perm" 1287 | permute_param { 1288 | order: 0 1289 | order: 2 1290 | order: 3 1291 | order: 1 1292 | } 1293 | } 1294 | layer { 1295 | name: "conv13_mbox_loc_flat" 1296 | type: "Flatten" 1297 | bottom: "conv13_mbox_loc_perm" 1298 | top: "conv13_mbox_loc_flat" 1299 | flatten_param { 1300 | axis: 1 1301 | } 1302 | } 1303 | layer { 1304 | name: "conv13_mbox_conf" 1305 | type: "Convolution" 1306 | bottom: "conv13" 1307 | top: "conv13_mbox_conf" 1308 | param { 1309 | lr_mult: 1.0 1310 | decay_mult: 1.0 1311 | } 1312 | param { 1313 | lr_mult: 2.0 1314 | decay_mult: 0.0 1315 | } 1316 | convolution_param { 1317 | num_output: 126 1318 | kernel_size: 1 1319 | weight_filler { 1320 | type: "msra" 1321 | } 1322 | bias_filler { 1323 | type: "constant" 1324 | value: 0.0 1325 | } 1326 | } 1327 | } 1328 | layer { 1329 | name: "conv13_mbox_conf_perm" 1330 | type: "Permute" 1331 | bottom: "conv13_mbox_conf" 1332 | top: "conv13_mbox_conf_perm" 1333 | permute_param { 1334 | order: 0 1335 | order: 2 1336 | order: 3 1337 | order: 1 1338 | } 1339 | } 1340 | layer { 1341 | name: "conv13_mbox_conf_flat" 1342 | type: "Flatten" 1343 | bottom: "conv13_mbox_conf_perm" 1344 | top: "conv13_mbox_conf_flat" 1345 | flatten_param { 1346 | axis: 1 1347 | } 1348 | } 1349 | layer { 1350 | name: "conv13_mbox_priorbox" 1351 | type: "PriorBox" 1352 | bottom: "conv13" 1353 | bottom: "data" 1354 | top: "conv13_mbox_priorbox" 1355 | prior_box_param { 1356 | min_size: 105.0 1357 | max_size: 150.0 1358 | aspect_ratio: 2.0 1359 | aspect_ratio: 3.0 1360 | flip: true 1361 | clip: false 1362 | variance: 0.1 1363 | variance: 0.1 1364 | variance: 0.2 1365 | variance: 0.2 1366 | offset: 0.5 1367 | } 1368 | } 1369 | layer { 1370 | name: "conv14_2_mbox_loc" 1371 | type: "Convolution" 1372 | bottom: "conv14_2" 1373 | top: "conv14_2_mbox_loc" 1374 | param { 1375 | lr_mult: 1.0 1376 | decay_mult: 1.0 1377 | } 1378 | param { 1379 | lr_mult: 2.0 1380 | decay_mult: 0.0 1381 | } 1382 | convolution_param { 1383 | num_output: 24 1384 | kernel_size: 1 1385 | weight_filler { 1386 | type: "msra" 1387 | } 1388 | bias_filler { 1389 | type: "constant" 1390 | value: 0.0 1391 | } 1392 | } 1393 | } 1394 | layer { 1395 | name: "conv14_2_mbox_loc_perm" 1396 | type: "Permute" 1397 | bottom: "conv14_2_mbox_loc" 1398 | top: "conv14_2_mbox_loc_perm" 1399 | permute_param { 1400 | order: 0 1401 | order: 2 1402 | order: 3 1403 | order: 1 1404 | } 1405 | } 1406 | layer { 1407 | name: "conv14_2_mbox_loc_flat" 1408 | type: "Flatten" 1409 | bottom: "conv14_2_mbox_loc_perm" 1410 | top: "conv14_2_mbox_loc_flat" 1411 | flatten_param { 1412 | axis: 1 1413 | } 1414 | } 1415 | layer { 1416 | name: "conv14_2_mbox_conf" 1417 | type: "Convolution" 1418 | bottom: "conv14_2" 1419 | top: "conv14_2_mbox_conf" 1420 | param { 1421 | lr_mult: 1.0 1422 | decay_mult: 1.0 1423 | } 1424 | param { 1425 | lr_mult: 2.0 1426 | decay_mult: 0.0 1427 | } 1428 | convolution_param { 1429 | num_output: 126 1430 | kernel_size: 1 1431 | weight_filler { 1432 | type: "msra" 1433 | } 1434 | bias_filler { 1435 | type: "constant" 1436 | value: 0.0 1437 | } 1438 | } 1439 | } 1440 | layer { 1441 | name: "conv14_2_mbox_conf_perm" 1442 | type: "Permute" 1443 | bottom: "conv14_2_mbox_conf" 1444 | top: "conv14_2_mbox_conf_perm" 1445 | permute_param { 1446 | order: 0 1447 | order: 2 1448 | order: 3 1449 | order: 1 1450 | } 1451 | } 1452 | layer { 1453 | name: "conv14_2_mbox_conf_flat" 1454 | type: "Flatten" 1455 | bottom: "conv14_2_mbox_conf_perm" 1456 | top: "conv14_2_mbox_conf_flat" 1457 | flatten_param { 1458 | axis: 1 1459 | } 1460 | } 1461 | layer { 1462 | name: "conv14_2_mbox_priorbox" 1463 | type: "PriorBox" 1464 | bottom: "conv14_2" 1465 | bottom: "data" 1466 | top: "conv14_2_mbox_priorbox" 1467 | prior_box_param { 1468 | min_size: 150.0 1469 | max_size: 195.0 1470 | aspect_ratio: 2.0 1471 | aspect_ratio: 3.0 1472 | flip: true 1473 | clip: false 1474 | variance: 0.1 1475 | variance: 0.1 1476 | variance: 0.2 1477 | variance: 0.2 1478 | offset: 0.5 1479 | } 1480 | } 1481 | layer { 1482 | name: "conv15_2_mbox_loc" 1483 | type: "Convolution" 1484 | bottom: "conv15_2" 1485 | top: "conv15_2_mbox_loc" 1486 | param { 1487 | lr_mult: 1.0 1488 | decay_mult: 1.0 1489 | } 1490 | param { 1491 | lr_mult: 2.0 1492 | decay_mult: 0.0 1493 | } 1494 | convolution_param { 1495 | num_output: 24 1496 | kernel_size: 1 1497 | weight_filler { 1498 | type: "msra" 1499 | } 1500 | bias_filler { 1501 | type: "constant" 1502 | value: 0.0 1503 | } 1504 | } 1505 | } 1506 | layer { 1507 | name: "conv15_2_mbox_loc_perm" 1508 | type: "Permute" 1509 | bottom: "conv15_2_mbox_loc" 1510 | top: "conv15_2_mbox_loc_perm" 1511 | permute_param { 1512 | order: 0 1513 | order: 2 1514 | order: 3 1515 | order: 1 1516 | } 1517 | } 1518 | layer { 1519 | name: "conv15_2_mbox_loc_flat" 1520 | type: "Flatten" 1521 | bottom: "conv15_2_mbox_loc_perm" 1522 | top: "conv15_2_mbox_loc_flat" 1523 | flatten_param { 1524 | axis: 1 1525 | } 1526 | } 1527 | layer { 1528 | name: "conv15_2_mbox_conf" 1529 | type: "Convolution" 1530 | bottom: "conv15_2" 1531 | top: "conv15_2_mbox_conf" 1532 | param { 1533 | lr_mult: 1.0 1534 | decay_mult: 1.0 1535 | } 1536 | param { 1537 | lr_mult: 2.0 1538 | decay_mult: 0.0 1539 | } 1540 | convolution_param { 1541 | num_output: 126 1542 | kernel_size: 1 1543 | weight_filler { 1544 | type: "msra" 1545 | } 1546 | bias_filler { 1547 | type: "constant" 1548 | value: 0.0 1549 | } 1550 | } 1551 | } 1552 | layer { 1553 | name: "conv15_2_mbox_conf_perm" 1554 | type: "Permute" 1555 | bottom: "conv15_2_mbox_conf" 1556 | top: "conv15_2_mbox_conf_perm" 1557 | permute_param { 1558 | order: 0 1559 | order: 2 1560 | order: 3 1561 | order: 1 1562 | } 1563 | } 1564 | layer { 1565 | name: "conv15_2_mbox_conf_flat" 1566 | type: "Flatten" 1567 | bottom: "conv15_2_mbox_conf_perm" 1568 | top: "conv15_2_mbox_conf_flat" 1569 | flatten_param { 1570 | axis: 1 1571 | } 1572 | } 1573 | layer { 1574 | name: "conv15_2_mbox_priorbox" 1575 | type: "PriorBox" 1576 | bottom: "conv15_2" 1577 | bottom: "data" 1578 | top: "conv15_2_mbox_priorbox" 1579 | prior_box_param { 1580 | min_size: 195.0 1581 | max_size: 240.0 1582 | aspect_ratio: 2.0 1583 | aspect_ratio: 3.0 1584 | flip: true 1585 | clip: false 1586 | variance: 0.1 1587 | variance: 0.1 1588 | variance: 0.2 1589 | variance: 0.2 1590 | offset: 0.5 1591 | } 1592 | } 1593 | layer { 1594 | name: "conv16_2_mbox_loc" 1595 | type: "Convolution" 1596 | bottom: "conv16_2" 1597 | top: "conv16_2_mbox_loc" 1598 | param { 1599 | lr_mult: 1.0 1600 | decay_mult: 1.0 1601 | } 1602 | param { 1603 | lr_mult: 2.0 1604 | decay_mult: 0.0 1605 | } 1606 | convolution_param { 1607 | num_output: 24 1608 | kernel_size: 1 1609 | weight_filler { 1610 | type: "msra" 1611 | } 1612 | bias_filler { 1613 | type: "constant" 1614 | value: 0.0 1615 | } 1616 | } 1617 | } 1618 | layer { 1619 | name: "conv16_2_mbox_loc_perm" 1620 | type: "Permute" 1621 | bottom: "conv16_2_mbox_loc" 1622 | top: "conv16_2_mbox_loc_perm" 1623 | permute_param { 1624 | order: 0 1625 | order: 2 1626 | order: 3 1627 | order: 1 1628 | } 1629 | } 1630 | layer { 1631 | name: "conv16_2_mbox_loc_flat" 1632 | type: "Flatten" 1633 | bottom: "conv16_2_mbox_loc_perm" 1634 | top: "conv16_2_mbox_loc_flat" 1635 | flatten_param { 1636 | axis: 1 1637 | } 1638 | } 1639 | layer { 1640 | name: "conv16_2_mbox_conf" 1641 | type: "Convolution" 1642 | bottom: "conv16_2" 1643 | top: "conv16_2_mbox_conf" 1644 | param { 1645 | lr_mult: 1.0 1646 | decay_mult: 1.0 1647 | } 1648 | param { 1649 | lr_mult: 2.0 1650 | decay_mult: 0.0 1651 | } 1652 | convolution_param { 1653 | num_output: 126 1654 | kernel_size: 1 1655 | weight_filler { 1656 | type: "msra" 1657 | } 1658 | bias_filler { 1659 | type: "constant" 1660 | value: 0.0 1661 | } 1662 | } 1663 | } 1664 | layer { 1665 | name: "conv16_2_mbox_conf_perm" 1666 | type: "Permute" 1667 | bottom: "conv16_2_mbox_conf" 1668 | top: "conv16_2_mbox_conf_perm" 1669 | permute_param { 1670 | order: 0 1671 | order: 2 1672 | order: 3 1673 | order: 1 1674 | } 1675 | } 1676 | layer { 1677 | name: "conv16_2_mbox_conf_flat" 1678 | type: "Flatten" 1679 | bottom: "conv16_2_mbox_conf_perm" 1680 | top: "conv16_2_mbox_conf_flat" 1681 | flatten_param { 1682 | axis: 1 1683 | } 1684 | } 1685 | layer { 1686 | name: "conv16_2_mbox_priorbox" 1687 | type: "PriorBox" 1688 | bottom: "conv16_2" 1689 | bottom: "data" 1690 | top: "conv16_2_mbox_priorbox" 1691 | prior_box_param { 1692 | min_size: 240.0 1693 | max_size: 285.0 1694 | aspect_ratio: 2.0 1695 | aspect_ratio: 3.0 1696 | flip: true 1697 | clip: false 1698 | variance: 0.1 1699 | variance: 0.1 1700 | variance: 0.2 1701 | variance: 0.2 1702 | offset: 0.5 1703 | } 1704 | } 1705 | layer { 1706 | name: "conv17_2_mbox_loc" 1707 | type: "Convolution" 1708 | bottom: "conv17_2" 1709 | top: "conv17_2_mbox_loc" 1710 | param { 1711 | lr_mult: 1.0 1712 | decay_mult: 1.0 1713 | } 1714 | param { 1715 | lr_mult: 2.0 1716 | decay_mult: 0.0 1717 | } 1718 | convolution_param { 1719 | num_output: 24 1720 | kernel_size: 1 1721 | weight_filler { 1722 | type: "msra" 1723 | } 1724 | bias_filler { 1725 | type: "constant" 1726 | value: 0.0 1727 | } 1728 | } 1729 | } 1730 | layer { 1731 | name: "conv17_2_mbox_loc_perm" 1732 | type: "Permute" 1733 | bottom: "conv17_2_mbox_loc" 1734 | top: "conv17_2_mbox_loc_perm" 1735 | permute_param { 1736 | order: 0 1737 | order: 2 1738 | order: 3 1739 | order: 1 1740 | } 1741 | } 1742 | layer { 1743 | name: "conv17_2_mbox_loc_flat" 1744 | type: "Flatten" 1745 | bottom: "conv17_2_mbox_loc_perm" 1746 | top: "conv17_2_mbox_loc_flat" 1747 | flatten_param { 1748 | axis: 1 1749 | } 1750 | } 1751 | layer { 1752 | name: "conv17_2_mbox_conf" 1753 | type: "Convolution" 1754 | bottom: "conv17_2" 1755 | top: "conv17_2_mbox_conf" 1756 | param { 1757 | lr_mult: 1.0 1758 | decay_mult: 1.0 1759 | } 1760 | param { 1761 | lr_mult: 2.0 1762 | decay_mult: 0.0 1763 | } 1764 | convolution_param { 1765 | num_output: 126 1766 | kernel_size: 1 1767 | weight_filler { 1768 | type: "msra" 1769 | } 1770 | bias_filler { 1771 | type: "constant" 1772 | value: 0.0 1773 | } 1774 | } 1775 | } 1776 | layer { 1777 | name: "conv17_2_mbox_conf_perm" 1778 | type: "Permute" 1779 | bottom: "conv17_2_mbox_conf" 1780 | top: "conv17_2_mbox_conf_perm" 1781 | permute_param { 1782 | order: 0 1783 | order: 2 1784 | order: 3 1785 | order: 1 1786 | } 1787 | } 1788 | layer { 1789 | name: "conv17_2_mbox_conf_flat" 1790 | type: "Flatten" 1791 | bottom: "conv17_2_mbox_conf_perm" 1792 | top: "conv17_2_mbox_conf_flat" 1793 | flatten_param { 1794 | axis: 1 1795 | } 1796 | } 1797 | layer { 1798 | name: "conv17_2_mbox_priorbox" 1799 | type: "PriorBox" 1800 | bottom: "conv17_2" 1801 | bottom: "data" 1802 | top: "conv17_2_mbox_priorbox" 1803 | prior_box_param { 1804 | min_size: 285.0 1805 | max_size: 300.0 1806 | aspect_ratio: 2.0 1807 | aspect_ratio: 3.0 1808 | flip: true 1809 | clip: false 1810 | variance: 0.1 1811 | variance: 0.1 1812 | variance: 0.2 1813 | variance: 0.2 1814 | offset: 0.5 1815 | } 1816 | } 1817 | layer { 1818 | name: "mbox_loc" 1819 | type: "Concat" 1820 | bottom: "conv11_mbox_loc_flat" 1821 | bottom: "conv13_mbox_loc_flat" 1822 | bottom: "conv14_2_mbox_loc_flat" 1823 | bottom: "conv15_2_mbox_loc_flat" 1824 | bottom: "conv16_2_mbox_loc_flat" 1825 | bottom: "conv17_2_mbox_loc_flat" 1826 | top: "mbox_loc" 1827 | concat_param { 1828 | axis: 1 1829 | } 1830 | } 1831 | layer { 1832 | name: "mbox_conf" 1833 | type: "Concat" 1834 | bottom: "conv11_mbox_conf_flat" 1835 | bottom: "conv13_mbox_conf_flat" 1836 | bottom: "conv14_2_mbox_conf_flat" 1837 | bottom: "conv15_2_mbox_conf_flat" 1838 | bottom: "conv16_2_mbox_conf_flat" 1839 | bottom: "conv17_2_mbox_conf_flat" 1840 | top: "mbox_conf" 1841 | concat_param { 1842 | axis: 1 1843 | } 1844 | } 1845 | layer { 1846 | name: "mbox_priorbox" 1847 | type: "Concat" 1848 | bottom: "conv11_mbox_priorbox" 1849 | bottom: "conv13_mbox_priorbox" 1850 | bottom: "conv14_2_mbox_priorbox" 1851 | bottom: "conv15_2_mbox_priorbox" 1852 | bottom: "conv16_2_mbox_priorbox" 1853 | bottom: "conv17_2_mbox_priorbox" 1854 | top: "mbox_priorbox" 1855 | concat_param { 1856 | axis: 2 1857 | } 1858 | } 1859 | layer { 1860 | name: "mbox_conf_reshape" 1861 | type: "Reshape" 1862 | bottom: "mbox_conf" 1863 | top: "mbox_conf_reshape" 1864 | reshape_param { 1865 | shape { 1866 | dim: 0 1867 | dim: -1 1868 | dim: 21 1869 | } 1870 | } 1871 | } 1872 | layer { 1873 | name: "mbox_conf_softmax" 1874 | type: "Softmax" 1875 | bottom: "mbox_conf_reshape" 1876 | top: "mbox_conf_softmax" 1877 | softmax_param { 1878 | axis: 2 1879 | } 1880 | } 1881 | layer { 1882 | name: "mbox_conf_flatten" 1883 | type: "Flatten" 1884 | bottom: "mbox_conf_softmax" 1885 | top: "mbox_conf_flatten" 1886 | flatten_param { 1887 | axis: 1 1888 | } 1889 | } 1890 | layer { 1891 | name: "detection_out" 1892 | type: "DetectionOutput" 1893 | bottom: "mbox_loc" 1894 | bottom: "mbox_conf_flatten" 1895 | bottom: "mbox_priorbox" 1896 | top: "detection_out" 1897 | include { 1898 | phase: TEST 1899 | } 1900 | detection_output_param { 1901 | num_classes: 21 1902 | share_location: true 1903 | background_label_id: 0 1904 | nms_param { 1905 | nms_threshold: 0.45 1906 | top_k: 100 1907 | } 1908 | code_type: CENTER_SIZE 1909 | keep_top_k: 100 1910 | confidence_threshold: 0.25 1911 | } 1912 | } 1913 | -------------------------------------------------------------------------------- /models/haarcascade_cars3.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 20 20 7 | 8 | <_> 9 | 10 | 11 | <_> 12 | 13 | <_> 14 | 15 | 16 | 17 | <_> 18 | 6 12 8 8 -1. 19 | <_> 20 | 6 16 8 4 2. 21 | 0 22 | 0.0452074706554413 23 | -0.7191650867462158 24 | 0.7359663248062134 25 | <_> 26 | 27 | <_> 28 | 29 | 30 | 31 | <_> 32 | 1 12 18 1 -1. 33 | <_> 34 | 7 12 6 1 3. 35 | 0 36 | -0.0161712504923344 37 | 0.5866637229919434 38 | -0.5909150242805481 39 | <_> 40 | 41 | <_> 42 | 43 | 44 | 45 | <_> 46 | 7 18 5 2 -1. 47 | <_> 48 | 7 19 5 1 2. 49 | 0 50 | 0.0119725503027439 51 | -0.3645753860473633 52 | 0.8175076246261597 53 | <_> 54 | 55 | <_> 56 | 57 | 58 | 59 | <_> 60 | 5 12 11 4 -1. 61 | <_> 62 | 5 14 11 2 2. 63 | 0 64 | 0.0554178208112717 65 | -0.5766019225120544 66 | 0.8059020042419434 67 | -1.0691740512847900 68 | -1 69 | -1 70 | <_> 71 | 72 | 73 | <_> 74 | 75 | <_> 76 | 77 | 78 | 79 | <_> 80 | 1 12 18 2 -1. 81 | <_> 82 | 7 12 6 2 3. 83 | 0 84 | -0.0243058893829584 85 | 0.5642552971839905 86 | -0.7375097870826721 87 | <_> 88 | 89 | <_> 90 | 91 | 92 | 93 | <_> 94 | 3 1 14 6 -1. 95 | <_> 96 | 3 3 14 2 3. 97 | 0 98 | -0.0302439108490944 99 | 0.5537161827087402 100 | -0.5089462995529175 101 | <_> 102 | 103 | <_> 104 | 105 | 106 | 107 | <_> 108 | 4 8 12 9 -1. 109 | <_> 110 | 4 11 12 3 3. 111 | 0 112 | -0.1937028020620346 113 | 0.7614368200302124 114 | -0.3485977053642273 115 | <_> 116 | 117 | <_> 118 | 119 | 120 | 121 | <_> 122 | 8 18 12 2 -1. 123 | <_> 124 | 14 18 6 1 2. 125 | <_> 126 | 8 19 6 1 2. 127 | 0 128 | 0.0120156398043036 129 | -0.4035871028900146 130 | 0.6296288967132568 131 | <_> 132 | 133 | <_> 134 | 135 | 136 | 137 | <_> 138 | 0 12 6 6 -1. 139 | <_> 140 | 2 12 2 6 3. 141 | 0 142 | 2.9895049519836903e-03 143 | -0.4086846113204956 144 | 0.4285241067409515 145 | <_> 146 | 147 | <_> 148 | 149 | 150 | 151 | <_> 152 | 6 11 9 8 -1. 153 | <_> 154 | 6 15 9 4 2. 155 | 0 156 | 0.1299877017736435 157 | -0.2570166885852814 158 | 0.5929297208786011 159 | <_> 160 | 161 | <_> 162 | 163 | 164 | 165 | <_> 166 | 1 6 10 2 -1. 167 | <_> 168 | 1 6 5 1 2. 169 | <_> 170 | 6 7 5 1 2. 171 | 0 172 | -6.0164160095155239e-03 173 | 0.5601549744606018 174 | -0.2849527895450592 175 | -1.0788700580596924 176 | 0 177 | -1 178 | <_> 179 | 180 | 181 | <_> 182 | 183 | <_> 184 | 185 | 186 | 187 | <_> 188 | 3 2 14 12 -1. 189 | <_> 190 | 3 6 14 4 3. 191 | 0 192 | 0.0943963602185249 193 | -0.5406976938247681 194 | 0.5407304763793945 195 | <_> 196 | 197 | <_> 198 | 199 | 200 | 201 | <_> 202 | 1 11 18 9 -1. 203 | <_> 204 | 7 11 6 9 3. 205 | 0 206 | -0.0279577299952507 207 | 0.3281945884227753 208 | -0.7144141197204590 209 | <_> 210 | 211 | <_> 212 | 213 | 214 | 215 | <_> 216 | 5 12 10 4 -1. 217 | <_> 218 | 5 14 10 2 2. 219 | 0 220 | 0.0635356530547142 221 | -0.3744345009326935 222 | 0.5956786870956421 223 | <_> 224 | 225 | <_> 226 | 227 | 228 | 229 | <_> 230 | 6 18 9 2 -1. 231 | <_> 232 | 6 19 9 1 2. 233 | 0 234 | 0.0211040005087852 235 | -0.4845815896987915 236 | 0.7378302812576294 237 | <_> 238 | 239 | <_> 240 | 241 | 242 | 243 | <_> 244 | 9 12 2 8 -1. 245 | <_> 246 | 9 16 2 4 2. 247 | 0 248 | 2.6957250665873289e-03 249 | -0.8702409863471985 250 | 0.2475769072771072 251 | <_> 252 | 253 | <_> 254 | 255 | 256 | 257 | <_> 258 | 15 3 3 16 -1. 259 | <_> 260 | 15 11 3 8 2. 261 | 0 262 | 0.0110464803874493 263 | -0.5981134176254272 264 | 0.1849218010902405 265 | <_> 266 | 267 | <_> 268 | 269 | 270 | 271 | <_> 272 | 7 9 1 6 -1. 273 | <_> 274 | 7 11 1 2 3. 275 | 0 276 | -1.3549139839597046e-04 277 | 0.3266639113426208 278 | -0.8332661986351013 279 | <_> 280 | 281 | <_> 282 | 283 | 284 | 285 | <_> 286 | 6 0 8 6 -1. 287 | <_> 288 | 6 3 8 3 2. 289 | 0 290 | -0.0495516993105412 291 | 0.7439032196998596 292 | -0.4024896025657654 293 | <_> 294 | 295 | <_> 296 | 297 | 298 | 299 | <_> 300 | 1 13 6 1 -1. 301 | <_> 302 | 4 13 3 1 2. 303 | 0 304 | -1.9892829004675150e-03 305 | 0.5047793984413147 306 | -0.5123764276504517 307 | <_> 308 | 309 | <_> 310 | 311 | 312 | 313 | <_> 314 | 10 10 6 1 -1. 315 | <_> 316 | 12 10 2 1 3. 317 | 0 318 | -5.7016697246581316e-04 319 | 0.2391823977231979 320 | -0.2104973942041397 321 | <_> 322 | 323 | <_> 324 | 325 | 326 | 327 | <_> 328 | 4 10 6 1 -1. 329 | <_> 330 | 6 10 2 1 3. 331 | 0 332 | 5.4985969327390194e-03 333 | -0.3141318857669830 334 | 0.7439212799072266 335 | <_> 336 | 337 | <_> 338 | 339 | 340 | 341 | <_> 342 | 6 6 8 3 -1. 343 | <_> 344 | 6 7 8 1 3. 345 | 0 346 | -7.7209789305925369e-03 347 | 0.6021335721015930 348 | -0.3841854035854340 349 | -1.5200910568237305 350 | 1 351 | -1 352 | <_> 353 | 354 | 355 | <_> 356 | 357 | <_> 358 | 359 | 360 | 361 | <_> 362 | 1 12 14 1 -1. 363 | <_> 364 | 8 12 7 1 2. 365 | 0 366 | -1.1992900399491191e-03 367 | 0.2906270921230316 368 | -0.7548354268074036 369 | <_> 370 | 371 | <_> 372 | 373 | 374 | 375 | <_> 376 | 5 2 15 12 -1. 377 | <_> 378 | 5 6 15 4 3. 379 | 0 380 | 0.0943495184183121 381 | -0.4595882892608643 382 | 0.3241611123085022 383 | <_> 384 | 385 | <_> 386 | 387 | 388 | 389 | <_> 390 | 7 18 6 2 -1. 391 | <_> 392 | 7 19 6 1 2. 393 | 0 394 | 0.0227251593023539 395 | -0.2826507091522217 396 | 0.7242512702941895 397 | <_> 398 | 399 | <_> 400 | 401 | 402 | 403 | <_> 404 | 5 12 10 4 -1. 405 | <_> 406 | 5 14 10 2 2. 407 | 0 408 | 0.0585403405129910 409 | -0.5193219780921936 410 | 0.6013407111167908 411 | <_> 412 | 413 | <_> 414 | 415 | 416 | 417 | <_> 418 | 2 19 4 1 -1. 419 | <_> 420 | 4 19 2 1 2. 421 | 0 422 | 2.8358890631352551e-05 423 | -0.6561384201049805 424 | 0.3897354006767273 425 | <_> 426 | 427 | <_> 428 | 429 | 430 | 431 | <_> 432 | 10 12 10 8 -1. 433 | <_> 434 | 10 16 10 4 2. 435 | 0 436 | 3.9341559750027955e-04 437 | -0.8008638024330139 438 | 0.2018187046051025 439 | <_> 440 | 441 | <_> 442 | 443 | 444 | 445 | <_> 446 | 1 13 6 6 -1. 447 | <_> 448 | 4 13 3 6 2. 449 | 0 450 | -5.8259762590751052e-04 451 | 0.2970958054065704 452 | -0.8628513216972351 453 | <_> 454 | 455 | <_> 456 | 457 | 458 | 459 | <_> 460 | 9 18 6 2 -1. 461 | <_> 462 | 12 18 3 1 2. 463 | <_> 464 | 9 19 3 1 2. 465 | 0 466 | 2.7955149562330917e-05 467 | -0.4508801102638245 468 | 0.1758446991443634 469 | <_> 470 | 471 | <_> 472 | 473 | 474 | 475 | <_> 476 | 1 10 9 10 -1. 477 | <_> 478 | 1 15 9 5 2. 479 | 0 480 | 1.2162160128355026e-03 481 | -0.8695623278617859 482 | 0.2619656026363373 483 | <_> 484 | 485 | <_> 486 | 487 | 488 | 489 | <_> 490 | 1 2 18 5 -1. 491 | <_> 492 | 7 2 6 5 3. 493 | 0 494 | 0.0133769698441029 495 | -0.6464508175849915 496 | 0.3887208998203278 497 | <_> 498 | 499 | <_> 500 | 501 | 502 | 503 | <_> 504 | 1 12 18 4 -1. 505 | <_> 506 | 7 12 6 4 3. 507 | 0 508 | -0.0113867800682783 509 | 0.2826564013957977 510 | -0.8351002931594849 511 | <_> 512 | 513 | <_> 514 | 515 | 516 | 517 | <_> 518 | 9 11 6 3 -1. 519 | <_> 520 | 9 11 3 3 2. 521 | 0 522 | 2.6949660386890173e-03 523 | -0.5282859802246094 524 | 0.6657627820968628 525 | <_> 526 | 527 | <_> 528 | 529 | 530 | 531 | <_> 532 | 5 10 3 2 -1. 533 | <_> 534 | 6 10 1 2 3. 535 | 0 536 | 2.8329479391686618e-05 537 | -0.6864507794380188 538 | 0.5240061283111572 539 | <_> 540 | 541 | <_> 542 | 543 | 544 | 545 | <_> 546 | 8 12 9 8 -1. 547 | <_> 548 | 8 16 9 4 2. 549 | 0 550 | 1.4069270109757781e-03 551 | -0.8969905972480774 552 | 0.2389785945415497 553 | <_> 554 | 555 | <_> 556 | 557 | 558 | 559 | <_> 560 | 6 1 3 2 -1. 561 | <_> 562 | 6 2 3 1 2. 563 | 0 564 | -2.9115570214344189e-05 565 | 0.4608972072601318 566 | -0.8574141860008240 567 | <_> 568 | 569 | <_> 570 | 571 | 572 | 573 | <_> 574 | 2 12 18 6 -1. 575 | <_> 576 | 2 14 18 2 3. 577 | 0 578 | 4.5082978904247284e-03 579 | -0.7511271238327026 580 | 0.4849173128604889 581 | <_> 582 | 583 | <_> 584 | 585 | 586 | 587 | <_> 588 | 0 11 18 1 -1. 589 | <_> 590 | 6 11 6 1 3. 591 | 0 592 | -0.0198406204581261 593 | 0.6246759295463562 594 | -0.7629678845405579 595 | <_> 596 | 597 | <_> 598 | 599 | 600 | 601 | <_> 602 | 9 5 6 3 -1. 603 | <_> 604 | 9 6 6 1 3. 605 | 0 606 | 3.8021910004317760e-03 607 | -0.4809493124485016 608 | 0.6243296861648560 609 | <_> 610 | 611 | <_> 612 | 613 | 614 | 615 | <_> 616 | 3 11 4 6 -1. 617 | <_> 618 | 3 14 4 3 2. 619 | 0 620 | 1.1158349661855027e-04 621 | -0.8559886217117310 622 | 0.3861764967441559 623 | <_> 624 | 625 | <_> 626 | 627 | 628 | 629 | <_> 630 | 12 18 2 2 -1. 631 | <_> 632 | 13 18 1 1 2. 633 | <_> 634 | 12 19 1 1 2. 635 | 0 636 | 2.7662550564855337e-05 637 | -0.7629433274269104 638 | 0.3604950010776520 639 | <_> 640 | 641 | <_> 642 | 643 | 644 | 645 | <_> 646 | 3 12 9 8 -1. 647 | <_> 648 | 3 16 9 4 2. 649 | 0 650 | 2.7047859039157629e-03 651 | -0.9496951103210449 652 | 0.3921845853328705 653 | <_> 654 | 655 | <_> 656 | 657 | 658 | 659 | <_> 660 | 6 12 9 2 -1. 661 | <_> 662 | 9 12 3 2 3. 663 | 0 664 | 5.1935878582298756e-04 665 | -0.8682754039764404 666 | 0.4790566861629486 667 | <_> 668 | 669 | <_> 670 | 671 | 672 | 673 | <_> 674 | 2 12 12 8 -1. 675 | <_> 676 | 2 12 6 4 2. 677 | <_> 678 | 8 16 6 4 2. 679 | 0 680 | 1.0928940173471346e-04 681 | -0.9670708775520325 682 | 0.6848754286766052 683 | <_> 684 | 685 | <_> 686 | 687 | 688 | 689 | <_> 690 | 1 6 19 3 -1. 691 | <_> 692 | 1 7 19 1 3. 693 | 0 694 | 5.7576759718358517e-03 695 | -0.9778658747673035 696 | 0.8792119026184082 697 | <_> 698 | 699 | <_> 700 | 701 | 702 | 703 | <_> 704 | 0 0 8 2 -1. 705 | <_> 706 | 0 0 4 1 2. 707 | <_> 708 | 4 1 4 1 2. 709 | 0 710 | -4.2572239181026816e-05 711 | 1. 712 | -1. 713 | <_> 714 | 715 | <_> 716 | 717 | 718 | 719 | <_> 720 | 12 0 8 2 -1. 721 | <_> 722 | 16 0 4 1 2. 723 | <_> 724 | 12 1 4 1 2. 725 | 0 726 | 3.4698568924795836e-05 727 | -0.8942371010780334 728 | 0.6385173201560974 729 | <_> 730 | 731 | <_> 732 | 733 | 734 | 735 | <_> 736 | 1 0 13 15 -1. 737 | <_> 738 | 1 5 13 5 3. 739 | 0 740 | 6.0833231545984745e-03 741 | -0.9911761283874512 742 | 0.8617964982986450 743 | <_> 744 | 745 | <_> 746 | 747 | 748 | 749 | <_> 750 | 17 18 1 2 -1. 751 | <_> 752 | 17 19 1 1 2. 753 | 0 754 | 1.5569420065730810e-04 755 | -1. 756 | 0.9989972114562988 757 | <_> 758 | 759 | <_> 760 | 761 | 762 | 763 | <_> 764 | 0 0 4 3 -1. 765 | <_> 766 | 2 0 2 3 2. 767 | 0 768 | 0. 769 | 0. 770 | -1. 771 | <_> 772 | 773 | <_> 774 | 775 | 776 | 777 | <_> 778 | 9 19 4 1 -1. 779 | <_> 780 | 9 19 2 1 2. 781 | 0 782 | 5.8437039115233347e-05 783 | -0.9401987791061401 784 | 0.9499294161796570 785 | <_> 786 | 787 | <_> 788 | 789 | 790 | 791 | <_> 792 | 3 13 14 4 -1. 793 | <_> 794 | 3 15 14 2 2. 795 | 0 796 | 8.5243082139641047e-04 797 | -1. 798 | 1.0000870227813721 799 | <_> 800 | 801 | <_> 802 | 803 | 804 | 805 | <_> 806 | 17 0 3 4 -1. 807 | <_> 808 | 17 2 3 2 2. 809 | 0 810 | 0. 811 | 0. 812 | -1. 813 | <_> 814 | 815 | <_> 816 | 817 | 818 | 819 | <_> 820 | 7 1 2 3 -1. 821 | <_> 822 | 7 2 2 1 3. 823 | 0 824 | 8.8114888058044016e-05 825 | -1. 826 | 1.0001029968261719 827 | <_> 828 | 829 | <_> 830 | 831 | 832 | 833 | <_> 834 | 17 0 3 4 -1. 835 | <_> 836 | 17 2 3 2 2. 837 | 0 838 | 0. 839 | 0. 840 | -1. 841 | <_> 842 | 843 | <_> 844 | 845 | 846 | 847 | <_> 848 | 1 12 18 2 -1. 849 | <_> 850 | 7 12 6 2 3. 851 | 0 852 | -1.6535379691049457e-03 853 | 0.9649471044540405 854 | -0.9946994185447693 855 | <_> 856 | 857 | <_> 858 | 859 | 860 | 861 | <_> 862 | 16 3 2 4 -1. 863 | <_> 864 | 17 3 1 2 2. 865 | <_> 866 | 16 5 1 2 2. 867 | 0 868 | 2.2355250257533044e-04 869 | -0.8841317892074585 870 | 0.5885220170021057 871 | <_> 872 | 873 | <_> 874 | 875 | 876 | 877 | <_> 878 | 3 13 10 2 -1. 879 | <_> 880 | 3 13 5 1 2. 881 | <_> 882 | 8 14 5 1 2. 883 | 0 884 | -2.0420220680534840e-03 885 | 0.8850557208061218 886 | -0.9887136220932007 887 | <_> 888 | 889 | <_> 890 | 891 | 892 | 893 | <_> 894 | 11 13 6 2 -1. 895 | <_> 896 | 11 13 3 2 2. 897 | 0 898 | -2.7822980191558599e-03 899 | 0.8021606206893921 900 | -0.8011325001716614 901 | <_> 902 | 903 | <_> 904 | 905 | 906 | 907 | <_> 908 | 6 4 6 12 -1. 909 | <_> 910 | 9 4 3 12 2. 911 | 0 912 | 2.6262819301337004e-03 913 | -0.8629643917083740 914 | 0.9028394818305969 915 | <_> 916 | 917 | <_> 918 | 919 | 920 | 921 | <_> 922 | 14 5 2 14 -1. 923 | <_> 924 | 15 5 1 7 2. 925 | <_> 926 | 14 12 1 7 2. 927 | 0 928 | -5.8437039115233347e-05 929 | 0.5506380796432495 930 | -0.8834760189056396 931 | <_> 932 | 933 | <_> 934 | 935 | 936 | 937 | <_> 938 | 3 2 12 10 -1. 939 | <_> 940 | 9 2 6 10 2. 941 | 0 942 | -1.1351429857313633e-03 943 | 0.9118285179138184 944 | -0.8601468205451965 945 | <_> 946 | 947 | <_> 948 | 949 | 950 | 951 | <_> 952 | 16 11 4 4 -1. 953 | <_> 954 | 16 13 4 2 2. 955 | 0 956 | 6.5544509561732411e-04 957 | -0.5529929995536804 958 | 0.6181765794754028 959 | <_> 960 | 961 | <_> 962 | 963 | 964 | 965 | <_> 966 | 5 19 10 1 -1. 967 | <_> 968 | 10 19 5 1 2. 969 | 0 970 | 3.8200760172912851e-05 971 | -0.8676869273185730 972 | 0.7274010777473450 973 | <_> 974 | 975 | <_> 976 | 977 | 978 | 979 | <_> 980 | 15 2 1 18 -1. 981 | <_> 982 | 15 11 1 9 2. 983 | 0 984 | -6.2933329900261015e-05 985 | 0.3377492129802704 986 | -0.8335667848587036 987 | <_> 988 | 989 | <_> 990 | 991 | 992 | 993 | <_> 994 | 1 4 5 16 -1. 995 | <_> 996 | 1 12 5 8 2. 997 | 0 998 | 2.8638119692914188e-04 999 | -0.8729416131973267 1000 | 0.7917960286140442 1001 | <_> 1002 | 1003 | <_> 1004 | 1005 | 1006 | 1007 | <_> 1008 | 7 6 12 6 -1. 1009 | <_> 1010 | 7 8 12 2 3. 1011 | 0 1012 | 3.6316178739070892e-04 1013 | -0.9013931751251221 1014 | 0.7772005200386047 1015 | <_> 1016 | 1017 | <_> 1018 | 1019 | 1020 | 1021 | <_> 1022 | 2 11 12 6 -1. 1023 | <_> 1024 | 2 11 6 3 2. 1025 | <_> 1026 | 8 14 6 3 2. 1027 | 0 1028 | 1.2007999466732144e-03 1029 | -0.9860498905181885 1030 | 0.8049355149269104 1031 | <_> 1032 | 1033 | <_> 1034 | 1035 | 1036 | 1037 | <_> 1038 | 6 0 14 18 -1. 1039 | <_> 1040 | 6 6 14 6 3. 1041 | 0 1042 | -2.3152970243245363e-03 1043 | 1. 1044 | -1. 1045 | <_> 1046 | 1047 | <_> 1048 | 1049 | 1050 | 1051 | <_> 1052 | 0 0 19 18 -1. 1053 | <_> 1054 | 0 6 19 6 3. 1055 | 0 1056 | 0.0144739197567105 1057 | -0.9682086706161499 1058 | 0.9563586115837097 1059 | <_> 1060 | 1061 | <_> 1062 | 1063 | 1064 | 1065 | <_> 1066 | 10 17 1 3 -1. 1067 | <_> 1068 | 10 18 1 1 3. 1069 | 0 1070 | -3.2585670705884695e-03 1071 | 1. 1072 | -0.9941142201423645 1073 | <_> 1074 | 1075 | <_> 1076 | 1077 | 1078 | 1079 | <_> 1080 | 2 10 5 10 -1. 1081 | <_> 1082 | 2 15 5 5 2. 1083 | 0 1084 | 0.0134088601917028 1085 | -0.9944000840187073 1086 | 0.8795533776283264 1087 | <_> 1088 | 1089 | <_> 1090 | 1091 | 1092 | 1093 | <_> 1094 | 17 0 3 1 -1. 1095 | <_> 1096 | 18 0 1 1 3. 1097 | 0 1098 | 4.0174949390348047e-05 1099 | -0.9955059885978699 1100 | 0.4559975862503052 1101 | <_> 1102 | 1103 | <_> 1104 | 1105 | 1106 | 1107 | <_> 1108 | 0 16 5 3 -1. 1109 | <_> 1110 | 0 17 5 1 3. 1111 | 0 1112 | 1.8752219330053777e-04 1113 | -1. 1114 | 1.0003039836883545 1115 | <_> 1116 | 1117 | <_> 1118 | 1119 | 1120 | 1121 | <_> 1122 | 19 0 1 2 -1. 1123 | <_> 1124 | 19 1 1 1 2. 1125 | 0 1126 | 0. 1127 | 0. 1128 | -1. 1129 | <_> 1130 | 1131 | <_> 1132 | 1133 | 1134 | 1135 | <_> 1136 | 0 12 14 1 -1. 1137 | <_> 1138 | 7 12 7 1 2. 1139 | 0 1140 | -5.7442798279225826e-03 1141 | 1. 1142 | -1. 1143 | <_> 1144 | 1145 | <_> 1146 | 1147 | 1148 | 1149 | <_> 1150 | 13 12 6 6 -1. 1151 | <_> 1152 | 13 14 6 2 3. 1153 | 0 1154 | 2.8128331177867949e-04 1155 | -0.9679043292999268 1156 | 0.5377150774002075 1157 | <_> 1158 | 1159 | <_> 1160 | 1161 | 1162 | 1163 | <_> 1164 | 0 11 4 4 -1. 1165 | <_> 1166 | 0 13 4 2 2. 1167 | 0 1168 | 2.9258249560371041e-04 1169 | -0.9925985932350159 1170 | 0.7377948760986328 1171 | <_> 1172 | 1173 | <_> 1174 | 1175 | 1176 | 1177 | <_> 1178 | 10 17 3 3 -1. 1179 | <_> 1180 | 10 18 3 1 3. 1181 | 0 1182 | -7.6873782090842724e-03 1183 | 0.4390138089656830 1184 | -0.9956768155097961 1185 | <_> 1186 | 1187 | <_> 1188 | 1189 | 1190 | 1191 | <_> 1192 | 2 10 15 5 -1. 1193 | <_> 1194 | 7 10 5 5 3. 1195 | 0 1196 | -1.6997690545395017e-04 1197 | 0.8890876173973083 1198 | -0.9900755286216736 1199 | <_> 1200 | 1201 | <_> 1202 | 1203 | 1204 | 1205 | <_> 1206 | 14 9 1 4 -1. 1207 | <_> 1208 | 14 11 1 2 2. 1209 | 0 1210 | -2.8665470381383784e-05 1211 | 0.4759410917758942 1212 | -0.9352231025695801 1213 | <_> 1214 | 1215 | <_> 1216 | 1217 | 1218 | 1219 | <_> 1220 | 5 9 6 4 -1. 1221 | <_> 1222 | 5 9 3 2 2. 1223 | <_> 1224 | 8 11 3 2 2. 1225 | 0 1226 | 4.4182338751852512e-04 1227 | -0.7511792182922363 1228 | 0.8805574178695679 1229 | -4.9593520164489746 1230 | 2 1231 | -1 1232 | <_> 1233 | 1234 | 1235 | <_> 1236 | 1237 | <_> 1238 | 1239 | 1240 | 1241 | <_> 1242 | 0 3 14 14 -1. 1243 | <_> 1244 | 0 3 7 7 2. 1245 | <_> 1246 | 7 10 7 7 2. 1247 | 0 1248 | -0.0127300098538399 1249 | 0.4832380115985870 1250 | -0.7198603749275208 1251 | <_> 1252 | 1253 | <_> 1254 | 1255 | 1256 | 1257 | <_> 1258 | 0 2 20 8 -1. 1259 | <_> 1260 | 0 6 20 4 2. 1261 | 0 1262 | 0.0589522011578083 1263 | -0.4658026993274689 1264 | 0.4875808060169220 1265 | <_> 1266 | 1267 | <_> 1268 | 1269 | 1270 | 1271 | <_> 1272 | 0 12 8 8 -1. 1273 | <_> 1274 | 0 16 8 4 2. 1275 | 0 1276 | 7.8740529716014862e-04 1277 | -0.7789018750190735 1278 | 0.2557401061058044 1279 | <_> 1280 | 1281 | <_> 1282 | 1283 | 1284 | 1285 | <_> 1286 | 7 12 6 6 -1. 1287 | <_> 1288 | 7 14 6 2 3. 1289 | 0 1290 | 0.0105524603277445 1291 | -0.6375812888145447 1292 | 0.3461680114269257 1293 | <_> 1294 | 1295 | <_> 1296 | 1297 | 1298 | 1299 | <_> 1300 | 1 18 8 2 -1. 1301 | <_> 1302 | 1 18 4 1 2. 1303 | <_> 1304 | 5 19 4 1 2. 1305 | 0 1306 | 8.0834580585360527e-03 1307 | -0.6557192206382751 1308 | 0.6636518239974976 1309 | <_> 1310 | 1311 | <_> 1312 | 1313 | 1314 | 1315 | <_> 1316 | 8 10 4 8 -1. 1317 | <_> 1318 | 8 14 4 4 2. 1319 | 0 1320 | 0.0235214307904243 1321 | -0.9006652832031250 1322 | 0.4957715868949890 1323 | <_> 1324 | 1325 | <_> 1326 | 1327 | 1328 | 1329 | <_> 1330 | 0 12 6 5 -1. 1331 | <_> 1332 | 2 12 2 5 3. 1333 | 0 1334 | 2.1901269792579114e-04 1335 | -0.9414082765579224 1336 | 0.4645870029926300 1337 | <_> 1338 | 1339 | <_> 1340 | 1341 | 1342 | 1343 | <_> 1344 | 10 8 9 12 -1. 1345 | <_> 1346 | 10 12 9 4 3. 1347 | 0 1348 | -1.5295119374059141e-04 1349 | 0.1733245998620987 1350 | -0.9518421888351440 1351 | <_> 1352 | 1353 | <_> 1354 | 1355 | 1356 | 1357 | <_> 1358 | 5 5 10 15 -1. 1359 | <_> 1360 | 5 10 10 5 3. 1361 | 0 1362 | -4.9944370985031128e-03 1363 | 0.2332555055618286 1364 | -0.9303036928176880 1365 | <_> 1366 | 1367 | <_> 1368 | 1369 | 1370 | 1371 | <_> 1372 | 1 2 18 14 -1. 1373 | <_> 1374 | 10 2 9 7 2. 1375 | <_> 1376 | 1 9 9 7 2. 1377 | 0 1378 | -2.8488549869507551e-03 1379 | 0.5224574208259583 1380 | -0.6394140124320984 1381 | <_> 1382 | 1383 | <_> 1384 | 1385 | 1386 | 1387 | <_> 1388 | 2 3 3 16 -1. 1389 | <_> 1390 | 2 11 3 8 2. 1391 | 0 1392 | 8.3920639008283615e-03 1393 | -0.6068183183670044 1394 | 0.4723689854145050 1395 | <_> 1396 | 1397 | <_> 1398 | 1399 | 1400 | 1401 | <_> 1402 | 6 17 13 3 -1. 1403 | <_> 1404 | 6 18 13 1 3. 1405 | 0 1406 | -3.5511489841155708e-05 1407 | 0.2968985140323639 1408 | -0.6452224850654602 1409 | <_> 1410 | 1411 | <_> 1412 | 1413 | 1414 | 1415 | <_> 1416 | 5 11 9 3 -1. 1417 | <_> 1418 | 8 11 3 3 3. 1419 | 0 1420 | 2.1621841005980968e-03 1421 | -0.4258666932582855 1422 | 0.5548338890075684 1423 | <_> 1424 | 1425 | <_> 1426 | 1427 | 1428 | 1429 | <_> 1430 | 1 12 18 4 -1. 1431 | <_> 1432 | 7 12 6 4 3. 1433 | 0 1434 | -5.1551498472690582e-03 1435 | 0.3051683902740479 1436 | -0.8206862807273865 1437 | <_> 1438 | 1439 | <_> 1440 | 1441 | 1442 | 1443 | <_> 1444 | 3 9 4 2 -1. 1445 | <_> 1446 | 3 9 2 1 2. 1447 | <_> 1448 | 5 10 2 1 2. 1449 | 0 1450 | 1.7603079322725534e-04 1451 | -0.4252283871173859 1452 | 0.4734784960746765 1453 | <_> 1454 | 1455 | <_> 1456 | 1457 | 1458 | 1459 | <_> 1460 | 7 3 8 3 -1. 1461 | <_> 1462 | 7 4 8 1 3. 1463 | 0 1464 | -5.6310528889298439e-03 1465 | 0.4430184960365295 1466 | -0.5268139839172363 1467 | <_> 1468 | 1469 | <_> 1470 | 1471 | 1472 | 1473 | <_> 1474 | 0 17 2 3 -1. 1475 | <_> 1476 | 0 18 2 1 3. 1477 | 0 1478 | 1.0609399760141969e-04 1479 | -0.4128456115722656 1480 | 0.4862971007823944 1481 | <_> 1482 | 1483 | <_> 1484 | 1485 | 1486 | 1487 | <_> 1488 | 5 8 10 4 -1. 1489 | <_> 1490 | 5 10 10 2 2. 1491 | 0 1492 | -0.0146872196346521 1493 | 0.3483710885047913 1494 | -0.6565722227096558 1495 | <_> 1496 | 1497 | <_> 1498 | 1499 | 1500 | 1501 | <_> 1502 | 1 12 15 6 -1. 1503 | <_> 1504 | 1 14 15 2 3. 1505 | 0 1506 | 0.0810066536068916 1507 | -0.3347136080265045 1508 | 0.6498758792877197 1509 | <_> 1510 | 1511 | <_> 1512 | 1513 | 1514 | 1515 | <_> 1516 | 6 19 14 1 -1. 1517 | <_> 1518 | 6 19 7 1 2. 1519 | 0 1520 | 7.1147878770716488e-05 1521 | -0.5422406792640686 1522 | 0.2807042896747589 1523 | <_> 1524 | 1525 | <_> 1526 | 1527 | 1528 | 1529 | <_> 1530 | 0 19 16 1 -1. 1531 | <_> 1532 | 8 19 8 1 2. 1533 | 0 1534 | 2.6208710551145487e-05 1535 | -0.7503160834312439 1536 | 0.4175724089145660 1537 | <_> 1538 | 1539 | <_> 1540 | 1541 | 1542 | 1543 | <_> 1544 | 14 11 1 2 -1. 1545 | <_> 1546 | 14 12 1 1 2. 1547 | 0 1548 | -2.2025800717528909e-05 1549 | 0.3986887931823730 1550 | -0.8484249711036682 1551 | <_> 1552 | 1553 | <_> 1554 | 1555 | 1556 | 1557 | <_> 1558 | 3 11 3 2 -1. 1559 | <_> 1560 | 3 12 3 1 2. 1561 | 0 1562 | -2.7908370611839928e-05 1563 | 0.4262354969978333 1564 | -0.6090481281280518 1565 | <_> 1566 | 1567 | <_> 1568 | 1569 | 1570 | 1571 | <_> 1572 | 5 12 12 1 -1. 1573 | <_> 1574 | 5 12 6 1 2. 1575 | 0 1576 | -3.7988298572599888e-04 1577 | 0.2306731045246124 1578 | -0.3030667901039124 1579 | <_> 1580 | 1581 | <_> 1582 | 1583 | 1584 | 1585 | <_> 1586 | 3 12 12 1 -1. 1587 | <_> 1588 | 9 12 6 1 2. 1589 | 0 1590 | -2.8329479391686618e-05 1591 | 0.4294688999652863 1592 | -0.6150280237197876 1593 | -2.0059499740600586 1594 | 3 1595 | -1 1596 | <_> 1597 | 1598 | 1599 | <_> 1600 | 1601 | <_> 1602 | 1603 | 1604 | 1605 | <_> 1606 | 7 18 3 2 -1. 1607 | <_> 1608 | 8 18 1 2 3. 1609 | 0 1610 | -8.7926961714401841e-04 1611 | -0.8508998155593872 1612 | 0.2012203931808472 1613 | <_> 1614 | 1615 | <_> 1616 | 1617 | 1618 | 1619 | <_> 1620 | 10 18 3 2 -1. 1621 | <_> 1622 | 11 18 1 2 3. 1623 | 0 1624 | -1.0719529818743467e-03 1625 | -0.8750498294830322 1626 | 0.1188623011112213 1627 | <_> 1628 | 1629 | <_> 1630 | 1631 | 1632 | 1633 | <_> 1634 | 7 18 3 2 -1. 1635 | <_> 1636 | 8 18 1 2 3. 1637 | 0 1638 | 1.1958930408582091e-03 1639 | 0.1821606010198593 1640 | -0.8673701882362366 1641 | <_> 1642 | 1643 | <_> 1644 | 1645 | 1646 | 1647 | <_> 1648 | 4 1 13 6 -1. 1649 | <_> 1650 | 4 3 13 2 3. 1651 | 0 1652 | -0.0367217697203159 1653 | 0.3615708947181702 1654 | -0.3918508887290955 1655 | <_> 1656 | 1657 | <_> 1658 | 1659 | 1660 | 1661 | <_> 1662 | 8 15 2 1 -1. 1663 | <_> 1664 | 9 15 1 1 2. 1665 | 0 1666 | 2.8816348640248179e-04 1667 | 0.1872649937868118 1668 | -0.7076212763786316 1669 | <_> 1670 | 1671 | <_> 1672 | 1673 | 1674 | 1675 | <_> 1676 | 10 15 3 1 -1. 1677 | <_> 1678 | 11 15 1 1 3. 1679 | 0 1680 | 6.8340590223670006e-04 1681 | 0.1269242018461227 1682 | -0.7228708863258362 1683 | <_> 1684 | 1685 | <_> 1686 | 1687 | 1688 | 1689 | <_> 1690 | 1 12 18 1 -1. 1691 | <_> 1692 | 7 12 6 1 3. 1693 | 0 1694 | -0.0425732918083668 1695 | 0.5858349800109863 1696 | -0.2147608995437622 1697 | -0.9255558848381042 1698 | 4 1699 | -1 1700 | <_> 1701 | 1702 | 1703 | <_> 1704 | 1705 | <_> 1706 | 1707 | 1708 | 1709 | <_> 1710 | 6 18 7 2 -1. 1711 | <_> 1712 | 6 19 7 1 2. 1713 | 0 1714 | 0.0233492702245712 1715 | -0.2366411983966827 1716 | 0.5849282145500183 1717 | <_> 1718 | 1719 | <_> 1720 | 1721 | 1722 | 1723 | <_> 1724 | 12 16 2 1 -1. 1725 | <_> 1726 | 12 16 1 1 2. 1727 | 0 1728 | 4.9444608157500625e-04 1729 | 0.1428918987512589 1730 | -0.6820772290229797 1731 | <_> 1732 | 1733 | <_> 1734 | 1735 | 1736 | 1737 | <_> 1738 | 3 8 4 6 -1. 1739 | <_> 1740 | 3 8 2 3 2. 1741 | <_> 1742 | 5 11 2 3 2. 1743 | 0 1744 | -0.0177930891513824 1745 | 0.5955523848533630 1746 | -0.2330096960067749 1747 | <_> 1748 | 1749 | <_> 1750 | 1751 | 1752 | 1753 | <_> 1754 | 2 3 18 4 -1. 1755 | <_> 1756 | 2 5 18 2 2. 1757 | 0 1758 | 0.0353034809231758 1759 | -0.3556973040103912 1760 | 0.3598164916038513 1761 | <_> 1762 | 1763 | <_> 1764 | 1765 | 1766 | 1767 | <_> 1768 | 6 16 2 2 -1. 1769 | <_> 1770 | 7 16 1 2 2. 1771 | 0 1772 | 7.1409897645935416e-04 1773 | 0.1659422963857651 1774 | -0.7856965065002441 1775 | <_> 1776 | 1777 | <_> 1778 | 1779 | 1780 | 1781 | <_> 1782 | 9 19 2 1 -1. 1783 | <_> 1784 | 9 19 1 1 2. 1785 | 0 1786 | -3.5466518602333963e-04 1787 | -0.7188175916671753 1788 | 0.1491793990135193 1789 | <_> 1790 | 1791 | <_> 1792 | 1793 | 1794 | 1795 | <_> 1796 | 9 19 2 1 -1. 1797 | <_> 1798 | 10 19 1 1 2. 1799 | 0 1800 | -3.2956211362034082e-04 1801 | -0.7239602804183960 1802 | 0.1283237040042877 1803 | <_> 1804 | 1805 | <_> 1806 | 1807 | 1808 | 1809 | <_> 1810 | 1 12 18 3 -1. 1811 | <_> 1812 | 7 12 6 3 3. 1813 | 0 1814 | -0.0558854192495346 1815 | 0.2699365019798279 1816 | -0.3814569115638733 1817 | <_> 1818 | 1819 | <_> 1820 | 1821 | 1822 | 1823 | <_> 1824 | 5 8 10 9 -1. 1825 | <_> 1826 | 5 11 10 3 3. 1827 | 0 1828 | -0.2315281033515930 1829 | 0.5102406740188599 1830 | -0.2150623947381973 1831 | <_> 1832 | 1833 | <_> 1834 | 1835 | 1836 | 1837 | <_> 1838 | 7 0 6 18 -1. 1839 | <_> 1840 | 9 0 2 18 3. 1841 | 0 1842 | 3.8320471066981554e-03 1843 | -0.3187570869922638 1844 | 0.3741405010223389 1845 | <_> 1846 | 1847 | <_> 1848 | 1849 | 1850 | 1851 | <_> 1852 | 2 5 8 4 -1. 1853 | <_> 1854 | 2 5 4 2 2. 1855 | <_> 1856 | 6 7 4 2 2. 1857 | 0 1858 | -7.1148001588881016e-03 1859 | 0.3868972063064575 1860 | -0.3064059019088745 1861 | <_> 1862 | 1863 | <_> 1864 | 1865 | 1866 | 1867 | <_> 1868 | 13 11 2 3 -1. 1869 | <_> 1870 | 13 11 1 3 2. 1871 | 0 1872 | 1.0463730432093143e-03 1873 | -0.0578359216451645 1874 | 0.2854403853416443 1875 | <_> 1876 | 1877 | <_> 1878 | 1879 | 1880 | 1881 | <_> 1882 | 5 11 2 3 -1. 1883 | <_> 1884 | 6 11 1 3 2. 1885 | 0 1886 | 1.2736029748339206e-04 1887 | -0.3159281015396118 1888 | 0.4068993926048279 1889 | -1.1411540508270264 1890 | 5 1891 | -1 1892 | <_> 1893 | 1894 | 1895 | <_> 1896 | 1897 | <_> 1898 | 1899 | 1900 | 1901 | <_> 1902 | 1 19 18 1 -1. 1903 | <_> 1904 | 7 19 6 1 3. 1905 | 0 1906 | 0.0220439601689577 1907 | -0.2536872923374176 1908 | 0.5212177038192749 1909 | <_> 1910 | 1911 | <_> 1912 | 1913 | 1914 | 1915 | <_> 1916 | 12 14 3 6 -1. 1917 | <_> 1918 | 13 14 1 6 3. 1919 | 0 1920 | 2.1312560420483351e-03 1921 | 0.1482914984226227 1922 | -0.5914195775985718 1923 | <_> 1924 | 1925 | <_> 1926 | 1927 | 1928 | 1929 | <_> 1930 | 0 11 12 4 -1. 1931 | <_> 1932 | 4 11 4 4 3. 1933 | 0 1934 | -0.0413990207016468 1935 | 0.4204145073890686 1936 | -0.2349137067794800 1937 | <_> 1938 | 1939 | <_> 1940 | 1941 | 1942 | 1943 | <_> 1944 | 0 2 20 8 -1. 1945 | <_> 1946 | 0 6 20 4 2. 1947 | 0 1948 | 0.1522327959537506 1949 | -0.3104422092437744 1950 | 0.4176956117153168 1951 | <_> 1952 | 1953 | <_> 1954 | 1955 | 1956 | 1957 | <_> 1958 | 7 14 2 4 -1. 1959 | <_> 1960 | 8 14 1 4 2. 1961 | 0 1962 | 7.2278419975191355e-04 1963 | 0.2251144051551819 1964 | -0.6049224138259888 1965 | <_> 1966 | 1967 | <_> 1968 | 1969 | 1970 | 1971 | <_> 1972 | 5 10 10 8 -1. 1973 | <_> 1974 | 10 10 5 4 2. 1975 | <_> 1976 | 5 14 5 4 2. 1977 | 0 1978 | 0.0139188598841429 1979 | 0.1998808979988098 1980 | -0.5362910032272339 1981 | <_> 1982 | 1983 | <_> 1984 | 1985 | 1986 | 1987 | <_> 1988 | 5 12 1 4 -1. 1989 | <_> 1990 | 5 14 1 2 2. 1991 | 0 1992 | 9.3200067058205605e-03 1993 | -0.3086053133010864 1994 | 0.3600850105285645 1995 | <_> 1996 | 1997 | <_> 1998 | 1999 | 2000 | 2001 | <_> 2002 | 10 0 1 8 -1. 2003 | <_> 2004 | 10 4 1 4 2. 2005 | 0 2006 | -0.0135594001039863 2007 | 0.7699136137962341 2008 | -0.1129935979843140 2009 | <_> 2010 | 2011 | <_> 2012 | 2013 | 2014 | 2015 | <_> 2016 | 1 8 18 8 -1. 2017 | <_> 2018 | 7 8 6 8 3. 2019 | 0 2020 | -0.2024694979190826 2021 | 0.5726454854011536 2022 | -0.1685701012611389 2023 | <_> 2024 | 2025 | <_> 2026 | 2027 | 2028 | 2029 | <_> 2030 | 9 8 10 4 -1. 2031 | <_> 2032 | 9 8 5 4 2. 2033 | 0 2034 | 0.0256939493119717 2035 | -0.0890305936336517 2036 | 0.4055748879909515 2037 | <_> 2038 | 2039 | <_> 2040 | 2041 | 2042 | 2043 | <_> 2044 | 6 6 8 3 -1. 2045 | <_> 2046 | 6 7 8 1 3. 2047 | 0 2048 | -0.0135868499055505 2049 | 0.4805161952972412 2050 | -0.1680151969194412 2051 | <_> 2052 | 2053 | <_> 2054 | 2055 | 2056 | 2057 | <_> 2058 | 10 9 3 3 -1. 2059 | <_> 2060 | 11 9 1 3 3. 2061 | 0 2062 | -6.3351547578349710e-04 2063 | 0.2068227976560593 2064 | -0.2571463882923126 2065 | <_> 2066 | 2067 | <_> 2068 | 2069 | 2070 | 2071 | <_> 2072 | 4 14 2 4 -1. 2073 | <_> 2074 | 5 14 1 4 2. 2075 | 0 2076 | 1.3086969556752592e-04 2077 | 0.2003916949033737 2078 | -0.4468185007572174 2079 | <_> 2080 | 2081 | <_> 2082 | 2083 | 2084 | 2085 | <_> 2086 | 10 17 10 2 -1. 2087 | <_> 2088 | 15 17 5 1 2. 2089 | <_> 2090 | 10 18 5 1 2. 2091 | 0 2092 | 9.4451867043972015e-03 2093 | 0.0453975386917591 2094 | -0.6604390144348145 2095 | <_> 2096 | 2097 | <_> 2098 | 2099 | 2100 | 2101 | <_> 2102 | 3 18 3 2 -1. 2103 | <_> 2104 | 4 18 1 2 3. 2105 | 0 2106 | -1.1732289567589760e-03 2107 | -0.7233589887619019 2108 | 0.1189457029104233 2109 | <_> 2110 | 2111 | <_> 2112 | 2113 | 2114 | 2115 | <_> 2116 | 13 2 4 9 -1. 2117 | <_> 2118 | 13 2 2 9 2. 2119 | 0 2120 | -0.0270948894321918 2121 | 0.4183718860149384 2122 | -0.0622722618281841 2123 | <_> 2124 | 2125 | <_> 2126 | 2127 | 2128 | 2129 | <_> 2130 | 3 2 4 9 -1. 2131 | <_> 2132 | 5 2 2 9 2. 2133 | 0 2134 | 0.0128746498376131 2135 | -0.2036883980035782 2136 | 0.4376415908336639 2137 | <_> 2138 | 2139 | <_> 2140 | 2141 | 2142 | 2143 | <_> 2144 | 9 8 2 8 -1. 2145 | <_> 2146 | 10 8 1 4 2. 2147 | <_> 2148 | 9 12 1 4 2. 2149 | 0 2150 | -2.8124409727752209e-03 2151 | -0.6812670230865479 2152 | 0.1294167041778564 2153 | -1.2025229930877686 2154 | 6 2155 | -1 2156 | <_> 2157 | 2158 | 2159 | <_> 2160 | 2161 | <_> 2162 | 2163 | 2164 | 2165 | <_> 2166 | 0 18 14 2 -1. 2167 | <_> 2168 | 0 18 7 1 2. 2169 | <_> 2170 | 7 19 7 1 2. 2171 | 0 2172 | 0.0179104395210743 2173 | -0.2364671975374222 2174 | 0.5514438152313232 2175 | <_> 2176 | 2177 | <_> 2178 | 2179 | 2180 | 2181 | <_> 2182 | 10 13 9 1 -1. 2183 | <_> 2184 | 13 13 3 1 3. 2185 | 0 2186 | -5.0143511034548283e-03 2187 | 0.4693753123283386 2188 | -0.3883568942546844 2189 | <_> 2190 | 2191 | <_> 2192 | 2193 | 2194 | 2195 | <_> 2196 | 6 15 3 1 -1. 2197 | <_> 2198 | 7 15 1 1 3. 2199 | 0 2200 | 4.2181540629826486e-04 2201 | 0.1153784990310669 2202 | -0.7132592797279358 2203 | <_> 2204 | 2205 | <_> 2206 | 2207 | 2208 | 2209 | <_> 2210 | 0 16 20 4 -1. 2211 | <_> 2212 | 10 16 10 2 2. 2213 | <_> 2214 | 0 18 10 2 2. 2215 | 0 2216 | -0.0263313204050064 2217 | -0.6675789952278137 2218 | 0.1828629970550537 2219 | <_> 2220 | 2221 | <_> 2222 | 2223 | 2224 | 2225 | <_> 2226 | 1 13 18 4 -1. 2227 | <_> 2228 | 1 13 9 2 2. 2229 | <_> 2230 | 10 15 9 2 2. 2231 | 0 2232 | 0.0270899794995785 2233 | 0.0714882835745811 2234 | -0.7389600276947021 2235 | <_> 2236 | 2237 | <_> 2238 | 2239 | 2240 | 2241 | <_> 2242 | 10 10 6 1 -1. 2243 | <_> 2244 | 12 10 2 1 3. 2245 | 0 2246 | 3.9808810688555241e-03 2247 | -0.0624900311231613 2248 | 0.2579961121082306 2249 | <_> 2250 | 2251 | <_> 2252 | 2253 | 2254 | 2255 | <_> 2256 | 0 10 12 6 -1. 2257 | <_> 2258 | 4 10 4 6 3. 2259 | 0 2260 | 0.0938581079244614 2261 | -0.1166857033967972 2262 | 0.8323975801467896 2263 | <_> 2264 | 2265 | <_> 2266 | 2267 | 2268 | 2269 | <_> 2270 | 10 11 9 4 -1. 2271 | <_> 2272 | 13 11 3 4 3. 2273 | 0 2274 | -0.0170704908668995 2275 | 0.2551425099372864 2276 | -0.1464619040489197 2277 | <_> 2278 | 2279 | <_> 2280 | 2281 | 2282 | 2283 | <_> 2284 | 1 13 9 1 -1. 2285 | <_> 2286 | 4 13 3 1 3. 2287 | 0 2288 | -5.6102341040968895e-03 2289 | 0.3810698091983795 2290 | -0.2898282110691071 2291 | <_> 2292 | 2293 | <_> 2294 | 2295 | 2296 | 2297 | <_> 2298 | 12 17 1 3 -1. 2299 | <_> 2300 | 12 18 1 1 3. 2301 | 0 2302 | -1.6884109936654568e-03 2303 | 0.3976930975914001 2304 | -0.1791553944349289 2305 | <_> 2306 | 2307 | <_> 2308 | 2309 | 2310 | 2311 | <_> 2312 | 5 17 3 3 -1. 2313 | <_> 2314 | 6 17 1 3 3. 2315 | 0 2316 | 1.1422219686210155e-03 2317 | 0.1220583021640778 2318 | -0.7954893708229065 2319 | <_> 2320 | 2321 | <_> 2322 | 2323 | 2324 | 2325 | <_> 2326 | 0 2 20 8 -1. 2327 | <_> 2328 | 0 6 20 4 2. 2329 | 0 2330 | 0.0854484736919403 2331 | -0.3227156102657318 2332 | 0.2583124935626984 2333 | -0.8488889932632446 2334 | 7 2335 | -1 2336 | <_> 2337 | 2338 | 2339 | <_> 2340 | 2341 | <_> 2342 | 2343 | 2344 | 2345 | <_> 2346 | 5 12 1 6 -1. 2347 | <_> 2348 | 5 15 1 3 2. 2349 | 0 2350 | -1.2407209724187851e-03 2351 | 0.7162470817565918 2352 | -0.2007752954959869 2353 | <_> 2354 | 2355 | <_> 2356 | 2357 | 2358 | 2359 | <_> 2360 | 6 5 14 10 -1. 2361 | <_> 2362 | 13 5 7 5 2. 2363 | <_> 2364 | 6 10 7 5 2. 2365 | 0 2366 | -0.0822703167796135 2367 | 0.3968873023986816 2368 | -0.2290832996368408 2369 | <_> 2370 | 2371 | <_> 2372 | 2373 | 2374 | 2375 | <_> 2376 | 2 9 9 1 -1. 2377 | <_> 2378 | 5 9 3 1 3. 2379 | 0 2380 | 6.2309550121426582e-03 2381 | -0.2406931966543198 2382 | 0.3659430146217346 2383 | <_> 2384 | 2385 | <_> 2386 | 2387 | 2388 | 2389 | <_> 2390 | 10 11 9 3 -1. 2391 | <_> 2392 | 13 11 3 3 3. 2393 | 0 2394 | -0.0140555696561933 2395 | 0.2607584893703461 2396 | -0.2829737067222595 2397 | <_> 2398 | 2399 | <_> 2400 | 2401 | 2402 | 2403 | <_> 2404 | 7 14 6 1 -1. 2405 | <_> 2406 | 9 14 2 1 3. 2407 | 0 2408 | 6.5327459014952183e-04 2409 | 0.1528156995773315 2410 | -0.5593969821929932 2411 | <_> 2412 | 2413 | <_> 2414 | 2415 | 2416 | 2417 | <_> 2418 | 19 0 1 16 -1. 2419 | <_> 2420 | 19 8 1 8 2. 2421 | 0 2422 | 0.0125494198873639 2423 | -0.2089716047048569 2424 | 0.2781802117824554 2425 | <_> 2426 | 2427 | <_> 2428 | 2429 | 2430 | 2431 | <_> 2432 | 7 4 6 10 -1. 2433 | <_> 2434 | 7 4 3 5 2. 2435 | <_> 2436 | 10 9 3 5 2. 2437 | 0 2438 | 0.0156330708414316 2439 | 0.1483357995748520 2440 | -0.6003684997558594 2441 | <_> 2442 | 2443 | <_> 2444 | 2445 | 2446 | 2447 | <_> 2448 | 10 9 2 3 -1. 2449 | <_> 2450 | 10 9 1 3 2. 2451 | 0 2452 | 7.4582709930837154e-04 2453 | -0.2270790934562683 2454 | 0.1987556070089340 2455 | <_> 2456 | 2457 | <_> 2458 | 2459 | 2460 | 2461 | <_> 2462 | 0 12 12 2 -1. 2463 | <_> 2464 | 4 12 4 2 3. 2465 | 0 2466 | -0.0158222708851099 2467 | 0.2820397913455963 2468 | -0.2920896112918854 2469 | <_> 2470 | 2471 | <_> 2472 | 2473 | 2474 | 2475 | <_> 2476 | 12 18 3 2 -1. 2477 | <_> 2478 | 12 19 3 1 2. 2479 | 0 2480 | 8.7247788906097412e-03 2481 | -0.1720713973045349 2482 | 0.4697273969650269 2483 | <_> 2484 | 2485 | <_> 2486 | 2487 | 2488 | 2489 | <_> 2490 | 5 17 1 2 -1. 2491 | <_> 2492 | 5 18 1 1 2. 2493 | 0 2494 | 6.8489677505567670e-04 2495 | 0.1544692963361740 2496 | -0.6636797189712524 2497 | <_> 2498 | 2499 | <_> 2500 | 2501 | 2502 | 2503 | <_> 2504 | 9 11 2 1 -1. 2505 | <_> 2506 | 9 11 1 1 2. 2507 | 0 2508 | 2.5823758915066719e-04 2509 | 0.1690579950809479 2510 | -0.4210532009601593 2511 | <_> 2512 | 2513 | <_> 2514 | 2515 | 2516 | 2517 | <_> 2518 | 5 0 9 4 -1. 2519 | <_> 2520 | 8 0 3 4 3. 2521 | 0 2522 | 0.0420489497482777 2523 | -0.1286004930734634 2524 | 0.6025344729423523 2525 | <_> 2526 | 2527 | <_> 2528 | 2529 | 2530 | 2531 | <_> 2532 | 7 11 7 3 -1. 2533 | <_> 2534 | 7 12 7 1 3. 2535 | 0 2536 | -0.0152104198932648 2537 | 0.3247380852699280 2538 | -0.2400044947862625 2539 | <_> 2540 | 2541 | <_> 2542 | 2543 | 2544 | 2545 | <_> 2546 | 8 14 3 1 -1. 2547 | <_> 2548 | 9 14 1 1 3. 2549 | 0 2550 | -7.4586068512871861e-04 2551 | -0.7052754759788513 2552 | 0.1198176965117455 2553 | <_> 2554 | 2555 | <_> 2556 | 2557 | 2558 | 2559 | <_> 2560 | 7 9 6 4 -1. 2561 | <_> 2562 | 10 9 3 2 2. 2563 | <_> 2564 | 7 11 3 2 2. 2565 | 0 2566 | -5.6090662255883217e-03 2567 | -0.5189142227172852 2568 | 0.1511954963207245 2569 | <_> 2570 | 2571 | <_> 2572 | 2573 | 2574 | 2575 | <_> 2576 | 7 9 3 3 -1. 2577 | <_> 2578 | 8 9 1 3 3. 2579 | 0 2580 | -6.9692882243543863e-04 2581 | 0.2492880970239639 2582 | -0.2738071978092194 2583 | <_> 2584 | 2585 | <_> 2586 | 2587 | 2588 | 2589 | <_> 2590 | 9 9 2 1 -1. 2591 | <_> 2592 | 9 9 1 1 2. 2593 | 0 2594 | -1.3032859424129128e-03 2595 | -0.7021797895431519 2596 | 0.1096538975834846 2597 | -1.0809509754180908 2598 | 8 2599 | -1 2600 | <_> 2601 | 2602 | 2603 | <_> 2604 | 2605 | <_> 2606 | 2607 | 2608 | 2609 | <_> 2610 | 1 19 15 1 -1. 2611 | <_> 2612 | 6 19 5 1 3. 2613 | 0 2614 | 0.0127973603084683 2615 | -0.2490361928939819 2616 | 0.4674673080444336 2617 | <_> 2618 | 2619 | <_> 2620 | 2621 | 2622 | 2623 | <_> 2624 | 9 3 3 3 -1. 2625 | <_> 2626 | 9 4 3 1 3. 2627 | 0 2628 | -4.1834129951894283e-03 2629 | 0.3007251024246216 2630 | -0.2219883054494858 2631 | <_> 2632 | 2633 | <_> 2634 | 2635 | 2636 | 2637 | <_> 2638 | 1 12 18 1 -1. 2639 | <_> 2640 | 7 12 6 1 3. 2641 | 0 2642 | -0.0236128699034452 2643 | 0.2414264976978302 2644 | -0.3374670147895813 2645 | <_> 2646 | 2647 | <_> 2648 | 2649 | 2650 | 2651 | <_> 2652 | 14 8 1 9 -1. 2653 | <_> 2654 | 14 11 1 3 3. 2655 | 0 2656 | -0.0251536108553410 2657 | 0.4372070133686066 2658 | -0.3275614082813263 2659 | <_> 2660 | 2661 | <_> 2662 | 2663 | 2664 | 2665 | <_> 2666 | 2 2 2 18 -1. 2667 | <_> 2668 | 2 11 2 9 2. 2669 | 0 2670 | 0.0211393106728792 2671 | -0.2863174080848694 2672 | 0.3124063909053802 2673 | <_> 2674 | 2675 | <_> 2676 | 2677 | 2678 | 2679 | <_> 2680 | 13 11 6 6 -1. 2681 | <_> 2682 | 16 11 3 3 2. 2683 | <_> 2684 | 13 14 3 3 2. 2685 | 0 2686 | -0.0217125993221998 2687 | 0.6942697763442993 2688 | -0.1012582033872604 2689 | <_> 2690 | 2691 | <_> 2692 | 2693 | 2694 | 2695 | <_> 2696 | 1 9 18 6 -1. 2697 | <_> 2698 | 1 9 9 3 2. 2699 | <_> 2700 | 10 12 9 3 2. 2701 | 0 2702 | -0.0430783592164516 2703 | -0.5607234239578247 2704 | 0.1663125008344650 2705 | <_> 2706 | 2707 | <_> 2708 | 2709 | 2710 | 2711 | <_> 2712 | 10 10 6 1 -1. 2713 | <_> 2714 | 12 10 2 1 3. 2715 | 0 2716 | -1.4987450558692217e-03 2717 | 0.1272646039724350 2718 | -0.1166080012917519 2719 | <_> 2720 | 2721 | <_> 2722 | 2723 | 2724 | 2725 | <_> 2726 | 4 10 6 1 -1. 2727 | <_> 2728 | 6 10 2 1 3. 2729 | 0 2730 | 4.1716569103300571e-03 2731 | -0.2401334047317505 2732 | 0.4614624083042145 2733 | <_> 2734 | 2735 | <_> 2736 | 2737 | 2738 | 2739 | <_> 2740 | 17 13 3 7 -1. 2741 | <_> 2742 | 18 13 1 7 3. 2743 | 0 2744 | 4.8898528330028057e-03 2745 | 0.0905465632677078 2746 | -0.4839006960391998 2747 | <_> 2748 | 2749 | <_> 2750 | 2751 | 2752 | 2753 | <_> 2754 | 0 13 3 7 -1. 2755 | <_> 2756 | 1 13 1 7 3. 2757 | 0 2758 | -1.1625960469245911e-03 2759 | -0.5429257154464722 2760 | 0.1364106982946396 2761 | <_> 2762 | 2763 | <_> 2764 | 2765 | 2766 | 2767 | <_> 2768 | 3 10 14 6 -1. 2769 | <_> 2770 | 10 10 7 3 2. 2771 | <_> 2772 | 3 13 7 3 2. 2773 | 0 2774 | -0.0367816612124443 2775 | -0.7064548730850220 2776 | 0.1088668033480644 2777 | <_> 2778 | 2779 | <_> 2780 | 2781 | 2782 | 2783 | <_> 2784 | 1 10 6 5 -1. 2785 | <_> 2786 | 3 10 2 5 3. 2787 | 0 2788 | 0.0246897693723440 2789 | -0.1673354059457779 2790 | 0.5149983167648315 2791 | <_> 2792 | 2793 | <_> 2794 | 2795 | 2796 | 2797 | <_> 2798 | 9 7 2 3 -1. 2799 | <_> 2800 | 9 8 2 1 3. 2801 | 0 2802 | -4.8654521815478802e-03 2803 | 0.5060626268386841 2804 | -0.1594700068235397 2805 | <_> 2806 | 2807 | <_> 2808 | 2809 | 2810 | 2811 | <_> 2812 | 5 8 10 3 -1. 2813 | <_> 2814 | 5 9 10 1 3. 2815 | 0 2816 | -0.0117849996313453 2817 | 0.4351908862590790 2818 | -0.1512733995914459 2819 | <_> 2820 | 2821 | <_> 2822 | 2823 | 2824 | 2825 | <_> 2826 | 10 13 2 1 -1. 2827 | <_> 2828 | 10 13 1 1 2. 2829 | 0 2830 | 9.4989547505974770e-04 2831 | 0.0692935213446617 2832 | -0.4393649101257324 2833 | <_> 2834 | 2835 | <_> 2836 | 2837 | 2838 | 2839 | <_> 2840 | 8 13 2 1 -1. 2841 | <_> 2842 | 9 13 1 1 2. 2843 | 0 2844 | 5.9616740327328444e-04 2845 | 0.0982565581798553 2846 | -0.6629868745803833 2847 | <_> 2848 | 2849 | <_> 2850 | 2851 | 2852 | 2853 | <_> 2854 | 9 9 2 3 -1. 2855 | <_> 2856 | 9 10 2 1 3. 2857 | 0 2858 | -6.2817288562655449e-03 2859 | 0.4888150990009308 2860 | -0.1557238996028900 2861 | -1.1087180376052856 2862 | 9 2863 | -1 2864 | <_> 2865 | 2866 | 2867 | <_> 2868 | 2869 | <_> 2870 | 2871 | 2872 | 2873 | <_> 2874 | 9 0 1 8 -1. 2875 | <_> 2876 | 9 4 1 4 2. 2877 | 0 2878 | -9.9095050245523453e-03 2879 | 0.5630884766578674 2880 | -0.2063539028167725 2881 | <_> 2882 | 2883 | <_> 2884 | 2885 | 2886 | 2887 | <_> 2888 | 19 0 1 14 -1. 2889 | <_> 2890 | 19 7 1 7 2. 2891 | 0 2892 | 4.5435219071805477e-03 2893 | -0.2470169961452484 2894 | 0.1799020022153854 2895 | <_> 2896 | 2897 | <_> 2898 | 2899 | 2900 | 2901 | <_> 2902 | 7 6 6 2 -1. 2903 | <_> 2904 | 7 7 6 1 2. 2905 | 0 2906 | -8.7091082241386175e-04 2907 | 0.2453050017356873 2908 | -0.2765454053878784 2909 | <_> 2910 | 2911 | <_> 2912 | 2913 | 2914 | 2915 | <_> 2916 | 14 8 1 9 -1. 2917 | <_> 2918 | 14 11 1 3 3. 2919 | 0 2920 | -0.0216368697583675 2921 | 0.2515161931514740 2922 | -0.3227509856224060 2923 | <_> 2924 | 2925 | <_> 2926 | 2927 | 2928 | 2929 | <_> 2930 | 2 18 4 2 -1. 2931 | <_> 2932 | 2 18 2 1 2. 2933 | <_> 2934 | 4 19 2 1 2. 2935 | 0 2936 | 2.5493409484624863e-03 2937 | -0.1476895958185196 2938 | 0.5545899271965027 2939 | <_> 2940 | 2941 | <_> 2942 | 2943 | 2944 | 2945 | <_> 2946 | 9 11 6 3 -1. 2947 | <_> 2948 | 9 11 3 3 2. 2949 | 0 2950 | 1.6613079933449626e-03 2951 | -0.2122790962457657 2952 | 0.1571837961673737 2953 | <_> 2954 | 2955 | <_> 2956 | 2957 | 2958 | 2959 | <_> 2960 | 0 0 1 14 -1. 2961 | <_> 2962 | 0 7 1 7 2. 2963 | 0 2964 | 9.4684818759560585e-03 2965 | -0.2621173858642578 2966 | 0.2920702099800110 2967 | <_> 2968 | 2969 | <_> 2970 | 2971 | 2972 | 2973 | <_> 2974 | 10 5 2 15 -1. 2975 | <_> 2976 | 10 10 2 5 3. 2977 | 0 2978 | -0.0522385612130165 2979 | 0.1780423969030380 2980 | -0.3343229889869690 2981 | <_> 2982 | 2983 | <_> 2984 | 2985 | 2986 | 2987 | <_> 2988 | 5 11 6 3 -1. 2989 | <_> 2990 | 8 11 3 3 2. 2991 | 0 2992 | 2.5752868968993425e-03 2993 | -0.2065097987651825 2994 | 0.4189889132976532 2995 | <_> 2996 | 2997 | <_> 2998 | 2999 | 3000 | 3001 | <_> 3002 | 11 6 6 7 -1. 3003 | <_> 3004 | 13 6 2 7 3. 3005 | 0 3006 | -0.0160471405833960 3007 | 0.2585200071334839 3008 | -0.1094772964715958 3009 | <_> 3010 | 3011 | <_> 3012 | 3013 | 3014 | 3015 | <_> 3016 | 4 10 12 9 -1. 3017 | <_> 3018 | 8 10 4 9 3. 3019 | 0 3020 | -0.1159958988428116 3021 | 0.6298483014106750 3022 | -0.1196947023272514 3023 | <_> 3024 | 3025 | <_> 3026 | 3027 | 3028 | 3029 | <_> 3030 | 10 14 3 1 -1. 3031 | <_> 3032 | 11 14 1 1 3. 3033 | 0 3034 | -9.7595580155029893e-04 3035 | -0.6507467031478882 3036 | 0.0756275802850723 3037 | <_> 3038 | 3039 | <_> 3040 | 3041 | 3042 | 3043 | <_> 3044 | 7 14 3 1 -1. 3045 | <_> 3046 | 8 14 1 1 3. 3047 | 0 3048 | -4.2097578989341855e-04 3049 | -0.5833796858787537 3050 | 0.1222841963171959 3051 | <_> 3052 | 3053 | <_> 3054 | 3055 | 3056 | 3057 | <_> 3058 | 10 14 3 2 -1. 3059 | <_> 3060 | 11 14 1 2 3. 3061 | 0 3062 | 3.9017631206661463e-04 3063 | 0.0758925378322601 3064 | -0.2629995942115784 3065 | <_> 3066 | 3067 | <_> 3068 | 3069 | 3070 | 3071 | <_> 3072 | 4 8 2 6 -1. 3073 | <_> 3074 | 5 8 1 6 2. 3075 | 0 3076 | 3.1535029411315918e-03 3077 | -0.1664831042289734 3078 | 0.4664255082607269 3079 | <_> 3080 | 3081 | <_> 3082 | 3083 | 3084 | 3085 | <_> 3086 | 10 14 3 2 -1. 3087 | <_> 3088 | 11 14 1 2 3. 3089 | 0 3090 | -1.4046890428289771e-03 3091 | -0.3981274962425232 3092 | 0.0561619699001312 3093 | <_> 3094 | 3095 | <_> 3096 | 3097 | 3098 | 3099 | <_> 3100 | 3 12 3 4 -1. 3101 | <_> 3102 | 4 12 1 4 3. 3103 | 0 3104 | 3.1666089780628681e-03 3105 | -0.1787768006324768 3106 | 0.4090973138809204 3107 | <_> 3108 | 3109 | <_> 3110 | 3111 | 3112 | 3113 | <_> 3114 | 3 1 14 6 -1. 3115 | <_> 3116 | 3 3 14 2 3. 3117 | 0 3118 | -0.0164993591606617 3119 | 0.2048030048608780 3120 | -0.3630825877189636 3121 | <_> 3122 | 3123 | <_> 3124 | 3125 | 3126 | 3127 | <_> 3128 | 7 14 3 2 -1. 3129 | <_> 3130 | 8 14 1 2 3. 3131 | 0 3132 | 4.1761019383557141e-04 3133 | 0.1311777979135513 3134 | -0.4833852946758270 3135 | <_> 3136 | 3137 | <_> 3138 | 3139 | 3140 | 3141 | <_> 3142 | 12 11 3 3 -1. 3143 | <_> 3144 | 13 11 1 3 3. 3145 | 0 3146 | 9.0707670897245407e-03 3147 | 9.2487707734107971e-03 3148 | -0.6447566151618958 3149 | <_> 3150 | 3151 | <_> 3152 | 3153 | 3154 | 3155 | <_> 3156 | 5 11 3 3 -1. 3157 | <_> 3158 | 6 11 1 3 3. 3159 | 0 3160 | 3.3107338822446764e-04 3161 | -0.2549797892570496 3162 | 0.2758406996726990 3163 | <_> 3164 | 3165 | <_> 3166 | 3167 | 3168 | 3169 | <_> 3170 | 4 0 12 3 -1. 3171 | <_> 3172 | 4 1 12 1 3. 3173 | 0 3174 | 0.0139847695827484 3175 | 0.1226134970784187 3176 | -0.5258917808532715 3177 | <_> 3178 | 3179 | <_> 3180 | 3181 | 3182 | 3183 | <_> 3184 | 1 19 18 1 -1. 3185 | <_> 3186 | 7 19 6 1 3. 3187 | 0 3188 | 0.0238846298307180 3189 | -0.1637594997882843 3190 | 0.3971964120864868 3191 | <_> 3192 | 3193 | <_> 3194 | 3195 | 3196 | 3197 | <_> 3198 | 5 10 11 6 -1. 3199 | <_> 3200 | 5 12 11 2 3. 3201 | 0 3202 | -0.0941136777400970 3203 | 0.2231238931417465 3204 | -0.2817093133926392 3205 | <_> 3206 | 3207 | <_> 3208 | 3209 | 3210 | 3211 | <_> 3212 | 0 9 12 1 -1. 3213 | <_> 3214 | 6 9 6 1 2. 3215 | 0 3216 | -0.0163963604718447 3217 | 0.5174812078475952 3218 | -0.1398597955703735 3219 | -1.1378910541534424 3220 | 10 3221 | -1 3222 | <_> 3223 | 3224 | 3225 | <_> 3226 | 3227 | <_> 3228 | 3229 | 3230 | 3231 | <_> 3232 | 5 12 1 6 -1. 3233 | <_> 3234 | 5 15 1 3 2. 3235 | 0 3236 | -1.8984159396495670e-04 3237 | 0.4796459972858429 3238 | -0.1926054060459137 3239 | <_> 3240 | 3241 | <_> 3242 | 3243 | 3244 | 3245 | <_> 3246 | 14 12 6 6 -1. 3247 | <_> 3248 | 16 12 2 6 3. 3249 | 0 3250 | 4.7213290818035603e-03 3251 | -0.3855938911437988 3252 | 0.2359178066253662 3253 | <_> 3254 | 3255 | <_> 3256 | 3257 | 3258 | 3259 | <_> 3260 | 5 17 3 2 -1. 3261 | <_> 3262 | 5 18 3 1 2. 3263 | 0 3264 | 1.7611780203878880e-03 3265 | 0.1145095974206924 3266 | -0.5536686778068542 3267 | <_> 3268 | 3269 | <_> 3270 | 3271 | 3272 | 3273 | <_> 3274 | 14 12 6 6 -1. 3275 | <_> 3276 | 16 12 2 6 3. 3277 | 0 3278 | 0.0619058012962341 3279 | 0.0361764803528786 3280 | -0.7537580132484436 3281 | <_> 3282 | 3283 | <_> 3284 | 3285 | 3286 | 3287 | <_> 3288 | 0 12 6 6 -1. 3289 | <_> 3290 | 2 12 2 6 3. 3291 | 0 3292 | 6.8295709788799286e-03 3293 | -0.2995564043521881 3294 | 0.2059424966573715 3295 | <_> 3296 | 3297 | <_> 3298 | 3299 | 3300 | 3301 | <_> 3302 | 14 8 1 9 -1. 3303 | <_> 3304 | 14 11 1 3 3. 3305 | 0 3306 | -0.0229486804455519 3307 | 0.1910860985517502 3308 | -0.2746480107307434 3309 | <_> 3310 | 3311 | <_> 3312 | 3313 | 3314 | 3315 | <_> 3316 | 0 16 11 4 -1. 3317 | <_> 3318 | 0 18 11 2 2. 3319 | 0 3320 | 0.0131213096901774 3321 | -0.1467829048633575 3322 | 0.4494847953319550 3323 | <_> 3324 | 3325 | <_> 3326 | 3327 | 3328 | 3329 | <_> 3330 | 14 8 1 9 -1. 3331 | <_> 3332 | 14 11 1 3 3. 3333 | 0 3334 | -0.0331512987613678 3335 | 0.2912957966327667 3336 | -0.1595291942358017 3337 | <_> 3338 | 3339 | <_> 3340 | 3341 | 3342 | 3343 | <_> 3344 | 5 2 4 6 -1. 3345 | <_> 3346 | 5 5 4 3 2. 3347 | 0 3348 | 0.0224155597388744 3349 | -0.1776317954063416 3350 | 0.3403505980968475 3351 | <_> 3352 | 3353 | <_> 3354 | 3355 | 3356 | 3357 | <_> 3358 | 9 0 2 8 -1. 3359 | <_> 3360 | 9 4 2 4 2. 3361 | 0 3362 | -0.0255698896944523 3363 | 0.5480523109436035 3364 | -0.1752621978521347 3365 | <_> 3366 | 3367 | <_> 3368 | 3369 | 3370 | 3371 | <_> 3372 | 8 10 2 8 -1. 3373 | <_> 3374 | 8 14 2 4 2. 3375 | 0 3376 | 0.0174023006111383 3377 | -0.3940981030464172 3378 | 0.1953804939985275 3379 | <_> 3380 | 3381 | <_> 3382 | 3383 | 3384 | 3385 | <_> 3386 | 12 12 8 3 -1. 3387 | <_> 3388 | 12 12 4 3 2. 3389 | 0 3390 | -6.6808518022298813e-03 3391 | 0.1267247051000595 3392 | -0.3698250055313110 3393 | <_> 3394 | 3395 | <_> 3396 | 3397 | 3398 | 3399 | <_> 3400 | 1 3 18 3 -1. 3401 | <_> 3402 | 7 3 6 3 3. 3403 | 0 3404 | -0.0474075004458427 3405 | -0.6734154224395752 3406 | 0.0941268503665924 3407 | <_> 3408 | 3409 | <_> 3410 | 3411 | 3412 | 3413 | <_> 3414 | 10 13 4 4 -1. 3415 | <_> 3416 | 12 13 2 2 2. 3417 | <_> 3418 | 10 15 2 2 2. 3419 | 0 3420 | -7.0174131542444229e-03 3421 | -0.4878580868244171 3422 | -4.7722761519253254e-03 3423 | <_> 3424 | 3425 | <_> 3426 | 3427 | 3428 | 3429 | <_> 3430 | 4 17 1 3 -1. 3431 | <_> 3432 | 4 18 1 1 3. 3433 | 0 3434 | -5.6818639859557152e-04 3435 | 0.3031811118125916 3436 | -0.1906266957521439 3437 | <_> 3438 | 3439 | <_> 3440 | 3441 | 3442 | 3443 | <_> 3444 | 12 12 8 3 -1. 3445 | <_> 3446 | 12 12 4 3 2. 3447 | 0 3448 | -0.0346436500549316 3449 | 0.1061747968196869 3450 | -0.1113270968198776 3451 | <_> 3452 | 3453 | <_> 3454 | 3455 | 3456 | 3457 | <_> 3458 | 5 13 8 4 -1. 3459 | <_> 3460 | 5 13 4 2 2. 3461 | <_> 3462 | 9 15 4 2 2. 3463 | 0 3464 | 0.0128513900563121 3465 | 0.1139544025063515 3466 | -0.6669226884841919 3467 | <_> 3468 | 3469 | <_> 3470 | 3471 | 3472 | 3473 | <_> 3474 | 0 0 20 18 -1. 3475 | <_> 3476 | 0 9 20 9 2. 3477 | 0 3478 | 0.2961465120315552 3479 | -0.1820058971643448 3480 | 0.3209075033664703 3481 | <_> 3482 | 3483 | <_> 3484 | 3485 | 3486 | 3487 | <_> 3488 | 5 17 1 2 -1. 3489 | <_> 3490 | 5 18 1 1 2. 3491 | 0 3492 | -1.3540580403059721e-03 3493 | -0.7073159813880920 3494 | 0.0918638333678246 3495 | <_> 3496 | 3497 | <_> 3498 | 3499 | 3500 | 3501 | <_> 3502 | 17 18 3 2 -1. 3503 | <_> 3504 | 17 19 3 1 2. 3505 | 0 3506 | -7.0616841549053788e-04 3507 | 0.1960162967443466 3508 | -0.1338178962469101 3509 | <_> 3510 | 3511 | <_> 3512 | 3513 | 3514 | 3515 | <_> 3516 | 4 8 7 3 -1. 3517 | <_> 3518 | 4 9 7 1 3. 3519 | 0 3520 | -5.4999729618430138e-03 3521 | 0.3074981868267059 3522 | -0.1724286973476410 3523 | <_> 3524 | 3525 | <_> 3526 | 3527 | 3528 | 3529 | <_> 3530 | 7 9 13 2 -1. 3531 | <_> 3532 | 7 10 13 1 2. 3533 | 0 3534 | -0.0122836297377944 3535 | 0.1942628026008606 3536 | -0.1230755969882011 3537 | <_> 3538 | 3539 | <_> 3540 | 3541 | 3542 | 3543 | <_> 3544 | 7 12 2 1 -1. 3545 | <_> 3546 | 8 12 1 1 2. 3547 | 0 3548 | 1.9181630341336131e-04 3549 | 0.1334999054670334 3550 | -0.3691028952598572 3551 | <_> 3552 | 3553 | <_> 3554 | 3555 | 3556 | 3557 | <_> 3558 | 7 11 6 5 -1. 3559 | <_> 3560 | 9 11 2 5 3. 3561 | 0 3562 | 2.7476788964122534e-03 3563 | -0.1872316002845764 3564 | 0.2906386852264404 3565 | <_> 3566 | 3567 | <_> 3568 | 3569 | 3570 | 3571 | <_> 3572 | 8 14 3 2 -1. 3573 | <_> 3574 | 9 14 1 2 3. 3575 | 0 3576 | 5.3845712682232261e-04 3577 | 0.1176405027508736 3578 | -0.5548595190048218 3579 | <_> 3580 | 3581 | <_> 3582 | 3583 | 3584 | 3585 | <_> 3586 | 17 18 3 2 -1. 3587 | <_> 3588 | 17 19 3 1 2. 3589 | 0 3590 | -6.2914132140576839e-03 3591 | -0.6762797832489014 3592 | 0.0256425291299820 3593 | <_> 3594 | 3595 | <_> 3596 | 3597 | 3598 | 3599 | <_> 3600 | 0 18 3 2 -1. 3601 | <_> 3602 | 0 19 3 1 2. 3603 | 0 3604 | -8.0435717245563865e-04 3605 | 0.3097242116928101 3606 | -0.2231778949499130 3607 | <_> 3608 | 3609 | <_> 3610 | 3611 | 3612 | 3613 | <_> 3614 | 16 18 3 2 -1. 3615 | <_> 3616 | 16 19 3 1 2. 3617 | 0 3618 | 0.0178245995193720 3619 | 0.0100319497287273 3620 | -1.0000309944152832 3621 | <_> 3622 | 3623 | <_> 3624 | 3625 | 3626 | 3627 | <_> 3628 | 1 18 3 2 -1. 3629 | <_> 3630 | 1 19 3 1 2. 3631 | 0 3632 | -4.5915339142084122e-03 3633 | -0.7925583124160767 3634 | 0.0804975628852844 3635 | <_> 3636 | 3637 | <_> 3638 | 3639 | 3640 | 3641 | <_> 3642 | 11 15 2 2 -1. 3643 | <_> 3644 | 12 15 1 1 2. 3645 | <_> 3646 | 11 16 1 1 2. 3647 | 0 3648 | -4.2610289528965950e-04 3649 | -0.4836213886737823 3650 | 0.0490311309695244 3651 | -1.0918780565261841 3652 | 11 3653 | -1 3654 | 3655 | -------------------------------------------------------------------------------- /models/hog.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 40 40 6 | 7 | 16 16 8 | 9 | 8 8 10 | 11 | 8 8 12 | 9 13 | 1 14 | 4. 15 | 0 16 | 2.0000000000000001e-01 17 | 1 18 | 64 19 | 0 20 | 21 | -------------------------------------------------------------------------------- /resourse/wait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/masloff-open-projects/OpenCV-Webcam-Recorder-and-Streamer/83d1ca246d725ae991d2a740bb9c12f262c99e28/resourse/wait.png -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | export OPENCV_LOG_LEVEL=debug 2 | export OPENCV_VIDEOIO_DEBUG=1 3 | 4 | python3 main.py -------------------------------------------------------------------------------- /templates/records.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CCTV - Records 6 | 7 | 8 | 9 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /user_hooks.py: -------------------------------------------------------------------------------- 1 | # This file is intended for your custom hooks. 2 | # You can write all the necessary hooks to the _user_hooks function. 3 | # It is called immediately after the delivery and announcement 4 | # of all the necessary objects and before the system is connected to the camera 5 | 6 | def _user_hooks(cv2=None, Hooks=None, Filters=None): 7 | 8 | # An example of writing Hello world text on a frame that will be written to a file 9 | # 10 | # def bigtext(frame): 11 | # cv2.putText(frame, 'Hello world!', (50, 140), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 255, 255), 8) 12 | # return frame 13 | # 14 | # Filters.set('on_frame_record', bigtext) 15 | 16 | 17 | 18 | # Add a new line to the frame text. 19 | # def append_text(text): 20 | # return "{text}" \ 21 | # "New line".format(text=text) 22 | # 23 | # Filters.set('on_frame_text', append_text) 24 | 25 | 26 | 27 | # Save detected face 28 | # def save_detected_face(frame): 29 | # cv2.imwrite('static/face.jpg', frame) 30 | # 31 | # Hooks.set('on_face_detect', save_detected_face) 32 | 33 | 34 | 35 | # Change the configuration directly in the program without changing config.json 36 | # def change_cfg(config): 37 | # config['detect_face'] = True; 38 | # return config 39 | # 40 | # Filters.set('on_config', change_cfg) 41 | 42 | 43 | 44 | # Create the third highest priority file to attempt recording 45 | # def on_reserve_videofile(file): 46 | # return "" 47 | 48 | # Filters.set('on_reserve_videofile', on_reserve_videofile) 49 | 50 | 51 | 52 | # How to register a multihook to work with Net 53 | # def person(frame): 54 | # cv2.imwrite('static/person.jpg', frame) 55 | # 56 | # Hooks.set('on_net_person_detect', person) 57 | 58 | 59 | pass 60 | 61 | --------------------------------------------------------------------------------