├── .gitignore ├── README.md ├── crelu_layer.py ├── deploy_seenet.prototxt ├── download.png ├── samples ├── 2007_000039.jpg ├── 2007_000063.jpg ├── 2007_000738.jpg └── 2007_001185.jpg └── vis.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SeeNet 2 | Self-Erasing Network for Integral Object Attention in NeurIPS2018 3 | 4 | 5 | ### Network architecture and more details 6 | Please refer to [our paper](https://arxiv.org/pdf/1810.09821.pdf). 7 | 8 | ### Usage 9 | Please install [Caffe](https://github.com/BVLC/caffe) first. I think you may find a great number of tutorials talking about how to install it. 10 | ```bash 11 | cd /examples 12 | git clone https://github.com/Andrew-Qibin/SeeNet.git 13 | 14 | ipython notebook vis.ipynb 15 | ``` 16 | Before you start, you also need our [pretrained model (google drive)](https://drive.google.com/open?id=1zMGgStdf8AucFmbHlxDI2Fqxlu6t8GIG). 17 | 18 | ### Visual examples 19 | ![](https://github.com/Andrew-Qibin/SeeNet/blob/master/download.png) 20 | 21 | 22 | ### Attention maps for all VOC images (10582) 23 | You can find them [here (google drive)](https://drive.google.com/open?id=1RodkkAYilOmBxqUdXab_EMZocUD9hd4G). 24 | 25 | ### If you think this work is helpful, please cite 26 | ```latex 27 | @inproceedings{hou2018selferasing, 28 | title={Self-Erasing Network for Integral Object Attention}, 29 | author={Hou, Qibin and Jiang, Peng-Tao and Wei, Yunchao and Cheng, Ming-Ming}, 30 | booktitle={NeurIPS}, 31 | year={2018} 32 | } 33 | ``` 34 | -------------------------------------------------------------------------------- /crelu_layer.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | import sys 3 | caffe_root = '../../' 4 | sys.path.insert(0, caffe_root + 'python') 5 | import caffe 6 | import numpy as np 7 | 8 | class CReLULayer(caffe.Layer): 9 | def setup(self, bottom, top): 10 | ##config 11 | params = eval(self.param_str) 12 | self.maxt = params['maxt'] 13 | self.mint = params['mint'] 14 | if len(bottom) != 3: 15 | raise Exception('Need to define three bottoms') 16 | if len(top) != 1: 17 | raise Exception('Only Need to define one top'); 18 | 19 | def reshape(self, bottom, top): 20 | self.N = bottom[0].data.shape[0] 21 | top[0].reshape(*bottom[0].shape) 22 | 23 | def forward(self, bottom, top): 24 | top[0].data[...] = bottom[0].data 25 | label = bottom[2].data.reshape(20) 26 | #cl = np.where(label == 1)[0] 27 | 28 | mask = bottom[1].data[0].copy() 29 | mask[mask < 0] = 0 30 | for i in range(20): 31 | if int(label[i]) == 1: 32 | ma = np.max(mask[i]) 33 | mi = np.min(mask[i]) 34 | mask[i] = (mask[i] - mi) / (ma - mi + 1e-8) 35 | else: # 0 36 | mask[i,...] = 0 37 | mask = mask.max(axis=0) 38 | self.pos = np.where(mask > self.maxt) 39 | top[0].data[:, :, self.pos[0], self.pos[1]] = 0 40 | self.pos1 = np.where(mask < self.mint) 41 | top[0].data[:, :, self.pos1[0], self.pos1[1]] = top[0].data[:,:,self.pos1[0], self.pos1[1]] * -1 42 | 43 | def backward(self, top, propagate_down, bottom): 44 | if propagate_down[0]: 45 | bottom[0].diff[...] = top[0].diff 46 | bottom[0].diff[...][0, 0, self.pos[0], self.pos[1]] = 0 47 | #bottom[0].diff[...][0, 0, self.pos1[0], self.pos1[1]] *= -1 48 | bottom[0].diff[:, :, self.pos1[0], self.pos1[1]] = bottom[0].diff[:,:,self.pos1[0], self.pos1[1]] * -1 49 | -------------------------------------------------------------------------------- /deploy_seenet.prototxt: -------------------------------------------------------------------------------- 1 | name: "VOC_Classification" 2 | #force_backward:true 3 | input: "data" 4 | input_dim: 1 5 | input_dim: 3 6 | input_dim: 500 7 | input_dim: 500 8 | 9 | input: "label" 10 | input_dim: 1 11 | input_dim: 1 12 | input_dim: 1 13 | input_dim: 1 14 | 15 | layer { 16 | bottom: "data" 17 | top: "conv1_1" 18 | name: "conv1_1" 19 | type: "Convolution" 20 | convolution_param { 21 | num_output: 64 22 | pad: 1 23 | kernel_size: 3 24 | } 25 | param { 26 | lr_mult: 1 27 | decay_mult: 1 28 | } 29 | param { 30 | lr_mult: 2 31 | decay_mult: 0 32 | } 33 | } 34 | layer { 35 | bottom: "conv1_1" 36 | top: "conv1_1" 37 | name: "relu1_1" 38 | type: "ReLU" 39 | } 40 | layer { 41 | bottom: "conv1_1" 42 | top: "conv1_2" 43 | name: "conv1_2" 44 | type: "Convolution" 45 | convolution_param { 46 | num_output: 64 47 | pad: 1 48 | kernel_size: 3 49 | } 50 | param { 51 | lr_mult: 1 52 | decay_mult: 1 53 | } 54 | param { 55 | lr_mult: 2 56 | decay_mult: 0 57 | } 58 | } 59 | layer { 60 | bottom: "conv1_2" 61 | top: "conv1_2" 62 | name: "relu1_2" 63 | type: "ReLU" 64 | } 65 | layer { 66 | bottom: "conv1_2" 67 | top: "pool1" 68 | name: "pool1" 69 | type: "Pooling" 70 | pooling_param { 71 | pool: MAX 72 | kernel_size: 2 73 | stride: 2 74 | } 75 | } 76 | 77 | layer { 78 | bottom: "pool1" 79 | top: "conv2_1" 80 | name: "conv2_1" 81 | type: "Convolution" 82 | convolution_param { 83 | num_output: 128 84 | pad: 1 85 | kernel_size: 3 86 | } 87 | param { 88 | lr_mult: 1 89 | decay_mult: 1 90 | } 91 | param { 92 | lr_mult: 2 93 | decay_mult: 0 94 | } 95 | } 96 | layer { 97 | bottom: "conv2_1" 98 | top: "conv2_1" 99 | name: "relu2_1" 100 | type: "ReLU" 101 | } 102 | layer { 103 | bottom: "conv2_1" 104 | top: "conv2_2" 105 | name: "conv2_2" 106 | type: "Convolution" 107 | convolution_param { 108 | num_output: 128 109 | pad: 1 110 | kernel_size: 3 111 | } 112 | param { 113 | lr_mult: 1 114 | decay_mult: 1 115 | } 116 | param { 117 | lr_mult: 2 118 | decay_mult: 0 119 | } 120 | } 121 | layer { 122 | bottom: "conv2_2" 123 | top: "conv2_2" 124 | name: "relu2_2" 125 | type: "ReLU" 126 | } 127 | layer { 128 | bottom: "conv2_2" 129 | top: "pool2" 130 | name: "pool2" 131 | type: "Pooling" 132 | pooling_param { 133 | pool: MAX 134 | kernel_size: 2 135 | stride: 2 136 | } 137 | } 138 | layer { 139 | bottom: "pool2" 140 | top: "conv3_1" 141 | name: "conv3_1" 142 | type: "Convolution" 143 | convolution_param { 144 | num_output: 256 145 | pad: 1 146 | kernel_size: 3 147 | } 148 | param { 149 | lr_mult: 1 150 | decay_mult: 1 151 | } 152 | param { 153 | lr_mult: 2 154 | decay_mult: 0 155 | } 156 | } 157 | layer { 158 | bottom: "conv3_1" 159 | top: "conv3_1" 160 | name: "relu3_1" 161 | type: "ReLU" 162 | } 163 | layer { 164 | bottom: "conv3_1" 165 | top: "conv3_2" 166 | name: "conv3_2" 167 | type: "Convolution" 168 | convolution_param { 169 | num_output: 256 170 | pad: 1 171 | kernel_size: 3 172 | } 173 | param { 174 | lr_mult: 1 175 | decay_mult: 1 176 | } 177 | param { 178 | lr_mult: 2 179 | decay_mult: 0 180 | } 181 | } 182 | layer { 183 | bottom: "conv3_2" 184 | top: "conv3_2" 185 | name: "relu3_2" 186 | type: "ReLU" 187 | } 188 | layer { 189 | bottom: "conv3_2" 190 | top: "conv3_3" 191 | name: "conv3_3" 192 | type: "Convolution" 193 | convolution_param { 194 | num_output: 256 195 | pad: 1 196 | kernel_size: 3 197 | } 198 | param { 199 | lr_mult: 1 200 | decay_mult: 1 201 | } 202 | param { 203 | lr_mult: 2 204 | decay_mult: 0 205 | } 206 | } 207 | layer { 208 | bottom: "conv3_3" 209 | top: "conv3_3" 210 | name: "relu3_3" 211 | type: "ReLU" 212 | } 213 | layer { 214 | bottom: "conv3_3" 215 | top: "pool3" 216 | name: "pool3" 217 | type: "Pooling" 218 | pooling_param { 219 | pool: MAX 220 | kernel_size: 2 221 | stride: 2 222 | } 223 | } 224 | layer { 225 | bottom: "pool3" 226 | top: "conv4_1" 227 | name: "conv4_1" 228 | type: "Convolution" 229 | convolution_param { 230 | num_output: 512 231 | pad: 1 232 | kernel_size: 3 233 | } 234 | param { 235 | lr_mult: 1 236 | decay_mult: 1 237 | } 238 | param { 239 | lr_mult: 2 240 | decay_mult: 0 241 | } 242 | } 243 | layer { 244 | bottom: "conv4_1" 245 | top: "conv4_1" 246 | name: "relu4_1" 247 | type: "ReLU" 248 | } 249 | layer { 250 | bottom: "conv4_1" 251 | top: "conv4_2" 252 | name: "conv4_2" 253 | type: "Convolution" 254 | convolution_param { 255 | num_output: 512 256 | pad: 1 257 | kernel_size: 3 258 | } 259 | param { 260 | lr_mult: 1 261 | decay_mult: 1 262 | } 263 | param { 264 | lr_mult: 2 265 | decay_mult: 0 266 | } 267 | } 268 | layer { 269 | bottom: "conv4_2" 270 | top: "conv4_2" 271 | name: "relu4_2" 272 | type: "ReLU" 273 | } 274 | layer { 275 | bottom: "conv4_2" 276 | top: "conv4_3" 277 | name: "conv4_3" 278 | type: "Convolution" 279 | convolution_param { 280 | num_output: 512 281 | pad: 1 282 | kernel_size: 3 283 | } 284 | param { 285 | lr_mult: 1 286 | decay_mult: 1 287 | } 288 | param { 289 | lr_mult: 2 290 | decay_mult: 0 291 | } 292 | } 293 | layer { 294 | bottom: "conv4_3" 295 | top: "conv4_3" 296 | name: "relu4_3" 297 | type: "ReLU" 298 | } 299 | layer { 300 | bottom: "conv4_3" 301 | top: "pool4" 302 | name: "pool4" 303 | type: "Pooling" 304 | pooling_param { 305 | pool: MAX 306 | kernel_size: 2 307 | stride: 2 308 | } 309 | } 310 | layer { 311 | bottom: "pool4" 312 | top: "conv5_1" 313 | name: "conv5_1" 314 | type: "Convolution" 315 | convolution_param { 316 | num_output: 512 317 | pad: 1 318 | kernel_size: 3 319 | } 320 | param { 321 | lr_mult: 1 322 | decay_mult: 1 323 | } 324 | param { 325 | lr_mult: 2 326 | decay_mult: 0 327 | } 328 | } 329 | layer { 330 | bottom: "conv5_1" 331 | top: "conv5_1" 332 | name: "relu5_1" 333 | type: "ReLU" 334 | } 335 | layer { 336 | bottom: "conv5_1" 337 | top: "conv5_2" 338 | name: "conv5_2" 339 | type: "Convolution" 340 | convolution_param { 341 | num_output: 512 342 | pad: 1 343 | kernel_size: 3 344 | } 345 | param { 346 | lr_mult: 1 347 | decay_mult: 1 348 | } 349 | param { 350 | lr_mult: 2 351 | decay_mult: 0 352 | } 353 | } 354 | 355 | layer { 356 | bottom: "conv5_2" 357 | top: "conv5_2" 358 | name: "relu5_2" 359 | type: "ReLU" 360 | } 361 | layer { 362 | bottom: "conv5_2" 363 | top: "conv5_3" 364 | name: "conv5_3" 365 | type: "Convolution" 366 | convolution_param { 367 | num_output: 512 368 | pad: 1 369 | kernel_size: 3 370 | } 371 | param { 372 | lr_mult: 1 373 | decay_mult: 1 374 | } 375 | param { 376 | lr_mult: 2 377 | decay_mult: 0 378 | } 379 | } 380 | layer { 381 | bottom: "conv5_3" 382 | top: "conv5_3" 383 | name: "relu5_3" 384 | type: "ReLU" 385 | } 386 | layer { 387 | bottom: "conv5_3" 388 | top: "conv1_b1" 389 | name: "conv1_b1" 390 | type: "Convolution" 391 | convolution_param { 392 | num_output: 512 393 | pad: 1 394 | kernel_size: 3 395 | weight_filler { 396 | type: "gaussian" 397 | std: 0.01 398 | } 399 | bias_filler { 400 | type: "constant" 401 | value: 0 402 | } 403 | } 404 | param { 405 | lr_mult: 1 406 | decay_mult: 1 407 | } 408 | param { 409 | lr_mult: 2 410 | decay_mult: 0 411 | } 412 | } 413 | layer { 414 | bottom: "conv1_b1" 415 | top: "conv1_b1" 416 | name: "relu1_b1" 417 | type: "ReLU" 418 | } 419 | layer { 420 | bottom: "conv1_b1" 421 | top: "conv2_b1" 422 | name: "conv2_b1" 423 | type: "Convolution" 424 | convolution_param { 425 | num_output: 512 426 | pad: 1 427 | kernel_size: 3 428 | weight_filler { 429 | type: "gaussian" 430 | std: 0.01 431 | } 432 | bias_filler { 433 | type: "constant" 434 | value: 0 435 | } 436 | } 437 | param { 438 | lr_mult: 1 439 | decay_mult: 1 440 | } 441 | param { 442 | lr_mult: 2 443 | decay_mult: 0 444 | } 445 | } 446 | layer { 447 | bottom: "conv2_b1" 448 | top: "conv2_b1" 449 | name: "relu2_b1" 450 | type: "ReLU" 451 | } 452 | layer { 453 | bottom: "conv2_b1" 454 | top: "conv2_b1" 455 | name: "drop2_b1" 456 | type: "Dropout" 457 | dropout_param { 458 | dropout_ratio: 0.5 459 | } 460 | } 461 | layer { 462 | bottom: "conv2_b1" 463 | top: "score_b1" 464 | name: "score_b1" 465 | type: "Convolution" 466 | convolution_param { 467 | num_output: 20 468 | pad: 0 469 | kernel_size: 1 470 | weight_filler { 471 | type: "gaussian" 472 | std: 0.01 473 | } 474 | bias_filler { 475 | type: "constant" 476 | value: 0 477 | } 478 | } 479 | param { 480 | lr_mult: 1 481 | decay_mult: 1 482 | } 483 | param { 484 | lr_mult: 2 485 | decay_mult: 0 486 | } 487 | } 488 | layer { 489 | name: "pool_b1" 490 | type: "Pooling" 491 | bottom: "score_b1" 492 | top: "pool_b1" 493 | pooling_param { 494 | pool: AVE 495 | global_pooling: true 496 | } 497 | } 498 | layer { 499 | name: "sigmoid1" 500 | type: "Sigmoid" 501 | bottom: "pool_b1" 502 | top: "sigmoid1" 503 | } 504 | #### net2 505 | #layer { 506 | # bottom: "conv5_3" 507 | # top: "conv5_4" 508 | # name: "conv5_4" 509 | # type: "Convolution" 510 | # convolution_param { 511 | # num_output: 512 512 | # pad: 1 513 | # kernel_size: 3 514 | # weight_filler { 515 | # type: "gaussian" 516 | # std: 0.01 517 | # } 518 | # bias_filler { 519 | # type: "constant" 520 | # value: 0 521 | # } 522 | # } 523 | # param { 524 | # lr_mult: 1 525 | # decay_mult: 1 526 | # } 527 | # param { 528 | # lr_mult: 2 529 | # decay_mult: 0 530 | # } 531 | #} 532 | #layer { 533 | # bottom: "conv5_4" 534 | # top: "conv5_4" 535 | # name: "relu5_4" 536 | # type: "ReLU" 537 | #} 538 | layer { 539 | name: "mask_b2" 540 | type: "Python" 541 | bottom: "conv5_3" 542 | bottom: "score_b1" 543 | bottom: "label" 544 | top: "mask_b2" 545 | python_param { 546 | module: "crelu_layer" 547 | layer: "CReLULayer" 548 | param_str: "{\'maxt\': 0.8, \'mint\': 0.0 }" 549 | } 550 | propagate_down: 1 551 | propagate_down: 0 552 | propagate_down: 0 553 | } 554 | #layer { 555 | # name: "conv5_3_mask" 556 | # type: "CompetingMask" 557 | # bottom: "pool5" 558 | # bottom: "attention" 559 | # bottom: "label" 560 | # top: "conv5_3_mask" 561 | # competing_mask_param { 562 | # one_hot: true 563 | # thresh_h: 0.7 564 | # thresh_l: -0.2 565 | # } 566 | # propagate_down: 1 567 | # propagate_down: 0 568 | # propagate_down: 0 569 | #} 570 | layer { 571 | bottom: "mask_b2" 572 | top: "conv1_b2" 573 | name: "conv1_b2" 574 | type: "Convolution" 575 | convolution_param { 576 | num_output: 512 577 | pad: 1 578 | kernel_size: 3 579 | weight_filler { 580 | type: "gaussian" 581 | std: 0.01 582 | } 583 | bias_filler { 584 | type: "constant" 585 | value: 0 586 | } 587 | } 588 | param { 589 | name: "conv1_b2_w" 590 | lr_mult: 1 591 | decay_mult: 1 592 | } 593 | param { 594 | name: "conv1_b2_b" 595 | lr_mult: 2 596 | decay_mult: 0 597 | } 598 | } 599 | layer { 600 | bottom: "conv1_b2" 601 | top: "conv1_b2" 602 | name: "relu1_b2" 603 | type: "ReLU" 604 | } 605 | #layer { 606 | # bottom: "conv_ex1" 607 | # top: "conv_ex1" 608 | # name: "conv_ex1_drop" 609 | # type: "Dropout" 610 | # dropout_param { 611 | # dropout_ratio: 0.5 612 | # } 613 | #} 614 | layer { 615 | bottom: "conv1_b2" 616 | top: "conv2_b2" 617 | name: "conv2_b2" 618 | type: "Convolution" 619 | convolution_param { 620 | num_output: 512 621 | pad: 1 622 | kernel_size: 3 623 | weight_filler { 624 | type: "gaussian" 625 | std: 0.01 626 | } 627 | bias_filler { 628 | type: "constant" 629 | value: 0 630 | } 631 | } 632 | param { 633 | name: "conv2_b2_w" 634 | lr_mult: 1 635 | decay_mult: 1 636 | } 637 | param { 638 | name: "conv2_b2_b" 639 | lr_mult: 2 640 | decay_mult: 0 641 | } 642 | } 643 | layer { 644 | bottom: "conv2_b2" 645 | top: "conv2_b2" 646 | name: "relu2_b2" 647 | type: "ReLU" 648 | } 649 | #layer { 650 | # bottom: "conv2_b2" 651 | # top: "conv3_b2" 652 | # name: "conv3_b2" 653 | # type: "Convolution" 654 | # convolution_param { 655 | # num_output: 512 656 | # pad: 1 657 | # kernel_size: 3 658 | # weight_filler { 659 | # type: "gaussian" 660 | # std: 0.01 661 | # } 662 | # bias_filler { 663 | # type: "constant" 664 | # value: 0 665 | # } 666 | # } 667 | # param { 668 | # name: "conv3_b2_w" 669 | # lr_mult: 1 670 | # decay_mult: 1 671 | # } 672 | # param { 673 | # name: "conv3_b2_b" 674 | # lr_mult: 2 675 | # decay_mult: 0 676 | # } 677 | #} 678 | #layer { 679 | # bottom: "conv3_b2" 680 | # top: "conv3_b2" 681 | # name: "relu3_b2" 682 | # type: "ReLU" 683 | #} 684 | #layer { 685 | # bottom: "conv2_b2" 686 | # top: "conv2_b2" 687 | # name: "drop2_b2" 688 | # type: "Dropout" 689 | # dropout_param { 690 | # dropout_ratio: 0.5 691 | # } 692 | #} 693 | layer { 694 | bottom: "conv2_b2" 695 | top: "score_b2" 696 | name: "score_b2" 697 | type: "Convolution" 698 | convolution_param { 699 | num_output: 20 700 | pad: 0 701 | kernel_size: 1 702 | weight_filler { 703 | type: "gaussian" 704 | std: 0.01 705 | } 706 | bias_filler { 707 | type: "constant" 708 | value: 0 709 | } 710 | } 711 | param { 712 | name: "score_b2_w" 713 | lr_mult: 1 714 | decay_mult: 1 715 | } 716 | param { 717 | name: "score_b2_b" 718 | lr_mult: 2 719 | decay_mult: 0 720 | } 721 | } 722 | -------------------------------------------------------------------------------- /download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houqb/SeeNet/2a448d4b2baf9cfa21a6d68fed1029076166aa9c/download.png -------------------------------------------------------------------------------- /samples/2007_000039.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houqb/SeeNet/2a448d4b2baf9cfa21a6d68fed1029076166aa9c/samples/2007_000039.jpg -------------------------------------------------------------------------------- /samples/2007_000063.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houqb/SeeNet/2a448d4b2baf9cfa21a6d68fed1029076166aa9c/samples/2007_000063.jpg -------------------------------------------------------------------------------- /samples/2007_000738.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houqb/SeeNet/2a448d4b2baf9cfa21a6d68fed1029076166aa9c/samples/2007_000738.jpg -------------------------------------------------------------------------------- /samples/2007_001185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/houqb/SeeNet/2a448d4b2baf9cfa21a6d68fed1029076166aa9c/samples/2007_001185.jpg --------------------------------------------------------------------------------