Speed up by ignoring std::cout

Test Code

  1. #include <iostream>
  2.  
  3. int main(int argc, char *argv[])
  4. {
  5. 	//std::cout.setstate(std::ios_base::badbit);
  6. 	for(int i = 0; i < 100; i ++) {
  7. 		for(int i = 0; i < 100; i ++) {
  8. 			;//std::cout << "" << std::endl;
  9. 		}
  10. 	}
  11. 	return 0;
  12. }

Test it without std::cout

  1. root@imx6ul7d:~/tmp# time ./t1_1 
  2.  
  3. real    0m0.041s
  4. user    0m0.020s
  5. sys     0m0.000s

Test it with std::cout, but redirect to /dev/null

  1. root@imx6ul7d:~/tmp# time ./t1_0 > /dev/null
  2.  
  3. real    0m0.096s
  4. user    0m0.030s
  5. sys     0m0.030s

Test it with std::cout, but set io state

  1. root@imx6ul7d:~/tmp# time ./t1_2
  2.  
  3. real    0m0.061s
  4. user    0m0.040s
  5. sys     0m0.000s

Profile : Linux

Example 1

Add -pg

  1. arm-linux-gnueabihf-g++ -Wall -g -pg hello.cpp -o hello -std=c++17

Test

  1. root@imx6ul7d:~# gprof -b hello 
  2. Flat profile:
  3.  
  4. Each sample counts as 0.01 seconds.
  5.   %   cumulative   self              self     total           
  6.  time   seconds   seconds    calls   s/call   s/call  name    
  7. 100.00      3.45     3.45        1     3.45     3.45  hehe()
  8.   0.00      3.45     0.00        4     0.00     0.00  std::_Optional_base<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >::_M_is_engaged() const
  9. ......

Routes stream to specified buffer

Developer Command Prompt for VS 2019

  1. cl basic_ios_rdbuf.cpp /EHsc

MSDN Source Code

  1. #include <ios>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. int main( ) 
  6. {
  7.    using namespace std;
  8.    ofstream file( "rdbuf.txt" );
  9.    streambuf *x = cout.rdbuf( file.rdbuf( ) );
  10.    cout << "test" << endl; // Goes to file
  11.    cout.rdbuf(x);
  12.    cout << "test2" << endl; //normal
  13. }

TensorFlow on Android (Refer to codelabs : tensorflow-for-poets)

The google demo is good, but there are some error when you follow it, so I copied and update it.

Install TensorFlow As Normal

  1. pip install tensorflow==1.7.1

Download Google Demo

  1. git clone https://github.com/googlecodelabs/tensorflow-for-poets-2
  2. cd tensorflow-for-poets-2

Download TF_Files

  1. wget http://download.tensorflow.org/example_images/flower_photos.tgz
  2. tar -xvf flower_photos.tgz -C tf_files

Set ARCHITECTURE

  1. IMAGE_SIZE=224
  2. ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"

Start TensorBoard

  1. tensorboard --logdir tf_files/training_summaries &

Help : retraining script

  1. python -m scripts.retrain -h

Train

  1. python -m scripts.retrain \
  2.   --bottleneck_dir=tf_files/bottlenecks \
  3.   --how_many_training_steps=500 \
  4.   --model_dir=tf_files/models/ \
  5.   --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" \
  6.   --output_graph=tf_files/retrained_graph.pb \
  7.   --output_labels=tf_files/retrained_labels.txt \
  8.   --architecture="${ARCHITECTURE}" \
  9.   --image_dir=tf_files/flower_photos

Train with default 4,000 iterations

  1. python -m scripts.retrain \
  2.   --bottleneck_dir=tf_files/bottlenecks \
  3.   --model_dir=tf_files/models/"${ARCHITECTURE}" \
  4.   --summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" \
  5.   --output_graph=tf_files/retrained_graph.pb \
  6.   --output_labels=tf_files/retrained_labels.txt \
  7.   --architecture="${ARCHITECTURE}" \
  8.   --image_dir=tf_files/flower_photos

