Files
lpmsdemo/ffmpeg/dnn_test.go
2020-05-22 06:09:05 +08:00

587 lines
13 KiB
Go

package ffmpeg
import (
"fmt"
"os"
"strings"
"testing"
"time"
)
//go test -run Dnn
func TestDnn_LoadModel(t *testing.T) {
//MODEL_PARAM=tmodel.pb,input_1,reshape_3/Reshape
param := os.Getenv("MODEL_PARAM")
if param == "" {
t.Skip("Skipping model loading test; no MODEL_PARAM set")
//t.Error("no MODEL_PARAM set")
}
str2dnnfilter := func(inp string) VideoProfile {
dnnfilter := VideoProfile{}
strs := strings.Split(inp, ",")
if len(strs) != 3 {
return dnnfilter
}
dnnfilter.Detector.ModelPath = strs[0]
dnnfilter.Detector.Input = strs[1]
dnnfilter.Detector.Output = strs[2]
return dnnfilter
}
_, dir := setupTest(t)
defer os.RemoveAll(dir)
dnncfg := str2dnnfilter(param)
if len(dnncfg.Detector.ModelPath) <= 0 || len(dnncfg.Detector.Input) <= 0 || len(dnncfg.Detector.Output) <= 0 {
t.Errorf("invalid MODEL_PARAM set %v", param)
}
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
t.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
dnnfilter.StopDnnFilter()
}
func TestDnn_GetVideoInfo(t *testing.T) {
fname := "../data/bunny2.mp4"
tvinfo := NewDnnVinfo()
vinfo, _ := tvinfo.GetVideoInfo(fname)
if len(vinfo) == 0 {
t.Errorf("Could not get video information %v", fname)
} else {
t.Logf("%v : %v", fname, vinfo)
fmt.Println(vinfo)
}
tvinfo.DeleteDnnVinfo()
}
//go test -run Dnn -bench Dnn
func BenchmarkDnn_Loadtime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
dnnfilter.StopDnnFilter()
}
//go test -run DnnSW -bench DnnSW
func BenchmarkDnnSW_Transcodingtime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
for i := 0; i < b.N; i++ {
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Software,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Software,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnSW_FilterExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
fname := "../data/bunny2.mp4"
for i := 0; i < b.N; i++ {
dnnfilter.ExecuteDnnFilter(fname, Software)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnSW_AllExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Software)
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Software,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Software,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnSW_AllDigitalExecutetime(b *testing.B) {
totalreport := ""
//0x no classify only transcoding
//1x ,2x, 3x, ... 6x
for s := 0; s <= 64; {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = uint(s)
dnncfg.Detector.Interval = 0.0
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
start := time.Now()
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Software,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Software,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
dnnfilter.StopDnnFilter()
tvinfo := NewDnnVinfo()
vinfo, _ := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %vx = classify(1) and transcoding(%v %v) at video(%v) : %v sec\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, elasec)
if s == 0 {
s = 1
evalreport = strings.Replace(evalreport, "classify(1)", "no classify", 1)
} else {
s *= 2
}
totalreport += evalreport
fmt.Println(evalreport)
}
fmt.Println(totalreport)
}
func BenchmarkDnnSW_AllCombineExecutetime(b *testing.B) {
totalreport := ""
//0x no classify only transcoding
//1x ,2x, 3x, ... 6x
SetCengineFlag(true)
for s := 0; s <= 64; {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = uint(s)
dnncfg.Detector.Interval = 0.0
RegistryDnnEngine(dnncfg)
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
start := time.Now()
for i := 0; i < b.N; i++ {
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Software,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Software,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
RemoveAllDnnEngine()
tvinfo := NewDnnVinfo()
vinfo, _ := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %vx = classify(1) and transcoding(%v %v) at video(%v) : %v sec\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, elasec)
if s == 0 {
s = 1
evalreport = strings.Replace(evalreport, "classify(1)", "no classify", 1)
} else {
s *= 2
}
totalreport += evalreport
fmt.Println(evalreport)
}
fmt.Println(totalreport)
}
func BenchmarkDnnSW_ClassifyExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = 1
dnncfg.Detector.Interval = 0.0
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
prof := P720p25fps16x9
fname := "../data/bunny2.mp4"
start := time.Now()
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
dnnfilter.StopDnnFilter()
tvinfo := NewDnnVinfo()
vinfo, frames := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %v %v %v %v %v classify: %v sec, %v s(per 1 frame) %v fps\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, frames, elasec, elasec/float64(frames), float64(frames)/elasec)
fmt.Println(evalreport)
}
//go test -run DnnHW -bench DnnHW
func BenchmarkDnnHW_Transcodingtime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
for i := 0; i < b.N; i++ {
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Nvidia,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Nvidia,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnHW_FilterExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
fname := "../data/bunny2.mp4"
for i := 0; i < b.N; i++ {
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnHW_AllExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Nvidia,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Nvidia,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
dnnfilter.StopDnnFilter()
}
func BenchmarkDnnHW_AllDigitalExecutetime(b *testing.B) {
totalreport := ""
//0x no classify only transcoding
//1x ,2x, 3x, ... 6x
for s := 0; s <= 64; {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = uint(s)
dnncfg.Detector.Interval = 0.0
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
start := time.Now()
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Nvidia,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Nvidia,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
dnnfilter.StopDnnFilter()
tvinfo := NewDnnVinfo()
vinfo, _ := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %vx = classify(1) and transcoding(%v %v) at video(%v) : %v sec\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, elasec)
if s == 0 {
s = 1
evalreport = strings.Replace(evalreport, "classify(1)", "no classify", 1)
} else {
s *= 2
}
totalreport += evalreport
fmt.Println(evalreport)
}
fmt.Println(totalreport)
}
func BenchmarkDnnHW_AllCombineExecutetime(b *testing.B) {
totalreport := ""
//0x no classify only transcoding
//1x ,2x, 3x, ... 6x
SetCengineFlag(true)
for s := 0; s <= 64; {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = uint(s)
dnncfg.Detector.Interval = 0.0
RegistryDnnEngine(dnncfg)
var err error
fname := "../data/bunny2.mp4"
oname := "outbunny2.ts"
prof := P720p25fps16x9
start := time.Now()
for i := 0; i < b.N; i++ {
// hw dec, hw enc
err = Transcode2(&TranscodeOptionsIn{
Fname: fname,
Accel: Nvidia,
}, []TranscodeOptions{
{
Oname: oname,
Profile: prof,
Accel: Nvidia,
},
})
if err != nil {
b.Error(err)
}
os.Remove(oname)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
RemoveAllDnnEngine()
tvinfo := NewDnnVinfo()
vinfo, _ := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %vx = classify(1) and transcoding(%v %v) at video(%v) : %v sec\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, elasec)
if s == 0 {
s = 1
evalreport = strings.Replace(evalreport, "classify(1)", "no classify", 1)
} else {
s *= 2
}
totalreport += evalreport
fmt.Println(evalreport)
}
fmt.Println(totalreport)
}
func BenchmarkDnnHW_ClassifyExecutetime(b *testing.B) {
dnncfg := PDnnDetector
dnncfg.Detector.SampleRate = 1
dnncfg.Detector.Interval = 0.0
dnnfilter := NewDnnFilter()
dnnfilter.dnncfg = dnncfg
if dnnfilter.InitDnnFilter(dnncfg) != true {
b.Errorf("Can not load model file %v", dnncfg.Detector.ModelPath)
}
prof := P720p25fps16x9
fname := "../data/bunny2.mp4"
start := time.Now()
for i := 0; i < b.N; i++ {
// dnn filter
dnnfilter.ExecuteDnnFilter(fname, Nvidia)
}
elapsed := time.Since(start)
elasec := elapsed.Seconds() / float64(b.N)
dnnfilter.StopDnnFilter()
tvinfo := NewDnnVinfo()
vinfo, frames := tvinfo.GetVideoInfo(fname)
tvinfo.DeleteDnnVinfo()
//run 1x = classify(1) and transcoding(1280x720 30fps) at realtime video len(s): xxxx s
evalreport := fmt.Sprintf("Run %v %v %v %v %v classify: %v sec, %v s(per 1 frame) %v fps\n", dnncfg.Detector.SampleRate,
prof.Resolution, prof.Framerate, vinfo, frames, elasec, elasec/float64(frames), float64(frames)/elasec)
fmt.Println(evalreport)
}