FC2カウンター FPGAの部屋 DNN

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

YOLOv2 をやってみた

YOLOv3 をやってみた”に続いて、YOLOv2 をやってみたので、YOLOv3 との比較をしてみよう。

YOLOv3 のフレームワークを使って、YOLOv2 の .cfg と .weights ファイルだけを”YOLOv2のリアルタイム物体検出をTensorFlowとPythonで実装する方法”からもらってきた。
yolo.cfg と yolo.weights だ。
YOLOv3_28_180331.png

YOLOv3_29_180331.png

さて、この YOLOv2 の yolo.cfg と yolo.weights を使用して物体認識してみよう。
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
YOLOv3_17_180330.png
YOLOv3_18_180330.png

dog: 82%
truck: 64%
bicycle: 85%


だった、YOLOv3 の時は、

dog: 99%
truck: 92%
bicycle: 99%

だったので、精度は下がっているようだ。
ログを示す。

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   608 x 608 x   3   ->   608 x 608 x  32  0.639 BFLOPs
    1 max          2 x 2 / 2   608 x 608 x  32   ->   304 x 304 x  32
    2 conv     64  3 x 3 / 1   304 x 304 x  32   ->   304 x 304 x  64  3.407 BFLOPs
    3 max          2 x 2 / 2   304 x 304 x  64   ->   152 x 152 x  64
    4 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    5 conv     64  1 x 1 / 1   152 x 152 x 128   ->   152 x 152 x  64  0.379 BFLOPs
    6 conv    128  3 x 3 / 1   152 x 152 x  64   ->   152 x 152 x 128  3.407 BFLOPs
    7 max          2 x 2 / 2   152 x 152 x 128   ->    76 x  76 x 128
    8 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
    9 conv    128  1 x 1 / 1    76 x  76 x 256   ->    76 x  76 x 128  0.379 BFLOPs
   10 conv    256  3 x 3 / 1    76 x  76 x 128   ->    76 x  76 x 256  3.407 BFLOPs
   11 max          2 x 2 / 2    76 x  76 x 256   ->    38 x  38 x 256
   12 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   13 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   14 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   15 conv    256  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x 256  0.379 BFLOPs
   16 conv    512  3 x 3 / 1    38 x  38 x 256   ->    38 x  38 x 512  3.407 BFLOPs
   17 max          2 x 2 / 2    38 x  38 x 512   ->    19 x  19 x 512
   18 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   19 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   20 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   21 conv    512  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 512  0.379 BFLOPs
   22 conv   1024  3 x 3 / 1    19 x  19 x 512   ->    19 x  19 x1024  3.407 BFLOPs
   23 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   24 conv   1024  3 x 3 / 1    19 x  19 x1024   ->    19 x  19 x1024  6.814 BFLOPs
   25 route  16
   26 conv     64  1 x 1 / 1    38 x  38 x 512   ->    38 x  38 x  64  0.095 BFLOPs
   27 reorg              / 2    38 x  38 x  64   ->    19 x  19 x 256
   28 route  27 24
   29 conv   1024  3 x 3 / 1    19 x  19 x1280   ->    19 x  19 x1024  8.517 BFLOPs
   30 conv    425  1 x 1 / 1    19 x  19 x1024   ->    19 x  19 x 425  0.314 BFLOPs
   31 detection
mask_scale: Using default '1.000000'
Loading weights from yolo.weights...Done!
data/dog.jpg: Predicted in 23.070361 seconds.
dog: 82%
truck: 64%
bicycle: 85%


31層のようだ。

検出結果の predictions.png を示す。
YOLOv3_19_180330.jpg

次に馬の写真でやってみた。
./darknet detect cfg/yolo.cfg yolo.weights data/horses.jpg
YOLOv3_20_180330.png

馬の検出は 3 頭だった。YOLOv3 では 4 頭だったので、やはり検出精度が下がっているのか?
YOLOv3_21_180330.jpg

お次は、イーグルの写真だ。
./darknet detect cfg/yolo.cfg yolo.weights data/eagle.jpg
YOLOv3_22_180330.png

YOLOv3_23_180330.jpg

カイトの写真。
./darknet detect cfg/yolo.cfg yolo.weights data/kite.jpg
YOLOv3_24_180330.png

カイトは 2 個認識されていた。YOLOv3 では 7 個認識されていたので、精度は下がっている。
人は、 2 人で、YOLOv3 では、 8 人認識されていた。YOLOv3 凄い。
YOLOv3_25_180330.jpg 

犬と人と馬の写真。
./darknet detect cfg/yolo.cfg yolo.weights data/kite.jpg
YOLOv3_26_180330.png

YOLOv3_27_180330.jpg

  1. 2018年03月31日 05:11 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

YOLOv3 をやってみた

YOLOv3 が”YOLO: Real-Time Object Detection”の通りにやれば、簡単に出来たので、ブログに書いておく。

YOLO: Real-Time Object Detection”の説明のとおりにやっていく。

darknet を git clone する。
git clone https://github.com/pjreddie/darknet
cd darknet
make

