├── CMakeLists.txt ├── CONTRIBUTING.md ├── Info.plist ├── LICENSE.txt ├── README.md ├── benchmark ├── CMakeLists.txt ├── README.md ├── alexnet.param ├── benchncnn.cpp ├── googlenet.param ├── googlenet_int8.param ├── mnasnet.param ├── mobilenet.param ├── mobilenet_int8.param ├── mobilenet_ssd.param ├── mobilenet_ssd_int8.param ├── mobilenet_v2.param ├── mobilenet_yolo.param ├── mobilenet_yolov3.param ├── proxylessnasnet.param ├── resnet18.param ├── resnet18_int8.param ├── resnet50.param ├── resnet50_int8.param ├── shufflenet.param ├── squeezenet.param ├── squeezenet_int8.param ├── squeezenet_ssd.param ├── squeezenet_ssd_int8.param ├── vgg16.param └── vgg16_int8.param ├── build.sh ├── cmake └── ncnnConfig.cmake.in ├── docs ├── Home.md ├── application-with-ncnn-inside.md ├── benchmark │ ├── the-benchmark-of-caffe-android-lib,-mini-caffe,-and-ncnn.md │ └── vulkan-conformance-test.md ├── developer-guide │ ├── aarch64-mix-assembly-and-intrinsic.md │ ├── add-custom-layer.zh.md │ ├── armv7-mix-assembly-and-intrinsic.md │ ├── binaryop-broadcasting.md │ ├── custom-allocator.md │ ├── element-packing.md │ ├── how-to-implement-custom-layer-step-by-step.md │ ├── how-to-write-a-neon-optimized-op-kernel.md │ ├── low-level-operation-api.md │ ├── ncnn-tips-and-tricks.zh.md │ ├── new-model-load-api.md │ ├── new-param-load-api.md │ ├── operation-param-weight-table.md │ ├── param-and-model-file-structure.md │ ├── preload-practice.zh.md │ └── tensorflow-op-combination.md ├── how-to-build │ ├── build-for-VS2017.zh.md │ ├── build-for-android.zh.md │ ├── build-for-ios.zh.md │ └── enable-openmp-for-ios.zh.md └── how-to-use-and-FAQ │ ├── FAQ-ncnn-produce-wrong-result.md │ ├── FAQ-ncnn-throw-error.md │ ├── FAQ-ncnn-vulkan.md │ ├── quantized-int8-inference.md │ ├── use-ncnn-with-alexnet.md │ ├── use-ncnn-with-alexnet.zh.md │ ├── use-ncnn-with-pytorch-or-onnx.md │ ├── use-ncnnoptmize-to-optimize-model.md │ └── vulkan-notes.md ├── examples ├── CMakeLists.txt ├── fasterrcnn.cpp ├── mobilenetssd.cpp ├── mobilenetv2ssdlite.cpp ├── peleenetssd_seg.cpp ├── rfcn.cpp ├── shufflenetv2.cpp ├── squeezencnn │ ├── AndroidManifest.xml │ ├── ant.properties │ ├── assets │ │ ├── squeezenet_v1.1.bin │ │ ├── squeezenet_v1.1.param.bin │ │ └── synset_words.txt │ ├── build.xml │ ├── jni │ │ ├── Android.mk │ │ ├── Application.mk │ │ ├── squeezencnn_jni.cpp │ │ └── squeezenet_v1.1.id.h │ ├── local.properties │ ├── proguard-project.txt │ ├── project.properties │ ├── res │ │ ├── layout │ │ │ └── main.xml │ │ └── values │ │ │ └── strings.xml │ └── src │ │ └── com │ │ └── tencent │ │ └── squeezencnn │ │ ├── MainActivity.java │ │ └── SqueezeNcnn.java ├── squeezenet.cpp ├── squeezenet_v1.1.bin ├── squeezenet_v1.1.caffemodel ├── squeezenet_v1.1.param ├── squeezenet_v1.1.prototxt ├── squeezenetssd.cpp ├── synset_words.txt ├── yolov2.cpp └── yolov3.cpp ├── images ├── 128-ncnn.png ├── 16-ncnn.png ├── 256-ncnn.png ├── 2eff677a1588b8bcf8382183192b44c.png ├── 32-ncnn.png └── 64-ncnn.png ├── myPro ├── benchmark │ └── benchncnn ├── examples │ ├── fasterrcnn │ ├── mobilenetssd │ ├── mobilenetv2ssdlite │ ├── peleenetssd_seg │ ├── rfcn │ ├── shufflenetv2 │ ├── squeezenet │ ├── squeezenet_v1.1.bin │ ├── squeezenet_v1.1.param │ ├── squeezenetssd │ ├── yolov2 │ └── yolov3 ├── projects │ ├── 1.jpg │ ├── 2.jpg │ ├── myNet │ ├── ncnn.param │ └── yolo ├── src │ ├── layer_declaration.h │ ├── layer_registry.h │ ├── layer_shader_registry.h │ ├── layer_shader_spv_data.h │ ├── layer_type_enum.h │ ├── libncnn.a │ └── platform.h └── tools │ ├── caffe │ ├── caffe.pb.cc │ ├── caffe.pb.h │ └── caffe2ncnn │ ├── mxnet │ └── mxnet2ncnn │ ├── ncnn2mem │ ├── ncnnoptimize │ ├── onnx │ ├── exp.frozen.onnx │ ├── ncnn.bin │ ├── ncnn.param │ ├── onnx.pb.cc │ ├── onnx.pb.h │ └── onnx2ncnn │ └── tensorflow │ ├── attr_value.pb.cc │ ├── attr_value.pb.h │ ├── function.pb.cc │ ├── function.pb.h │ ├── graph.pb.cc │ ├── graph.pb.h │ ├── node_def.pb.cc │ ├── node_def.pb.h │ ├── op_def.pb.cc │ ├── op_def.pb.h │ ├── resource_handle.pb.cc │ ├── resource_handle.pb.h │ ├── tensor.pb.cc │ ├── tensor.pb.h │ ├── tensor_shape.pb.cc │ ├── tensor_shape.pb.h │ ├── tensorflow2ncnn │ ├── types.pb.cc │ ├── types.pb.h │ ├── versions.pb.cc │ └── versions.pb.h ├── package.sh ├── projects ├── CMakeLists.txt ├── myNet.cpp ├── yolo.cpp └── yoloDection.h ├── src ├── CMakeLists.txt ├── allocator.cpp ├── allocator.h ├── benchmark.cpp ├── benchmark.h ├── blob.cpp ├── blob.h ├── command.cpp ├── command.h ├── cpu.cpp ├── cpu.h ├── gpu.cpp ├── gpu.h ├── layer.cpp ├── layer.h ├── layer │ ├── .clip.cpp.swp │ ├── absval.cpp │ ├── absval.h │ ├── argmax.cpp │ ├── argmax.h │ ├── arm │ │ ├── absval_arm.cpp │ │ ├── absval_arm.h │ │ ├── batchnorm_arm.cpp │ │ ├── batchnorm_arm.h │ │ ├── bias_arm.cpp │ │ ├── bias_arm.h │ │ ├── binaryop_arm.cpp │ │ ├── binaryop_arm.h │ │ ├── clip_arm.cpp │ │ ├── clip_arm.h │ │ ├── convolution_1x1.h │ │ ├── convolution_1x1_int8.h │ │ ├── convolution_2x2.h │ │ ├── convolution_3x3.h │ │ ├── convolution_3x3_int8.h │ │ ├── convolution_4x4.h │ │ ├── convolution_5x5.h │ │ ├── convolution_5x5_int8.h │ │ ├── convolution_7x7.h │ │ ├── convolution_7x7_int8.h │ │ ├── convolution_arm.cpp │ │ ├── convolution_arm.h │ │ ├── convolution_sgemm.h │ │ ├── convolution_sgemm_int8.h │ │ ├── convolutiondepthwise_3x3.h │ │ ├── convolutiondepthwise_3x3_int8.h │ │ ├── convolutiondepthwise_5x5.h │ │ ├── convolutiondepthwise_arm.cpp │ │ ├── convolutiondepthwise_arm.h │ │ ├── deconvolution_3x3.h │ │ ├── deconvolution_4x4.h │ │ ├── deconvolution_arm.cpp │ │ ├── deconvolution_arm.h │ │ ├── deconvolutiondepthwise_arm.cpp │ │ ├── deconvolutiondepthwise_arm.h │ │ ├── dequantize_arm.cpp │ │ ├── dequantize_arm.h │ │ ├── dropout_arm.cpp │ │ ├── dropout_arm.h │ │ ├── eltwise_arm.cpp │ │ ├── eltwise_arm.h │ │ ├── flatten_arm.cpp │ │ ├── flatten_arm.h │ │ ├── hardsigmoid_arm.cpp │ │ ├── hardsigmoid_arm.h │ │ ├── innerproduct_arm.cpp │ │ ├── innerproduct_arm.h │ │ ├── interp_arm.cpp │ │ ├── interp_arm.h │ │ ├── lrn_arm.cpp │ │ ├── lrn_arm.h │ │ ├── neon_mathfun.h │ │ ├── packing_arm.cpp │ │ ├── packing_arm.h │ │ ├── padding_arm.cpp │ │ ├── padding_arm.h │ │ ├── pooling_2x2.h │ │ ├── pooling_3x3.h │ │ ├── pooling_arm.cpp │ │ ├── pooling_arm.h │ │ ├── prelu_arm.cpp │ │ ├── prelu_arm.h │ │ ├── quantize_arm.cpp │ │ ├── quantize_arm.h │ │ ├── relu_arm.cpp │ │ ├── relu_arm.h │ │ ├── requantize_arm.cpp │ │ ├── requantize_arm.h │ │ ├── scale_arm.cpp │ │ ├── scale_arm.h │ │ ├── selu_arm.cpp │ │ ├── selu_arm.h │ │ ├── sigmoid_arm.cpp │ │ ├── sigmoid_arm.h │ │ ├── softmax_arm.cpp │ │ ├── softmax_arm.h │ │ ├── unaryop_arm.cpp │ │ └── unaryop_arm.h │ ├── batchnorm.cpp │ ├── batchnorm.h │ ├── bias.cpp │ ├── bias.h │ ├── binaryop.cpp │ ├── binaryop.h │ ├── bnll.cpp │ ├── bnll.h │ ├── cast.cpp │ ├── cast.h │ ├── clip.cpp │ ├── clip.h │ ├── concat.cpp │ ├── concat.h │ ├── convolution.cpp │ ├── convolution.h │ ├── convolutiondepthwise.cpp │ ├── convolutiondepthwise.h │ ├── crop.cpp │ ├── crop.h │ ├── deconvolution.cpp │ ├── deconvolution.h │ ├── deconvolutiondepthwise.cpp │ ├── deconvolutiondepthwise.h │ ├── dequantize.cpp │ ├── dequantize.h │ ├── detectionoutput.cpp │ ├── detectionoutput.h │ ├── dropout.cpp │ ├── dropout.h │ ├── eltwise.cpp │ ├── eltwise.h │ ├── elu.cpp │ ├── elu.h │ ├── embed.cpp │ ├── embed.h │ ├── exp.cpp │ ├── exp.h │ ├── expanddims.cpp │ ├── expanddims.h │ ├── flatten.cpp │ ├── flatten.h │ ├── hardsigmoid.cpp │ ├── hardsigmoid.h │ ├── innerproduct.cpp │ ├── innerproduct.h │ ├── input.cpp │ ├── input.h │ ├── instancenorm.cpp │ ├── instancenorm.h │ ├── interp.cpp │ ├── interp.h │ ├── log.cpp │ ├── log.h │ ├── lrn.cpp │ ├── lrn.h │ ├── lstm.cpp │ ├── lstm.h │ ├── memorydata.cpp │ ├── memorydata.h │ ├── mvn.cpp │ ├── mvn.h │ ├── normalize.cpp │ ├── normalize.h │ ├── packing.cpp │ ├── packing.h │ ├── padding.cpp │ ├── padding.h │ ├── permute.cpp │ ├── permute.h │ ├── pooling.cpp │ ├── pooling.h │ ├── power.cpp │ ├── power.h │ ├── prelu.cpp │ ├── prelu.h │ ├── priorbox.cpp │ ├── priorbox.h │ ├── proposal.cpp │ ├── proposal.h │ ├── psroipooling.cpp │ ├── psroipooling.h │ ├── quantize.cpp │ ├── quantize.h │ ├── reduction.cpp │ ├── reduction.h │ ├── relu.cpp │ ├── relu.h │ ├── reorg.cpp │ ├── reorg.h │ ├── requantize.cpp │ ├── requantize.h │ ├── reshape.cpp │ ├── reshape.h │ ├── rnn.cpp │ ├── rnn.h │ ├── roialign.cpp │ ├── roialign.h │ ├── roipooling.cpp │ ├── roipooling.h │ ├── scale.cpp │ ├── scale.h │ ├── selu.cpp │ ├── selu.h │ ├── shufflechannel.cpp │ ├── shufflechannel.h │ ├── sigmoid.cpp │ ├── sigmoid.h │ ├── slice.cpp │ ├── slice.h │ ├── softmax.cpp │ ├── softmax.h │ ├── split.cpp │ ├── split.h │ ├── spp.cpp │ ├── spp.h │ ├── squeeze.cpp │ ├── squeeze.h │ ├── tanh.cpp │ ├── tanh.h │ ├── tfpack.cpp │ ├── tfpack.h │ ├── tfrange.cpp │ ├── tfrange.h │ ├── tfreshape.cpp │ ├── tfreshape.h │ ├── tfresizebilinear.cpp │ ├── tfresizebilinear.h │ ├── tfshape.cpp │ ├── tfshape.h │ ├── tfstridedslice.cpp │ ├── tfstridedslice.h │ ├── tftile.cpp │ ├── tftile.h │ ├── threshold.cpp │ ├── threshold.h │ ├── tile.cpp │ ├── tile.h │ ├── unaryop.cpp │ ├── unaryop.h │ ├── vulkan │ │ ├── absval_vulkan.cpp │ │ ├── absval_vulkan.h │ │ ├── batchnorm_vulkan.cpp │ │ ├── batchnorm_vulkan.h │ │ ├── binaryop_vulkan.cpp │ │ ├── binaryop_vulkan.h │ │ ├── cast_vulkan.cpp │ │ ├── cast_vulkan.h │ │ ├── clip_vulkan.cpp │ │ ├── clip_vulkan.h │ │ ├── concat_vulkan.cpp │ │ ├── concat_vulkan.h │ │ ├── convolution_vulkan.cpp │ │ ├── convolution_vulkan.h │ │ ├── convolutiondepthwise_vulkan.cpp │ │ ├── convolutiondepthwise_vulkan.h │ │ ├── crop_vulkan.cpp │ │ ├── crop_vulkan.h │ │ ├── deconvolution_vulkan.cpp │ │ ├── deconvolution_vulkan.h │ │ ├── deconvolutiondepthwise_vulkan.cpp │ │ ├── deconvolutiondepthwise_vulkan.h │ │ ├── dropout_vulkan.cpp │ │ ├── dropout_vulkan.h │ │ ├── eltwise_vulkan.cpp │ │ ├── eltwise_vulkan.h │ │ ├── flatten_vulkan.cpp │ │ ├── flatten_vulkan.h │ │ ├── hardsigmoid_vulkan.cpp │ │ ├── hardsigmoid_vulkan.h │ │ ├── innerproduct_vulkan.cpp │ │ ├── innerproduct_vulkan.h │ │ ├── interp_vulkan.cpp │ │ ├── interp_vulkan.h │ │ ├── lrn_vulkan.cpp │ │ ├── lrn_vulkan.h │ │ ├── packing_vulkan.cpp │ │ ├── packing_vulkan.h │ │ ├── padding_vulkan.cpp │ │ ├── padding_vulkan.h │ │ ├── permute_vulkan.cpp │ │ ├── permute_vulkan.h │ │ ├── pooling_vulkan.cpp │ │ ├── pooling_vulkan.h │ │ ├── prelu_vulkan.cpp │ │ ├── prelu_vulkan.h │ │ ├── priorbox_vulkan.cpp │ │ ├── priorbox_vulkan.h │ │ ├── relu_vulkan.cpp │ │ ├── relu_vulkan.h │ │ ├── reorg_vulkan.cpp │ │ ├── reorg_vulkan.h │ │ ├── reshape_vulkan.cpp │ │ ├── reshape_vulkan.h │ │ ├── scale_vulkan.cpp │ │ ├── scale_vulkan.h │ │ ├── shader │ │ │ ├── absval.comp │ │ │ ├── absval_pack4.comp │ │ │ ├── batchnorm.comp │ │ │ ├── batchnorm_pack4.comp │ │ │ ├── binaryop.comp │ │ │ ├── binaryop_pack4.comp │ │ │ ├── cast_fp16_to_fp32.comp │ │ │ ├── cast_fp16_to_fp32_pack4.comp │ │ │ ├── cast_fp32_to_fp16.comp │ │ │ ├── cast_fp32_to_fp16_pack4.comp │ │ │ ├── clip.comp │ │ │ ├── clip_pack4.comp │ │ │ ├── concat.comp │ │ │ ├── concat_pack4.comp │ │ │ ├── concat_pack4to1.comp │ │ │ ├── convolution.comp │ │ │ ├── convolution_1x1s1d1.comp │ │ │ ├── convolution_pack1to4.comp │ │ │ ├── convolution_pack4.comp │ │ │ ├── convolution_pack4_1x1s1d1.comp │ │ │ ├── convolution_pack4_3x3s1d1_lds_8_8_2.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd23_gemm.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd23_transform_input.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd23_transform_output.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd63_gemm.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd63_transform_input.comp │ │ │ ├── convolution_pack4_3x3s1d1_winograd63_transform_output.comp │ │ │ ├── convolution_pack4to1.comp │ │ │ ├── convolutiondepthwise.comp │ │ │ ├── convolutiondepthwise_group.comp │ │ │ ├── convolutiondepthwise_group_pack1to4.comp │ │ │ ├── convolutiondepthwise_group_pack4.comp │ │ │ ├── convolutiondepthwise_group_pack4to1.comp │ │ │ ├── convolutiondepthwise_pack4.comp │ │ │ ├── crop.comp │ │ │ ├── crop_pack4.comp │ │ │ ├── deconvolution.comp │ │ │ ├── deconvolution_pack1to4.comp │ │ │ ├── deconvolution_pack4.comp │ │ │ ├── deconvolution_pack4to1.comp │ │ │ ├── deconvolutiondepthwise.comp │ │ │ ├── deconvolutiondepthwise_group.comp │ │ │ ├── deconvolutiondepthwise_group_pack1to4.comp │ │ │ ├── deconvolutiondepthwise_group_pack4.comp │ │ │ ├── deconvolutiondepthwise_group_pack4to1.comp │ │ │ ├── deconvolutiondepthwise_pack4.comp │ │ │ ├── dropout.comp │ │ │ ├── dropout_pack4.comp │ │ │ ├── eltwise.comp │ │ │ ├── eltwise_pack4.comp │ │ │ ├── flatten.comp │ │ │ ├── flatten_pack1to4.comp │ │ │ ├── flatten_pack4.comp │ │ │ ├── hardsigmoid.comp │ │ │ ├── hardsigmoid_pack4.comp │ │ │ ├── innerproduct.comp │ │ │ ├── innerproduct_pack1to4.comp │ │ │ ├── innerproduct_pack4.comp │ │ │ ├── innerproduct_pack4_lds_64.comp │ │ │ ├── innerproduct_pack4to1.comp │ │ │ ├── interp.comp │ │ │ ├── interp_bicubic.comp │ │ │ ├── interp_bicubic_coeffs.comp │ │ │ ├── interp_bicubic_pack4.comp │ │ │ ├── interp_pack4.comp │ │ │ ├── lrn_norm.comp │ │ │ ├── lrn_norm_across_channel_pack4.comp │ │ │ ├── lrn_norm_within_channel_pack4.comp │ │ │ ├── lrn_square_pad.comp │ │ │ ├── lrn_square_pad_across_channel_pack4.comp │ │ │ ├── lrn_square_pad_within_channel_pack4.comp │ │ │ ├── packing_1to4.comp │ │ │ ├── packing_4to1.comp │ │ │ ├── padding.comp │ │ │ ├── padding_pack4.comp │ │ │ ├── permute.comp │ │ │ ├── permute_pack4to1.comp │ │ │ ├── pooling.comp │ │ │ ├── pooling_global.comp │ │ │ ├── pooling_global_pack4.comp │ │ │ ├── pooling_pack4.comp │ │ │ ├── prelu.comp │ │ │ ├── prelu_pack4.comp │ │ │ ├── priorbox.comp │ │ │ ├── priorbox_mxnet.comp │ │ │ ├── relu.comp │ │ │ ├── relu_pack4.comp │ │ │ ├── reorg.comp │ │ │ ├── reorg_pack1to4.comp │ │ │ ├── reorg_pack4.comp │ │ │ ├── reshape.comp │ │ │ ├── reshape_pack1to4.comp │ │ │ ├── reshape_pack4.comp │ │ │ ├── reshape_pack4to1.comp │ │ │ ├── scale.comp │ │ │ ├── scale_pack4.comp │ │ │ ├── shufflechannel.comp │ │ │ ├── shufflechannel_pack4.comp │ │ │ ├── sigmoid.comp │ │ │ ├── sigmoid_pack4.comp │ │ │ ├── softmax_div_sum.comp │ │ │ ├── softmax_div_sum_pack4.comp │ │ │ ├── softmax_exp_sub_max.comp │ │ │ ├── softmax_exp_sub_max_pack4.comp │ │ │ ├── softmax_reduce_max.comp │ │ │ ├── softmax_reduce_max_pack4.comp │ │ │ ├── softmax_reduce_sum.comp │ │ │ ├── softmax_reduce_sum_pack4.comp │ │ │ ├── tanh.comp │ │ │ ├── tanh_pack4.comp │ │ │ ├── unaryop.comp │ │ │ └── unaryop_pack4.comp │ │ ├── shufflechannel_vulkan.cpp │ │ ├── shufflechannel_vulkan.h │ │ ├── sigmoid_vulkan.cpp │ │ ├── sigmoid_vulkan.h │ │ ├── softmax_vulkan.cpp │ │ ├── softmax_vulkan.h │ │ ├── tanh_vulkan.cpp │ │ ├── tanh_vulkan.h │ │ ├── unaryop_vulkan.cpp │ │ └── unaryop_vulkan.h │ ├── x86 │ │ ├── avx_mathfun.h │ │ ├── convolution_1x1.h │ │ ├── convolution_1x1_int8.h │ │ ├── convolution_3x3.h │ │ ├── convolution_3x3_int8.h │ │ ├── convolution_5x5.h │ │ ├── convolution_5x5_int8.h │ │ ├── convolution_7x7.h │ │ ├── convolution_7x7_int8.h │ │ ├── convolution_sgemm.h │ │ ├── convolution_sgemm_int8.h │ │ ├── convolution_x86.cpp │ │ ├── convolution_x86.h │ │ ├── convolutiondepthwise_3x3.h │ │ ├── convolutiondepthwise_3x3_int8.h │ │ ├── convolutiondepthwise_x86.cpp │ │ ├── convolutiondepthwise_x86.h │ │ └── sse_mathfun.h │ ├── yolodetectionoutput.cpp │ ├── yolodetectionoutput.h │ ├── yolov3detectionoutput.cpp │ └── yolov3detectionoutput.h ├── layer_declaration.h.in ├── layer_registry.h.in ├── layer_shader_registry.h.in ├── layer_shader_spv_data.h.in ├── layer_type.h ├── layer_type_enum.h.in ├── mat.cpp ├── mat.h ├── mat_pixel.cpp ├── mat_pixel_resize.cpp ├── modelbin.cpp ├── modelbin.h ├── net.cpp ├── net.h ├── opencv.cpp ├── opencv.h ├── option.cpp ├── option.h ├── paramdict.cpp ├── paramdict.h ├── pipeline.cpp ├── pipeline.h └── platform.h.in ├── toolchains ├── aarch64-linux-gnu.toolchain.cmake ├── arm-linux-gnueabi.toolchain.cmake ├── arm-linux-gnueabihf.toolchain.cmake ├── himix100.toolchain.cmake ├── himix200.toolchain.cmake ├── hisiv300.toolchain.cmake ├── hisiv500.toolchain.cmake ├── hisiv600.toolchain.cmake ├── host.gcc.toolchain.cmake ├── ios.toolchain.cmake ├── iossimxc-x64.toolchain.cmake ├── iossimxc.toolchain.cmake ├── iosxc-arm64.toolchain.cmake ├── iosxc.toolchain.cmake ├── jetson.toolchain.cmake └── pi3.toolchain.cmake └── tools ├── CMakeLists.txt ├── README_CN.md ├── caffe ├── CMakeLists.txt ├── caffe.proto └── caffe2ncnn.cpp ├── darknet └── readme.txt ├── mxnet ├── CMakeLists.txt └── mxnet2ncnn.cpp ├── ncnn2mem.cpp ├── ncnnoptimize.cpp ├── onnx ├── CMakeLists.txt ├── onnx.proto ├── onnx2ncnn.cpp └── ssd.onnx ├── plugin ├── ImageWatchNCNN.natvis ├── README.md └── snapshot.png ├── pytorch └── readme.txt ├── quantize ├── CMakeLists.txt ├── ncnn2int8.cpp └── ncnn2table.cpp └── tensorflow ├── .tensorflow2ncnn.cpp.swp ├── CMakeLists.txt ├── attr_value.proto ├── function.proto ├── graph.proto ├── node_def.proto ├── op_def.proto ├── resource_handle.proto ├── tensor.proto ├── tensor_shape.proto ├── tensorflow2ncnn.cpp ├── types.proto └── versions.proto /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | 2 | ## Acknowledgements 3 | - Thanks to bug1989 [https://github.com/bug1989] for contributing the initial quantized int8 inference code and a large variety of device benchmark 4 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleName 6 | ncnn 7 | CFBundleIdentifier 8 | com.tencent.ncnn 9 | CFBundleVersion 10 | 1.0 11 | CFBundleShortVersionString 12 | 1.0 13 | CFBundleSignature 14 | ???? 15 | CFBundlePackageType 16 | FMWK 17 | 18 | 19 | -------------------------------------------------------------------------------- /benchmark/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | add_executable(benchncnn benchncnn.cpp) 2 | target_link_libraries(benchncnn PRIVATE ncnn) 3 | -------------------------------------------------------------------------------- /benchmark/alexnet.param: -------------------------------------------------------------------------------- 1 | 7767517 2 | 15 15 3 | Input data 0 1 data 0=227 1=227 2=3 4 | Convolution conv1 1 1 data conv1_relu1 0=96 1=11 3=4 5=1 6=34848 9=1 5 | LRN norm1 1 1 conv1_relu1 norm1 2=0.000100 6 | Pooling pool1 1 1 norm1 pool1 1=3 2=2 7 | ConvolutionDepthWise conv2 1 1 pool1 conv2_relu2 0=256 1=5 4=2 5=1 6=307200 7=2 9=1 8 | LRN norm2 1 1 conv2_relu2 norm2 2=0.000100 9 | Pooling pool2 1 1 norm2 pool2 1=3 2=2 10 | Convolution conv3 1 1 pool2 conv3_relu3 0=384 1=3 4=1 5=1 6=884736 9=1 11 | ConvolutionDepthWise conv4 1 1 conv3_relu3 conv4_relu4 0=384 1=3 4=1 5=1 6=663552 7=2 9=1 12 | ConvolutionDepthWise conv5 1 1 conv4_relu4 conv5_relu5 0=256 1=3 4=1 5=1 6=442368 7=2 9=1 13 | Pooling pool5 1 1 conv5_relu5 pool5 1=3 2=2 14 | InnerProduct fc6 1 1 pool5 fc6_drop6 0=4096 1=1 2=37748736 9=1 15 | InnerProduct fc7 1 1 fc6_drop6 fc7_drop7 0=4096 1=1 2=16777216 9=1 16 | InnerProduct fc8 1 1 fc7_drop7 fc8 0=1000 1=1 2=4096000 17 | Softmax prob 1 1 fc8 output 18 | -------------------------------------------------------------------------------- /cmake/ncnnConfig.cmake.in: -------------------------------------------------------------------------------- 1 | set(NCNN_OPENMP @NCNN_OPENMP@) 2 | set(NCNN_VULKAN @NCNN_VULKAN@) 3 | 4 | if(NCNN_OPENMP) 5 | find_package(OpenMP) 6 | endif() 7 | 8 | if(NCNN_VULKAN) 9 | find_package(Vulkan REQUIRED) 10 | 11 | add_library(Vulkan UNKNOWN IMPORTED) 12 | set_target_properties(Vulkan PROPERTIES IMPORTED_LOCATION ${Vulkan_LIBRARY}) 13 | set_target_properties(Vulkan PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Vulkan_INCLUDE_DIR}) 14 | endif() 15 | 16 | include(${CMAKE_CURRENT_LIST_DIR}/ncnn.cmake) 17 | -------------------------------------------------------------------------------- /docs/developer-guide/aarch64-mix-assembly-and-intrinsic.md: -------------------------------------------------------------------------------- 1 | ``` 2 | // v寄存器全部使用 %.4s 3 | // 128-bit vreg matches %.4s 4 | // a += b * c 5 | float32x4_t _a = vld1q_f32(a); 6 | float32x4_t _b = vld1q_f32(b); 7 | float32x4_t _c = vld1q_f32(c); 8 | asm volatile( 9 | "fmla %0.4s, %2.4s, %3.4s" 10 | : "=w"(_a) // %0 11 | : "0"(_a), 12 | "w"(_b), // %2 13 | "w"(_c) // %3 14 | : 15 | ); 16 | ``` 17 | ``` 18 | // v寄存器使用低64位 %.2s 19 | // low 64-bit vreg matches %.2s 20 | // a += b * c 21 | float32x2_t _a = vld1_f32(a); 22 | float32x2_t _b = vld1_f32(b); 23 | float32x2_t _c = vld1_f32(c); 24 | asm volatile( 25 | "fmla %0.2s, %2.2s, %3.2s" 26 | : "=w"(_a) // %0 27 | : "0"(_a), 28 | "w"(_b), // %2 29 | "w"(_c) // %3 30 | : 31 | ); 32 | ``` 33 | ``` 34 | // v寄存器单路使用 %.s[0] %.s[1] %.s[2] %.s[3] 35 | // 32-bit register matches %.s[0] 36 | // a += b * c[0] 37 | // a += b * c[1] 38 | // a += b * c[2] 39 | // a += b * c[3] 40 | float32x4_t _a = vld1_f32(a); 41 | float32x4_t _b = vld1_f32(b); 42 | float32x4_t _c = vld1_f32(c); 43 | asm volatile( 44 | "fmla %0.4s, %2.4s, %3.s[0]" 45 | "fmla %0.4s, %2.4s, %3.s[1]" 46 | "fmla %0.4s, %2.4s, %3.s[2]" 47 | "fmla %0.4s, %2.4s, %3.s[3]" 48 | : "=w"(_a) // %0 49 | : "0"(_a), 50 | "w"(_b), // %2 51 | "w"(_c) // %3 52 | : 53 | ); 54 | ``` 55 | 56 | 57 | qwq 58 | -------------------------------------------------------------------------------- /docs/developer-guide/binaryop-broadcasting.md: -------------------------------------------------------------------------------- 1 | ### broadcasting rule 2 | 3 | ncnn BinaryOp accepts blobs with different shape 4 | 5 | C = BinaryOp(A, B) 6 | 7 | shape notation convention is [w], [w,h], [w,h,c] 8 | 9 | |type|A|B|C| 10 | |---|---|---|---| 11 | |1|[1]|scalar|[1]| 12 | |2|[1]|[1]|[1]| 13 | |3|[1]|[2,3]|[2,3]| 14 | |4|[1]|[2,3,4]|[2,3,4]| 15 | |5|[2]|scalar|[2]| 16 | |6|[2]|[1]|[2]| 17 | |7|[2]|[2]|[2]| 18 | |8|[3]|[2,3]|[2,3]| 19 | |9|[4]|[2,3,4]|[2,3,4]| 20 | |10|[2,3]|scalar|[2,3]| 21 | |11|[2,3]|[1]|[2,3]| 22 | |12|[2,3]|[3]|[2,3]| 23 | |13|[2,3]|[2,3]|[2,3]| 24 | |14|[3,4]|[2,3,4]|[2,3,4]| 25 | |15|[2,3,4]|scalar|[2,3,4]| 26 | |16|[2,3,4]|[1]|[2,3,4]| 27 | |17|[2,3,4]|[4]|[2,3,4]| 28 | |18|[2,3,4]|[3,4]|[2,3,4]| 29 | |19|[2,3,4]|[2,3,4]|[2,3,4]| 30 | 31 | some special broadcasting rule exists for model compatibility 32 | 33 | |special type|A|B|C| 34 | |---|---|---|---| 35 | |1|[2,3,4]|[1,1,4]|[2,3,4]| 36 | -------------------------------------------------------------------------------- /docs/developer-guide/how-to-write-a-neon-optimized-op-kernel.md: -------------------------------------------------------------------------------- 1 | # benchmark 2 | op 3 | 4 | # naive C with openmp 5 | for for for 6 | 7 | # unroll, first try 8 | h 9 | 10 | # register allocation 11 | kernels 12 | 13 | # unroll, second try 14 | simd 15 | 16 | # neon intrinsics 17 | optional 18 | 19 | # naive neon assembly with pld 20 | asm 21 | 22 | # pipeline optimize, first try 23 | more register load mla 24 | 25 | # pipeline optimize, second try 26 | interleave load mla 27 | 28 | # pipeline optimize, third try 29 | loop tail 30 | 31 | # usual practice, load/save 32 | 233 33 | 34 | # usual practice, unroll 35 | 233 36 | 37 | # usual practice, save register 38 | 233 39 | -------------------------------------------------------------------------------- /docs/developer-guide/preload-practice.zh.md: -------------------------------------------------------------------------------- 1 | ## 只是实践经验,没有理论,不一定正确 2 | 3 | ``` 4 | prfm pldl1keep, [x0, #256] 5 | ``` 6 | * 放在 ld1 [x0] 前面 0~8 条指令 7 | * #256 表示把 x0+256 的内容放进 L1 cache 8 | * ldp 也适用 9 | * (经验)不写 offset 不如写个 #128 10 | * (经验)pldl1strm 似乎没啥意思,也没 pldl1keep 快 11 | * (经验)x0 ~ x0+256 的内容也会进来 12 | * (经验)load 128bit 用 #128,256bit或更多用 #256 13 | * (经验)避免 pld a,pld b,load a,load b 顺序,可能相互干扰 14 | * (经验)提前太多会失效 15 | * (经验)适合连续读 16 | 17 | ``` 18 | prfm pldl2strm, [x0, #256] 19 | ``` 20 | * 放在 ld1 [x0] 前面 N 条指令,N 尽量大些 21 | * #256 表示把 x0+256 的内容放进 L2 cache 22 | * ldp 也适用 23 | * (经验)不写 offset 不如写个 #128 24 | * (经验)pldl2strm 效果稍好于 pldl2keep 25 | * (经验)x0 ~ x0+256 的内容也会进来 26 | * (经验)load 128bit 用 #128,256bit 用 #256 27 | * (经验)读很多数据,用不同 offset 连续两次 pldl2strm 28 | * (经验)后面不要对同位置再 pldl1keep,会变慢 29 | * (经验)适合提前准备要跳到很远的地方读,比如换 channel 30 | -------------------------------------------------------------------------------- /docs/how-to-build/build-for-VS2017.zh.md: -------------------------------------------------------------------------------- 1 | ## 预先准备 2 | 3 | Visual Studio 2017 Community Edition,使用动态的 CRT 运行库 4 | 5 | 以下命令行均使用 **适用于 VS 2017 的 x64 本机工具命令提示** 6 | 7 | ## 编译安装 protobuf 8 | 9 | https://github.com/google/protobuf/archive/v3.4.0.zip 10 | 11 | 我下载到 C:/Users/shuiz/source 解压缩 12 | 13 | ``` 14 | mkdir build-vs2017 15 | cd build-vs2017 16 | cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install \ 17 | -Dprotobuf_BUILD_TESTS=OFF \ 18 | -Dprotobuf_MSVC_STATIC_RUNTIME=OFF ../cmake 19 | nmake 20 | nmake install 21 | ``` 22 | 23 | protobuf 会安装在 build-vs2017/install 里头 24 | 25 | ## 编译安装 ncnn 26 | 27 | https://github.com/Tencent/ncnn.git 28 | 29 | cmake 命令中的 protobuf 路径要相应修改成自己的 30 | 31 | ``` 32 | mkdir build-vs2017 33 | cd build-vs2017 34 | cmake -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%cd%/install \ 35 | -DProtobuf_INCLUDE_DIR=C:/Users/shuiz/source/protobuf-3.4.0/build-vs2017/install/include \ 36 | -DProtobuf_LIBRARIES=C:/Users/shuiz/source/protobuf-3.4.0/build-vs2017/install/lib/libprotobuf.lib \ 37 | -DProtobuf_PROTOC_EXECUTABLE=C:/Users/shuiz/source/protobuf-3.4.0/build-vs2017/install/bin/protoc.exe .. 38 | nmake 39 | nmake install 40 | ``` 41 | 42 | ncnn 会安装在 build-vs2017/install 里头 43 | 44 | ncnn 转换工具在 build-vs2017/tools 里头 45 | 46 | -------------------------------------------------------------------------------- /docs/how-to-use-and-FAQ/quantized-int8-inference.md: -------------------------------------------------------------------------------- 1 | under construction ... 2 | 3 | ## caffe-int8-convert-tools 4 | https://github.com/BUG1989/caffe-int8-convert-tools 5 | 6 | ## convert caffe model to ncnn quantized int8 model 7 | ### the offline way, reduce model binary size down to 25% 8 | 9 | |sample model binary|size| 10 | |---|---| 11 | |squeezenet.bin|4.7M| 12 | |squeezenet-int8.bin|1.2M| 13 | |mobilenet_ssd_voc.bin|22.1M| 14 | |mobilenet_ssd_voc-int8.bin|5.6M| 15 | 16 | ``` 17 | ./caffe2ncnn resnet.prototxt resnet.caffemodel resnet-int8.param resnet-int8.bin 256 resnet.table 18 | ``` 19 | ### the runtime way, no model binary reduction 20 | ``` 21 | ./caffe2ncnn resnet.prototxt resnet.caffemodel resnet-fp32-int8.param resnet-fp32-int8.bin 0 resnet.table 22 | ``` 23 | 24 | ## use ncnn int8 inference 25 | the ncnn library would use int8 inference automatically, nothing changed in your code 26 | ``` 27 | ncnn::Net resnet; 28 | resnet.load_param("resnet-int8.param"); 29 | resnet.load_model("resnet-int8.bin"); 30 | ``` 31 | ### turn off int8 inference, the runtime model only 32 | ``` 33 | ncnn::Net resnet; 34 | resnet.use_int8_inference = 0;// set the switch before loading, force int8 inference off 35 | resnet.load_param("resnet-fp32-int8.param"); 36 | resnet.load_model("resnet-fp32-int8.bin"); 37 | ``` 38 | 39 | ## mixed precision inference 40 | before converting your model files, delete the layer weight scale line in table file, and that layer will do the float32 inference 41 | ``` 42 | conv1_param_0 156.639840536 43 | ``` 44 | ``` 45 | ``` 46 | -------------------------------------------------------------------------------- /docs/how-to-use-and-FAQ/use-ncnn-with-pytorch-or-onnx.md: -------------------------------------------------------------------------------- 1 | Here is a practical guide for converting pytorch model to ncnn 2 | 3 | resnet18 is used as the example 4 | 5 | ## pytorch to onnx 6 | 7 | The official pytorch tutorial for exporting onnx model 8 | 9 | https://pytorch.org/tutorials/advanced/super_resolution_with_caffe2.html 10 | 11 | ``` 12 | import torch 13 | import torchvision 14 | import torch.onnx 15 | 16 | # An instance of your model 17 | model = torchvision.models.resnet18() 18 | 19 | # An example input you would normally provide to your model's forward() method 20 | x = torch.rand(1, 3, 224, 224) 21 | 22 | # Export the model 23 | torch_out = torch.onnx._export(model, x, "resnet18.onnx", export_params=True) 24 | ``` 25 | 26 | ## simplify onnx model 27 | 28 | The exported resnet18.onnx model may contains many redundant operators such as Shape, Gather and Unsqueeze that is not supported in ncnn 29 | 30 | ``` 31 | Shape not supported yet! 32 | Gather not supported yet! 33 | # axis=0 34 | Unsqueeze not supported yet! 35 | # axes 7 36 | Unsqueeze not supported yet! 37 | # axes 7 38 | ``` 39 | 40 | Fortunately, daquexian developed a handy tool to eliminate them. cheers! 41 | 42 | https://github.com/daquexian/onnx-simplifier 43 | 44 | ``` 45 | python3 -m onnxsim resnet18.onnx resnet18-sim.onnx 46 | ``` 47 | 48 | ## onnx to ncnn 49 | 50 | Finally, you can convert the model to ncnn using tools/onnx2ncnn 51 | 52 | ``` 53 | onnx2ncnn resnet18-sim.onnx resnet18.param resnet18.bin 54 | ``` 55 | 56 | -------------------------------------------------------------------------------- /docs/how-to-use-and-FAQ/use-ncnnoptmize-to-optimize-model.md: -------------------------------------------------------------------------------- 1 | ### Non ARM Linux Platform 2 | 3 | the typical usage 4 | ``` 5 | ncnnoptimize mobilenet.param mobilenet.bin mobilenet-opt.param mobilenet-opt.bin 65536 6 | ``` 7 | 8 | operator fusion 9 | * batchnorm - scale 10 | * convolution - batchnorm 11 | * convolutiondepthwise - batchnorm 12 | * deconvolution - batchnorm 13 | * deconvolutiondepthwise - batchnorm 14 | * innerproduct - batchnorm 15 | * convolution - relu 16 | * convolutiondepthwise - relu 17 | * deconvolution - relu 18 | * deconvolutiondepthwise - relu 19 | * innerproduct - relu 20 | 21 | eliminate noop operator 22 | * innerproduct - dropout 23 | * flatten after global pooling 24 | 25 | prefer better operator 26 | * replace convolution with innerproduct after global pooling 27 | 28 | ### ARM Linux Platform 29 | usage 30 | ``` 31 | ncnnoptimize squeezenet.param squeezenet.bin squeezenet-opt.param squeezenet-opt.bin 0 data 227 224 3 32 | ``` 33 | 34 | explanation 35 | 36 | |parameter|meaning| 37 | |---|---| 38 | |data|input data node, currently support one input| 39 | |227|input weight| 40 | |224|input height| 41 | |3|input channel| 42 | 43 | this feature would auto choose the fastest convolution implementation, normally speedup 10%. 44 | -------------------------------------------------------------------------------- /examples/squeezencnn/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /examples/squeezencnn/ant.properties: -------------------------------------------------------------------------------- 1 | # This file is used to override default values used by the Ant build system. 2 | # 3 | # This file must be checked into Version Control Systems, as it is 4 | # integral to the build system of your project. 5 | 6 | # This file is only used by the Ant script. 7 | 8 | # You can use this to override default values such as 9 | # 'source.dir' for the location of your java source folder and 10 | # 'out.dir' for the location of your output folder. 11 | 12 | # You can also use it define how the release builds are signed by declaring 13 | # the following properties: 14 | # 'key.store' for the location of your keystore and 15 | # 'key.alias' for the name of the key to use. 16 | # The password will be asked during the build when you use the 'release' target. 17 | 18 | key.store=/home/nihui/osd/nihuini-release-key.keystore 19 | key.alias=nihuini 20 | key.store.password=nihuini 21 | key.alias.password=nihuini 22 | -------------------------------------------------------------------------------- /examples/squeezencnn/assets/squeezenet_v1.1.bin: -------------------------------------------------------------------------------- 1 | ../../squeezenet_v1.1.bin -------------------------------------------------------------------------------- /examples/squeezencnn/assets/squeezenet_v1.1.param.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hanzy88/tensorflow2ncnn/a440bf6750af409cc1476da1c68f5e9bed1491a1/examples/squeezencnn/assets/squeezenet_v1.1.param.bin -------------------------------------------------------------------------------- /examples/squeezencnn/assets/synset_words.txt: -------------------------------------------------------------------------------- 1 | ../../synset_words.txt -------------------------------------------------------------------------------- /examples/squeezencnn/jni/Android.mk: -------------------------------------------------------------------------------- 1 | LOCAL_PATH := $(call my-dir) 2 | 3 | # change this folder path to yours 4 | NCNN_INSTALL_PATH := /home/nihui/osd/ncnn-release/ncnn-android-vulkan-lib 5 | 6 | include $(CLEAR_VARS) 7 | LOCAL_MODULE := ncnn 8 | LOCAL_SRC_FILES := $(NCNN_INSTALL_PATH)/$(TARGET_ARCH_ABI)/libncnn.a 9 | include $(PREBUILT_STATIC_LIBRARY) 10 | 11 | include $(CLEAR_VARS) 12 | 13 | LOCAL_MODULE := squeezencnn 14 | LOCAL_SRC_FILES := squeezencnn_jni.cpp 15 | 16 | LOCAL_C_INCLUDES := $(NCNN_INSTALL_PATH)/include 17 | 18 | LOCAL_STATIC_LIBRARIES := ncnn 19 | 20 | LOCAL_CFLAGS := -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math 21 | LOCAL_CPPFLAGS := -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math 22 | LOCAL_LDFLAGS += -Wl,--gc-sections 23 | 24 | LOCAL_CFLAGS += -fopenmp 25 | LOCAL_CPPFLAGS += -fopenmp 26 | LOCAL_LDFLAGS += -fopenmp 27 | 28 | LOCAL_LDLIBS := -lz -llog -ljnigraphics -lvulkan 29 | 30 | include $(BUILD_SHARED_LIBRARY) 31 | -------------------------------------------------------------------------------- /examples/squeezencnn/jni/Application.mk: -------------------------------------------------------------------------------- 1 | APP_STL := c++_static 2 | APP_ABI := armeabi-v7a arm64-v8a 3 | APP_PLATFORM := android-24 4 | -------------------------------------------------------------------------------- /examples/squeezencnn/local.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must *NOT* be checked into Version Control Systems, 5 | # as it contains information specific to your local configuration. 6 | 7 | # location of the SDK. This is only used by Ant 8 | # For customization when using a Version Control System, please read the 9 | # header note. 10 | sdk.dir=/home/nihui/osd/android-sdk-linux 11 | -------------------------------------------------------------------------------- /examples/squeezencnn/proguard-project.txt: -------------------------------------------------------------------------------- 1 | # To enable ProGuard in your project, edit project.properties 2 | # to define the proguard.config property as described in that file. 3 | # 4 | # Add project specific ProGuard rules here. 5 | # By default, the flags in this file are appended to flags specified 6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt 7 | # You can edit the include path and order by changing the ProGuard 8 | # include property in project.properties. 9 | # 10 | # For more details, see 11 | # http://developer.android.com/guide/developing/tools/proguard.html 12 | 13 | # Add any project specific keep options here: 14 | 15 | # If your project uses WebView with JS, uncomment the following 16 | # and specify the fully qualified class name to the JavaScript interface 17 | # class: 18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 19 | # public *; 20 | #} 21 | -------------------------------------------------------------------------------- /examples/squeezencnn/project.properties: -------------------------------------------------------------------------------- 1 | # This file is automatically generated by Android Tools. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must be checked in Version Control Systems. 5 | # 6 | # To customize properties used by the Ant build system edit 7 | # "ant.properties", and override values to adapt the script to your 8 | # project structure. 9 | # 10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): 11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 12 | 13 | # Project target. 14 | target=android-24 15 | -------------------------------------------------------------------------------- /examples/squeezencnn/res/layout/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 |