File: dlmodel_source

package info (click to toggle)
dlmodelbox 1.1.1-1
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 84 kB
  • sloc: python: 152; makefile: 2
file content (135 lines) | stat: -rwxr-xr-x 3,891 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/python3

import glob
import hashlib
import json
import os
import readline
import shutil
import subprocess


def init_cli():
    def complete(text, state):
        return (glob.glob(text+'*')+[None])[state]

    readline.set_completer_delims(' \t\n;')
    readline.parse_and_bind("tab: complete")
    readline.set_completer(complete)


def get_sha256(filepath):
    bufsize = 65536
    sha256 = hashlib.sha256()
    with open(filepath, 'rb') as f:
        while True:
            data = f.read(bufsize)
            if not data:
                break
            sha256.update(data)
    return sha256.hexdigest()


def get_meta():
    """Get metadata from user via CLI.

    :return: metadata in JSON structure
    :rtype: dict
    """
    inference_engine_names = {
        1: 'tflite',
        2: 'openvino',
        3: 'darknet',
        4: 'tensorflow',
        5: 'pytorch',
        6: 'keras',
        7: 'mxnet',
        8: 'caffe2',
        9: 'caffe',
        10: 'movidius',
        11: 'others'
    }
    # model, label, config are full paths for copying them into
    # target package directory.  They will be updated to relative paths
    # in the model package.
    meta = {}
    config_files = {}
    meta['name'] = input('Package name: ')
    meta['version'] = input('Package version: ')
    meta['model'] = os.path.abspath(input('Model filepath: '))
    meta['label'] = os.path.abspath(input('Label filepath: '))
    while True:
        key = input('Config name (press enter directly to stop): ')
        if len(key) != 0:
            value = os.path.abspath(input('Config filepath: '))
            config_files[key] = value
        else:
            break
    meta['config'] = config_files
    engine_index = int(input(
        (
            'Inference engine\n'
            '\t 1. TFLite\n'
            '\t 2. OpenVINO\n'
            '\t 3. Darknet\n'
            '\t 4. TensorFlow\n'
            '\t 5. PyTorch\n'
            '\t 6. Keras\n'
            '\t 7. MXNet\n'
            '\t 8. Caffe2\n'
            '\t 9. Caffe\n'
            '\t10. Movidius\n'
            '\t11. Others\n'
            ': '
        )
    ))
    meta['inference-engine'] = inference_engine_names[engine_index]
    return meta


def create_metafile(meta, package_dirpath):
    """Create DL model package meta file (meta.json)
    """
    checksums = {}
    for cksum_key in ['model', 'label']:
        target_path = os.path.join(package_dirpath, meta[cksum_key])
        checksums[meta[cksum_key]] = get_sha256(target_path)
    for k, v in meta['config'].items():
        target_path = os.path.join(package_dirpath, v)
        checksums[v] = get_sha256(target_path)
    meta['checksums-sha256'] = checksums

    with open(os.path.join(package_dirpath, 'meta.json'), 'w') as f:
        json.dump(meta, f, indent=4)


def create_source_package(meta):
    # copy model contents to model package directory
    package_name = meta['name'] + '-' + meta['version']
    package_dirpath = os.path.join('/tmp', package_name)
    subprocess.call(
        'mkdir -p {pkgdir}'.format(pkgdir=package_dirpath),
        shell=True)
    shutil.copy2(meta['model'], package_dirpath)
    shutil.copy2(meta['label'], package_dirpath)
    for k, v in meta['config'].items():
        shutil.copy2(v, package_dirpath)
    # update full paths to relative paths in the model package directory
    meta['model'] = os.path.basename(meta['model'])
    meta['label'] = os.path.basename(meta['label'])
    for k, v in meta['config'].items():
        meta['config'][k] = os.path.basename(v)
    # create model description file (meta.json)
    create_metafile(meta, package_dirpath)
    print('Model source package is at ' + package_dirpath)


def main():
    init_cli()
    meta = get_meta()
    create_source_package(meta)


if __name__ == '__main__':
    # TODO: capture ctrl+c and confirm exit or not
    main()