YOLOv3_1_180330.png

make のログを示す。

mkdir -p obj
mkdir -p results
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/gemm.c -o obj/gemm.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/utils.c -o obj/utils.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/cuda.c -o obj/cuda.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/deconvolutional_layer.c -o obj/deconvolutional_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/convolutional_layer.c -o obj/convolutional_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/list.c -o obj/list.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/image.c -o obj/image.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/activations.c -o obj/activations.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/im2col.c -o obj/im2col.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/col2im.c -o obj/col2im.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/blas.c -o obj/blas.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/crop_layer.c -o obj/crop_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/dropout_layer.c -o obj/dropout_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/maxpool_layer.c -o obj/maxpool_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/softmax_layer.c -o obj/softmax_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/data.c -o obj/data.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/matrix.c -o obj/matrix.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/network.c -o obj/network.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/connected_layer.c -o obj/connected_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/cost_layer.c -o obj/cost_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/parser.c -o obj/parser.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/option_list.c -o obj/option_list.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/detection_layer.c -o obj/detection_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/route_layer.c -o obj/route_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/upsample_layer.c -o obj/upsample_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/box.c -o obj/box.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/normalization_layer.c -o obj/normalization_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/avgpool_layer.c -o obj/avgpool_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/layer.c -o obj/layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/local_layer.c -o obj/local_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/shortcut_layer.c -o obj/shortcut_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/logistic_layer.c -o obj/logistic_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/activation_layer.c -o obj/activation_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/rnn_layer.c -o obj/rnn_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/gru_layer.c -o obj/gru_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/crnn_layer.c -o obj/crnn_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/demo.c -o obj/demo.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/batchnorm_layer.c -o obj/batchnorm_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/region_layer.c -o obj/region_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/reorg_layer.c -o obj/reorg_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/tree.c -o obj/tree.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/lstm_layer.c -o obj/lstm_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/l2norm_layer.c -o obj/l2norm_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./src/yolo_layer.c -o obj/yolo_layer.o
gcc -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -shared obj/gemm.o obj/utils.o obj/cuda.o obj/deconvolutional_layer.o obj/convolutional_layer.o obj/list.o obj/image.o obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/detection_layer.o obj/route_layer.o obj/upsample_layer.o obj/box.o obj/normalization_layer.o obj/avgpool_layer.o obj/layer.o obj/local_layer.o obj/shortcut_layer.o obj/logistic_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/crnn_layer.o obj/demo.o obj/batchnorm_layer.o obj/region_layer.o obj/reorg_layer.o obj/tree.o obj/lstm_layer.o obj/l2norm_layer.o obj/yolo_layer.o -o libdarknet.so -lm -pthread
ar rcs libdarknet.a obj/gemm.o obj/utils.o obj/cuda.o obj/deconvolutional_layer.o obj/convolutional_layer.o obj/list.o obj/image.o obj/activations.o obj/im2col.o obj/col2im.o obj/blas.o obj/crop_layer.o obj/dropout_layer.o obj/maxpool_layer.o obj/softmax_layer.o obj/data.o obj/matrix.o obj/network.o obj/connected_layer.o obj/cost_layer.o obj/parser.o obj/option_list.o obj/detection_layer.o obj/route_layer.o obj/upsample_layer.o obj/box.o obj/normalization_layer.o obj/avgpool_layer.o obj/layer.o obj/local_layer.o obj/shortcut_layer.o obj/logistic_layer.o obj/activation_layer.o obj/rnn_layer.o obj/gru_layer.o obj/crnn_layer.o obj/demo.o obj/batchnorm_layer.o obj/region_layer.o obj/reorg_layer.o obj/tree.o obj/lstm_layer.o obj/l2norm_layer.o obj/yolo_layer.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/captcha.c -o obj/captcha.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/lsd.c -o obj/lsd.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/super.c -o obj/super.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/art.c -o obj/art.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/tag.c -o obj/tag.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/cifar.c -o obj/cifar.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/go.c -o obj/go.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/rnn.c -o obj/rnn.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/segmenter.c -o obj/segmenter.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/regressor.c -o obj/regressor.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/classifier.c -o obj/classifier.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/coco.c -o obj/coco.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/yolo.c -o obj/yolo.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/detector.c -o obj/detector.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/nightmare.c -o obj/nightmare.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -c ./examples/darknet.c -o obj/darknet.o
gcc -Iinclude/ -Isrc/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/darknet.o libdarknet.a -o darknet -lm -pthread libdarknet.a


yolov3.weights をダウンロードした。
wget https://pjreddie.com/media/files/yolov3.weights
YOLOv3_2_180330.png 

物体識別スタートなのだが、はじめに darknet/data ディレクトリを示しておく。
YOLOv3_7_180330.png

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
YOLOv3_3_180330.png
YOLOv3_4_180330.png

成功したようだ。
dog: 99%
truck: 92%
bicycle: 99%
ログを示す。