Train with Your Own Data

--image_dir= The root folder of the subdirectories which is used as label names by the classification script
This image is copied from google’s codelabs !

The Retrained Model

  1. tf_files/retrained_graph.pb
  2. tf_files/retrained_labels.txt

Test

  1. (venv) water@water-G11CD:~/tensorflow-for-poets-2$ python -m scripts.label_image     --graph=tf_files/retrained_graph.pb      --image=tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg
  2.  
  3. 2019-01-23 14:13:50.234939: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  4.  
  5. Evaluation time (1-image): 0.094s
  6.  
  7. daisy (score=0.99938)
  8. sunflowers (score=0.00033)
  9. dandelion (score=0.00028)
  10. roses (score=0.00000)
  11. tulips (score=0.00000)

Now, Prepare for Android

Install PILLOW

  1. pip install PILLOW

Convert the model to TFLite format

  1. IMAGE_SIZE=224
  2. toco   --input_file=tf_files/retrained_graph.pb   --output_file=tf_files/optimized_graph.lite   --input_format=TENSORFLOW_GRAPHDEF   --output_format=TFLITE   --input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3   --input_array=input   --output_array=final_result   --inference_type=FLOAT   --input_data_type=FLOAT

The TFLite Model

  1. tf_files/optimized_graph.lite

Install AndroidStudio

  1. unzip android-studio-ide-182.5199772-linux.zip 
  2. cd android-studio/
  3. cd bin/
  4. ./studio.sh

Maybe You Need to Set Proxy

If you use lantern, you can do it like this!

Open Project

Open an existing Android Studio project

Choose android/tflite

Gradle Sync, YES

Build, Make Project

  1. android/tflite/app/build/outputs/apk/debug/app-debug.apk

Test on Your Phone

Add your model files to the project, and then Make Project, Test Again

  1. cp tf_files/optimized_graph.lite android/tflite/app/src/main/assets/graph.lite
  2. cp tf_files/retrained_labels.txt android/tflite/app/src/main/assets/labels.txt

How to train YOLOv3 to detect Peppa Pig

Prepare

Collecting Data from the Web with Python If you like

PASCAL VOC

.
├── VOCdevkit
│ └── VOC2018
│ ├── Annotations
├── ImageSets
│ │ └── Main // name of *.jpg without “.jpg”
├── JPEGImages // *.jpg

Annotation

LabelImg is a graphical image annotation tool

Example : XML

  1. <annotation>
  2. 	<folder>000</folder>
  3. 	<filename>000000.jpg</filename>
  4. 	<path>/home/water/Machine_Learning/Peppa_Pig/train/000/000000.jpg</path>
  5. 	<source>
  6. 		<database>Unknown</database>
  7. 	</source>
  8. 	<size>
  9. 		<width>410</width>
  10. 		<height>256</height>
  11. 		<depth>3</depth>
  12. 	</size>
  13. 	<segmented>0</segmented>
  14. 	<object>
  15. 		<name>Peppa</name>
  16. 		<pose>Unspecified</pose>
  17. 		<truncated>0</truncated>
  18. 		<difficult>0</difficult>
  19. 		<bndbox>
  20. 			<xmin>64</xmin>
  21. 			<ymin>87</ymin>
  22. 			<xmax>166</xmax>
  23. 			<ymax>226</ymax>
  24. 		</bndbox>
  25. 	</object>
  26. 	<object>
  27. 		<name>Peppa</name>
  28. 		<pose>Unspecified</pose>
  29. 		<truncated>0</truncated>
  30. 		<difficult>0</difficult>
  31. 		<bndbox>
  32. 			<xmin>290</xmin>
  33. 			<ymin>77</ymin>
  34. 			<xmax>333</xmax>
  35. 			<ymax>131</ymax>
  36. 		</bndbox>
  37. 	</object>
  38. </annotation>

Generate Labels for VOC

