├── .gitignore ├── images ├── 18.jpg ├── 2.jpg ├── 20.jpg └── 9.jpg ├── README.md ├── Makefile ├── fp16.h ├── wts_gen_demo.py ├── data ├── weights_demo16_v2.wts ├── weights_demo16.wts ├── weights_demo32.wts ├── weights_demo.p ├── weights_demo16_plain.wts └── weights_demo32_plain.wts └── demo.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | demo 2 | *.pyc 3 | *.bkp 4 | obj 5 | extras 6 | -------------------------------------------------------------------------------- /images/18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FrancescoB-Vintra/fp16tensorRT/HEAD/images/18.jpg -------------------------------------------------------------------------------- /images/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FrancescoB-Vintra/fp16tensorRT/HEAD/images/2.jpg -------------------------------------------------------------------------------- /images/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FrancescoB-Vintra/fp16tensorRT/HEAD/images/20.jpg -------------------------------------------------------------------------------- /images/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FrancescoB-Vintra/fp16tensorRT/HEAD/images/9.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Goal 3 | This is a working example of a TensorRT model written with the C++ TensorRT API, running inference in half precision mode. 4 | Both inference in full and half precision mode can be run. 5 | 6 | # Content 7 | * `demo.cpp` - model definition and inference 8 | * `wts_gen_demo.py` - weight file conversion from general dictionary of numpy array to TensorRT wts format, either in full or half precision 9 | * `./images` - test images to run the inference 10 | * `./data` - data folder containing weights both in pickle dictionary format and in TensorRT wts format 11 | * `Makefile` 12 | 13 | # Dependencies 14 | * OpenCV >= 2.4 15 | * TensorRT RC 4.0.0.3 16 | * CUDA 9.0 17 | 18 | # Requirements 19 | A NVIDIA GPU with FP16 support is needed. 20 | We tested on a Tesla V100. 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .SUFFIXES: 2 | TARGET = demo 3 | CC = g++ 4 | CUCC = nvcc 5 | 6 | CFLAGS = -std=c++11 -Wall 7 | CUFLAGS = -m64 -arch=sm_35 -ccbin $(CC) 8 | LDFLAGS = $(CFLAGS) 9 | 10 | ifdef DEBUG 11 | CFLAGS += -g -O0 -DDEBUG 12 | CUFLAGS += -lineinfo 13 | LDFLAGS += -g -O0 14 | else 15 | CFLAGS += -O3 #-DNDEBUG 16 | CUFLAGS += 17 | LDFLAGS += -O3 18 | endif 19 | 20 | ifdef VERBOSE 21 | AT = 22 | else 23 | AT = @ 24 | endif 25 | 26 | AR = ar cr 27 | ECHO = @echo 28 | SHELL = /bin/sh 29 | 30 | define concat 31 | $1$2$3$4$5$6$7$8 32 | endef 33 | 34 | #$(call make-depend,source-file,object-file,depend-file) 35 | define make-depend 36 | $(AT)$(CC) -MM -MF $3 -MP -MT $2 $(CFLAGS) $1 37 | endef 38 | 39 | define make-depend-cu 40 | $(AT)$(CUCC) -M $(CUFLAGS) $1 > $3.$$$$; \ 41 | sed 's,.*\.o[ :]*,$2 : ,g' < $3.$$$$ > $3; \ 42 | rm -f $3.$$$$ 43 | endef 44 | 45 | # SRCS_C = sqdtrt.cpp trtUtil.cpp common.cpp tensorUtil.cu errorHandle.cu sdt_alloc.c 46 | SRCS = *.cpp *.c *.cu 47 | OUTDIR = . 48 | OBJDIR = $(call concat,$(OUTDIR),/obj) 49 | OBJS = $(patsubst %.c, $(OBJDIR)/%.o, $(wildcard *.c)) 50 | OBJS += $(patsubst %.cpp, $(OBJDIR)/%.o, $(wildcard *.cpp)) 51 | CUOBJS = $(patsubst %.cu, $(OBJDIR)/%.o, $(wildcard *.cu)) 52 | 53 | TRIPLE?=x86_64-linux 54 | CUDA_INSTALL_DIR = /usr/local/cuda-9.0 55 | CUDA_LIBDIR = lib 56 | TENSORRT_INSTALL_DIR = /home/ubuntu/TensorRT-4.0.0.3 57 | 58 | INCPATHS =-I"$(CUDA_INSTALL_DIR)/include" -I"/usr/local/include" -I"$(TENSORRT_INSTALL_DIR)/include" -I"/usr/local/include/opencv" 59 | LIBPATHS =-L"$(CUDA_INSTALL_DIR)/targets/$(TRIPLE)/$(CUDA_LIBDIR)" -L"/usr/local/lib" -L"$(CUDA_INSTALL_DIR)/lib64" -L"$(CUDA_INSTALL_DIR)/$(CUDA_LIBDIR)" -L"$(TENSORRT_INSTALL_DIR)/lib" 60 | LIBS = $(LIBPATHS) -lcudart -lcudart_static -lnvinfer `pkg-config --libs opencv` -lnvcaffe_parser -lnvinfer_plugin -lnvparsers 61 | CFLAGS += $(INCPATHS) `pkg-config --cflags opencv` 62 | CUFLAGS += $(INCPATHS) `pkg-config --cflags opencv` 63 | LDFLAGS += $(LIBS) 64 | 65 | .PHONY: all 66 | all: $(OUTDIR)/$(TARGET) 67 | 68 | $(OUTDIR)/$(TARGET): $(OBJS) $(CUOBJS) $(TESTOBJS) 69 | $(ECHO) Linking: $^ 70 | $(AT)$(CC) -o $@ $^ $(LDFLAGS) 71 | 72 | $(OBJDIR)/%.o: %.c 73 | $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi 74 | $(call make-depend,$<,$@,$(subst .o,.d,$@)) 75 | $(ECHO) Compiling: $< 76 | $(AT)$(CC) $(CFLAGS) -c -o $@ $< 77 | 78 | $(OBJDIR)/%.o: %.cpp 79 | $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi 80 | $(call make-depend,$<,$@,$(subst .o,.d,$@)) 81 | $(ECHO) Compiling: $< 82 | $(AT)$(CC) $(CFLAGS) -c -o $@ $< 83 | 84 | $(OBJDIR)/%.o: %.cu 85 | $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi 86 | $(call make-depend-cu,$<,$@,$(subst .o,.d,$@)) 87 | $(ECHO) Compiling CUDA: $< 88 | $(AT)$(CUCC) $(CUFLAGS) -c -o $@ $< 89 | 90 | clean: 91 | rm -rf $(OBJDIR) 92 | 93 | ifneq "$(MAKECMDGOALS)" "clean" 94 | -include $(OBJDIR)/*.d 95 | endif 96 | -------------------------------------------------------------------------------- /fp16.h: -------------------------------------------------------------------------------- 1 | #ifndef _TRT_FP16_H_ 2 | #define _TRT_FP16_H_ 3 | 4 | #include 5 | 6 | namespace fp16 7 | { 8 | // Code added before equivalent code was available via cuda. 9 | // This code needs to be removed when we ship for cuda-9.2. 10 | template T bitwise_cast(U u) 11 | { 12 | return *reinterpret_cast(&u); 13 | } 14 | 15 | __half __float2half(float f) 16 | { 17 | uint32_t x = bitwise_cast(f); 18 | uint32_t u = (x & 0x7fffffff); 19 | 20 | // Get rid of +NaN/-NaN case first. 21 | if (u > 0x7f800000) 22 | return bitwise_cast<__half, uint16_t>(uint16_t(0x7fff)); 23 | 24 | uint16_t sign = ((x >> 16) & 0x8000); 25 | 26 | // Get rid of +Inf/-Inf, +0/-0. 27 | if (u > 0x477fefff) 28 | return bitwise_cast<__half, uint16_t>(sign | uint16_t(0x7c00)); 29 | 30 | if (u < 0x33000001) 31 | return bitwise_cast<__half, uint16_t>(sign | uint16_t(0x0000)); 32 | 33 | uint32_t exponent = ((u >> 23) & 0xff); 34 | uint32_t mantissa = (u & 0x7fffff); 35 | 36 | uint32_t shift; 37 | if (exponent > 0x70) 38 | { 39 | shift = 13; 40 | exponent -= 0x70; 41 | } 42 | else 43 | { 44 | shift = 0x7e - exponent; 45 | exponent = 0; 46 | mantissa |= 0x800000; 47 | } 48 | 49 | uint32_t lsb = (1 << shift); 50 | uint32_t lsb_s1 = (lsb >> 1); 51 | uint32_t lsb_m1 = (lsb - 1); 52 | 53 | // Round to nearest even. 54 | uint32_t remainder = (mantissa & lsb_m1); 55 | mantissa >>= shift; 56 | if ( (remainder > lsb_s1) || ((remainder == lsb_s1) && (mantissa & 0x1)) ) 57 | { 58 | ++mantissa; 59 | if (!(mantissa & 0x3ff)) 60 | { 61 | ++exponent; 62 | mantissa = 0; 63 | } 64 | } 65 | 66 | return bitwise_cast<__half, uint16_t>(sign | uint16_t(exponent<<10) | uint16_t(mantissa)); 67 | } 68 | 69 | float __half2float(__half h) 70 | { 71 | uint16_t x = bitwise_cast(h); 72 | uint32_t sign = ((x >> 15) & 1); 73 | uint32_t exponent = ((x >> 10) & 0x1f); 74 | uint32_t mantissa = (static_cast(x & 0x3ff) << 13); 75 | 76 | if (exponent == 0x1f) 77 | { /* NaN or Inf */ 78 | if (mantissa != 0) 79 | { // NaN 80 | sign = 0; 81 | mantissa = 0x7fffff; 82 | } 83 | else // Inf 84 | mantissa = 0; 85 | exponent = 0xff; 86 | } 87 | else if (!exponent) 88 | { /* Denorm or Zero */ 89 | if (mantissa) { 90 | unsigned int msb; 91 | exponent = 0x71; 92 | do 93 | { 94 | msb = (mantissa & 0x400000); 95 | mantissa <<= 1; /* normalize */ 96 | --exponent; 97 | } 98 | while (!msb); 99 | mantissa &= 0x7fffff; /* 1.mantissa is implicit */ 100 | } 101 | } 102 | else 103 | exponent += 0x70; 104 | return bitwise_cast( (sign<<31) | (exponent<<23) | mantissa ); 105 | } 106 | 107 | }; 108 | 109 | #endif // _TRT_FP16_H_ 110 | -------------------------------------------------------------------------------- /wts_gen_demo.py: -------------------------------------------------------------------------------- 1 | 2 | import os 3 | import numpy as np 4 | import pickle 5 | import struct 6 | 7 | ### conv 8 | # the weights are specified as a contiguous array in GKCRS order, where G is the number of groups, K the number of output feature maps, C the number of input channels, and R and S are the height and width of the filter 9 | ## fc 10 | # set the kernel weights. The expected format is an array of KC values, where K is the number of outputs and C is the number of inputs. 11 | #G = 1 12 | 13 | 14 | #precision = 'full' 15 | precision = 'half' 16 | 17 | assert(precision in ['full', 'half']) 18 | if precision == 'full': 19 | datatype = np.float32 20 | datatype_id = 0 21 | elif precision == 'half': 22 | datatype = np.float16 23 | # datatype = np.float32 24 | datatype_id = 1 25 | 26 | flatten_order = 'C' 27 | transpose_order_conv = (3, 2, 0, 1) 28 | transpose_order_fc = (1, 0) 29 | 30 | 31 | def make_printable32(in_array): 32 | 33 | hex_array = [float_to_hex(x)[2:] for x in in_array] 34 | 35 | return ' '.join(hex_array) 36 | 37 | def make_printable16(in_array): 38 | 39 | hex_array = [float_to_hex(x)[2:6] for x in in_array] 40 | 41 | return ' '.join(hex_array) 42 | 43 | def make_printable32_plain(in_array): 44 | 45 | float_array = [str(x) for x in in_array] 46 | 47 | return ' '.join(float_array) 48 | 49 | def make_printable16_plain(in_array): 50 | 51 | float_array = [str(x) for x in in_array] 52 | 53 | return ' '.join(float_array) 54 | 55 | 56 | make_printable = {'full': make_printable32, 'half': make_printable16} 57 | make_printable_plain = {'full': make_printable32_plain, 'half': make_printable16_plain} 58 | 59 | 60 | def float_to_hex(f): 61 | 62 | return hex(struct.unpack(' 95 | w_line = w_id + (' %d %d ' % (datatype_id, w.size)) + make_printable[precision](w) + '\n' 96 | b_line = b_id + (' %d %d ' % (datatype_id, b.size)) + make_printable[precision](b) + '\n' 97 | 98 | # append to file 99 | outfile.write(b_line) 100 | outfile.write(w_line) 101 | 102 | -------------------------------------------------------------------------------- /data/weights_demo16_v2.wts: -------------------------------------------------------------------------------- 1 | 2 2 | conv1_b 1 64 3d9d 3d17 3e10 bcfc 3cea ba4a 3be4 3d8d 3d7d 3d4f 3c33 bc89 3dc1 bd32 3d0e 3d08 bdc7 bc9b bd79 bc48 3d09 3ca5 3d3a 3cd8 3cb2 3bd2 bc08 bb6d 3d1f 3d11 bc68 bd27 bcae 3d07 3da6 3d14 bd9e 3d94 bd3e 3cf3 bd4a 3d29 bdba 3d4d bb8e bd83 3b84 bd7c bcfb bbb2 3caa 3d1b bcdf 3d66 3da6 bd13 bbb6 bca6 3c8a 3d81 3d11 bd9a 3c3e 3db5 3 | conv1_w 1 1728 bb96 3d04 3cd4 bbba 3cdd 3d2b bc9f 3c73 3c15 bd1e bc98 bc83 bd2c bcc6 bbd1 bcf9 bc82 ba7e 3c5c 3c75 3cad bc0e 3c7d 3ca8 3c20 3ba6 3cdc bd4b bd86 bd1f bc21 bc13 bb77 3d67 3d8d 3d45 bd75 bd8c bceb 3c3b 3ad9 bb1e 3d50 3d76 3d21 bd2c bd38 bd08 3b52 3bf0 baf5 3d2d 3d3b 3cc0 bb6d bce2 bc68 bd03 bd85 bd05 bb45 bcb6 3a8d 3cd3 3d3b 3cc3 3cb4 3d2b 3d0b 3c8a 3cf6 3ca3 bc25 b540 bcdf 39a4 3ba6 3b1a bc96 3bed bc40 bbe8 bc5d bacb bc34 bc99 3c0f 3b9f bc05 3c39 bc20 bc02 3b55 bc96 bca5 bbf4 bc83 bc68 3a90 baec bbe7 bb4c 3a3a bc2d 3acf bb11 ba91 bb23 3cbc 3b95 bb61 3cd1 bd0a bd2f 3c8f bc77 bca3 3cc9 3afe bb1d 3d74 3bdb bd10 3d4f bb2d bca0 bc22 bbdb bb69 3d10 bc08 bcf1 3c37 ba8a bc7e bcfd bc85 bc32 3b67 3cf1 bc8c 3c8b 3d48 bbbb bd18 bcf5 bcf6 3c81 3ccb bcaa 3ccf 3d66 bc96 bc1e bb31 bc4e 3cc2 3d1d bc67 bc3b 3c92 bcb0 bb2c 3d9e 3d5c bcb0 bd1d 3cab bc8b bd57 bc36 bcb5 3c86 bcd6 3cb7 bcf0 bca1 3d79 bcaf bb66 bd5b 3b2e bd1f 3ce8 bab5 3c5d 3d22 3bbf 3cac 3d26 3c81 3bb4 3d49 bbf0 bd1e 3cc4 bd18 bd85 3d28 3cfe 3a99 3d85 3c3b bcff 3cb8 bd27 bd9a 3c71 3ca6 3b3f 3d26 3be3 bc9f 3bc0 bd25 bd55 bcd1 bd33 3a03 bc26 bc3a bc0c 3d4c 3d4d 3c42 bd56 bd55 bc03 3c00 bade bbdc 3d50 3d67 3c01 bd02 bcef 3c20 3c14 3b0d bbad 3ca3 3cf0 bbf9 bcd6 3cf2 bd43 b9ea 3e07 3c22 bd2c bcbc bcef bd00 3cb5 bd97 bc75 3e02 bb72 bcf7 39f9 bc09 bbf5 3c74 bce8 bcbc 3dae 3c2c bcbd bc91 bbe9 bc6d bbb3 3bd5 bc17 3c71 bc31 3c15 3cb9 bc84 bd56 bca6 38e9 bc19 3d2d 3cbd bb39 3d43 baf6 bd17 bc22 3cf5 bc5b 3cbe 3c96 bcde 3c0f bc86 ba8a bc5e 3c0e bd07 bd48 bc96 bd0e bcf3 3c35 3d21 3cc9 3c28 3d2d 3d1a 3c1e 3ca0 3d02 3d0e bc24 bcae bce2 3b70 3a93 bc88 bc46 bae2 bb21 bc88 bc3b 3c8a ba7a 3bbc 3a8b 3c17 bc39 bb3c bca4 3c73 bac7 3cd4 3d31 b9bd 3c88 ba87 bd18 bc2d 3cc3 3c87 3cdf 3d15 3aac bb1f bc32 bd2b bc28 bc12 bb89 b987 3cbb 3c38 bc8b 3c0d bbb2 3c9f bb7d 3c75 3c86 3b0d bbe5 3c12 3b0f bbcc 3c72 bcde 3c00 ba4f bccc bcbc 3c4a bc22 badb bc2c bd85 bd33 bb94 bdad 3b8b 3dc5 3d2f 3d83 3d1b 3d13 3d1f bc50 bd84 3d39 bc91 bd4c bc66 3ceb 3ceb 3c34 3b91 bd25 3cf7 bc64 bced bc58 3cb8 bba0 3c5b bd6e bd58 3cbe 3b4e 3cd5 3d0e 3b99 ba8b 3cd5 bd77 bd51 3d16 bc81 3cb5 3cfa 3b06 ba9a bc35 bd21 bca4 3cc3 3c18 3d09 3bd1 3c2e 3cc7 bc7d 3af5 3cc4 bbce 3d34 3b98 bce6 bc36 3bd6 bd36 ba91 3a4d bd02 3d5e bc95 bd35 3b0c 3c26 bc98 3bdf 3c11 bc68 3d80 3b23 bcc8 bcd3 bcaf bcb4 39f4 3ccb 3b08 3aca 3ce2 bc12 3cbc 3bc3 3cd3 3c82 3c32 3c30 3d02 3ce5 3cc2 bc24 bd21 bb81 bd0f bd31 bcad bba8 bc7a 3c15 bba9 3c86 3b85 3bc3 3d12 bc6a bd3b bc5e bc44 3cc0 3c5a bb91 3d11 3d09 bcf6 3bbc 3c29 3bd6 3c01 bc3b 3c33 bc6d bd0e bcd1 bae7 bc50 3c83 bcb2 bbf3 bc2a 3cb6 3ce8 bc95 3c4a 3c98 bc1d bcc1 bccb bca3 3d27 3c94 bd18 3cde 3c4e bcb0 bc23 bbc0 bc6f 3cf6 3d03 bc11 3c12 3c31 bcee 3c94 3cd3 3cd3 bb9c bb8d 3cec bd00 bd3f 3a67 3cfd 3cf9 bb8e bb2d bb8f 3bae bd04 bd3e bcd8 3d43 3d55 3b31 3ba7 3bd5 3b83 bc99 bd4a bcaa bd85 bd04 3abc bd34 bc84 3a66 3bbd 3c65 3c24 bce5 3caa 3d20 3a68 3d3f 3d1c 3d16 3d3a 3ce4 bcea bc72 3b9a bcd4 bc3b bc03 3aec 3b1e bc9a bcc3 bd0e bd90 3d33 3ca1 bd2c 3d8e 3d53 bbe9 bd07 bd3e bd86 3d19 3c8c bceb 3d93 3d53 bba5 bc8b bcd3 bd3a 3cf5 3c8b bcdb 3d0c 3d17 bbd0 3d00 3ad7 bc9f 3c68 3be7 3c15 bccc bd55 bc9d 3cda 3d02 bbf2 3d19 3d83 3d20 bc85 bc96 3c51 bc9f bca0 bcdd bcb3 bb3e 3c74 bcf7 bd02 3cc3 bd9b bd18 3b0c bc01 3ddf 3d8d bd37 bbfe 3c15 3b80 bce2 bcc8 3ce1 3d8b bc4e 3c1c bc90 bccc 3d2b bc80 3b29 3ce8 3bee bcef 3c89 bd29 bcf8 bcf9 bb35 3da0 bd26 3b24 3c80 bd01 bb80 bcde bc68 bccb 3c02 3ce8 3d59 bc14 3cff 3d36 bd43 3b0c bd13 3c34 3c2c 3c52 bcc9 3ca9 3cdd bd55 bc2b bdb8 bd0b 3cea bcdb bd3a 3d88 3d71 3c8a 3cb9 bc8c 3d2d 3c9a 3b3f 3bdf bc60 3cb1 bc27 3c68 bc04 3d63 bbfa bc5a 3bf2 bd6b bca6 bc44 bc09 bca0 bd2b 3d13 bcd2 bc0d 3d5d 3901 3cd2 3cca 3d4c 3cb5 3b0d bcf0 3ca6 bd38 bd80 3be6 bc9f 3ca2 bc82 bb89 bc81 3cbc bc50 bc66 3d20 3c26 3b83 3d1c bd2e be16 3c51 3d6a 3cac 3d77 3d5e 3cfa 3cf8 3c02 be0e 3aee 3c8d bcb8 3bb1 3c5d 3c8f bc8d 3cbc bda7 3b1c 3ccd 3c4e 3b79 bcd3 3d2f 3d07 39a8 3d59 bc42 bd0c bc99 bd29 bd92 bc26 bc8f 3d47 3dbe bd0e 3cf8 3ca1 bd10 bd80 bc33 ba36 3c93 3d63 3a2a bc03 3c3e bca5 bcd1 bd10 bc40 bd07 bd56 bcaf bcb6 bcdb bbba 3c90 3c32 3ca8 3d35 3d27 3d4b 3d24 3d12 3d22 bcb7 bca7 bc9d 3be5 3bef bbe7 bb9e bc06 bbc6 bc6a bc4a 3cbc bc89 bd37 bc44 bcd2 bd24 bbaa 3c9e 3c98 3bb0 3d7d 3d1b 37e2 3d0a 3c9e 3c33 bcc0 bcbd bcbd 3cae 3cbb bc8b b99a bbc6 bd0a bcd7 bacc 3baf bcbc 3c2d bc2f bd24 bca7 bc83 3ceb 3d4b 3cb2 3d28 3d94 3cf4 3cf4 3d09 3cb4 bc45 bccd bc7c bd0d bd02 bd3a bc3e bcdd bce0 bc82 bce3 bc4a bc9d bcbb bc9d bb47 bbe2 3b80 3d52 3d73 3d3b 3d55 3d83 3d16 3d28 3d33 3cfe bcab bd0a bce9 bd04 bd3f bd2b bd0b bcee bd16 bba1 bbbe bbd8 bba2 bc94 bc41 3c65 bb51 bbe7 3d2e 3d4a 3d2a 3d0b 3d6e 3d29 3ce8 3d50 3ce7 bd13 bd4b bd25 bd3d bd2b bced bcda bcee bc48 bd60 bcf8 bb99 bd50 bd75 bcf3 bd24 bd2e bc55 b8b4 3cde 3ce9 3cd3 3d2f 3cee 3d28 3d27 3cf0 bc9c 3c8f 3b05 3c75 3d12 3c3c 3be8 3c79 3b6b bd52 bd0b bc15 3b9f 3cc8 bc2a 3cef 3d2d bcda bd4d bc8b 3c1c 3cb6 3d87 3c3d 3cdb 3d1c bcfa bd45 bcc4 3b94 3b4a 3d24 3bc1 bc1e 3c92 bcf4 3c8f 3cc3 bd46 3d84 3d3c bd6c 3d2a 3c8d bd96 3bb3 bb04 bd78 3d5f 3ca9 bd65 3d3c 3c08 bd6a 3c28 3ca8 bc64 3d09 3ca0 bd0d 3c85 3bb8 bd23 3c09 3d05 3c91 3b9f 3cf5 3c66 bca0 bc62 bc1b 3bd2 3c1f bc35 3c9a 3cac 3ad6 3b41 ba1e 3c23 bb72 3bee bc60 3aa6 3cce 3bf0 bbea bc4f bc1b 3c9d 3ce0 3bf6 3d2c 3d88 3d07 3c59 3cf7 3c1e 3c1a 3b8c 3b91 3b4d 3bd9 3b9e 3c94 ba90 3c5e bcad bd28 bc01 bd25 bd7a bd1c bcfb bd27 bcae bcbc bc75 bcf4 3d3b 3d8a bbc4 b7eb 3cb8 bcc6 3ba4 bcbc 3c10 3b35 3ba0 bc96 bc84 bb73 3a4e 3c25 bbf8 3d30 bcaf bc86 bc6c bc83 bc86 3cc9 bc85 bb03 3c3e 3aaa 3d26 ba83 bbd6 3a1f bd0a bd63 bcb1 bc29 3c84 3d5e bbdf 3ce5 3d30 bd2d bd38 bb71 3b18 3c88 3d58 3c0c 3c12 3c6d bd12 baa7 bc3c bd27 bba8 3c05 3cf1 baa2 3d23 3d4e 3d4b 3ce9 bbcf bb9a bc32 3b97 bda5 bd5a bc30 3d6f 3cfa 3b2a 3b58 bb37 bab9 bd4c bd0b bbf2 3d21 bd1e 3d25 bcef be0a 3cc7 3cc6 3d41 3d47 3d78 bd6f 3d1b 3c3d be19 3c7f 3cee 3ca7 b961 3d31 bcdf 3c68 3c74 bdb0 3cba 3bc9 3d0c bc65 bd43 bd0f bc3d 3c52 3cbb bcaa 3d1a 3d53 bc96 bd6e bce2 bc67 3ca3 3d24 bcc2 3d2c 3d64 bd0c bd39 bbee 3c2c 3c45 3d31 3a67 3b9b 3ca0 bd1c 3ce6 3d3f 3ccb 3cae 3d14 3ba5 bd05 bcec bd0d bd02 bd25 bd34 bce2 bd0e bd12 3c0c bc86 ba63 bc51 3a66 3a66 3c3c 3cad 3cfa 3cbb 3cca 3d34 bcb8 bbf1 bc2d 3c2c 3a13 3c1a 3c67 3ca9 3c68 bca4 bc90 bcce bcda bd0c bcaf bd0c bd0a bd09 3ce6 3d26 3c99 3d13 3cd4 3d01 3c9d 3c16 3c31 3c27 bce7 bc5e 3cf3 bce6 bd57 3ce5 bc4f bcb2 3c7c 3bc1 3cca 3d4a 3bba bbf7 3d05 3c85 3c85 bd0f bd03 3c3e 3b16 bcd9 bc8b 3b3a 3bda 3b0b bc9c bd36 bc8a bcfa bce8 bce9 3cae 3d8e 3d5d 3d14 3b7f bbe6 bbb9 3cab bcd2 bc91 3d40 3af6 3cfe 3ca4 3b95 bc7a 3c42 bc40 bd67 3c52 bc8f 3c5d 3c17 3cd3 bc6a b9cc bb0c bc17 bd00 3b9b bcce bb8d bd0c 3cf1 3d92 b880 3bbe 3a3d bcb2 bcf5 bc96 bb0b bb1c 3d36 3c11 bc20 bbde baa9 bd49 bd80 bbf6 bcde bc75 3bca 3d18 3d4d 3d0b bd1c bd2c bc38 bbd3 3c5c 3c7e 3d1f 3d74 3ce2 bd2a bd5c bc73 bb00 ba27 39dc 3cf7 3d1d 3c8b bc30 bcf5 bcac bc82 bd29 bd2a bb6c bc84 bd08 3d2e 3d40 3d6b 3d59 3d45 3d22 3d0c 3d38 3ce4 bce9 bd09 bc67 bcb0 bca4 bc79 bc85 bc2f bb86 bbbd bd0e bcf7 3c3e bcb9 bd1f 3b26 3c16 bbf9 3c87 ba9a 3bc9 3d36 3cda bc7f 3d1b 3d31 3c32 bc25 bd02 bcde 3c59 bb54 bd0f 3c60 3c97 bc20 3a30 3cc4 3d08 bd53 bd13 3d20 bc3c bcd8 3c8f 3b81 3d63 3d2d bd36 bbd5 3d20 bce2 bd2c bb97 bc45 3d05 3c3a bcca bbff 3cb9 3abf bcb8 bb89 bd80 bd5e bcb1 bc9c 3c01 3c66 3d33 3d76 3d41 bd9c bd89 bc8d bc57 3c7e 3cab 3d12 3d74 3cbe bd50 bd1c bc10 bc13 3c6d 3cb1 3cd4 3d0a 3ca6 3c83 3d0e 3ce6 bb9a 3d1c bc26 bd48 bccd bd26 bca1 bc85 bcc0 3d04 3d33 bc84 3cd9 3d40 3c74 bd09 bd70 bd2f 3adf bc89 bd23 3d07 3cae 3c9a bcac bab5 3c5c bce8 3d35 3cd4 bd17 3c31 bab7 bcb4 bcc3 bcf8 baed 3d3e bb8d 3c6c 3d40 ba1a 3c80 bc35 3a14 bca0 3c62 3a5f bc8e 3b6c bc81 bd0b bd83 bd22 bcaf 3b32 bafe b953 3d41 3cc6 3b44 bc9d ba6c 3c9e 3c93 3b5f 3c83 3d4f 3c04 3b95 bd15 bcbb 3c8b 3c77 bbec ba6d 3cdd bb99 bca0 3d05 bca5 bd20 3d54 3bfc bc4b 3b2f 3bf1 bc80 3ca6 bd10 bd28 3d12 3c0e 3b94 3ad6 3c46 3c2a 3ca9 bc93 bd0c 3cd5 3a57 3b05 bbb8 3a6f bcbd bd3f bd11 bd1e bd48 bd38 bc7d bd06 bc8e 3c5b 3bca bc57 3d49 3d0d 3b14 3d2b 3d14 3a89 3c73 3b31 bc7a 3d3c 3d38 3ba7 3cfa 3d02 3aca 3cf1 bbed bd53 3d58 3c3f bd51 3d6b 3bd1 bd58 3ce3 bcb1 bd62 3d9a 3be4 bd6b 3d98 3c4a bd51 3c3b bcb4 bd46 3d44 3c4f bd1d 3d57 3c85 bd10 3ccc 3c76 3d33 3b0a bd03 bce5 bcdf bd64 bd11 3cf3 3caa 3d0a 3d7a 3c86 bc16 3ca5 baf3 3bb6 bcaa bceb 3a99 3c27 bcb8 bce5 3c46 bc13 baa4 bca0 bcc5 bcbd bcff 3cbb bc9b bb8b 3cea 3c00 3b79 3c78 bc3c bac8 3da1 3be1 bc5f 3d47 39fb 3c2a 3b36 badd bccd 3d07 bca4 bcee bb67 bd14 bcd7 bd08 bce0 bd34 bd85 bd2e bb99 bd03 bc2a 3d00 3d54 3d1b 3d01 3d46 3d34 3ceb 3caf 3d03 bc01 3c4b bbe9 bb60 3cc2 3b19 bc45 bc0b bc9d 4 | -------------------------------------------------------------------------------- /data/weights_demo16.wts: -------------------------------------------------------------------------------- 1 | 2 2 | conv1_b 1 64 3d9d6c21 3d17be27 3e101df7 bcfcae63 3cea5b5f ba4aa522 3be40390 3d8d6c3e 3d7d250d 3d4f5f36 3c33a4b6 bc8912d5 3dc1a1f8 bd3299ff 3d0e05f5 3d08c264 bdc724e9 bc9baac2 bd79e869 bc4809ae 3d09bf1a 3ca552a3 3d3a2ac9 3cd8420d 3cb20f43 3bd2774d bc08cb5d bb6d2055 3d1f2020 3d11d598 bc683993 bd270c76 bcae422c 3d0769cb 3da6c26b 3d145daa bd9e1463 3d94bf60 bd3e196d 3cf3d817 bd4ac244 3d29e182 bdba1e36 3d4d65f9 bb8e2438 bd82f218 3b84d250 bd7c21d1 bcfbcdec bbb2a086 3caaaf21 3d1b6ccd bcdf83f8 3d65f813 3da65b02 bd13cb02 bbb6058a bca69ed6 3c8a606b 3d81b324 3d113740 bd9a5e14 3c3e6e95 3db52593 3 | conv1_w 1 1728 bb96b027 3d049f8a 3cd4aff9 bbba8e89 3cdd24cb 3d2b39ea bc9f0ce8 3c73b9ce 3c15590e bd1e4089 bc98ef8c bc837f10 bd2c12e6 bcc6df35 bbd11c0a bcf9bcb7 bc82bd37 ba7e43cd 3c5cdd42 3c75383a 3cad01f9 bc0e2508 3c7deead 3ca824ea 3c20556c 3ba6acd3 3cdc1ad8 bd4b70e4 bd85fbfe bd1f87cf bc21bbe4 bc1365a4 bb773fdb 3d67e120 3d8d9e25 3d45a005 bd755a47 bd8c820a bcebee74 3c3b8eef 3ad961c1 bb1e9904 3d501600 3d765bed 3d21b96e bd2bf10f bd3823aa bd0892ac 3b5240ed 3beff3f1 baf5b536 3d2d1333 3d3b7616 3cc04cd5 bb6d9320 bce201a1 bc68eada bd03a155 bd858d7d bd05a9aa bb45b0ff bcb6b940 3a8cfd1a 3cd2f6a2 3d3befd7 3cc39386 3cb4d2cd 3d2bbc8d 3d0b158d 3c8ad227 3cf6d843 3ca3d6bd bc25d5ff b5395868 bcdf20ae 39a4966c 3ba6b555 3b1a2662 bc96b0ef 3bed64cd bc40a4b5 bbe8aaef bc5de82a bacb9d4d bc3483b5 bc995d01 3c0f9eec 3b9efb3e bc05439c 3c397fa4 bc201417 bc02aae3 3b558d73 bc96802c bca5cd8f bbf403e8 bc83099b bc685940 3a907632 baec9690 bbe732da bb4cc6c3 3a3a64e3 bc2d3c98 3acf4ed7 bb11a0a8 ba91de15 bb23a5e2 3cbbf3a5 3b95e446 bb61e1ab 3cd1581b bd0a667c bd2fb2a7 3c8f66a2 bc77ac36 bca2fa5d 3cc951cd 3afec30e bb1d51ba 3d73f4b7 3bdb5494 bd1035c6 3d4f3fe2 bb2d1196 bca056a8 bc228b2b bbdb11f5 bb698c84 3d103d28 bc083a43 bcf181b7 3c37085e ba8aaa84 bc7e4d1c bcfdd476 bc85a986 bc31fca2 3b6736e3 3cf0fd36 bc8c0469 3c8b51ab 3d48587c bbbbabf2 bd189362 bcf5e4a2 bcf65f4a 3c816607 3ccb6dbc bcaad174 3ccf97bf 3d664e53 bc964202 bc1eefa0 bb318c12 bc4e7eb0 3cc238f4 3d1d3793 bc671d8f bc3b98f4 3c928d44 bcb0890f bb2c5247 3d9ec355 3d5ced6e bcb0024b bd1d1131 3cab22b4 bc8b3485 bd5773c4 bc35fcf2 bcb54e90 3c863ac9 bcd61ef9 3cb7ca24 bcf07521 bca19c81 3d7924ce bcaf6570 bb66822c bd5bda26 3b2e6d9c bd1f69bc 3ce803ae bab4ffc0 3c5d528f 3d22b0d7 3bbfce44 3cac3011 3d26df3b 3c81e431 3bb48eab 3d49eb2d bbf032fa bd1df6e2 3cc43ac8 bd18e334 bd8547c4 3d28ef21 3cfdf73f 3a99edbc 3d85357b 3c3b0722 bcffb268 3cb86b2a bd27c4d8 bd9adc9f 3c71c3d7 3ca6de1c 3b3f2944 3d26044d 3be310d7 bc9f749e 3bc02679 bd25ad9c bd55c826 bcd1847e bd33ef3b 3a033e7b bc265feb bc39f85a bc0c0c14 3d4c1ff9 3d4dc890 3c4265d6 bd55f142 bd55bfa6 bc03c421 3c00c414 bade2add bbdc05d2 3d50892a 3d6769f4 3c016582 bd02cd06 bcef9b28 3c203bf1 3c14c621 3b0dc6e6 bbada5c3 3ca3c4be 3cf0ea94 bbf97cf4 bcd5f426 3cf287ae bd43e87e b9eac563 3e07be2f 3c229a3a bd2c039a bcbbf7bf bcef6869 bd003181 3cb546ae bd977b6c bc75a3a5 3e023625 bb72827b bcf74589 39f939c8 bc094bce bbf535ae 3c73f95e bce8131b bcbc4c1b 3dae8126 3c2c6e13 bcbdc961 bc91b062 bbe9e31c bc6d52c5 bbb3505f 3bd56bb2 bc16f986 3c7124de bc317204 3c15074e 3cb93071 bc846846 bd55fadd bca6b351 38e97f0d bc198215 3d2d697a 3cbde4bb bb3986df 3d43c386 baf67fab bd17b68f bc22bd4c 3cf5d7da bc5b16d5 3cbeb47c 3c964e72 bcdebf5a 3c0f1d1c bc86ad95 ba8a128c bc5ed297 3c0ea7c5 bd0739b6 bd47f6f3 bc96d690 bd0dfc5e bcf388d7 3c35083c 3d21c602 3cc97934 3c283f1c 3d2d9b31 3d1a44b4 3c1ee53a 3ca081fb 3d028e88 3d0ed5cc bc246cfa bcaec0e9 bce2409f 3b70a4c2 3a93a831 bc883be7 bc466bde bae1f126 bb211d90 bc886ef3 bc3be8dc 3c8a88eb ba79f1c1 3bbbf21c 3a8bca8b 3c173963 bc393825 bb3c50f6 bca48920 3c73aa18 bac7b8de 3cd456de 3d3119ec b9bdbf75 3c8813f7 ba878c75 bd1892f7 bc2d9632 3cc3abc3 3c87ab74 3cdfeb91 3d1559d5 3aac704e bb1f5121 bc32d995 bd2bae78 bc28482b bc1244cb bb898ba7 b9870f0d 3cbb1f4f 3c381722 bc8b4325 3c0cf49e bbb268ce 3c9ef6f4 bb7de1b5 3c75bcf0 3c8656d5 3b0cfe96 bbe50731 3c12955b 3b0f107a bbcc119c 3c720e84 bcde06d6 3bfffb4f ba4f6fc8 bccc374e bcbc8152 3c4a8fe8 bc2216d2 badb2a63 bc2cc883 bd852f7f bd33cf58 bb949443 bdad0354 3b8be1f4 3dc5b4dd 3d2f13c2 3d833208 3d1af3cb 3d130df2 3d1facf7 bc507922 bd843cf2 3d39776f bc9104b8 bd4c9a40 bc66b0e3 3ceaf369 3ceb5ebb 3c348d2a 3b9107d7 bd259b2c 3cf7ef2b bc646615 bced6996 bc58a1a1 3cb8a42e bba0bb53 3c5b3548 bd6e1b62 bd58c1b7 3cbe2210 3b4e3f65 3cd51298 3d0eedac 3b990e55 ba8afa12 3cd59dc6 bd77d4cd bd510401 3d16ac5e bc81b9fa 3cb50a6f 3cfa0682 3b06c211 ba9ac93d bc357f4d bd211ad5 bca4c4e6 3cc32c75 3c18b896 3d099f6e 3bd17efd 3c2e4b75 3cc7e4a0 bc7d66f5 3af59d3c 3cc43ab0 bbce2705 3d343bfa 3b98809f bce6df4b bc35f630 3bd63fcc bd36afe7 ba91ac47 3a4d8fbc bd02e87f 3d5ecb52 bc95daa2 bd35529b 3b0c0cc7 3c26e591 bc987ce7 3bdf8f14 3c115327 bc68946f 3d801c79 3b23cad5 bcc8850b bcd3e0ab bcaf417f bcb48d2d 39f48a51 3ccb272b 3b08748f 3aca06f6 3ce20d85 bc12a01c 3cbc9ac5 3bc3c94a 3cd30290 3c822241 3c325a37 3c30503b 3d022356 3ce56f55 3cc20975 bc240a8f bd21748d bb818d36 bd0fb8ff bd3168fa bcad88c5 bba8775e bc7a1579 3c14f9bd bba96980 3c8631ae 3b853663 3bc3433a 3d11f284 bc6aedf1 bd3b5392 bc5ea368 bc445cc9 3cc05b61 3c5a87f7 bb91ed83 3d1185ad 3d0969b5 bcf68479 3bbc2b99 3c29d5af 3bd6ddc4 3c0168c6 bc3b0e3e 3c33a287 bc6d3d71 bd0ee066 bcd185f8 bae6f38a bc505f0a 3c83e961 bcb2a48c bbf37600 bc2a59a7 3cb61439 3ce7f752 bc95a29e 3c4a9343 3c98587b bc1d2a06 bcc1af5b bccb0e7a bca346f8 3d279253 3c9405d3 bd1894e9 3cdea389 3c4e51f6 bcb043d5 bc23cca1 bbc04b77 bc6f9d17 3cf6632c 3d038644 bc1154ab 3c12acd0 3c31666f bcee46a4 3c945823 3cd37e21 3cd3b4ca bb9c6529 bb8db3f1 3cece6d7 bd007a86 bd3fa3f6 3a67badd 3cfd6274 3cf9675e bb8eacbe bb2d14a0 bb8f790c 3bae5509 bd042c15 bd3e4cbc bcd87379 3d4301d8 3d552dc6 3b314b0c 3ba6f2a9 3bd5b0a7 3b832fd7 bc99e28a bd4a879d bcaab96b bd8538be bd0473d0 3abc75f0 bd34b605 bc8497bb 3a666217 3bbd8fe1 3c65d532 3c24b5fb bce5d15d 3caada43 3d2061fb 3a686b8c 3d3feea2 3d1ce259 3d164810 3d3a7ecb 3ce3f527 bcea6c79 bc72c768 3b9a7c40 bcd49930 bc3bd34a bc031b6c 3aec44cb 3b1e0dbf bc9ab2d6 bcc3574e bd0e575e bd90b26b 3d33a623 3ca10156 bd2c0420 3d8e03b0 3d53b9df bbe92bdf bd07c258 bd3e9a74 bd86c084 3d1989ef 3c8cd53a bcebdf53 3d931a0d 3d5311ef bba54815 bc8b357c bcd3787b bd3a02e8 3cf504a1 3c8be9d7 bcdb0ca1 3d0cea72 3d1777e2 bbd0c750 3d007a4f 3ad71a7e bc9f1d52 3c68259c 3be778f2 3c1574d5 bcccd407 bd554b80 bc9d4645 3cdac394 3d029524 bbf2cf38 3d19d06b 3d83b9bd 3d1ff80a bc857138 bc968aac 3c51b4c0 bc9fd9bf bca06f6c bcdda5d5 bcb36ab8 bb3e03e5 3c749047 bcf751a7 bd02ae62 3cc3abe3 bd9b4270 bd187ba4 3b0cb248 bc00ff23 3ddfbeb2 3d8dcef4 bd373079 bbfe6a5a 3c157388 3b80d0f1 bce29546 bcc87777 3ce1c335 3d8bc5ac bc4ee049 3c1ca514 bc906a01 bcccef1b 3d2b88fb bc805cc3 3b29ec2f 3ce85b9b 3bee7650 bcef9b3a 3c897a34 bd29a48e bcf8c590 bcf93d33 bb356c1d 3da028dc bd2658fd 3b240c1d 3c800c13 bd01aa2f bb8004bd bcde15bf bc68a68f bccb5c94 3c022c5c 3ce8894d 3d596f2f bc141c36 3cff19fe 3d36a7ac bd43893b 3b0ce004 bd138330 3c345b2c 3c2c3e89 3c51ff20 bcc93e41 3ca931d3 3cddad5e bd551aae bc2bc7d0 bdb8416c bd0bedb6 3cea7dcc bcdb8912 bd3a8313 3d88294d 3d716824 3c89f5b6 3cb91977 bc8c66ae 3d2dd301 3c9a4642 3b3f9490 3bdf4d6c bc609546 3cb1af28 bc27ae15 3c68ac75 bc03febd 3d635b4c bbfa0162 bc5a4ef3 3bf2762b bd6be339 bca6c2b5 bc4410c5 bc09339d bca0a503 bd2b274a 3d1350cf bcd25361 bc0db4d9 3d5d2618 390112ec 3cd273bf 3ccabd8c 3d4c504d 3cb5ba98 3b0d28df bcf0cea2 3ca69539 bd38975f bd807d36 3be66447 bc9f1dd7 3ca208c3 bc823826 bb8910eb bc813b61 3cbc4c64 bc50e28c bc66bbd6 3d201162 3c264d16 3b83cdd8 3d1c9fbe bd2eaffb be169ee3 3c517bd8 3d6a3834 3cacadda 3d77d879 3d5e6027 3cfaecdc 3cf8afff 3c02d8e0 be0eeea6 3aee4f3b 3c8d6062 bcb840c3 3bb14370 3c5d18d8 3c8f46b9 bc8cf3e0 3cbc659a bda7a767 3b1c4bbb 3ccda6ae 3c4e1e52 3b7969d4 bcd3620b 3d2f2721 3d0790f2 39a7f6ab 3d592db3 bc42b512 bd0c0c0e bc9925bd bd2993e7 bd928c99 bc261e42 bc8f781e 3d47b098 3dbe8a9c bd0e3761 3cf811b0 3ca17d96 bd106526 bd80eabe bc332c15 ba365e77 3c938919 3d633b52 3a2a09f2 bc02f6dd 3c3e4669 bca5d6e7 bcd16641 bd0fffdf bc40163e bd06f0bb bd562d79 bcaf21ef bcb6520a bcdbd195 bbba97cf 3c903465 3c328075 3ca7fe96 3d35a681 3d276b22 3d4b85aa 3d23f751 3d12555c 3d2281b4 bcb77b8a bca7d7fc bc9de7f1 3be5d54d 3bef51e4 bbe70c1d bb9e7a42 bc06b71e bbc61618 bc6a4fac bc4aa531 3cbcef84 bc88f956 bd37554c bc44de03 bcd289e5 bd24e388 bbaa09bd 3c9dfad0 3c98a19f 3bb0a3f3 3d7d5edd 3d1b06fd 37e1e230 3d0a1229 3c9ecd12 3c33efb1 bcc0ccdf bcbd448d bcbd1c52 3cae5db0 3cbb3271 bc8bb33f b99a0c9e bbc6c229 bd0a7a80 bcd7a463 bacc272a 3baf095a bcbce426 3c2def06 bc2f0db2 bd23f081 bca74091 bc83dd14 3cebaee3 3d4b1d09 3cb2bf53 3d289dc4 3d94bde3 3cf435df 3cf4e16b 3d098b7c 3cb409ef bc4555cd bccd94e8 bc7c4963 bd0d077f bd02c0e7 bd3ac803 bc3ec3e0 bcddd05a bce03578 bc823a7c bce376af bc49f10a bc9dac78 bcbb1b40 bc9cfa91 bb4742cb bbe234f0 3b8006cb 3d52b911 3d73b69c 3d3bbb4d 3d553c32 3d83ef2b 3d16981b 3d28e2cb 3d33173d 3cfebfec bcab8870 bd0a62a8 bce99ff4 bd04455b bd3f8b8e bd2bd9a0 bd0b5d38 bcee167b bd169729 bba11bcb bbbee45e bbd8da91 bba26b26 bc942513 bc41bf4c 3c651b13 bb5183b0 bbe7d15f 3d2e8529 3d4a1ffa 3d2adc90 3d0b0c21 3d6e97bd 3d2928f5 3ce8ea2b 3d50de86 3ce7afe9 bd131b7a bd4bac53 bd251412 bd3d26d6 bd2af22f bced020a bcda4d0a bceea574 bc48c324 bd5ffaa3 bcf88d87 bb993146 bd505ad3 bd750dc6 bcf350b4 bd2410a7 bd2e26a9 bc550ca0 b8b4b55a 3cde78b8 3ce9d701 3cd346f5 3d2f08b7 3ceebd73 3d28c31a 3d27489b 3cf0cadd bc9c497a 3c8f62b1 3b053830 3c751369 3d126e86 3c3c83ce 3be8b05c 3c79de8d 3b6b4fe4 bd52e1b2 bd0bb55d bc15e7c2 3b9fa2f4 3cc8216a bc2ab48a 3cef98e4 3d2d0a7b bcdaecc4 bd4d16b1 bc8b3151 3c1ce010 3cb69f82 3d8729a7 3c3d9edf 3cdb2be5 3d1ccaa5 bcfa73ef bd4583b6 bcc444ee 3b9435e2 3b49ffc4 3d2407d7 3bc1afac bc1e3246 3c92bf20 bcf42f77 3c8f97c9 3cc3a079 bd464206 3d84b53e 3d3ce782 bd6c73df 3d2a72d7 3c8d0719 bd96662a 3bb3dac5 bb04b9ce bd78a69f 3d5f76b8 3ca9dcee bd656684 3d3c8331 3c080ff2 bd6a52c9 3c27f6fe 3ca88b36 bc646284 3d09c37c 3ca0e838 bd0d58f6 3c85a676 3bb86bf2 bd233bff 3c0997e7 3d057933 3c913025 3b9f329f 3cf5d2f4 3c66b0f1 bca027a5 bc626b62 bc1badae 3bd2320d 3c1f83e7 bc352a29 3c9a6d89 3caceb5f 3ad643b4 3b418206 ba1e70b9 3c2353b3 bb721d95 3bee928c bc60e77c 3aa6569a 3ccecead 3bf0bc7d bbeaca66 bc4f0dd9 bc1b40ed 3c9da28d 3ce02224 3bf63b7b 3d2c3962 3d888ffe 3d07a9f2 3c59962d 3cf70d7b 3c1e5bcc 3c1aaa10 3b8c8c9c 3b9130a0 3b4d55cf 3bd9696b 3b9eb401 3c9418b0 ba90b9ff 3c5eb1af bcadda17 bd281d5e bc01e85a bd254663 bd7aef10 bd1cbfe0 bcfb8216 bd27a0ca bcae5076 bcbc9a0f bc756388 bcf42c55 3d3b3ffd 3d8a8496 bbc488c9 b7eb6f0c 3cb8e9cc bcc69ac2 3ba4a806 bcbc6ac9 3c10afed 3b3516f1 3ba0576a bc964f4d bc8462fe bb731822 3a4ea250 3c252898 bbf85caa 3d301f8f bcafd8c9 bc8632fb bc6c7083 bc83eb8c bc862179 3cc92836 bc8514b8 bb036d6d 3c3eec34 3aaa9dc2 3d25f068 ba838bf8 bbd5f177 3a1f9e78 bd0a9c6d bd634371 bcb1795c bc29977a 3c846cdd 3d5e2d5b bbdfa5e4 3ce599bb 3d309963 bd2daf64 bd389896 bb7113b7 3b18a0a6 3c88a333 3d5817b7 3c0caa67 3c12a5f0 3c6d674a bd127c00 baa731fa bc3c84d0 bd27bc6a bba801b6 3c0524ab 3cf11937 baa287d5 3d23c478 3d4e02f1 3d4bba09 3ce9d84d bbcf823f bb9ac4e5 bc324aca 3b975728 bda534fe bd5aeca4 bc30934f 3d6f2764 3cfa769b 3b2abe6b 3b582176 bb378379 bab96c50 bd4ccc10 bd0b0258 bbf2c863 3d211dc9 bd1dfa9f 3d2508d8 bcef4a48 be0a0c12 3cc78ba0 3cc6c0b8 3d417365 3d47ab4b 3d789cae bd6f64c4 3d1bd4a9 3c3da70b be1938ef 3c7f4cbb 3ceee085 3ca7041b b96134aa 3d31bf73 bcdf036c 3c68b5a8 3c743a70 bdb08e82 3cba58df 3bc9bc2c 3d0c19c4 bc64ffcb bd43de89 bd0f7fb6 bc3d9d53 3c527d8b 3cbb09b8 bcaa08b5 3d1ae1c6 3d5302c9 bc963580 bd6e9e56 bce20ff0 bc67523c 3ca36696 3d241fe1 bcc247c9 3d2c35eb 3d645f48 bd0c49cb bd39af32 bbeede45 3c2c36f0 3c4599cf 3d30f44f 3a673ae9 3b9b7747 3ca0ef1b bd1c4d9b 3ce63a8f 3d3f3061 3ccaf0d2 3caecf33 3d1458aa 3ba5c96d bd05808e bcec68dc bd0dbea3 bd01f651 bd25ce61 bd34d918 bce23cef bd0e96af bd12334a 3c0bf149 bc86c523 ba634a93 bc5172da 3a669022 3a669149 3c3cd284 3cad0cc3 3cfaa1a8 3cbb4fe9 3ccab50e 3d34bb1b bcb81b3c bbf1948b bc2d6d6b 3c2c6e26 3a1393c7 3c1abd6b 3c671a50 3ca95c8c 3c689f44 bca3f325 bc908461 bcce1c74 bcdaa15b bd0c7aa8 bcaf1789 bd0c5a2e bd0a4c23 bd09732b 3ce6328f 3d2638ec 3c98ff7e 3d137371 3cd4b3a7 3d0153d7 3c9d04a2 3c16a934 3c310863 3c27268d bce742d7 bc5eefb0 3cf3ddb8 bce60dc7 bd573bd7 3ce55f33 bc4fc8ed bcb21d65 3c7cc0b5 3bc123c8 3cca823e 3d4a17d0 3bbaca19 bbf7a175 3d053e2e 3c85d0eb 3c85c7fe bd0fda58 bd034683 3c3ecb57 3b169acb bcd9dcd7 bc8bdaff 3b3a5928 3bda9194 3b0b8faf bc9c0313 bd362428 bc8aa609 bcfa2886 bce8036f bce983c7 3cae3ff7 3d8e0687 3d5d0eaa 3d14d07c 3b7f8e64 bbe678d2 bbb9c998 3cab58af bcd22b10 bc918ec0 3d401415 3af6eb1e 3cfe0d3b 3ca4a4b7 3b952dc7 bc7ab034 3c42ea12 bc40aee5 bd67098c 3c529d47 bc8f2941 3c5d5ec7 3c175d04 3cd36e7d bc6a021c b9cc8f59 bb0ce5f4 bc17b8a2 bd000150 3b9b8857 bccedce0 bb8d7002 bd0c3fe1 3cf14e1a 3d922dca b880b50f 3bbe0261 3a3dee3d bcb2daab bcf57349 bc968e45 bb0af233 bb1c6436 3d369505 3c11a22a bc20bb1d bbde3267 baa96a57 bd4980fe bd806079 bbf66e3a bcde5a0d bc75e666 3bcae182 3d184d1d 3d4cfd7b 3d0b2bfa bd1c51e2 bd2bfac1 bc37f76b bbd3dbef 3c5cca47 3c7ec1ee 3d1fce55 3d746b21 3ce2616f bd2a130a bd5c7fd4 bc7369dd bb004d69 ba270b20 39dc2f01 3cf7078b 3d1d4bb8 3c8b61e9 bc308bc5 bcf5b404 bcac93ae bc820916 bd29af99 bd2ad3f3 bb6c49f2 bc84e4e7 bd0874c8 3d2e125d 3d4089d6 3d6bef7b 3d59ce31 3d452062 3d22df9b 3d0cd410 3d381292 3ce3fa90 bce97bf1 bd093850 bc67a0da bcb003f0 bca49843 bc79b690 bc85e239 bc2fe281 bb869b15 bbbdb7ba bd0eacba bcf7d9c0 3c3e4a49 bcb909a3 bd1f63f5 3b260575 3c167cc5 bbf95f4f 3c871f93 ba9a6c4b 3bc9e2db 3d3626f0 3cdac07d bc7fd2e6 3d1b477c 3d31b58f 3c325848 bc25193b bd026406 bcde91ea 3c5973bb bb54333d bd0fa975 3c603e71 3c97ad78 bc20af3a 3a309d67 3cc464b0 3d07f956 bd530410 bd13a7b7 3d20db90 bc3ca0f4 bcd8d563 3c8f1944 3b81dda1 3d6302f6 3d2da366 bd36be3d bbd538d4 3d20d8b0 bce23f6d bd2c949e bb9766c1 bc4528fa 3d05cce5 3c3ae57c bcca1115 bbfefba1 3cb97669 3abfa516 bcb8aaeb bb89e097 bd80bf10 bd5e75f8 bcb0f439 bc9cb9a6 3c0101a0 3c665ef6 3d33c94e 3d76721b 3d417e3b bd9c7676 bd89e0ab bc8d7250 bc5734d5 3c7e2d61 3cab567e 3d12d200 3d74c27e 3cbee4e2 bd4ff994 bd1c1c7e bc101ae8 bc1344ac 3c6deb2a 3cb17e37 3cd48bf0 3d0a90b6 3ca6cbae 3c83690b 3d0e9023 3ce65725 bb9a5a99 3d1c1efe bc260936 bd48bccb bcccf3cf bd26725d bca13a90 bc8549ec bcc0961f 3d04a421 3d332718 bc842239 3cd91253 3d4057ab 3c748822 bd09899a bd7053ce bd2f1d11 3adf4b2e bc899f9a bd235d0a 3d075c58 3cae5a61 3c9aead8 bcac77a1 bab5617f 3c5bfa31 bce818d9 3d35cb91 3cd3fa9f bd1717e2 3c3104b9 bab7a73f bcb3f9ce bcc3ad0f bcf8e411 baeda30e 3d3e4db6 bb8dc48c 3c6c890b 3d40b895 ba1aa693 3c8068c6 bc35c85c 3a141470 bca0db13 3c621d62 3a5f48d7 bc8dfd0d 3b6cb09f bc814550 bd0ba5c4 bd83e79a bd21f767 bcaf996c 3b32681f bafe3a90 b953a85f 3d41c6d4 3cc655c9 3b44e093 bc9da963 ba6ca450 3c9e720c 3c936270 3b5fca9d 3c83210a 3d4f051d 3c0436e5 3b952bbb bd15a47d bcbaf7dc 3c8b56a9 3c774350 bbec7c2d ba6cf2b6 3cdd1bcc bb997690 bca096be 3d05bd20 bca53d81 bd207fdb 3d54731e 3bfcd092 bc4ba987 3b2f8dff 3bf15a06 bc804592 3ca64bf9 bd10bb20 bd28c50b 3d11fa8c 3c0df0f8 3b94ef99 3ad6d16a 3c468107 3c29ff2e 3ca91ce8 bc9358c3 bd0c07c0 3cd5848f 3a574e98 3b059635 bbb8ac3d 3a6f6da7 bcbd9673 bd3f4247 bd11639c bd1e4125 bd47f828 bd38c1c3 bc7d8359 bd06c395 bc8e4b2a 3c5b157b 3bcaaf60 bc578c13 3d494d0b 3d0cf891 3b14191e 3d2b864e 3d14deaa 3a890815 3c736082 3b314353 bc7a7737 3d3c13e9 3d38ad9e 3ba7b29d 3cfaa67f 3d024e45 3acae6ef 3cf11cfd bbed9f7b bd5335cc 3d583e02 3c3f720d bd51a4ba 3d6bc574 3bd1994e bd580f82 3ce2f08e bcb119a3 bd628a23 3d9aadba 3be47fd6 bd6b20a0 3d987cab 3c4a9bb7 bd513c99 3c3ba06f bcb4cc5d bd4630de 3d444eca 3c4f2524 bd1d81af 3d5793df 3c85c16c bd10bed3 3ccc95b8 3c765a68 3d333377 3b0ad386 bd034169 bce561ac bcdf9b9b bd64ed19 bd11bfd9 3cf33097 3caa5db7 3d0aae9a 3d7a2e76 3c86a2c4 bc164505 3ca5ba3f baf39ca8 3bb6dfde bcaa7fcd bceb92d9 3a992487 3c277b93 bcb859b8 bce51a58 3c464715 bc13383f baa407c7 bca080a3 bcc53643 bcbd38cb bcffeeef 3cbb50b3 bc9b73e3 bb8bb4a1 3cea2dd2 3c00dfca 3b78f0f3 3c78029e bc3c44b0 bac802b4 3da14135 3be1a540 bc5f0ecc 3d47eb30 39fb374e 3c2a8321 3b367fd4 badddc07 bccd05f9 3d07c925 bca48e31 bceee584 bb67a8f5 bd145017 bcd7b758 bd0888d1 bce044bc bd345844 bd852b26 bd2e085f bb98f79e bd03d89f bc2a731d 3d00c41c 3d548b10 3d1b2aae 3d016283 3d46e056 3d3456b1 3ceb2dcb 3caf8727 3d03bdc1 bc016461 3c4b896a bbe99345 bb60c076 3cc202da 3b18f843 bc455e8d bc0baac1 bc9d27bc 4 | -------------------------------------------------------------------------------- /data/weights_demo32.wts: -------------------------------------------------------------------------------- 1 | 2 2 | conv1_b 0 64 3d9d6c21 3d17be27 3e101df7 bcfcae63 3cea5b5f ba4aa522 3be40390 3d8d6c3e 3d7d250d 3d4f5f36 3c33a4b6 bc8912d5 3dc1a1f8 bd3299ff 3d0e05f5 3d08c264 bdc724e9 bc9baac2 bd79e869 bc4809ae 3d09bf1a 3ca552a3 3d3a2ac9 3cd8420d 3cb20f43 3bd2774d bc08cb5d bb6d2055 3d1f2020 3d11d598 bc683993 bd270c76 bcae422c 3d0769cb 3da6c26b 3d145daa bd9e1463 3d94bf60 bd3e196d 3cf3d817 bd4ac244 3d29e182 bdba1e36 3d4d65f9 bb8e2438 bd82f218 3b84d250 bd7c21d1 bcfbcdec bbb2a086 3caaaf21 3d1b6ccd bcdf83f8 3d65f813 3da65b02 bd13cb02 bbb6058a bca69ed6 3c8a606b 3d81b324 3d113740 bd9a5e14 3c3e6e95 3db52593 3 | conv1_w 0 1728 bb96b027 3d049f8a 3cd4aff9 bbba8e89 3cdd24cb 3d2b39ea bc9f0ce8 3c73b9ce 3c15590e bd1e4089 bc98ef8c bc837f10 bd2c12e6 bcc6df35 bbd11c0a bcf9bcb7 bc82bd37 ba7e43cd 3c5cdd42 3c75383a 3cad01f9 bc0e2508 3c7deead 3ca824ea 3c20556c 3ba6acd3 3cdc1ad8 bd4b70e4 bd85fbfe bd1f87cf bc21bbe4 bc1365a4 bb773fdb 3d67e120 3d8d9e25 3d45a005 bd755a47 bd8c820a bcebee74 3c3b8eef 3ad961c1 bb1e9904 3d501600 3d765bed 3d21b96e bd2bf10f bd3823aa bd0892ac 3b5240ed 3beff3f1 baf5b536 3d2d1333 3d3b7616 3cc04cd5 bb6d9320 bce201a1 bc68eada bd03a155 bd858d7d bd05a9aa bb45b0ff bcb6b940 3a8cfd1a 3cd2f6a2 3d3befd7 3cc39386 3cb4d2cd 3d2bbc8d 3d0b158d 3c8ad227 3cf6d843 3ca3d6bd bc25d5ff b5395868 bcdf20ae 39a4966c 3ba6b555 3b1a2662 bc96b0ef 3bed64cd bc40a4b5 bbe8aaef bc5de82a bacb9d4d bc3483b5 bc995d01 3c0f9eec 3b9efb3e bc05439c 3c397fa4 bc201417 bc02aae3 3b558d73 bc96802c bca5cd8f bbf403e8 bc83099b bc685940 3a907632 baec9690 bbe732da bb4cc6c3 3a3a64e3 bc2d3c98 3acf4ed7 bb11a0a8 ba91de15 bb23a5e2 3cbbf3a5 3b95e446 bb61e1ab 3cd1581b bd0a667c bd2fb2a7 3c8f66a2 bc77ac36 bca2fa5d 3cc951cd 3afec30e bb1d51ba 3d73f4b7 3bdb5494 bd1035c6 3d4f3fe2 bb2d1196 bca056a8 bc228b2b bbdb11f5 bb698c84 3d103d28 bc083a43 bcf181b7 3c37085e ba8aaa84 bc7e4d1c bcfdd476 bc85a986 bc31fca2 3b6736e3 3cf0fd36 bc8c0469 3c8b51ab 3d48587c bbbbabf2 bd189362 bcf5e4a2 bcf65f4a 3c816607 3ccb6dbc bcaad174 3ccf97bf 3d664e53 bc964202 bc1eefa0 bb318c12 bc4e7eb0 3cc238f4 3d1d3793 bc671d8f bc3b98f4 3c928d44 bcb0890f bb2c5247 3d9ec355 3d5ced6e bcb0024b bd1d1131 3cab22b4 bc8b3485 bd5773c4 bc35fcf2 bcb54e90 3c863ac9 bcd61ef9 3cb7ca24 bcf07521 bca19c81 3d7924ce bcaf6570 bb66822c bd5bda26 3b2e6d9c bd1f69bc 3ce803ae bab4ffc0 3c5d528f 3d22b0d7 3bbfce44 3cac3011 3d26df3b 3c81e431 3bb48eab 3d49eb2d bbf032fa bd1df6e2 3cc43ac8 bd18e334 bd8547c4 3d28ef21 3cfdf73f 3a99edbc 3d85357b 3c3b0722 bcffb268 3cb86b2a bd27c4d8 bd9adc9f 3c71c3d7 3ca6de1c 3b3f2944 3d26044d 3be310d7 bc9f749e 3bc02679 bd25ad9c bd55c826 bcd1847e bd33ef3b 3a033e7b bc265feb bc39f85a bc0c0c14 3d4c1ff9 3d4dc890 3c4265d6 bd55f142 bd55bfa6 bc03c421 3c00c414 bade2add bbdc05d2 3d50892a 3d6769f4 3c016582 bd02cd06 bcef9b28 3c203bf1 3c14c621 3b0dc6e6 bbada5c3 3ca3c4be 3cf0ea94 bbf97cf4 bcd5f426 3cf287ae bd43e87e b9eac563 3e07be2f 3c229a3a bd2c039a bcbbf7bf bcef6869 bd003181 3cb546ae bd977b6c bc75a3a5 3e023625 bb72827b bcf74589 39f939c8 bc094bce bbf535ae 3c73f95e bce8131b bcbc4c1b 3dae8126 3c2c6e13 bcbdc961 bc91b062 bbe9e31c bc6d52c5 bbb3505f 3bd56bb2 bc16f986 3c7124de bc317204 3c15074e 3cb93071 bc846846 bd55fadd bca6b351 38e97f0d bc198215 3d2d697a 3cbde4bb bb3986df 3d43c386 baf67fab bd17b68f bc22bd4c 3cf5d7da bc5b16d5 3cbeb47c 3c964e72 bcdebf5a 3c0f1d1c bc86ad95 ba8a128c bc5ed297 3c0ea7c5 bd0739b6 bd47f6f3 bc96d690 bd0dfc5e bcf388d7 3c35083c 3d21c602 3cc97934 3c283f1c 3d2d9b31 3d1a44b4 3c1ee53a 3ca081fb 3d028e88 3d0ed5cc bc246cfa bcaec0e9 bce2409f 3b70a4c2 3a93a831 bc883be7 bc466bde bae1f126 bb211d90 bc886ef3 bc3be8dc 3c8a88eb ba79f1c1 3bbbf21c 3a8bca8b 3c173963 bc393825 bb3c50f6 bca48920 3c73aa18 bac7b8de 3cd456de 3d3119ec b9bdbf75 3c8813f7 ba878c75 bd1892f7 bc2d9632 3cc3abc3 3c87ab74 3cdfeb91 3d1559d5 3aac704e bb1f5121 bc32d995 bd2bae78 bc28482b bc1244cb bb898ba7 b9870f0d 3cbb1f4f 3c381722 bc8b4325 3c0cf49e bbb268ce 3c9ef6f4 bb7de1b5 3c75bcf0 3c8656d5 3b0cfe96 bbe50731 3c12955b 3b0f107a bbcc119c 3c720e84 bcde06d6 3bfffb4f ba4f6fc8 bccc374e bcbc8152 3c4a8fe8 bc2216d2 badb2a63 bc2cc883 bd852f7f bd33cf58 bb949443 bdad0354 3b8be1f4 3dc5b4dd 3d2f13c2 3d833208 3d1af3cb 3d130df2 3d1facf7 bc507922 bd843cf2 3d39776f bc9104b8 bd4c9a40 bc66b0e3 3ceaf369 3ceb5ebb 3c348d2a 3b9107d7 bd259b2c 3cf7ef2b bc646615 bced6996 bc58a1a1 3cb8a42e bba0bb53 3c5b3548 bd6e1b62 bd58c1b7 3cbe2210 3b4e3f65 3cd51298 3d0eedac 3b990e55 ba8afa12 3cd59dc6 bd77d4cd bd510401 3d16ac5e bc81b9fa 3cb50a6f 3cfa0682 3b06c211 ba9ac93d bc357f4d bd211ad5 bca4c4e6 3cc32c75 3c18b896 3d099f6e 3bd17efd 3c2e4b75 3cc7e4a0 bc7d66f5 3af59d3c 3cc43ab0 bbce2705 3d343bfa 3b98809f bce6df4b bc35f630 3bd63fcc bd36afe7 ba91ac47 3a4d8fbc bd02e87f 3d5ecb52 bc95daa2 bd35529b 3b0c0cc7 3c26e591 bc987ce7 3bdf8f14 3c115327 bc68946f 3d801c79 3b23cad5 bcc8850b bcd3e0ab bcaf417f bcb48d2d 39f48a51 3ccb272b 3b08748f 3aca06f6 3ce20d85 bc12a01c 3cbc9ac5 3bc3c94a 3cd30290 3c822241 3c325a37 3c30503b 3d022356 3ce56f55 3cc20975 bc240a8f bd21748d bb818d36 bd0fb8ff bd3168fa bcad88c5 bba8775e bc7a1579 3c14f9bd bba96980 3c8631ae 3b853663 3bc3433a 3d11f284 bc6aedf1 bd3b5392 bc5ea368 bc445cc9 3cc05b61 3c5a87f7 bb91ed83 3d1185ad 3d0969b5 bcf68479 3bbc2b99 3c29d5af 3bd6ddc4 3c0168c6 bc3b0e3e 3c33a287 bc6d3d71 bd0ee066 bcd185f8 bae6f38a bc505f0a 3c83e961 bcb2a48c bbf37600 bc2a59a7 3cb61439 3ce7f752 bc95a29e 3c4a9343 3c98587b bc1d2a06 bcc1af5b bccb0e7a bca346f8 3d279253 3c9405d3 bd1894e9 3cdea389 3c4e51f6 bcb043d5 bc23cca1 bbc04b77 bc6f9d17 3cf6632c 3d038644 bc1154ab 3c12acd0 3c31666f bcee46a4 3c945823 3cd37e21 3cd3b4ca bb9c6529 bb8db3f1 3cece6d7 bd007a86 bd3fa3f6 3a67badd 3cfd6274 3cf9675e bb8eacbe bb2d14a0 bb8f790c 3bae5509 bd042c15 bd3e4cbc bcd87379 3d4301d8 3d552dc6 3b314b0c 3ba6f2a9 3bd5b0a7 3b832fd7 bc99e28a bd4a879d bcaab96b bd8538be bd0473d0 3abc75f0 bd34b605 bc8497bb 3a666217 3bbd8fe1 3c65d532 3c24b5fb bce5d15d 3caada43 3d2061fb 3a686b8c 3d3feea2 3d1ce259 3d164810 3d3a7ecb 3ce3f527 bcea6c79 bc72c768 3b9a7c40 bcd49930 bc3bd34a bc031b6c 3aec44cb 3b1e0dbf bc9ab2d6 bcc3574e bd0e575e bd90b26b 3d33a623 3ca10156 bd2c0420 3d8e03b0 3d53b9df bbe92bdf bd07c258 bd3e9a74 bd86c084 3d1989ef 3c8cd53a bcebdf53 3d931a0d 3d5311ef bba54815 bc8b357c bcd3787b bd3a02e8 3cf504a1 3c8be9d7 bcdb0ca1 3d0cea72 3d1777e2 bbd0c750 3d007a4f 3ad71a7e bc9f1d52 3c68259c 3be778f2 3c1574d5 bcccd407 bd554b80 bc9d4645 3cdac394 3d029524 bbf2cf38 3d19d06b 3d83b9bd 3d1ff80a bc857138 bc968aac 3c51b4c0 bc9fd9bf bca06f6c bcdda5d5 bcb36ab8 bb3e03e5 3c749047 bcf751a7 bd02ae62 3cc3abe3 bd9b4270 bd187ba4 3b0cb248 bc00ff23 3ddfbeb2 3d8dcef4 bd373079 bbfe6a5a 3c157388 3b80d0f1 bce29546 bcc87777 3ce1c335 3d8bc5ac bc4ee049 3c1ca514 bc906a01 bcccef1b 3d2b88fb bc805cc3 3b29ec2f 3ce85b9b 3bee7650 bcef9b3a 3c897a34 bd29a48e bcf8c590 bcf93d33 bb356c1d 3da028dc bd2658fd 3b240c1d 3c800c13 bd01aa2f bb8004bd bcde15bf bc68a68f bccb5c94 3c022c5c 3ce8894d 3d596f2f bc141c36 3cff19fe 3d36a7ac bd43893b 3b0ce004 bd138330 3c345b2c 3c2c3e89 3c51ff20 bcc93e41 3ca931d3 3cddad5e bd551aae bc2bc7d0 bdb8416c bd0bedb6 3cea7dcc bcdb8912 bd3a8313 3d88294d 3d716824 3c89f5b6 3cb91977 bc8c66ae 3d2dd301 3c9a4642 3b3f9490 3bdf4d6c bc609546 3cb1af28 bc27ae15 3c68ac75 bc03febd 3d635b4c bbfa0162 bc5a4ef3 3bf2762b bd6be339 bca6c2b5 bc4410c5 bc09339d bca0a503 bd2b274a 3d1350cf bcd25361 bc0db4d9 3d5d2618 390112ec 3cd273bf 3ccabd8c 3d4c504d 3cb5ba98 3b0d28df bcf0cea2 3ca69539 bd38975f bd807d36 3be66447 bc9f1dd7 3ca208c3 bc823826 bb8910eb bc813b61 3cbc4c64 bc50e28c bc66bbd6 3d201162 3c264d16 3b83cdd8 3d1c9fbe bd2eaffb be169ee3 3c517bd8 3d6a3834 3cacadda 3d77d879 3d5e6027 3cfaecdc 3cf8afff 3c02d8e0 be0eeea6 3aee4f3b 3c8d6062 bcb840c3 3bb14370 3c5d18d8 3c8f46b9 bc8cf3e0 3cbc659a bda7a767 3b1c4bbb 3ccda6ae 3c4e1e52 3b7969d4 bcd3620b 3d2f2721 3d0790f2 39a7f6ab 3d592db3 bc42b512 bd0c0c0e bc9925bd bd2993e7 bd928c99 bc261e42 bc8f781e 3d47b098 3dbe8a9c bd0e3761 3cf811b0 3ca17d96 bd106526 bd80eabe bc332c15 ba365e77 3c938919 3d633b52 3a2a09f2 bc02f6dd 3c3e4669 bca5d6e7 bcd16641 bd0fffdf bc40163e bd06f0bb bd562d79 bcaf21ef bcb6520a bcdbd195 bbba97cf 3c903465 3c328075 3ca7fe96 3d35a681 3d276b22 3d4b85aa 3d23f751 3d12555c 3d2281b4 bcb77b8a bca7d7fc bc9de7f1 3be5d54d 3bef51e4 bbe70c1d bb9e7a42 bc06b71e bbc61618 bc6a4fac bc4aa531 3cbcef84 bc88f956 bd37554c bc44de03 bcd289e5 bd24e388 bbaa09bd 3c9dfad0 3c98a19f 3bb0a3f3 3d7d5edd 3d1b06fd 37e1e230 3d0a1229 3c9ecd12 3c33efb1 bcc0ccdf bcbd448d bcbd1c52 3cae5db0 3cbb3271 bc8bb33f b99a0c9e bbc6c229 bd0a7a80 bcd7a463 bacc272a 3baf095a bcbce426 3c2def06 bc2f0db2 bd23f081 bca74091 bc83dd14 3cebaee3 3d4b1d09 3cb2bf53 3d289dc4 3d94bde3 3cf435df 3cf4e16b 3d098b7c 3cb409ef bc4555cd bccd94e8 bc7c4963 bd0d077f bd02c0e7 bd3ac803 bc3ec3e0 bcddd05a bce03578 bc823a7c bce376af bc49f10a bc9dac78 bcbb1b40 bc9cfa91 bb4742cb bbe234f0 3b8006cb 3d52b911 3d73b69c 3d3bbb4d 3d553c32 3d83ef2b 3d16981b 3d28e2cb 3d33173d 3cfebfec bcab8870 bd0a62a8 bce99ff4 bd04455b bd3f8b8e bd2bd9a0 bd0b5d38 bcee167b bd169729 bba11bcb bbbee45e bbd8da91 bba26b26 bc942513 bc41bf4c 3c651b13 bb5183b0 bbe7d15f 3d2e8529 3d4a1ffa 3d2adc90 3d0b0c21 3d6e97bd 3d2928f5 3ce8ea2b 3d50de86 3ce7afe9 bd131b7a bd4bac53 bd251412 bd3d26d6 bd2af22f bced020a bcda4d0a bceea574 bc48c324 bd5ffaa3 bcf88d87 bb993146 bd505ad3 bd750dc6 bcf350b4 bd2410a7 bd2e26a9 bc550ca0 b8b4b55a 3cde78b8 3ce9d701 3cd346f5 3d2f08b7 3ceebd73 3d28c31a 3d27489b 3cf0cadd bc9c497a 3c8f62b1 3b053830 3c751369 3d126e86 3c3c83ce 3be8b05c 3c79de8d 3b6b4fe4 bd52e1b2 bd0bb55d bc15e7c2 3b9fa2f4 3cc8216a bc2ab48a 3cef98e4 3d2d0a7b bcdaecc4 bd4d16b1 bc8b3151 3c1ce010 3cb69f82 3d8729a7 3c3d9edf 3cdb2be5 3d1ccaa5 bcfa73ef bd4583b6 bcc444ee 3b9435e2 3b49ffc4 3d2407d7 3bc1afac bc1e3246 3c92bf20 bcf42f77 3c8f97c9 3cc3a079 bd464206 3d84b53e 3d3ce782 bd6c73df 3d2a72d7 3c8d0719 bd96662a 3bb3dac5 bb04b9ce bd78a69f 3d5f76b8 3ca9dcee bd656684 3d3c8331 3c080ff2 bd6a52c9 3c27f6fe 3ca88b36 bc646284 3d09c37c 3ca0e838 bd0d58f6 3c85a676 3bb86bf2 bd233bff 3c0997e7 3d057933 3c913025 3b9f329f 3cf5d2f4 3c66b0f1 bca027a5 bc626b62 bc1badae 3bd2320d 3c1f83e7 bc352a29 3c9a6d89 3caceb5f 3ad643b4 3b418206 ba1e70b9 3c2353b3 bb721d95 3bee928c bc60e77c 3aa6569a 3ccecead 3bf0bc7d bbeaca66 bc4f0dd9 bc1b40ed 3c9da28d 3ce02224 3bf63b7b 3d2c3962 3d888ffe 3d07a9f2 3c59962d 3cf70d7b 3c1e5bcc 3c1aaa10 3b8c8c9c 3b9130a0 3b4d55cf 3bd9696b 3b9eb401 3c9418b0 ba90b9ff 3c5eb1af bcadda17 bd281d5e bc01e85a bd254663 bd7aef10 bd1cbfe0 bcfb8216 bd27a0ca bcae5076 bcbc9a0f bc756388 bcf42c55 3d3b3ffd 3d8a8496 bbc488c9 b7eb6f0c 3cb8e9cc bcc69ac2 3ba4a806 bcbc6ac9 3c10afed 3b3516f1 3ba0576a bc964f4d bc8462fe bb731822 3a4ea250 3c252898 bbf85caa 3d301f8f bcafd8c9 bc8632fb bc6c7083 bc83eb8c bc862179 3cc92836 bc8514b8 bb036d6d 3c3eec34 3aaa9dc2 3d25f068 ba838bf8 bbd5f177 3a1f9e78 bd0a9c6d bd634371 bcb1795c bc29977a 3c846cdd 3d5e2d5b bbdfa5e4 3ce599bb 3d309963 bd2daf64 bd389896 bb7113b7 3b18a0a6 3c88a333 3d5817b7 3c0caa67 3c12a5f0 3c6d674a bd127c00 baa731fa bc3c84d0 bd27bc6a bba801b6 3c0524ab 3cf11937 baa287d5 3d23c478 3d4e02f1 3d4bba09 3ce9d84d bbcf823f bb9ac4e5 bc324aca 3b975728 bda534fe bd5aeca4 bc30934f 3d6f2764 3cfa769b 3b2abe6b 3b582176 bb378379 bab96c50 bd4ccc10 bd0b0258 bbf2c863 3d211dc9 bd1dfa9f 3d2508d8 bcef4a48 be0a0c12 3cc78ba0 3cc6c0b8 3d417365 3d47ab4b 3d789cae bd6f64c4 3d1bd4a9 3c3da70b be1938ef 3c7f4cbb 3ceee085 3ca7041b b96134aa 3d31bf73 bcdf036c 3c68b5a8 3c743a70 bdb08e82 3cba58df 3bc9bc2c 3d0c19c4 bc64ffcb bd43de89 bd0f7fb6 bc3d9d53 3c527d8b 3cbb09b8 bcaa08b5 3d1ae1c6 3d5302c9 bc963580 bd6e9e56 bce20ff0 bc67523c 3ca36696 3d241fe1 bcc247c9 3d2c35eb 3d645f48 bd0c49cb bd39af32 bbeede45 3c2c36f0 3c4599cf 3d30f44f 3a673ae9 3b9b7747 3ca0ef1b bd1c4d9b 3ce63a8f 3d3f3061 3ccaf0d2 3caecf33 3d1458aa 3ba5c96d bd05808e bcec68dc bd0dbea3 bd01f651 bd25ce61 bd34d918 bce23cef bd0e96af bd12334a 3c0bf149 bc86c523 ba634a93 bc5172da 3a669022 3a669149 3c3cd284 3cad0cc3 3cfaa1a8 3cbb4fe9 3ccab50e 3d34bb1b bcb81b3c bbf1948b bc2d6d6b 3c2c6e26 3a1393c7 3c1abd6b 3c671a50 3ca95c8c 3c689f44 bca3f325 bc908461 bcce1c74 bcdaa15b bd0c7aa8 bcaf1789 bd0c5a2e bd0a4c23 bd09732b 3ce6328f 3d2638ec 3c98ff7e 3d137371 3cd4b3a7 3d0153d7 3c9d04a2 3c16a934 3c310863 3c27268d bce742d7 bc5eefb0 3cf3ddb8 bce60dc7 bd573bd7 3ce55f33 bc4fc8ed bcb21d65 3c7cc0b5 3bc123c8 3cca823e 3d4a17d0 3bbaca19 bbf7a175 3d053e2e 3c85d0eb 3c85c7fe bd0fda58 bd034683 3c3ecb57 3b169acb bcd9dcd7 bc8bdaff 3b3a5928 3bda9194 3b0b8faf bc9c0313 bd362428 bc8aa609 bcfa2886 bce8036f bce983c7 3cae3ff7 3d8e0687 3d5d0eaa 3d14d07c 3b7f8e64 bbe678d2 bbb9c998 3cab58af bcd22b10 bc918ec0 3d401415 3af6eb1e 3cfe0d3b 3ca4a4b7 3b952dc7 bc7ab034 3c42ea12 bc40aee5 bd67098c 3c529d47 bc8f2941 3c5d5ec7 3c175d04 3cd36e7d bc6a021c b9cc8f59 bb0ce5f4 bc17b8a2 bd000150 3b9b8857 bccedce0 bb8d7002 bd0c3fe1 3cf14e1a 3d922dca b880b50f 3bbe0261 3a3dee3d bcb2daab bcf57349 bc968e45 bb0af233 bb1c6436 3d369505 3c11a22a bc20bb1d bbde3267 baa96a57 bd4980fe bd806079 bbf66e3a bcde5a0d bc75e666 3bcae182 3d184d1d 3d4cfd7b 3d0b2bfa bd1c51e2 bd2bfac1 bc37f76b bbd3dbef 3c5cca47 3c7ec1ee 3d1fce55 3d746b21 3ce2616f bd2a130a bd5c7fd4 bc7369dd bb004d69 ba270b20 39dc2f01 3cf7078b 3d1d4bb8 3c8b61e9 bc308bc5 bcf5b404 bcac93ae bc820916 bd29af99 bd2ad3f3 bb6c49f2 bc84e4e7 bd0874c8 3d2e125d 3d4089d6 3d6bef7b 3d59ce31 3d452062 3d22df9b 3d0cd410 3d381292 3ce3fa90 bce97bf1 bd093850 bc67a0da bcb003f0 bca49843 bc79b690 bc85e239 bc2fe281 bb869b15 bbbdb7ba bd0eacba bcf7d9c0 3c3e4a49 bcb909a3 bd1f63f5 3b260575 3c167cc5 bbf95f4f 3c871f93 ba9a6c4b 3bc9e2db 3d3626f0 3cdac07d bc7fd2e6 3d1b477c 3d31b58f 3c325848 bc25193b bd026406 bcde91ea 3c5973bb bb54333d bd0fa975 3c603e71 3c97ad78 bc20af3a 3a309d67 3cc464b0 3d07f956 bd530410 bd13a7b7 3d20db90 bc3ca0f4 bcd8d563 3c8f1944 3b81dda1 3d6302f6 3d2da366 bd36be3d bbd538d4 3d20d8b0 bce23f6d bd2c949e bb9766c1 bc4528fa 3d05cce5 3c3ae57c bcca1115 bbfefba1 3cb97669 3abfa516 bcb8aaeb bb89e097 bd80bf10 bd5e75f8 bcb0f439 bc9cb9a6 3c0101a0 3c665ef6 3d33c94e 3d76721b 3d417e3b bd9c7676 bd89e0ab bc8d7250 bc5734d5 3c7e2d61 3cab567e 3d12d200 3d74c27e 3cbee4e2 bd4ff994 bd1c1c7e bc101ae8 bc1344ac 3c6deb2a 3cb17e37 3cd48bf0 3d0a90b6 3ca6cbae 3c83690b 3d0e9023 3ce65725 bb9a5a99 3d1c1efe bc260936 bd48bccb bcccf3cf bd26725d bca13a90 bc8549ec bcc0961f 3d04a421 3d332718 bc842239 3cd91253 3d4057ab 3c748822 bd09899a bd7053ce bd2f1d11 3adf4b2e bc899f9a bd235d0a 3d075c58 3cae5a61 3c9aead8 bcac77a1 bab5617f 3c5bfa31 bce818d9 3d35cb91 3cd3fa9f bd1717e2 3c3104b9 bab7a73f bcb3f9ce bcc3ad0f bcf8e411 baeda30e 3d3e4db6 bb8dc48c 3c6c890b 3d40b895 ba1aa693 3c8068c6 bc35c85c 3a141470 bca0db13 3c621d62 3a5f48d7 bc8dfd0d 3b6cb09f bc814550 bd0ba5c4 bd83e79a bd21f767 bcaf996c 3b32681f bafe3a90 b953a85f 3d41c6d4 3cc655c9 3b44e093 bc9da963 ba6ca450 3c9e720c 3c936270 3b5fca9d 3c83210a 3d4f051d 3c0436e5 3b952bbb bd15a47d bcbaf7dc 3c8b56a9 3c774350 bbec7c2d ba6cf2b6 3cdd1bcc bb997690 bca096be 3d05bd20 bca53d81 bd207fdb 3d54731e 3bfcd092 bc4ba987 3b2f8dff 3bf15a06 bc804592 3ca64bf9 bd10bb20 bd28c50b 3d11fa8c 3c0df0f8 3b94ef99 3ad6d16a 3c468107 3c29ff2e 3ca91ce8 bc9358c3 bd0c07c0 3cd5848f 3a574e98 3b059635 bbb8ac3d 3a6f6da7 bcbd9673 bd3f4247 bd11639c bd1e4125 bd47f828 bd38c1c3 bc7d8359 bd06c395 bc8e4b2a 3c5b157b 3bcaaf60 bc578c13 3d494d0b 3d0cf891 3b14191e 3d2b864e 3d14deaa 3a890815 3c736082 3b314353 bc7a7737 3d3c13e9 3d38ad9e 3ba7b29d 3cfaa67f 3d024e45 3acae6ef 3cf11cfd bbed9f7b bd5335cc 3d583e02 3c3f720d bd51a4ba 3d6bc574 3bd1994e bd580f82 3ce2f08e bcb119a3 bd628a23 3d9aadba 3be47fd6 bd6b20a0 3d987cab 3c4a9bb7 bd513c99 3c3ba06f bcb4cc5d bd4630de 3d444eca 3c4f2524 bd1d81af 3d5793df 3c85c16c bd10bed3 3ccc95b8 3c765a68 3d333377 3b0ad386 bd034169 bce561ac bcdf9b9b bd64ed19 bd11bfd9 3cf33097 3caa5db7 3d0aae9a 3d7a2e76 3c86a2c4 bc164505 3ca5ba3f baf39ca8 3bb6dfde bcaa7fcd bceb92d9 3a992487 3c277b93 bcb859b8 bce51a58 3c464715 bc13383f baa407c7 bca080a3 bcc53643 bcbd38cb bcffeeef 3cbb50b3 bc9b73e3 bb8bb4a1 3cea2dd2 3c00dfca 3b78f0f3 3c78029e bc3c44b0 bac802b4 3da14135 3be1a540 bc5f0ecc 3d47eb30 39fb374e 3c2a8321 3b367fd4 badddc07 bccd05f9 3d07c925 bca48e31 bceee584 bb67a8f5 bd145017 bcd7b758 bd0888d1 bce044bc bd345844 bd852b26 bd2e085f bb98f79e bd03d89f bc2a731d 3d00c41c 3d548b10 3d1b2aae 3d016283 3d46e056 3d3456b1 3ceb2dcb 3caf8727 3d03bdc1 bc016461 3c4b896a bbe99345 bb60c076 3cc202da 3b18f843 bc455e8d bc0baac1 bc9d27bc 4 | -------------------------------------------------------------------------------- /demo.cpp: -------------------------------------------------------------------------------- 1 | #include "NvInfer.h" 2 | #include "NvCaffeParser.h" 3 | #include "NvUtils.h" 4 | #include "cuda_runtime_api.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include "fp16.h" 19 | 20 | #define CHECK(status) \ 21 | { \ 22 | if (status != 0) \ 23 | { \ 24 | std::cout << "Cuda failure: " << status; \ 25 | abort(); \ 26 | } \ 27 | } 28 | 29 | 30 | // stuff we know about the network and the input/output blobs 31 | static const int INPUT_H = 256; 32 | static const int INPUT_W = 384; 33 | static const int INPUT_C = 3; 34 | 35 | static const int OUTPUT_TEST_H = 256; 36 | static const int OUTPUT_TEST_W = 384; 37 | static const int OUTPUT_TEST_C = 64; 38 | static const int OUTPUT_TEST_SIZE = OUTPUT_TEST_H * OUTPUT_TEST_W * OUTPUT_TEST_C; 39 | 40 | static const int BATCH_SIZE = 4; 41 | static const int MAX_BATCH_SIZE = 4; 42 | 43 | const char* INPUT_BLOB_NAME = "data"; 44 | const char* OUTPUT_BLOB_NAME = "out"; 45 | 46 | const int N_BINDINGS = 2; 47 | static void* buffers[N_BINDINGS]; 48 | static cudaStream_t stream; 49 | static int inputIndex, outputIndexTest; 50 | 51 | using namespace nvinfer1; 52 | 53 | 54 | static const DataType DATATYPE = DataType::kHALF; 55 | const char* WEIGHTS_FILENAME = "weights_demo16.wts"; 56 | //static const DataType DATATYPE = DataType::kFLOAT; 57 | //const char* WEIGHTS_FILENAME = "weights_demo32.wts"; 58 | 59 | 60 | // Logger for GIE info/warning/errors 61 | class Logger : public nvinfer1::ILogger 62 | { 63 | public: 64 | void log(nvinfer1::ILogger::Severity severity, const char* msg) override 65 | { 66 | // suppress info-level messages 67 | if (severity == Severity::kINFO) return; 68 | 69 | switch (severity) 70 | { 71 | case Severity::kINTERNAL_ERROR: std::cerr << "INTERNAL_ERROR: "; break; 72 | case Severity::kERROR: std::cerr << "ERROR: "; break; 73 | case Severity::kWARNING: std::cerr << "WARNING: "; break; 74 | case Severity::kINFO: std::cerr << "INFO: "; break; 75 | default: std::cerr << "UNKNOWN: "; break; 76 | } 77 | std::cerr << msg << std::endl; 78 | } 79 | }; 80 | 81 | 82 | static Logger gLogger; 83 | 84 | union hf 85 | { 86 | uint32_t data_u; 87 | float data_f; 88 | } converter; 89 | 90 | // Our weight files are in a very simple space delimited format. 91 | // [type] [size] 92 | std::map loadWeights(const std::string file) 93 | { 94 | std::map weightMap; 95 | std::ifstream input(file); 96 | assert(input.is_open() && "Unable to load weight file."); 97 | int32_t count; 98 | input >> count; 99 | assert(count > 0 && "Invalid weight map file."); 100 | while(count--) 101 | { 102 | Weights wt{DataType::kFLOAT, nullptr, 0}; 103 | uint32_t type, size; 104 | std::string name; 105 | input >> name >> std::dec >> type >> size; 106 | wt.type = static_cast(type); 107 | 108 | if (wt.type == DataType::kFLOAT) 109 | { 110 | uint32_t *val = reinterpret_cast(malloc(sizeof(val) * size)); 111 | for (uint32_t x = 0, y = size; x < y; ++x) 112 | { 113 | input >> std::hex >> val[x]; 114 | } 115 | wt.values = val; 116 | } 117 | else if (wt.type == DataType::kHALF) 118 | { 119 | __half *val = reinterpret_cast<__half*>(malloc(sizeof(__half) * size)); 120 | for (uint32_t x = 0, y = size; x < y; ++x) 121 | { 122 | input >> std::hex >> converter.data_u; 123 | val[x] = fp16::__float2half(converter.data_f); 124 | } 125 | wt.values = val; 126 | } 127 | wt.count = size; 128 | weightMap[name] = wt; 129 | } 130 | return weightMap; 131 | } 132 | 133 | 134 | 135 | std::string locateFile(const std::string& input, const std::vector & directories) 136 | { 137 | std::string file; 138 | const int MAX_DEPTH{10}; 139 | bool found{false}; 140 | for (auto &dir : directories) 141 | { 142 | file = dir + input; 143 | for (int i = 0; i < MAX_DEPTH && !found; i++) 144 | { 145 | std::ifstream checkFile(file); 146 | found = checkFile.is_open(); 147 | if (found) break; 148 | file = "../" + file; 149 | } 150 | if (found) break; 151 | file.clear(); 152 | } 153 | 154 | assert(!file.empty() && "Could not find a file due to it not existing in the data directory."); 155 | return file; 156 | } 157 | 158 | // We have the data files located in a specific directory. This 159 | // searches for that directory format from the current directory. 160 | std::string locateFile(const std::string& input) 161 | { 162 | std::vector dirs{"./data/"}; 163 | return locateFile(input, dirs); 164 | } 165 | 166 | // print tensor dimensions 167 | void printDims(ITensor* data) 168 | { 169 | Dims dims = data->getDimensions(); 170 | int nbDims = dims.nbDims; 171 | for (int d = 0; d < nbDims; d++) 172 | std::cout << dims.d[d] << " ";// << dims.d[1] << " " << dims.d[2] << " " << dims.d[3] << std::endl; 173 | std::string sss; 174 | if (data->getType() == DataType::kHALF) 175 | sss = "float16"; 176 | if (data->getType() == DataType::kFLOAT) 177 | sss = "float32"; 178 | std::cout << sss << " "; 179 | std::cout << std::endl; 180 | } 181 | 182 | 183 | static void setAllLayerOutputsToHalf(INetworkDefinition* network) 184 | { 185 | for (int i = 0; i < network->getNbLayers(); i++) 186 | { 187 | nvinfer1::ILayer* layer = network->getLayer(i); 188 | for (int j = 0; j < layer->getNbOutputs(); j++) 189 | { 190 | if (layer->getOutput(j)->isNetworkOutput()) 191 | layer->getOutput(j)->setType(DataType::kHALF); 192 | } 193 | } 194 | } 195 | 196 | void APIToModel(unsigned int maxBatchSize, IHostMemory **modelStream) 197 | { 198 | // create the builder 199 | IBuilder* builder = createInferBuilder(gLogger); 200 | 201 | 202 | /////////////////////////////////////////////////////////// 203 | INetworkDefinition* network = builder->createNetwork(); 204 | 205 | // load weights values from disk 206 | std::map weightMap = loadWeights(locateFile(WEIGHTS_FILENAME)); 207 | 208 | // define input 209 | auto data = network->addInput(INPUT_BLOB_NAME, DATATYPE, DimsCHW{INPUT_C, INPUT_H, INPUT_W}); 210 | assert(data != nullptr); 211 | std::cout << "input" << std::endl; 212 | printDims(data); 213 | 214 | 215 | // add layer 216 | // 1 //////////////////////////////////// 217 | auto conv1 = network->addConvolution(*data, 64, DimsHW{3, 3}, weightMap["conv1_w"], weightMap["conv1_b"]); 218 | assert(conv1 != nullptr); 219 | conv1->setStride(DimsHW{1, 1}); 220 | conv1->setPadding(DimsHW{1, 1}); 221 | 222 | // set output 223 | conv1->getOutput(0)->setName(OUTPUT_BLOB_NAME); 224 | network->markOutput(*conv1->getOutput(0)); 225 | 226 | 227 | 228 | /////////////////////////////////////////////////////////// 229 | /////////////////////////////////////////////////////////// 230 | /////////////////////////////////////////////////////////// 231 | /////////////////////////////////////////////////////////// 232 | /////////////////////////////////////////////////////////// 233 | /////////////////////////////////////////////////////////// 234 | /////////////////////////////////////////////////////////// 235 | 236 | // Build the engine 237 | builder->setMaxBatchSize(maxBatchSize); 238 | builder->setMaxWorkspaceSize(1e6); 239 | if (DATATYPE == DataType::kHALF) 240 | { 241 | builder->setHalf2Mode(true); 242 | setAllLayerOutputsToHalf(network); 243 | } 244 | std::cout << "building the engine..." << std::endl; 245 | 246 | auto engine = builder->buildCudaEngine(*network); 247 | assert(engine != nullptr); 248 | 249 | std::cout << "engine built!" << std::endl; 250 | 251 | // serialize the engine, then close everything down 252 | (*modelStream) = engine->serialize(); 253 | 254 | // Once we have built the cuda engine, we can release all of our held memory. 255 | for (auto &mem : weightMap) 256 | { 257 | free((void*)(mem.second.values)); 258 | } 259 | /////////////////////////////////////////////////////////// 260 | 261 | network->destroy(); 262 | engine->destroy(); 263 | builder->destroy(); 264 | } 265 | 266 | template 267 | void setUpDevice(IExecutionContext& context, int batchSize) 268 | { 269 | const ICudaEngine& engine = context.getEngine(); 270 | // input and output buffer pointers that we pass to the engine - the engine requires exactly IEngine::getNbBindings(), 271 | // of these, but in this case we know that there is exactly one input and one output. 272 | assert(engine.getNbBindings() == N_BINDINGS); 273 | 274 | // In order to bind the buffers, we need to know the names of the input and output tensors. 275 | // note that indices are guaranteed to be less than IEngine::getNbBindings() 276 | inputIndex = engine.getBindingIndex(INPUT_BLOB_NAME); 277 | outputIndexTest = engine.getBindingIndex(OUTPUT_BLOB_NAME); 278 | 279 | // create GPU buffers and a stream 280 | CHECK(cudaMalloc(&buffers[inputIndex], batchSize * INPUT_H * INPUT_W * INPUT_C * sizeof(T))); 281 | CHECK(cudaMalloc(&buffers[outputIndexTest], batchSize * OUTPUT_TEST_SIZE * sizeof(T))); 282 | 283 | // create cuda stream 284 | CHECK(cudaStreamCreate(&stream)); 285 | } 286 | 287 | void cleanUp() 288 | { 289 | // release the stream and the buffers 290 | cudaStreamDestroy(stream); 291 | CHECK(cudaFree(buffers[inputIndex])); 292 | CHECK(cudaFree(buffers[outputIndexTest])); 293 | } 294 | 295 | void doInference(IExecutionContext& context, __half* input, __half* output, int batchSize) 296 | { 297 | // DMA the input to the GPU, execute the batch asynchronously, and DMA it back: 298 | CHECK(cudaMemcpyAsync(buffers[inputIndex], input, batchSize * INPUT_H * INPUT_W * INPUT_C * sizeof(__half), cudaMemcpyHostToDevice, stream)); 299 | context.enqueue(batchSize, buffers, stream, nullptr); 300 | CHECK(cudaMemcpyAsync(output, buffers[outputIndexTest], batchSize * OUTPUT_TEST_SIZE * sizeof(__half), cudaMemcpyDeviceToHost, stream)); 301 | cudaStreamSynchronize(stream); 302 | } 303 | 304 | void doInference(IExecutionContext& context, float* input, float* output, int batchSize) 305 | { 306 | // DMA the input to the GPU, execute the batch asynchronously, and DMA it back: 307 | CHECK(cudaMemcpyAsync(buffers[inputIndex], input, batchSize * INPUT_H * INPUT_W * INPUT_C * sizeof(float), cudaMemcpyHostToDevice, stream)); 308 | context.enqueue(batchSize, buffers, stream, nullptr); 309 | CHECK(cudaMemcpyAsync(output, buffers[outputIndexTest], batchSize * OUTPUT_TEST_SIZE * sizeof(float), cudaMemcpyDeviceToHost, stream)); 310 | cudaStreamSynchronize(stream); 311 | } 312 | 313 | 314 | // rearrange image data to [N, C, H, W] order 315 | void prepareDataBatch(__half* data, std::vector &frames) 316 | { 317 | assert(data && !frames.empty()); 318 | unsigned int volChl = INPUT_H * INPUT_W; 319 | unsigned int volImg = INPUT_H * INPUT_W * INPUT_C; 320 | 321 | for (int b = 0; b < BATCH_SIZE; b++) 322 | for (int c = 0; c < INPUT_C; c++) 323 | { 324 | // the color image to input should be in BGR order 325 | for (unsigned j = 0; j < volChl; j++) 326 | data[b * volImg + c * volChl + j] = fp16::__float2half( (frames[b].data[j * INPUT_C + c]) / 255.0); 327 | } 328 | 329 | return; 330 | } 331 | 332 | void prepareDataBatch(float* data, std::vector &frames) 333 | { 334 | assert(data && !frames.empty()); 335 | unsigned int volChl = INPUT_H * INPUT_W; 336 | unsigned int volImg = INPUT_H * INPUT_W * INPUT_C; 337 | 338 | for (int b = 0; b < BATCH_SIZE; b++) 339 | for (int c = 0; c < INPUT_C; c++) 340 | { 341 | // the color image to input should be in BGR order 342 | for (unsigned j = 0; j < volChl; j++) 343 | data[b * volImg + c * volChl + j] = (frames[b].data[j * INPUT_C + c]) / 255.0; 344 | } 345 | 346 | return; 347 | } 348 | 349 | 350 | 351 | void printOutput(float *out, const int batch_size, const int output_c, const int output_h, const int output_w) 352 | { 353 | int output_size(output_c * output_h * output_w); 354 | 355 | std::cout << "================="<< std::endl; 356 | std::cout << "================="<< std::endl; 357 | std::cout << "-----------------"<< std::endl; 358 | for (int b = 0; b < batch_size; b++) 359 | { 360 | for (int c = 0; c < output_c; c++) 361 | { 362 | for (int h = 0; h < 5; h++)//output_h; h++) 363 | { 364 | for (int w = 0; w < 5; w++)//output_w; w++) 365 | std::cout << out[b * output_size + c * output_h * output_w + h * output_w + w] << " "; 366 | std::cout << std::endl; 367 | } 368 | std::cout << "-----------------"<< std::endl; 369 | } 370 | std::cout << "================="<< std::endl; 371 | std::cout << "================="<< std::endl; 372 | } 373 | 374 | return; 375 | } 376 | 377 | 378 | 379 | void castOutput(__half* data_h, float* data_f, int output_size) 380 | { 381 | for (int i = 0; i < output_size; i++) 382 | data_f[i] = fp16::__half2float(data_h[i]); 383 | return; 384 | } 385 | 386 | void castOutput(float* data_h, float* data_f, int output_size) 387 | { 388 | for (int i = 0; i < output_size; i++) 389 | data_f[i] = data_h[i]; 390 | return; 391 | } 392 | 393 | 394 | typedef std::conditional::type FloatPrecision; 395 | 396 | 397 | int main(int argc, char** argv) 398 | { 399 | std::cout << sizeof(float) << std::endl; 400 | 401 | //read input, convert, resize 402 | std::vector image_paths; 403 | image_paths.push_back("./images/2.jpg"); 404 | image_paths.push_back("./images/9.jpg"); 405 | image_paths.push_back("./images/18.jpg"); 406 | image_paths.push_back("./images/20.jpg"); 407 | 408 | std::vector images(BATCH_SIZE); 409 | 410 | for (int b = 0; b < BATCH_SIZE; b++) 411 | { 412 | std::cout << image_paths[b] << std::endl; 413 | cv::Mat image_bgr = cv::imread(image_paths[b]); 414 | cv::Mat image_rgb, image; 415 | cv::cvtColor(image_bgr, image_rgb, cv::COLOR_BGR2RGB); 416 | cv::resize(image_rgb, image_rgb, cv::Size(INPUT_W, INPUT_H), 0, 0, cv::INTER_LINEAR); 417 | images[b] = image_rgb; 418 | } 419 | 420 | // allocate CPU memory for input and output 421 | int inputSize = BATCH_SIZE * INPUT_C * INPUT_H * INPUT_W; 422 | int outputSizeTest = BATCH_SIZE * OUTPUT_TEST_SIZE; 423 | FloatPrecision* data = new FloatPrecision[inputSize]; 424 | FloatPrecision* outtest = new FloatPrecision[outputSizeTest]; 425 | float* outtest_f = new float[outputSizeTest]; 426 | 427 | // init model stream variables 428 | IHostMemory *modelStream{nullptr}; 429 | IRuntime* runtime = createInferRuntime(gLogger); 430 | 431 | // create a model using the API directly and serialize it to a stream 432 | APIToModel(MAX_BATCH_SIZE, &modelStream); 433 | ICudaEngine* engine = runtime->deserializeCudaEngine(modelStream->data(), modelStream->size(), nullptr); 434 | 435 | // create execution context 436 | IExecutionContext *context = engine->createExecutionContext(); 437 | 438 | // allocate memory on device 439 | if (DATATYPE == DataType::kHALF) 440 | setUpDevice<__half>(*context, BATCH_SIZE); 441 | else 442 | setUpDevice(*context, BATCH_SIZE); 443 | 444 | // flatten image Mat, convert to float, do TF-style whitening 445 | prepareDataBatch(data, images); 446 | 447 | // run inference 448 | doInference(*context, data, outtest, BATCH_SIZE); 449 | 450 | // destroy the engine 451 | context->destroy(); 452 | engine->destroy(); 453 | runtime->destroy(); 454 | 455 | // clean-up device 456 | cleanUp(); 457 | 458 | // print out 459 | castOutput(outtest, outtest_f, outputSizeTest); 460 | printOutput(outtest_f, BATCH_SIZE, OUTPUT_TEST_C, OUTPUT_TEST_H, OUTPUT_TEST_W); 461 | 462 | //free mem 463 | delete[] data; 464 | delete[] outtest; 465 | delete[] outtest_f; 466 | 467 | std::cout << "done!" << std::endl; 468 | 469 | return 0; 470 | } 471 | 472 | -------------------------------------------------------------------------------- /data/weights_demo.p: -------------------------------------------------------------------------------- 1 | (dp0 2 | S'conv1_b' 3 | p1 4 | cnumpy.core.multiarray 5 | _reconstruct 6 | p2 7 | (cnumpy 8 | ndarray 9 | p3 10 | (I0 11 | tp4 12 | S'b' 13 | p5 14 | tp6 15 | Rp7 16 | (I1 17 | (I64 18 | tp8 19 | cnumpy 20 | dtype 21 | p9 22 | (S'f4' 23 | p10 24 | I0 25 | I1 26 | tp11 27 | Rp12 28 | (I3 29 | S'<' 30 | p13 31 | NNNI-1 32 | I-1 33 | I0 34 | tp14 35 | bI00 36 | S'!l\x9d=\'\xbe\x17=\xf7\x1d\x10>c\xae\xfc\xbc_[\xea<"\xa5J\xba\x90\x03\xe4;>l\x8d=\r%}=6_O=\xb6\xa43<\xd5\x12\x89\xbc\xf8\xa1\xc1=\xff\x992\xbd\xf5\x05\x0e=d\xc2\x08=\xe9$\xc7\xbd\xc2\xaa\x9b\xbci\xe8y\xbd\xae\tH\xbc\x1a\xbf\t=\xa3R\xa5<\xc9*:=\rB\xd8\xbd\x17\xd8\xf3<\x93%\xb5=' 37 | p15 38 | tp16 39 | bsS'conv1_w' 40 | p17 41 | g2 42 | (g3 43 | (I0 44 | tp18 45 | g5 46 | tp19 47 | Rp20 48 | (I1 49 | (I3 50 | I3 51 | I3 52 | I64 53 | tp21 54 | g12 55 | I00 56 | S'\'\xb0\x96\xbb\xe4pK\xbd \x93m\xbb\xef\xaa\xe8\xbb\xa5\xf3\xbb\xbd$\x95\x02=F\x95\xe2\xbc\x94\\\xcb\xbc\xaef\x8c\xbcMPL=\xdc\xec\xfa\x0e;\xbcwK\xc0\xbb\xc6-U=h\xc7r\xbc{x\xd3\xbclo\xa0\xbc\xc3\\\x80\xbc0\x83\x13\xbd\xbd\xfe\x03\xbc\xc3\x08\xa2<\xb9F\x8f<\x15,3\xbc\xfc\xd7\xa7\xbc\x8dD\xbd\xbc\xe8\x94\xcd\xbc\xa8b\n\xbdS\xacK\xbd\xb1b\x8f<\xeeD\xc4\xbc6\x8b\xa8<\x8c\x92\xee;^\x1d(\xbd\xaa\\\xf8\xbb\xb7\x13q\xbb\x9bv\xfa\x03:~\xe8C\xbd\xb2k\xd5;\xc5\xa7\x0e<\xeb\x88\x8a<\xa7\x8b\x89\xbbX\xcf3\xbdH5[<\xf5f}\xbc-\x8d\xb4\xbcc6\x85;\xa7Y*\xbc\xca\xb4\xd3<\xf0u\xbc:k\xb2\x90\xbdR\x1d\x9f\xbcH\xb2\x0c;\xdc(\xa0=\xb6\xed\x0b\xbdJ\'+\xbd\xbe\x9f\x1c=\xf2\x90\x07=>\x16@\xbc\x84\xef\xbc\x82\xca<\xd2x\xe6\xbb\xe1?\x0c\xbdk\xf77\xbc{\xefk=\xdb\xe2\xc9;f\xa3-=Pr\x8d\xbc\x1f\x96\xc0\xbc\x11\xe4\xf8\xbcP\xa4l\xba \xbb\x10\xbd\x13\x8cW\xbc#\x8ab\xbd\x9a\xae\n=\xb0D<\xbc\xae*\x1b=\xf9\x01\xad<\xac\x92\x08\xbd\xae \xdf\xbc\xc3\xc6L\xbb\x84\x8ci\xbb\xb0~N\xbc\xbci\x1f\xbdD)?;\xf1; <\x1b\x13\xe8\xbc\xda\xd7\xf5<\x9f@\xe2\xbct\xab\x87<\xc7-\x95;3\xf2\n\xbb\xddis\xbc\xda\xa0g\xbc\xea\x91\xde\xbc|\xe5:<\xe8\x1a\x10\xbc\x11\x1d/\xbdp\x14\x14:\xdc\xf7\xba\xbc\xc3X\x93\xbc7wz\xbc\xde0F\xbd\x87$\x99:\x07\xdc\xdd\xbaE\x93\xe9\xbb\x89\x8e\xba\xbb\xe4\xbb!\xbcU\xa1\x03\xbd\xb5\x834\xbc\x1bX\xd1<\xe36g;K\x02\xb0\xbc-\xebI=\xeb_&\xbcc\xc5\xea\xb9\x86\xf9\x16\xbc\xb69\x07\xbd\xc1\xf1y\xba\r\x0f\x87\xb9C\x94\x94\xbbb\x1bn\xbd<\x9d\xf5:Q\x8a\xf49:C\xc3;9\x14\xb6<)e\x9c\xbb\x05\xb64\xbd#\xa63=\x9c%h<#\xff\x00\xbc\xfdX&\xbd\xcc}\xea<\xcfP\x13=\xfb\xaf.\xbd\xab\xf6\xa79\xbb\xf0\x06\xbdV\xf9\x88\xbc&\xe4\xbc\xbcx\xac\x9d\xbc&k\xa2\xbb\xd3ZP\xbd\xf4\xa2\x9f;>\xb5\x84=\x9f2\x9f;b9,=\xfd?;=\xc2\x9d\xaa:\xb6\x01\xa8\xbbHJ\xef\xbc\x8b}R<3\xcf\xae<&n,<\xb8\xdd\xf3<\x86(\xfa\xbc\x1c\x02j\xbc\rZ\xde\xbc\x16\t\x82\xbcIJ><\x10\x04S\xbd\xa6\xb9\x9c\xbc\x99Z\x9a\xbb\xd9\x18\xe8\xbcl\x99\xaf\xbc\xdb\x7f \xbd%A\x1e\xbd\x02>X=\x86\xd3\n;\xef\xee\xff\xbcDX4\xbd\xe6\x12,\xbd\xef\x8e;<\xcd\xd2\xb4<,\x80\x96\xbc\xb7\xf4s=\x07f\x81<$\xca\xb7<{5\x85=\x14\xc4\x00<\xa5\xa3u\xbc\x15\x82\x19\xbc1\x9b-=\xdeV\xd4<\xd5V\x86<"yP\xbc\xcd\xd4w\xbdG\xac\x91\xbaA"\x82<\xad\x85\x11=S\x92\'=\xa0\x14-\xbb\x8ckh:\xef\x89\x19=k\xd0\x19=5\xc3\xe1,\xde$q<\xf3\xf6G\xbd\x1c\xf2\xbb;O\x1f\xbbzi-=\xb4D\x1a=\xec\x191=\x96\xfe\x0c;\xf2<\x84\xbd\x01\x04Q\xbd\xbc\x8fM:7Z2<\xb5i\t=\xd3\x05\x94<\x0cy\x8f\xbb\xa2\xee?=:\xd5\x8c<\xbd\xb9\x83=\xac\xc5\x8b=/oY=\x90\x94?;\xa2\xce\xf0\xbc\xa6\xee\x0e\xbe\x9c\x8a\xbe="k\'=\xfd\x06\x1b=\xe3\xbd\x94=+\xef\x83=\xbd\x97n=\xb7\x08/=\xa7)\x87=\xee\xdc\xa9<_\xeb\xac=pb\x93<\x8c\xfa\x11=\x91\xf8\x0c=\xd6\x7f\xe4;\xc4\xa2\x86<5A\xa1=V\xe0F=\xad\xee}<\xf1\xf3\xef;U\xb5\xa6;\x98<-\xbcC:\x08\xbc\x937\x1d=\xc0\xff\xb4\xba\xd7\x10\xe3;\xe6\xc6\r;&\x81\xae=|\xb4\xbe<1\xa8\x93:\xd5Y\x15=N7\xcc\xbc,\x9b%\xbd\xe6\xc4\xa4\xbc\'S\x11<\xfah1\xbdf\xe0\x0e\xbdD\x86\x03=\xa7\xb0\xd5;J\xd3;\xbc\xd7\xe9\x8b<\xe5\x03>\xbbPv\xee; \xffQ<\xf3NZ\xbca;\x81\xbcg\xa7\xa7\xbdR;c=\xe4Q\xef;q2\xbb<\xe7\xc0\x02\xbd\x8e\x8b?\xbd/\xf2*\xbd\x86n\x12=\xd7\x07$=8\xe8\xa0<\xad\xce\xce<\x10\xefz\xbd\xfb2\x86\xbc\xb7\x17X=y\x837\xbb\x82\x8e\xb0\xbdO\xf40=\xc3\x0c\xad<\xa7\xb3\xd4<\xd7\xdc\xd9\xbc\x12\xeaB<\x05\x956= \x0b\'\xbaC\x98\xa4\xbc=3T\xbb\xa1\xfb\xfe\xbb*\xebm<\x9a\x9f\x89\xbcb\x1db\xc9\xbc+v\xf2;dL\xbc<\xbbK\x1c;\xf2\t*:\x1d\x0c\xe7\xbb?\xb3\x8b\xbc\x03\xc8:\xbd\xa0\xd9+\xbd\n\x02\xed\xbc\xce\x83<<\xac\xaf\xc1;\xf6X\r\xbd}\xbc\xf0;\xe0\xbf\x1c\xbd\x83pl\xbcg\xaa\x0c\xfb\x9e;\xa2f\x8f<\xabQ\x8b<\x854\x8b\xbc\xc8:\xc4<\xf9\x1fL=\x9a\x03,\xbdN\x07\x15<^\xfc\r\xbdc9\x17<%C\x8b\xbc\xdd\xb4\xc5=e?N;\xfa;4=\xf6\x06\xca:\x92S;\xbdC\x93J<\x86z\x00\xbd\xe1\x8f\xbd;\xb0\x03\x8e=\x07\xd4\xcc\xbcy07\xbd/\xaa\x01\xbdM)\x88=\x18&]=48j=\x0e\x0c\x0c\xbd\nR\xb6\xbc\xe5\x89\xd2\xbc\x81\xf0#\xbd\xcbBG\xbb\x13\x1be<\xa7\x10$\xbd\xe4\x98\xef<\xd7r*=\xa5\'\xa0\xbc-\x96Y<\x0co\xeb\xb7w\xf1\xd5\xbb\xd5\x87\xa2\xba\xb8\xc0\xc6<\xc6\xe1\x1a=\x8e\x80\x05\xbdP\x1ag<3_\xe5<\xf7?\xae<\xa2\xb8\x17\xbc\x1dM\x18=\xf2Il\xbbu\x05&;\xf4\xa0<\xbcN\xc93=\xcb\xbcH\xbd\xe2\x17\x17\xbd_\xa8S\xb9\x87\xa9K\xbcY\x83}\xbct\xc5k=\x9b\x9b\xdf\xbc\xa1\xb4\x8b\xbb\x9e\xf7\x98\xbb\xb7\xbc\xf9\xbc\x00\x16P=\'\xd2\x8a<\x9b\t\x83\xbc\xe2?O=\xbf\x97\xcf<\xce$y=*k\xb8<*\x89P=\x89E\xf7\xbc\xdf\x869\xbb\xfb\x81\xa0<\xf7\x13\x88<[\x95\x12<\xb8\x04\x91\xbc\xfa\xb9\x81\xbcR\xcb^=V#\x02=\x99+\xbc;\x89\xa3\xde<\x15,\x04\xbd\x10H\x16=\r\x1a\x93=8q\x85\xbc\x14\xa5\x1c<\xfe\x19\xff\x05=\xc0\x8e\x91\xbca\x02\xbe;U\xce\x1f=\x10\xd4\x0c=|G\x1b=m?\xe2\xbc\x00\xd2\x12=S\x12\xd9<\x0b\x89l<\n!\x83<\x99\xef\x94;N\x86+=\xab|\x98=?\xba\xa5<\xcc\x0e_\xbc\xcb-\xeb\xbc8]\x0b\xbd\nM\xda\xbc\\\xb0\xe8;F2\x1e\xbcv\xa6\x85`<\x16\xa5\xbf:\xf0\x8b\xd4\xbd\xcb~:=\xef\x11S=\xac\x8a\x96\xbc\x01j\x90\xbc\xac\xa76=(\xaf\xb1<6}\x80\xbd\xc3@\xb8\xbc\x96}\xa1<\\U\x12=\x12\xcd\x9e<|\x8b\t==\x173=\x86\xdeP=\x9bH\'=\xa5\xca\x1c=\xf2\x0f\x08<\xb9p\x1e\xba\xff\xb9\x90\xba"\x18s\xbbc\x990=\xa4\xecZ\xbd\x1b\x04\xa7<\x1e\xb7\x06\xbc)\xc2\xc6\xbbZ\xd0\xdd\xbc{\x16\xee\xbct\xa5\xee\xbc\x8d\xdey< \xbf\x92<\xf2k\xb8;\xd9\rO\xbc\xca\xa0\'\xbdy!\x86\xbcJgm