layer     filters    size              input                output
    0 conv     32  3 x 3 / 1   416 x 416 x   3   ->   416 x 416 x  32  0.299 BFLOPs
    1 conv     64  3 x 3 / 2   416 x 416 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    2 conv     32  1 x 1 / 1   208 x 208 x  64   ->   208 x 208 x  32  0.177 BFLOPs
    3 conv     64  3 x 3 / 1   208 x 208 x  32   ->   208 x 208 x  64  1.595 BFLOPs
    4 res    1                 208 x 208 x  64   ->   208 x 208 x  64
    5 conv    128  3 x 3 / 2   208 x 208 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    6 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
    7 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
    8 res    5                 104 x 104 x 128   ->   104 x 104 x 128
    9 conv     64  1 x 1 / 1   104 x 104 x 128   ->   104 x 104 x  64  0.177 BFLOPs
   10 conv    128  3 x 3 / 1   104 x 104 x  64   ->   104 x 104 x 128  1.595 BFLOPs
   11 res    8                 104 x 104 x 128   ->   104 x 104 x 128
   12 conv    256  3 x 3 / 2   104 x 104 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   13 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   14 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   15 res   12                  52 x  52 x 256   ->    52 x  52 x 256
   16 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   17 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   18 res   15                  52 x  52 x 256   ->    52 x  52 x 256
   19 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   20 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   21 res   18                  52 x  52 x 256   ->    52 x  52 x 256
   22 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   23 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   24 res   21                  52 x  52 x 256   ->    52 x  52 x 256
   25 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   26 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   27 res   24                  52 x  52 x 256   ->    52 x  52 x 256
   28 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   29 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   30 res   27                  52 x  52 x 256   ->    52 x  52 x 256
   31 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   32 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   33 res   30                  52 x  52 x 256   ->    52 x  52 x 256
   34 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
   35 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
   36 res   33                  52 x  52 x 256   ->    52 x  52 x 256
   37 conv    512  3 x 3 / 2    52 x  52 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   38 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   39 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   40 res   37                  26 x  26 x 512   ->    26 x  26 x 512
   41 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   42 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   43 res   40                  26 x  26 x 512   ->    26 x  26 x 512
   44 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   45 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   46 res   43                  26 x  26 x 512   ->    26 x  26 x 512
   47 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   48 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   49 res   46                  26 x  26 x 512   ->    26 x  26 x 512
   50 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   51 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   52 res   49                  26 x  26 x 512   ->    26 x  26 x 512
   53 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   54 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   55 res   52                  26 x  26 x 512   ->    26 x  26 x 512
   56 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   57 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   58 res   55                  26 x  26 x 512   ->    26 x  26 x 512
   59 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   60 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   61 res   58                  26 x  26 x 512   ->    26 x  26 x 512
   62 conv   1024  3 x 3 / 2    26 x  26 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   63 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   64 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   65 res   62                  13 x  13 x1024   ->    13 x  13 x1024
   66 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   67 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   68 res   65                  13 x  13 x1024   ->    13 x  13 x1024
   69 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   70 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   71 res   68                  13 x  13 x1024   ->    13 x  13 x1024
   72 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   73 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   74 res   71                  13 x  13 x1024   ->    13 x  13 x1024
   75 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   76 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   77 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   78 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   79 conv    512  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 512  0.177 BFLOPs
   80 conv   1024  3 x 3 / 1    13 x  13 x 512   ->    13 x  13 x1024  1.595 BFLOPs
   81 conv    255  1 x 1 / 1    13 x  13 x1024   ->    13 x  13 x 255  0.088 BFLOPs
   82 detection
   83 route  79
   84 conv    256  1 x 1 / 1    13 x  13 x 512   ->    13 x  13 x 256  0.044 BFLOPs
   85 upsample            2x    13 x  13 x 256   ->    26 x  26 x 256
   86 route  85 61
   87 conv    256  1 x 1 / 1    26 x  26 x 768   ->    26 x  26 x 256  0.266 BFLOPs
   88 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   89 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   90 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   91 conv    256  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 256  0.177 BFLOPs
   92 conv    512  3 x 3 / 1    26 x  26 x 256   ->    26 x  26 x 512  1.595 BFLOPs
   93 conv    255  1 x 1 / 1    26 x  26 x 512   ->    26 x  26 x 255  0.177 BFLOPs
   94 detection
   95 route  91
   96 conv    128  1 x 1 / 1    26 x  26 x 256   ->    26 x  26 x 128  0.044 BFLOPs
   97 upsample            2x    26 x  26 x 128   ->    52 x  52 x 128
   98 route  97 36
   99 conv    128  1 x 1 / 1    52 x  52 x 384   ->    52 x  52 x 128  0.266 BFLOPs
  100 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  101 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
  102 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  103 conv    128  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 128  0.177 BFLOPs
  104 conv    256  3 x 3 / 1    52 x  52 x 128   ->    52 x  52 x 256  1.595 BFLOPs
  105 conv    255  1 x 1 / 1    52 x  52 x 256   ->    52 x  52 x 255  0.353 BFLOPs
  106 detection
Loading weights from yolov3.weights...Done!
data/dog.jpg: Predicted in 20.733993 seconds.
dog: 99%
truck: 92%
bicycle: 99%