Darknet wants a .txt file for each image with a line for each ground truth object in the image that looks like:

  1. <object-class> <x> <y> <width> <height>

voc_label.py

  1. import xml.etree.ElementTree as ET
  2. import pickle
  3. import os
  4. from os import listdir, getcwd
  5. from os.path import join
  6.  
  7. sets=[('2018', 'train'), ('2018', 'val')]
  8.  
  9. classes = ["Peppa"]
  10.  
  11. def convert(size, box):
  12.     dw = 1./size[0]
  13.     dh = 1./size[1]
  14.     x = (box[0] + box[1])/2.0
  15.     y = (box[2] + box[3])/2.0
  16.     w = box[1] - box[0]
  17.     h = box[3] - box[2]
  18.     x = x*dw
  19.     w = w*dw
  20.     y = y*dh
  21.     h = h*dh
  22.     return (x,y,w,h)
  23.  
  24. def convert_annotation(year, image_id):
  25.     in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
  26.     out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
  27.     tree=ET.parse(in_file)
  28.     root = tree.getroot()
  29.     size = root.find('size')
  30.     w = int(size.find('width').text)
  31.     h = int(size.find('height').text)
  32.  
  33.     for obj in root.iter('object'):
  34.         difficult = obj.find('difficult').text
  35.         cls = obj.find('name').text
  36.         if cls not in classes or int(difficult) == 1:
  37.             continue
  38.         cls_id = classes.index(cls)
  39.         xmlbox = obj.find('bndbox')
  40.         b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
  41.         bb = convert((w,h), b)
  42.         out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
  43.  
  44. wd = getcwd()
  45.  
  46. for year, image_set in sets:
  47.     if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
  48.         os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
  49.     image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
  50.     list_file = open('%s_%s.txt'%(year, image_set), 'w')
  51.     for image_id in image_ids:
  52.         list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
  53.         convert_annotation(year, image_id)
  54.     list_file.close()

peppa.data

  1. classes= 1
  2. train  = /home/d/Downloads/Peppa_VOC/2018_train.txt
  3. valid  = /home/d/Downloads/Peppa_VOC/2018_val.txt
  4. names = data/peppa.names
  5. backup = backup

