Skip to content

Commit e8c494d

Browse files
quantized weights + loading for tiny yolov2
1 parent b4f4729 commit e8c494d

7 files changed

+75
-2
lines changed

src/tinyYolov2/TinyYolov2.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { BOX_ANCHORS, INPUT_SIZES, IOU_THRESHOLD, NUM_BOXES } from './config';
1212
import { convWithBatchNorm } from './convWithBatchNorm';
1313
import { extractParams } from './extractParams';
1414
import { getDefaultParams } from './getDefaultParams';
15+
import { loadQuantizedParams } from './loadQuantizedParams';
1516
import { NetParams, TinyYolov2ForwardParams } from './types';
1617

1718
export class TinyYolov2 extends NeuralNetwork<NetParams> {
@@ -135,11 +136,9 @@ export class TinyYolov2 extends NeuralNetwork<NetParams> {
135136
return detections
136137
}
137138

138-
/* TODO
139139
protected loadQuantizedParams(uri: string | undefined) {
140140
return loadQuantizedParams(uri)
141141
}
142-
*/
143142

144143
protected extractParams(weights: Float32Array) {
145144
return extractParams(weights)

src/tinyYolov2/loadQuantizedParams.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import * as tf from '@tensorflow/tfjs-core';
2+
3+
import { disposeUnusedWeightTensors } from '../commons/disposeUnusedWeightTensors';
4+
import { extractWeightEntryFactory } from '../commons/extractWeightEntryFactory';
5+
import { loadWeightMap } from '../commons/loadWeightMap';
6+
import { ConvParams, ParamMapping } from '../commons/types';
7+
import { BatchNorm, ConvWithBatchNorm, NetParams } from './types';
8+
9+
const DEFAULT_MODEL_NAME = 'tiny_yolov2_model'
10+
11+
function extractorsFactory(weightMap: any, paramMappings: ParamMapping[]) {
12+
13+
const extractWeightEntry = extractWeightEntryFactory(weightMap, paramMappings)
14+
15+
function extractBatchNormParams(prefix: string): BatchNorm {
16+
const sub = extractWeightEntry<tf.Tensor1D>(`${prefix}/sub`, 1)
17+
const truediv = extractWeightEntry<tf.Tensor1D>(`${prefix}/truediv`, 1)
18+
return { sub, truediv }
19+
}
20+
21+
function extractConvParams(prefix: string): ConvParams {
22+
const filters = extractWeightEntry<tf.Tensor4D>(`${prefix}/filters`, 4)
23+
const bias = extractWeightEntry<tf.Tensor1D>(`${prefix}/bias`, 1)
24+
return { filters, bias }
25+
}
26+
27+
function extractConvWithBatchNormParams(prefix: string): ConvWithBatchNorm {
28+
const conv = extractConvParams(`${prefix}/conv`)
29+
const bn = extractBatchNormParams(`${prefix}/bn`)
30+
return { conv, bn }
31+
}
32+
33+
return {
34+
extractConvParams,
35+
extractConvWithBatchNormParams
36+
}
37+
38+
}
39+
40+
export async function loadQuantizedParams(
41+
uri: string | undefined
42+
): Promise<{ params: NetParams, paramMappings: ParamMapping[] }> {
43+
44+
const weightMap = await loadWeightMap(uri, DEFAULT_MODEL_NAME)
45+
const paramMappings: ParamMapping[] = []
46+
47+
const {
48+
extractConvParams,
49+
extractConvWithBatchNormParams
50+
} = extractorsFactory(weightMap, paramMappings)
51+
52+
53+
const params = {
54+
conv0: extractConvWithBatchNormParams('conv0'),
55+
conv1: extractConvWithBatchNormParams('conv1'),
56+
conv2: extractConvWithBatchNormParams('conv2'),
57+
conv3: extractConvWithBatchNormParams('conv3'),
58+
conv4: extractConvWithBatchNormParams('conv4'),
59+
conv5: extractConvWithBatchNormParams('conv5'),
60+
conv6: extractConvWithBatchNormParams('conv6'),
61+
conv7: extractConvWithBatchNormParams('conv7'),
62+
conv8: extractConvParams('conv8')
63+
}
64+
65+
disposeUnusedWeightTensors(weightMap, paramMappings)
66+
67+
return { params, paramMappings }
68+
}

weights/tiny_yolov2_model-shard1

4 MB
Binary file not shown.

weights/tiny_yolov2_model-shard2

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

weights/tiny_yolov2_model-shard3

Lines changed: 3 additions & 0 deletions
Large diffs are not rendered by default.

weights/tiny_yolov2_model-shard4

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"weights":[{"name":"conv0/conv/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0036540280370151294,"min":-0.44213739247883066}},{"name":"conv0/conv/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002164303555208094,"min":-0.13418682042290184}},{"name":"conv0/bn/sub","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0028029036288167914,"min":-0.3139252064274806}},{"name":"conv0/bn/truediv","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.05010388411727606,"min":2.7867696285247803}},{"name":"conv1/conv/filters","shape":[3,3,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0017398431020624497,"min":-0.22617960326811845}},{"name":"conv1/conv/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.001145745112615473,"min":-0.12488621727508656}},{"name":"conv1/bn/sub","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00586619587505565,"min":-0.9503237317590153}},{"name":"conv1/bn/truediv","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.007056442896525065,"min":1.2661800384521484}},{"name":"conv2/conv/filters","shape":[3,3,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0010545693776186774,"min":-0.12971203344709734}},{"name":"conv2/conv/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0005329197820495157,"min":-0.07034541123053607}},{"name":"conv2/bn/sub","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005863590567719703,"min":-0.691903686990925}},{"name":"conv2/bn/truediv","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006374212339812634,"min":1.4001796245574951}},{"name":"conv3/conv/filters","shape":[3,3,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0006935241175632851,"min":-0.08114232175490436}},{"name":"conv3/conv/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0002854522025468303,"min":-0.04224692597693088}},{"name":"conv3/bn/sub","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008516784275279325,"min":-1.1667994457132675}},{"name":"conv3/bn/truediv","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004096750652088838,"min":1.1394747495651245}},{"name":"conv4/conv/filters","shape":[3,3,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0006537227946169236,"min":-0.06733344784554313}},{"name":"conv4/conv/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00018004616905076831,"min":-0.041770711219778246}},{"name":"conv4/bn/sub","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011157989969440535,"min":-1.5509606057522343}},{"name":"conv4/bn/truediv","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00421752836190018,"min":1.1967103481292725}},{"name":"conv5/conv/filters","shape":[3,3,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0008280676077393925,"min":-0.05299632689532112}},{"name":"conv5/conv/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00007708504312105623,"min":-0.020973851904273033}},{"name":"conv5/bn/sub","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.011612189049814262,"min":-1.7302161684223252}},{"name":"conv5/bn/truediv","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0034869993434232826,"min":1.2963157892227173}},{"name":"conv6/conv/filters","shape":[3,3,512,1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0003250038945207409,"min":-0.04030048292057187}},{"name":"conv6/conv/bias","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00009164303220114009,"min":-0.02338002622127533}},{"name":"conv6/bn/sub","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0168181017333386,"min":-2.068626513200648}},{"name":"conv6/bn/truediv","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004455030198190726,"min":1.309550166130066}},{"name":"conv7/conv/filters","shape":[3,3,1024,1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.00026194834533859704,"min":-0.033267439858001825}},{"name":"conv7/conv/bias","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0001491123554753322,"min":-0.011928988438026577}},{"name":"conv7/bn/sub","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009263983427309523,"min":-1.1765258952683093}},{"name":"conv7/bn/truediv","shape":[1024],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.01123507022857666,"min":0.9360886812210083}},{"name":"conv8/filters","shape":[1,1,1024,30],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.001922343233052422,"min":-0.2614386796951294}},{"name":"conv8/bias","shape":[30],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0009638834233377494,"min":-0.15904076485072866}}],"paths":["tiny_yolov2_model-shard1","tiny_yolov2_model-shard2","tiny_yolov2_model-shard3","tiny_yolov2_model-shard4"]}]

0 commit comments

Comments
 (0)