106層なのか?深いな。。。
検出結果の predictions.png を示す。
YOLOv3_6_180330.jpg

他の写真でもやってみた。
./darknet detect cfg/yolov3.cfg yolov3.weights data/horses.jpg
YOLOv3_8_180330.png

YOLOv3_9_180330.jpg

./darknet detect cfg/yolov3.cfg yolov3.weights data/eagle.jpg
YOLOv3_10_180330.png

YOLOv3_11_180330.jpg

./darknet detect cfg/yolov3.cfg yolov3.weights data/kite.jpg
YOLOv3_12_180330.png 

YOLOv3_13_180330.jpg

これは凄い。。。小さいカイトまで綺麗に検出されている。

./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg
YOLOv3_14_180330.png

YOLOv3_15_180330.jpg

darknet/cfg を見ると YOLOv3 以外にもいろいろなネットワークがあるようだ。重みを持ってくればこれらもできるのかも?
YOLOv3_16_180330.png
  1. 2018年03月30日 05:09 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream インターフェースの畳み込みニューラルネットワーク5(モードの変更)

AXI4-Stream インターフェースの畳み込みニューラルネットワーク4(ビット幅の変更)”の続き。

前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのビット幅を変更したときの変化を確認した。今回は、量子化モード、オーバーフローモードを変更した場合の精度とリソース使用量の違いを見ていこう。

Linux で all_layers3 プロジェクトを作成した。all_layers2 の全ファイルをコピーして、すべての量子化モードとオーバーフローモードをAP_TRN, AP_WARP から AP_TRN_ZERO, AP_SAT に変更した。
all_layers_29_180318.png


最初に、#include

"curve_data_0_100.h"

だけを生かしてC シミュレーションを行った。
all_layers_30_180318.png

エラーの数は、ハードウェア化関数が 12 個、float のソフトウェアが 20 個だった。

hw_err_cnt = 12 sw_err_cnt = 20


#include "curve_data_2500_2600.h"

を生かして、C シミュレーションを行った。
all_layers_31_180318.png

エラーの数は、ハードウェア化関数が 29 個、float のソフトウェアが 11 個だった。

hw_err_cnt = 29 sw_err_cnt = 11


#include "curve_data_5000_5100.h"

を生かして、C シミュレーションを行った。
all_layers_32_180318.png

エラーの数は、ハードウェア化関数が 34 個、float のソフトウェアが 15 個だった。

hw_err_cnt = 34 sw_err_cnt = 15



ハードウェア化関数の推論の精度は (900 - (12 + 29 + 34)) / 900 ≒ 91.7 % だった。少し上がっている。
ソフトウェアでの推論の精度は、(900 - (20 + 11 + 15)) / 900 ≒ 94.9 % だった。


C コードの合成を行った。結果を示す。
all_layers_33_180318.png
all_layers_34_180318.png

Latency は 9799 クロックで、前回は 9625 クロックだったので長くなっている。Interval も 8583 クロックで、前回は 8427 クロックだったので、やはり、長くなっている。
リソース使用量は、BRAM_18K は 14 個で変化なし、DSP48E は 7 個で 28 個から大幅に減少した。FF は 5900 個で、4258 個から増加。LUT は 16727 個で、6828 個の 2.45 倍程度になってしまった。

やはり、オーバーフローモードで飽和を選ぶとリソース使用量が多いようだ。(追記:リソース使用量が多いかどうかは分からないが、飽和演算のためか?演算器がDSPからLUT にアサインされるのではないだろうか?)LUT を消費しないためには、演算がオーバーフローしないようにビット幅を選んで、もし、飽和演算したかったら、最後の1つだけ飽和演算した方が良さそうだ。
  1. 2018年03月19日 04:10 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream インターフェースの畳み込みニューラルネットワーク4(ビット幅の変更)

AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)”の続き。

前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークの C シミュレーションと C/RTL 協調シミュレーションを行った。今回は、ビット幅を変更したときの精度とリソース使用量の違いを見ていこう。

最初に、Linux の Vivado HLS 2017.3 で合成していなかったので、合成し、その結果を示す。
all_layers_27_180318.png
all_layers_28_180318.png

Latency は 9626 クロック、Interval は 8427 クロックで、Windows 10 上のVivado HLS 2017.4 と同じだ。
リソース使用量は、BRAM_18K とDSP48E は同じで、FF とLUT が少し多い。

次に、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(Vivado HLS でCNN を実装)”では、畳み込み層の演算を 13 ビット長、全結合層の演算を 16 ビット長で行い、出力も 16 ビット長なので、これに合わせてみることにした。なお、新たに all_layers2 プロジェクトを新規作成した。
all_layers_21_180318.png

最初に、

#include "curve_data_0_100.h"

だけを生かしてC シミュレーションを行った。
all_layers_22_180318.png

エラーの数は、ハードウェア化関数が 17 個、float のソフトウェアが 20 個だった。

hw_err_cnt = 17 sw_err_cnt = 20