yolov3-voc-peppa.cfg

  1. [net]
  2. # Testing
  3. batch=1
  4. subdivisions=1
  5. # Training
  6.  batch=64
  7.  subdivisions=2
  8. width=416
  9. height=416
  10. channels=3
  11. momentum=0.9
  12. decay=0.0005
  13. angle=0
  14. saturation = 1.5
  15. exposure = 1.5
  16. hue=.1
  17.  
  18. learning_rate=0.001
  19. burn_in=1000
  20. max_batches = 500200
  21. policy=steps
  22. steps=400000,450000
  23. scales=.1,.1
  24.  
  25. [convolutional]
  26. batch_normalize=1
  27. filters=16
  28. size=3
  29. stride=1
  30. pad=1
  31. activation=leaky
  32.  
  33. [maxpool]
  34. size=2
  35. stride=2
  36.  
  37. [convolutional]
  38. batch_normalize=1
  39. filters=32
  40. size=3
  41. stride=1
  42. pad=1
  43. activation=leaky
  44.  
  45. [maxpool]
  46. size=2
  47. stride=2
  48.  
  49. [convolutional]
  50. batch_normalize=1
  51. filters=64
  52. size=3
  53. stride=1
  54. pad=1
  55. activation=leaky
  56.  
  57. [maxpool]
  58. size=2
  59. stride=2
  60.  
  61. [convolutional]
  62. batch_normalize=1
  63. filters=128
  64. size=3
  65. stride=1
  66. pad=1
  67. activation=leaky
  68.  
  69. [maxpool]
  70. size=2
  71. stride=2
  72.  
  73. [convolutional]
  74. batch_normalize=1
  75. filters=256
  76. size=3
  77. stride=1
  78. pad=1
  79. activation=leaky
  80.  
  81. [maxpool]
  82. size=2
  83. stride=2
  84.  
  85. [convolutional]
  86. batch_normalize=1
  87. filters=512
  88. size=3
  89. stride=1
  90. pad=1
  91. activation=leaky
  92.  
  93. [maxpool]
  94. size=2
  95. stride=1
  96.  
  97. [convolutional]
  98. batch_normalize=1
  99. filters=1024
  100. size=3
  101. stride=1
  102. pad=1
  103. activation=leaky
  104.  
  105. ###########
  106.  
  107. [convolutional]
  108. batch_normalize=1
  109. filters=256
  110. size=1
  111. stride=1
  112. pad=1
  113. activation=leaky
  114.  
  115. [convolutional]
  116. batch_normalize=1
  117. filters=512
  118. size=3
  119. stride=1
  120. pad=1
  121. activation=leaky
  122.  
  123. [convolutional]
  124. size=1
  125. stride=1
  126. pad=1
  127. filters=18
  128. activation=linear
  129.  
  130.  
  131.  
  132. [yolo]
  133. mask = 3,4,5
  134. anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
  135. classes=1
  136. num=6
  137. jitter=.3
  138. ignore_thresh = .7
  139. truth_thresh = 1
  140. random=1
  141.  
  142. [route]
  143. layers = -4
  144.  
  145. [convolutional]
  146. batch_normalize=1
  147. filters=128
  148. size=1
  149. stride=1
  150. pad=1
  151. activation=leaky
  152.  
  153. [upsample]
  154. stride=2
  155.  
  156. [route]
  157. layers = -1, 8
  158.  
  159. [convolutional]
  160. batch_normalize=1
  161. filters=256
  162. size=3
  163. stride=1
  164. pad=1
  165. activation=leaky
  166.  
  167. [convolutional]
  168. size=1
  169. stride=1
  170. pad=1
  171. filters=18
  172. activation=linear
  173.  
  174. [yolo]
  175. mask = 0,1,2
  176. anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
  177. classes=1
  178. num=6
  179. jitter=.3
  180. ignore_thresh = .7
  181. truth_thresh = 1
  182. random=1

Train

  1. ./darknet detector train cfg/peppa.data cfg/yolov3-voc-peppa.cfg darknet53.conv.74

Test











Reference

  1. @article{yolov3,
  2.   title={YOLOv3: An Incremental Improvement},
  3.   author={Redmon, Joseph and Farhadi, Ali},
  4.   journal = {arXiv},
  5.   year={2018}
  6. }

Metric Learning : Caffe Example

Prepare (MNIST Data)

  1. python gen_pairwise_imglist.py
  2. /home/water/caffe/build/tools/convert_imageset ./ train.txt train_lmdb --gray
  3. /home/water/caffe/build/tools/convert_imageset ./ train_p.txt train_p_lmdb --gray
  4. /home/water/caffe/build/tools/convert_imageset ./ val.txt val_lmdb --gray
  5. /home/water/caffe/build/tools/convert_imageset ./ val_p.txt val_p_lmdb --gray

Based on Caffe siamese

Train loss vs iters

Visualize Result (Normal)

Visualize Result (τ- SNE)

Object Detection : MXNet SSD Example

Prepare

  1. cd /home/water/mxnet/example/ssd
  2. wget https://github.com/zhreshold/mxnet-ssd/releases/download/v0.6/resnet50_ssd_512_voc0712_trainval.zi
  3. unzip resnet50_ssd_512_voc0712_trainval.zip
  4. python data/demo/download_demo_images.py

Test

  1. python demo.py --gpu 0
  2. python demo.py --epoch 0 --images ./data/demo/dog.jpg --thresh 0.5
  3. python demo.py --cpu --network resnet50 --data-shape 512
  4. . . . . . .
  5. python demo.py --images ./data/demo/person.jpg --thresh 0.3
  6. python demo.py --images ./data/demo/person.jpg --network inceptionv3

Result