-
Notifications
You must be signed in to change notification settings - Fork 2
/
weights_darknet.go
83 lines (80 loc) · 1.72 KB
/
weights_darknet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package yologo
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
// ParseConfiguration Parse darknet configuration file
func ParseConfiguration(fname string) ([]map[string]string, error) {
file, err := os.Open(fname)
if err != nil {
return nil, err
}
defer file.Close()
lines := []string{}
scanner := bufio.NewScanner(file)
for scanner.Scan() {
text := scanner.Text()
if len(text) < 1 {
continue
}
if text[0] == '#' {
continue
}
lines = append(lines, strings.TrimSpace(text))
}
if err := scanner.Err(); err != nil {
return nil, err
}
block := make(map[string]string)
blocks := []map[string]string{}
for i := range lines {
if lines[i][0] == '[' {
if len(block) != 0 {
blocks = append(blocks, block)
block = make(map[string]string)
}
block["type"] = lines[i][1 : len(lines[i])-1]
} else {
kv := strings.Split(lines[i], "=")
if len(kv) != 2 {
return nil, fmt.Errorf("Wrong format of layer parameters: %s", lines[i])
}
key, value := strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1])
block[key] = value
}
}
blocks = append(blocks, block)
return blocks, nil
}
// ParseWeights Parse darknet weights
func ParseWeights(fname string) ([]float32, error) {
fp, err := os.Open(fname)
if err != nil {
return nil, err
}
defer fp.Close()
summary := []byte{}
data := make([]byte, 4096)
for {
data = data[:cap(data)]
n, err := fp.Read(data)
if err != nil {
if err == io.EOF {
break
}
return nil, err
}
data = data[:n]
summary = append(summary, data...)
}
dataF32 := []float32{}
for i := 0; i < len(summary); i += 4 {
tempSlice := summary[i : i+4]
tempFloat32 := Float32frombytes(tempSlice)
dataF32 = append(dataF32, tempFloat32)
}
return dataF32, nil
}