#include "curve_data_2500_2600.h"

を生かして、C シミュレーションを行った。
all_layers_23_180318.png

エラーの数は、ハードウェア化関数が 33 個、float のソフトウェアが 11 個だった。

hw_err_cnt = 33 sw_err_cnt = 11


#include "curve_data_5000_5100.h"

を生かして、C シミュレーションを行った。
all_layers_24_180318.png

エラーの数は、ハードウェア化関数が 29 個、float のソフトウェアが 15 個だった。

hw_err_cnt = 29 sw_err_cnt = 15


ハードウェア化関数の推論の精度は (900 - (17 + 33 + 29)) / 900 ≒ 91.2 % だった。前回と同じだ。
ソフトウェアでの推論の精度は、(900 - (20 + 11 + 15)) / 900 ≒ 94.9 % だった。


C コードの合成を行った。結果を示す。
all_layers_25_180318.png
all_layers_26_180318.png
Latency は 9625 クロックで、Interval は 8427 クロックだった。Interval は同じだが、Latency は 2 クロック短くなっている。
リソース使用量は、BRAM_18K とDSP48E は同じだが、FF とLUT は多少少なくなっている。

ビット幅を変更しても、顕著な変化は無い様だ。
  1. 2018年03月18日 06:23 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream インターフェースの畳み込みニューラルネットワーク3(シミュレーション)

AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)”の続き。

前回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークの C シミュレーションと C/RTL 協調シミュレーションを行う。

まずは、C シミュレーションから行こう。
まずは、最初の

#include "curve_data_0_100.h"

つまり、0 番目から 300 番目の白線画像でやってみた。結果はエラーになった。
all_layers_20_180317.png

エラー内容は、

cc1plus.exe: out of memory allocating 16008 bytes

なので、Linux のVivado HLS 2017.3 でやってみることにした。
もう一度、Linux 版のVivado HLS 2017.3 で C シミュレーションを行った。
今度は成功した。結果を示す。
all_layers_17_180316.png

hw_err_cnt = 12 sw_err_cnt = 20

の内の hw_err_cnt がハードウェア化関数でのエラーの数を表す。sw_err_cnt が float で実装したソフトウェアのエラーの数を示す。今回はハードウェアのエラーが 12 個で、ソフトウェアのエラーが 20 個だった。思いがけなくソフトウェアのエラー数が多かった。

次に、

#include "curve_data_2500_2600.h"

の 2500 番目から 2800 番目の白線画像でやってみた。結果を示す。
all_layers_18_180316.png

hw_err_cnt = 29 sw_err_cnt = 12

で、ハードウェアが 29 個、ソフトウェアが 12 個間違った。

今度は、

#include "curve_data_5000_5100.h"

で C シミュレーションを行った。結果を示す。
all_layers_19_180316.png

hw_err_cnt = 37 sw_err_cnt = 15

で、エラー数はハードウェアが 37 個、ソフトウェアが 15 個だった。やはり、ハードウェアのエラー数が多くなっている。

ここまでの精度を計算してみよう。
まずは、ハードウェアで、300 + 300 + 300 = 900 個の画像をテストして、12 + 29 + 37 = 78 個エラーがあったので、
(900 - 78) / 900 * 100 ≒ 91.3 % となった。

ソフトウェアは、300 + 300 + 300 = 900 個の画像をテストして、20 + 11 + 15 = 46 個エラーがあったので、
(900 - 46) / 900 * 100 ≒ 94.9 % となった。


C/RTL 協調シミュレーションを行うのだが、300 個のデータを実行するのは大変だ。と言う訳で、テストベンチの C ソースコードの

#define NUM_ITERATIONS 300

をコメントアウトして、

#define NUM_ITERATIONS 2

を生かした。
all_layers_16_180316.png

これで、C/RTL 協調シミュレーションを行った。結果を示す。
all_layers_13_180316.png

Latency は min が 9016 クロックで、avg が 9035 クロック、max が 9054 クロックだった。Interval は 8979 クロックだった。この結果は、C コードの合成と異なる結果になっている。合成では、Latency は 9626 クロックとなっていたので、C/RTL 協調シミュレーションでは短くなっている。

C/RTL 協調シミュレーションの波形を示す。
まずは、全体波形から。
all_layers_14_180316.png

2番目の処理の実行時間は89.54 us だった。

2番目の初めの処理を拡大してみよう。
all_layers_15_180316.png

初めは、順調にAXI4-Stream でデータを受け取れているが、定常状態になった後は、転送の間隔は 1.08 us となった。転送時間は 0.2 us だったので、転送の効率は 1/54 だった。
  1. 2018年03月17日 07:17 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream インターフェースの畳み込みニューラルネットワーク2(C コードの合成、Export RTL)

AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)”の続き。

前回は、AXI4-Stream インターフェースの各層をつないだ AXI4-Stream インターフェースの畳み込みニューラルネットワークの概要を説明した。今回は、AXI4-Stream インターフェースの畳み込みニューラルネットワークのC コードの合成と Export RTL を行った。

