|  | 
|  | 1 | +#!/usr/bin/env python3 | 
|  | 2 | +import sys | 
|  | 3 | +import gguf | 
|  | 4 | +import numpy as np | 
|  | 5 | + | 
|  | 6 | +def save_conv2d_layer(f, gguf_writer, prefix, inp_c, filters, size, batch_normalize=True): | 
|  | 7 | +    biases = np.fromfile(f, dtype=np.float32, count=filters) | 
|  | 8 | +    gguf_writer.add_tensor(prefix + "_biases", biases, raw_shape=(1, filters, 1, 1)) | 
|  | 9 | + | 
|  | 10 | +    if batch_normalize: | 
|  | 11 | +        scales = np.fromfile(f, dtype=np.float32, count=filters) | 
|  | 12 | +        gguf_writer.add_tensor(prefix + "_scales", scales, raw_shape=(1, filters, 1, 1)) | 
|  | 13 | +        rolling_mean = np.fromfile(f, dtype=np.float32, count=filters) | 
|  | 14 | +        gguf_writer.add_tensor(prefix + "_rolling_mean", rolling_mean, raw_shape=(1, filters, 1, 1)) | 
|  | 15 | +        rolling_variance = np.fromfile(f, dtype=np.float32, count=filters) | 
|  | 16 | +        gguf_writer.add_tensor(prefix + "_rolling_variance", rolling_variance, raw_shape=(1, filters, 1, 1)) | 
|  | 17 | + | 
|  | 18 | +    weights_count = filters * inp_c * size * size | 
|  | 19 | +    l0_weights = np.fromfile(f, dtype=np.float32, count=weights_count) | 
|  | 20 | +    ## ggml doesn't support f32 convolution yet, use f16 instead | 
|  | 21 | +    l0_weights = l0_weights.astype(np.float16) | 
|  | 22 | +    gguf_writer.add_tensor(prefix + "_weights", l0_weights, raw_shape=(filters, inp_c, size, size)) | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +if __name__ == '__main__': | 
|  | 26 | +    if len(sys.argv) != 2: | 
|  | 27 | +        print("Usage: %s <yolov3-tiny.weights>" % sys.argv[0]) | 
|  | 28 | +        sys.exit(1) | 
|  | 29 | +    outfile = 'yolov3-tiny.gguf' | 
|  | 30 | +    gguf_writer = gguf.GGUFWriter(outfile, 'yolov3-tiny') | 
|  | 31 | + | 
|  | 32 | +    f = open(sys.argv[1], 'rb') | 
|  | 33 | +    f.read(20) # skip header | 
|  | 34 | +    save_conv2d_layer(f, gguf_writer, "l0", 3, 16, 3) | 
|  | 35 | +    save_conv2d_layer(f, gguf_writer, "l1", 16, 32, 3) | 
|  | 36 | +    save_conv2d_layer(f, gguf_writer, "l2", 32, 64, 3) | 
|  | 37 | +    save_conv2d_layer(f, gguf_writer, "l3", 64, 128, 3) | 
|  | 38 | +    save_conv2d_layer(f, gguf_writer, "l4", 128, 256, 3) | 
|  | 39 | +    save_conv2d_layer(f, gguf_writer, "l5", 256, 512, 3) | 
|  | 40 | +    save_conv2d_layer(f, gguf_writer, "l6", 512, 1024, 3) | 
|  | 41 | +    save_conv2d_layer(f, gguf_writer, "l7", 1024, 256, 1) | 
|  | 42 | +    save_conv2d_layer(f, gguf_writer, "l8", 256, 512, 3) | 
|  | 43 | +    save_conv2d_layer(f, gguf_writer, "l9", 512, 255, 1, batch_normalize=False) | 
|  | 44 | +    save_conv2d_layer(f, gguf_writer, "l10", 256, 128, 1) | 
|  | 45 | +    save_conv2d_layer(f, gguf_writer, "l11", 384, 256, 3) | 
|  | 46 | +    save_conv2d_layer(f, gguf_writer, "l12", 256, 255, 1, batch_normalize=False) | 
|  | 47 | +    f.close() | 
|  | 48 | +     | 
|  | 49 | +    gguf_writer.write_header_to_file() | 
|  | 50 | +    gguf_writer.write_kv_data_to_file() | 
|  | 51 | +    gguf_writer.write_tensors_to_file() | 
|  | 52 | +    gguf_writer.close() | 
|  | 53 | +    print("{} converted to {}".format(sys.argv[1], outfile)) | 
0 commit comments