最初に、”AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)”で示したAXI4-Stream インターフェースの畳み込みニューラルネットワークのハードウェア化関数が書かれている all_layers.cpp は最終形なので、そこから DATAFLOW 指示子をコメントアウトする。これで C コードの合成を行ったが、エラーになった。
all_layers_7_180316.png

エラー内容の最初の 1 個を示す。

ERROR: [XFORM 203-733] An internal stream 'outs_conv_layer.V.data.data0.V' (all_layers/all_layers.cpp:42) with default size is used in a non-dataflow region, which may result in deadlock. Please consider to resize the stream using the directive 'set_directive_stream' or the 'HLS stream' pragma.


結局、各層の実行が1つの関数が実行を終了するまでブロックされるので、ストリームのバッファサイズを指定する必要があるようだ。そこで、コメントアウトされていた STREAM 指示子を生かそう。これらは、その層で出力されるデータのサイズを指定してある。
all_layers_8_180316.png

これで、C コードの合成を行った。今度はエラー無しでコンパイルすることができた。結果を示す。
all_layers_9_180316.png

Estmated は 9.40 ns だった。ただし、Uncertainty は 3.00 ns にしてある。これは、Estmated がタイミング制約をオーバーしてしまったからである。
Latency は 10065 クロックで、100 MHz で動作した場合には、100.65 us となる。
リソース使用量は、BRAM_18K は 28 個、DSP48E も 28 個となった。FF は 4931 個、LUT は 8980 個となった。

さて、この状態では、各層がオーバーラップしていないので、DATAFLOW 指示子を生かしてみよう。各層がオーバーラップ動作するので、STREAM 指示子は無くても動作できるためコメントアウトした。
all_layers_10_180316.png

これで、C コードの合成を行った。結果を示す。
all_layers_11_180316.png

Latency は 9626 クロックで、100 MHz で動作した場合には、96.26 us となる。Interval は 8427 クロックで、これは affine_layer1 とほぼ同じクロック数となる。
現在、白線間を走行するロボットカーで使用している畳み込みニューラルネットワークのLatency は 194433 クロックだったので、100 MHz で動作しているためレイテンシは約 1.94 ms だった。今回の AXI4-Stream インターフェースの畳み込みニューラルネットワークの Latency は 9626 クロックだったので、194433 / 9626 ≒ 20.2 倍の性能向上となった。ただし、現在使用している畳み込みニューラルネットワークは、最初に画像を切り取る機能があるので、AXI4-Stream インターフェースの畳み込みニューラルネットワークをそれに対応させると多少の性能低下はあると思う。
リソース使用量は、STREAM 指示子をコメントアウトして、DATAFLOW 指示子を付ける前よりもBRAM_18K の使用量が半分になった。これは、STREAM 指示子でのバッファが無くなったためだと思われる。FF は 4309 個、LUT は 6764 個でいずれも減っているのが分かる。

Export RTL を行った。結果を示す。
なお、Vivado synthesis, place and route にチェックを入れてある。
all_layers_12_180316.png

LUT は 1687 個、FF は 2168 個使用している。DSP は 28 個、BRAM は 14 個で合成の時と同じ数になった。
CP achieved post-implementation は、8.675 ns で問題無さそうだ。
  1. 2018年03月16日 04:20 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0

AXI4-Stream インターフェースの畳み込みニューラルネットワーク1(概要説明)

いよいよ今まで作ってきたAXI4-Stream インターフェースの各層をつないで、AXI4-Stream インターフェースの畳み込みニューラルネットワークをテストしていこう。

まずは、Vivado HLS 2017.4 で all_layers というプロジェクトを作成した。
all_layers_1_180315.png

プロジェクトにはファイルがたくさん入っている。
all_layers プロジェクトのフォルダを示す。
all_layers_2_180315.png

all_layers.cpp が今までのハードウェア化する各層の C ソースコードを接続するファイルで、all_layers_soft.cpp は、float で実装した各層の C ソースコードを接続するファイルだ。all_layers_soft.cpp はテストベンチでの比較用となる。
all_layers_tb.cpp がテストベンチだ。
curve_data_0_100.h, curve_data_2500_2600.h, curve_data_5000_5100.h は、”カーブ、直線用白線間走行用畳み込みニューラルネットワーク11(画像データをCのヘッダファイルに変換)”で作成された白線間走行用のテスト画像を数値化したヘッダファイルになる。名前では100 個のデータの様に見えるが、実は300 個の画像データが保存されている。今回は、これらのヘッダの 8 ビットの画像データの int t_train_256[300][560] を使用する。
all_layers_6_180315.png

さて、all_layers フォルダの下の hw_ip フォルダには、各層のハードウェア化する C ソースファイルがある。
all_layers_3_180315.png

これらの C ソースファイルは今までやってきたファイルと同じものだが、ブロック・レベルのインターフェースの指示子はコメントアウトしてある。こうしないと、最後のExport RTLで回路が無くなってしまうためだ。conv_layer.cpp を例として示しておく。
all_layers_5_180315.png

all_layers フォルダにある all_layers.cpp が各層の C ソースコードを接続するファイルとなる。

all_layers フォルダの下の sw_ip フォルダは、各層で、テストベンチに含まれていた float で演算する各層の C ソースコードを独立させた C ソースファイルがある。それらが、****_soft.c ファイルだ。
all_layers_4_180315.png

all_layers フォルダにある all_layers_soft.cpp が float で実装した各層の C ソースコードを接続するファイルとなる。

all_layers.h を示す。

// all_layers.h
// 2018/03/13 by marsee
//

#ifndef __ALL_LAYER_H__
#define __ALL_LAYER_H__
#include <ap_fixed.h>

template<int W, int I, int U, int TI, int TD>
    struct ap_fixed1_axis{
        struct data {
            ap_fixed<W,I,AP_TRN,AP_WRAP> data0;
        } data;
        ap_uint<(W+7)/8> keep;
        ap_uint<(W+7)/8> strb;
        ap_uint<U>       user;
        ap_uint<1>       last;
        ap_uint<TI>      id;
        ap_uint<TD>      dest;
    };

template<int W, int I, int U, int TI, int TD>
    struct ap_fixed2_axis{
        struct data {
            ap_fixed<W,I,AP_TRN,AP_WRAP> data0;
            ap_fixed<W,I,AP_TRN,AP_WRAP> data1;
        } data;
        ap_uint<(W+7)/8> keep;
        ap_uint<(W+7)/8> strb;
        ap_uint<U>       user;
        ap_uint<1>       last;
        ap_uint<TI>      id;
        ap_uint<TD>      dest;
    };

template<int U, int TI, int TD>
    struct float2_axis{
        struct data {
            float data0;
            float data1;
        } data;
        ap_uint<1> keep;
        ap_uint<1> strb;
        ap_uint<U>       user;
        ap_uint<1>       last;
        ap_uint<TI>      id;
        ap_uint<TD>      dest;
    };

template<int U, int TI, int TD>
    struct float1_axis{
        struct data {
            float data0;
        } data;
        ap_uint<1> keep;
        ap_uint<1> strb;
        ap_uint<U>       user;
        ap_uint<1>       last;
        ap_uint<TI>      id;
        ap_uint<TD>      dest;
    };

#define NUMBER_OF_OUTPUT_LAYER    3

typedef ap_uint<2> output_type;

typedef ap_fixed<12,7,AP_TRN,AP_WRAP> out_affine_type;
#endif


all_layers.cpp を示す。

// all_layers.cpp
// 2018/03/12 by marsee
//

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include <hls_video.h>

#include "all_layers.h"

int conv_layer(hls::stream<ap_axiu<32,1,1,1> >& ins,
        hls::stream<ap_fixed2_axis<16,6,1,1,1> >& outs);

int relu(hls::stream<ap_fixed2_axis<16,6,1,1,1> >& ins,
        hls::stream<ap_fixed2_axis<16,6,1,1,1> >& outs);

int max_pooling(hls::stream<ap_fixed2_axis<16,6,1,1,1> >& ins,
        hls::stream<ap_fixed2_axis<16,6,1,1,1> >& outs);

int affine_layer1(hls::stream<ap_fixed2_axis<16,6,1,1,1> >& ins,
        hls::stream<ap_fixed1_axis<19,7,1,1,1> >& outs);

int relu_affine1(hls::stream<ap_fixed1_axis<19,7,1,1,1> >& ins,
        hls::stream<ap_fixed1_axis<19,7,1,1,1> >& outs);

int affine_layer2(hls::stream<ap_fixed1_axis<19,7,1,1,1> >& ins,
        hls::stream<ap_fixed1_axis<12,7,1,1,1> >& outs);

int output_layer(hls::stream<ap_fixed1_axis<12,7,1,1,1> >& ins, output_type& output,
        out_affine_type dot2[NUMBER_OF_OUTPUT_LAYER]);

int all_layers(hls::stream<ap_axiu<32,1,1,1> >& ins, output_type& output,
        out_affine_type dot2[NUMBER_OF_OUTPUT_LAYER]){
#pragma HLS INTERFACE s_axilite port=output
#pragma HLS INTERFACE s_axilite port=dot2
#pragma HLS ARRAY_PARTITION variable=dot2 complete dim=1
#pragma HLS DATAFLOW
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=ins

    hls::stream<ap_fixed2_axis<16,6,1,1,1> > outs_conv_layer;
//#pragma HLS STREAM variable=outs_conv_layer depth=312 dim=1
    hls::stream<ap_fixed2_axis<16,6,1,1,1> > outs_relu;
//#pragma HLS STREAM variable=outs_relu depth=312 dim=1
    hls::stream<ap_fixed2_axis<16,6,1,1,1> > outs_max_pooling;
//#pragma HLS STREAM variable=outs_max_pooling depth=78 dim=1
    hls::stream<ap_fixed1_axis<19,7,1,1,1> > outs_affine_layer1;
//#pragma HLS STREAM variable=outs_affine_layer1 depth=100 dim=1
    hls::stream<ap_fixed1_axis<19,7,1,1,1> > outs_relu_affine1;
//#pragma HLS STREAM variable=outs_relu_affine1 depth=100 dim=1
    hls::stream<ap_fixed1_axis<12,7,1,1,1> > outs_affine_layer2;
//#pragma HLS STREAM variable=outs_affine_layer2 depth=3 dim=1

    conv_layer(ins, outs_conv_layer);
    relu(outs_conv_layer, outs_relu);
    max_pooling(outs_relu, outs_max_pooling);
    affine_layer1(outs_max_pooling, outs_affine_layer1);
    relu_affine1(outs_affine_layer1, outs_relu_affine1);
    affine_layer2(outs_relu_affine1, outs_affine_layer2);
    output_layer(outs_affine_layer2, output, dot2);

    return(0);
}


all_layers_tb.cpp を示す。

// all_layers_tb.cpp
// 2018/03/14 by marsee
//

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <iostream>
#include <fstream>
#include <iomanip>
#include <math.h>
#include <ap_axi_sdata.h>
#include <hls_video.h>

#include "all_layers.h"

#include "curve_data_0_100.h"
//#include "curve_data_2500_2600.h"
//#include "curve_data_5000_5100.h"

#define ALL_DATA_NUM   300
#define NUM_OF_KERNELS 2
#define COULMN_PIXELS 56
#define ROW_PIXELS 10
#define ALL_PIXELS 560
#define NUM_OF_OUTPUT 3

#define NUM_ITERATIONS    300 // C Simulation
//#define NUM_ITERATIONS    1 // C/RTL CoSimulation

int all_layers(hls::stream<ap_axiu<32,1,1,1> >& ins, output_type& output,
        out_affine_type dot2[NUMBER_OF_OUTPUT_LAYER]);

int all_layers_soft(hls::stream<ap_axiu<32,1,1,1> >& ins, output_type& output,
        float dot2[NUMBER_OF_OUTPUT_LAYER]);

int main(){
    using namespace std;

    hls::stream<ap_axiu<32,1,1,1> > ins;
    hls::stream<ap_axiu<32,1,1,1> > ins_soft;
    output_type output, output_soft;
    out_affine_type dot2[NUMBER_OF_OUTPUT_LAYER];
    float dot2_soft[NUMBER_OF_OUTPUT_LAYER];
    ap_axiu<32,1,1,1> pix;
    int hw_err_cnt = 0;
    int sw_err_cnt = 0;

    for(int i=0; i<NUM_ITERATIONS; i++){
        // ins に入力データを用意する
        for(int m=0; m<5; m++){    // dummy data
            pix.user = 0;
            pix.data = ap_uint<32>(m);
            ins << pix;
        }

        for(int y=0; y<ROW_PIXELS; y++){
            for(int x=0; x<COULMN_PIXELS; x++){
                // 1 画面分のデータを ins、ins_soft に入力する
                pix.data = ap_uint<32>(t_train_256[i][y*COULMN_PIXELS+x]);

                if (x==0 && y==0)    // 最初のデータの時に TUSER を 1 にする
                    pix.user = 1;
                else
                    pix.user = 0;

                if (x == COULMN_PIXELS-1// 行の最後でTLASTをアサートする
                    pix.last = 1;
                else
                    pix.last = 0;

                ins << pix;
                ins_soft << pix;
            }
        }

        all_layers(ins, output, dot2);
        all_layers_soft(ins_soft, output_soft, dot2_soft);

        int t_test_num = 0;
        for(int m=0; m<NUMBER_OF_OUTPUT_LAYER; m++){
            if(t_test[i][m] == 1.0f){
                t_test_num = m;
                break;
            }
        }
        // out と out_soft を比較する
        /* cout << "output" << " = " << int(output) << " output_soft = " << int(output_soft) << endl;        for(int j=0; j<NUMBER_OF_OUTPUT_LAYER; j++){            cout << "dot2[" << j << "] = " << float(dot2[j]) << " dot2_soft[" << j << "] = " << dot2_soft[j] << endl;        } */
        if(int(output) != t_test_num){
            cout << "hw_error: i = " << i << " output = " << int(output) << " t_test_num = " << t_test_num << endl;
            hw_err_cnt++;
            //return(1);
        }
        if(int(output_soft) != t_test_num){
            cout << "sw_error: i = "<< i << " output_soft = " << int(output_soft) << " t_test_num" " = " << t_test_num << endl;
            sw_err_cnt++;
            //return(1);
        }
        if(int(output) != t_test_num || int(output_soft) != t_test_num){
            for(int j=0; j<NUMBER_OF_OUTPUT_LAYER; j++){
                cout << "dot2[" << j << "] = " << fixed << setprecision(8) << float(dot2[j]) << "    dot2_soft[" << j << "] = " << dot2_soft[j] << endl;
            }
            cout << endl;
        }
    }
    cout << "hw_err_cnt = " << hw_err_cnt << " sw_err_cnt = " << sw_err_cnt << endl;

    return(0);
}

  1. 2018年03月15日 04:30 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0