master
/ main.ipynb

main.ipynb @master

95b766e
 
 
 
 
 
 
 
 
fcfd6cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95b766e
fcfd6cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95b766e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   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
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 基于深度学习的目标检测 - 气球\n",
    "\n",
    "# 1.实验介绍\n",
    "## 1.1 实验背景\n",
    "Object detection(目标检测)是计算机视觉中非常重要,也是非常具有挑战性的一个任务。本节作业我们将学习如何使用深度学习模型检测出图片中的气球。\n",
    "\n",
    "## 1.2 实验要求\n",
    "a) 建立深度神经网络模型,并尽可能将其调到最佳状态\n",
    "b) 用准确率等指标对模型进行评估\n",
    "\n",
    "## 1.3 实验环境\n",
    "可以使用基于 Python 的 OpenCV 库进行图像相关处理,使用 Numpy 库进行相关数值运算,使用pytorch 等框架建立深度学习模型等。\n",
    "\n",
    "## 1.4 注意事项\n",
    "+ Python 与 Python Package 的使用方式,可在右侧 API文档 中查阅。\n",
    "+ 当右上角的『Python 3』长时间指示为运行中的时候,造成代码无法执行时,可以重新启动 Kernel 解决(左上角『Kernel』-『Restart Kernel』)。\n",
    "\n",
    "## 1.5 参考资料\n",
    "OpenCV:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html  \n",
    "Numpy:https://www.numpy.org/  \n",
    "Pytorch:https://pytorch.org/\n",
    "\n",
    "# 2.实验内容\n",
    "## 2.1 介绍数据集\n",
    "该数据集包含了 380 个气球图片。数据格式是 VOC格式。\n",
    "\n",
    "导入数据集成功后路径,\n",
    "data_path = \"./dataset\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入相关包\n",
    "import glob, os\n",
    "\n",
    "# 数据集路径\n",
    "data_path =  \"./dataset/train\"\n",
    "\n",
    "# 获取数据名称列表\n",
    "img_list = glob.glob(os.path.join(data_path, '*/*.jpg'))\n",
    "\n",
    "# 打印数据集总量\n",
    "print(\"数据集总数量:\", len(img_list))\n",
    "print(\"数据路径和名称:\",img_list[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练数据集总共有 300 张图片,现在随机展示其中的 6 张图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random,cv2\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 从数据名称列表 img_list 中随机选取 6 个。\n",
    "for i, img_path in enumerate(random.sample(img_list, 6)):\n",
    "    \n",
    "    # 读取图片\n",
    "    img = cv2.imread(img_path)\n",
    "    \n",
    "    # 将图片从 BGR 模式转为 RGB 模式\n",
    "    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n",
    "    \n",
    "    # 将窗口设置为 2 行 3 列 6个子图\n",
    "    plt.subplot(2, 3, i + 1)\n",
    "    \n",
    "    # 展示图片\n",
    "    plt.imshow(img)\n",
    "    \n",
    "    # 不显示坐标尺寸\n",
    "    plt.axis('off')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "+  获取图像形状\n",
    "img.shape 可以获得图像的形状,返回值是一个包含行数,列数,通道数的元组"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(576, 1024, 3)\n"
     ]
    }
   ],
   "source": [
    "# 随机选取一张图片\n",
    "path = random.sample(img_list, 1)\n",
    "\n",
    "# 读取图片\n",
    "img = cv2.imread(path[0])\n",
    "\n",
    "# 将图片从 BGR 模式转为 RGB 模式\n",
    "img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)\n",
    "\n",
    "# 获取图片的形状\n",
    "print(img.shape)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 数据处理\n",
    "根据上面的介绍和我们数据集的特性,我们主要运用cv2.imread() 读取到图像信息和 xml.etree.ElementTree.ET.parse() 方法读取annotation的信息, 最后将他们封装为一个对象用于后续的训练,这个对象包含im_info:[height, width, im_scales], data: 图片的像素矩阵, gt_boxes: [xmin, ymin, xmax, ymax, cls_index]。我们将数据处理过程封装成为一个函数:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'im_info': array([6.0000000e+02, 9.0000000e+02, 8.7847733e-01], dtype=float32), 'data': array([[[[  6.084283 ,  -6.8821173,  10.292683 ],\n",
      "         [  6.965085 ,  -6.001314 ,  11.173486 ],\n",
      "         [  7.0199   ,  -5.9465   ,  11.2283   ],\n",
      "         ...,\n",
      "         [-25.910936 , -54.03151  , -57.856712 ],\n",
      "         [-25.910933 , -54.877335 , -58.702538 ],\n",
      "         [-25.910934 , -54.877335 , -58.702538 ]],\n",
      "\n",
      "        [[  6.2274   ,  -6.739    ,  10.435801 ],\n",
      "         [  6.391844 ,  -6.5745564,  10.6002445],\n",
      "         [  7.0198994,  -5.9465   ,  11.2283   ],\n",
      "         ...,\n",
      "         [-24.980103 , -53.10067  , -56.925877 ],\n",
      "         [-24.980099 , -53.9465   , -57.771706 ],\n",
      "         [-24.9801   , -53.9465   , -57.771706 ]],\n",
      "\n",
      "        [[  7.365733 ,  -5.6006665,  11.574133 ],\n",
      "         [  7.365733 ,  -5.6006665,  11.574133 ],\n",
      "         [  7.365733 ,  -5.6006665,  11.574133 ],\n",
      "         ...,\n",
      "         [-24.926783 , -53.047356 , -56.87256  ],\n",
      "         [-24.735415 , -53.701817 , -57.52702  ],\n",
      "         [-24.9801   , -53.946503 , -57.7717   ]],\n",
      "\n",
      "        ...,\n",
      "\n",
      "        [[ 36.743244 , -60.92517  , -70.38062  ],\n",
      "         [ 38.296577 , -60.56639  , -69.42845  ],\n",
      "         [ 40.90031  , -60.06609  , -67.89129  ],\n",
      "         ...,\n",
      "         [ 36.514122 , -70.29233  , -77.27747  ],\n",
      "         [ 35.6366   , -70.29233  , -78.155    ],\n",
      "         [ 35.6366   , -70.29233  , -78.155    ]],\n",
      "\n",
      "        [[ 37.08907  , -60.877335 , -70.70253  ],\n",
      "         [ 38.642403 , -59.946495 , -69.3567   ],\n",
      "         [ 41.091667 , -59.87473  , -67.699936 ],\n",
      "         ...,\n",
      "         [ 36.89772  , -70.06868  , -76.89388  ],\n",
      "         [ 36.459206 , -70.507195 , -77.3324   ],\n",
      "         [ 37.0199   , -69.9465   , -76.7717   ]],\n",
      "\n",
      "        [[ 37.955532 , -60.01087  , -69.83607  ],\n",
      "         [ 38.44925  , -60.13965  , -69.743    ],\n",
      "         [ 40.410973 , -60.555428 , -69.31148  ],\n",
      "         ...,\n",
      "         [ 36.078392 , -70.888016 , -77.7132   ],\n",
      "         [ 36.040127 , -70.92628  , -77.75147  ],\n",
      "         [ 36.089054 , -70.87735  , -77.702545 ]]]], dtype=float32), 'gt_boxes': array([[497.21817, 315.37335, 623.71893, 440.99564,   1.     ],\n",
      "       [628.98975, 433.08932, 706.2958 , 532.35724,   1.     ],\n",
      "       [632.50366, 269.69254, 676.42755, 301.31772,   1.     ]],\n",
      "      dtype=float32)}\n"
     ]
    }
   ],
   "source": [
    "\n",
    "import os\n",
    "import glob\n",
    "import cv2\n",
    "import xml.etree.ElementTree as ET\n",
    "import numpy as np\n",
    "import scipy.sparse\n",
    "import scipy.io as sio\n",
    "import numpy.random as npr\n",
    "import time\n",
    "from config import cfg\n",
    "\n",
    "SCALES = (600,)\n",
    "MAX_SIZE = 1000\n",
    "PIXEL_MEANS = cfg.PIXEL_MEANS\n",
    "\n",
    "\n",
    "class DataLayer(object):\n",
    "    def __init__(self, rootPath):\n",
    "        self.xmlPath = os.path.join(rootPath, \"Annotations\")\n",
    "        self.imgPath = os.path.join(rootPath, \"JPEGImages\")\n",
    "        self.point = 0  # 数据加载指针\n",
    "        # self.isOpen = True  # 数据是否加载完,False代表已全部加载\n",
    "        self.classes = (\n",
    "            '__background__',  # always index 0\n",
    "            'balloon')\n",
    "        self._class_to_ind = dict(\n",
    "            list(zip(self.classes, list(range(len(self.classes))))))\n",
    "        self.images = []\n",
    "        self.annotaions = []\n",
    "        self.filenames = []\n",
    "        self._load()\n",
    "        self.length = len(self.images)\n",
    "\n",
    "    # def refresh(self):\n",
    "    #     self.point = 0  # 数据加载指针\n",
    "    #     self.isOpen = True  # 数据是否加载完,False代表已全部加载\n",
    "\n",
    "    def im_list_to_blob(self, ims):\n",
    "        \"\"\"Convert a list of images into a network input.\n",
    "\n",
    "      Assumes images are already prepared (means subtracted, BGR order, ...).\n",
    "      \"\"\"\n",
    "        max_shape = np.array([im.shape for im in ims]).max(axis=0)\n",
    "        num_images = len(ims)\n",
    "        blob = np.zeros((num_images, max_shape[0], max_shape[1], 3), dtype=np.float32)\n",
    "        for i in range(num_images):\n",
    "            im = ims[i]\n",
    "            blob[i, 0:im.shape[0], 0:im.shape[1], :] = im\n",
    "        return blob\n",
    "\n",
    "    def prep_im_for_blob(self, im, pixel_means, target_size, max_size):\n",
    "        \"\"\"Mean subtract and scale an image for use in a blob.\"\"\"\n",
    "        im = im.astype(np.float32, copy=False)\n",
    "        im -= pixel_means\n",
    "        im_shape = im.shape\n",
    "        im_size_min = np.min(im_shape[0:2])\n",
    "        im_size_max = np.max(im_shape[0:2])\n",
    "        im_scale = float(target_size) / float(im_size_min)\n",
    "        # Prevent the biggest axis from being more than MAX_SIZE\n",
    "        if np.round(im_scale * im_size_max) > max_size:\n",
    "            im_scale = float(max_size) / float(im_size_max)\n",
    "        im = cv2.resize(\n",
    "            im,\n",
    "            None,\n",
    "            None,\n",
    "            fx=im_scale,\n",
    "            fy=im_scale,\n",
    "            interpolation=cv2.INTER_LINEAR)\n",
    "\n",
    "        return im, im_scale\n",
    "\n",
    "    def _get_image_blob(self, images, scale_inds):\n",
    "        \"\"\"Builds an input blob from the images in the roidb at the specified\n",
    "      scales.\n",
    "      \"\"\"\n",
    "        num_images = len(images)\n",
    "        processed_ims = []\n",
    "        im_scales = []\n",
    "        for i in range(num_images):\n",
    "            im = images[i]\n",
    "            target_size = SCALES[scale_inds[i]]\n",
    "            im, im_scale = self.prep_im_for_blob(im, PIXEL_MEANS, target_size, MAX_SIZE)\n",
    "            im_scales.append(im_scale)\n",
    "            processed_ims.append(im)\n",
    "\n",
    "        # Create a blob to hold the input images\n",
    "        blob = self.im_list_to_blob(processed_ims)\n",
    "\n",
    "        return blob, im_scales\n",
    "\n",
    "    def get_minibatch(self):\n",
    "        \"\"\"Given a roidb, construct a minibatch sampled from it.\"\"\"\n",
    "        imageArray = np.asarray([self.images[self.point % self.length]])\n",
    "        annotationArray = self.annotaions[self.point % self.length]\n",
    "        num_images = len(imageArray)\n",
    "        # Sample random scales to use for each image in this batch\n",
    "        random_scale_inds = npr.randint(\n",
    "            0, high=len(SCALES), size=num_images)\n",
    "\n",
    "        # Get the input image blob, formatted for caffe\n",
    "        im_blob, im_scales = self._get_image_blob(imageArray, random_scale_inds)\n",
    "\n",
    "        assert len(im_scales) == 1, \"Single batch only\"\n",
    "        assert len(im_blob) == 1, \"Single batch only\"\n",
    "\n",
    "        blobs = {'data': im_blob}\n",
    "\n",
    "        # gt boxes: (x1, y1, x2, y2, cls)\n",
    "        gt_inds = np.where(annotationArray['gt_classes'] != 0)[0]\n",
    "        gt_boxes = np.empty((len(gt_inds), 5), dtype=np.float32)\n",
    "        gt_boxes[:, 0:4] = annotationArray['boxes'][gt_inds, :] * im_scales[0]\n",
    "        gt_boxes[:, 4] = annotationArray['gt_classes'][gt_inds]\n",
    "        blobs['gt_boxes'] = gt_boxes\n",
    "        blobs['im_info'] = np.array([im_blob.shape[1], im_blob.shape[2], im_scales[0]], dtype=np.float32) # [height, width, im_scales]\n",
    "\n",
    "        return blobs\n",
    "\n",
    "    def forward(self):\n",
    "        \"\"\"Get blobs and copy them into this layer's top blob vector.\"\"\"\n",
    "        blobs = self.get_minibatch()\n",
    "        self.point += 1\n",
    "        # if self.point >= len(self.images):\n",
    "        #     self.isOpen = False\n",
    "        return blobs\n",
    "\n",
    "    def _load(self):\n",
    "        imageArray = []\n",
    "        annotationArray = []\n",
    "        for imgP in glob.glob(self.imgPath + \"/*.*\"):\n",
    "            # 读取图片,\n",
    "            img = cv2.imread(imgP)  # 读取的是BGR格式\n",
    "            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图片从 BGR 模式转为 RGB 模式\n",
    "            imageArray.append(img)\n",
    "            # 读取xml中的标签内容\n",
    "            xmlP = imgP.replace(\"JPEGImages\", \"Annotations\")\n",
    "            xmlP = xmlP.replace(\"jpg\", \"xml\")\n",
    "            annotation = self._load_pascal_annotation(xmlP)\n",
    "            annotationArray.append(annotation)\n",
    "            self.filenames.append(xmlP)\n",
    "        self.images = imageArray\n",
    "        self.annotaions = annotationArray\n",
    "\n",
    "    def _load_pascal_annotation(self, filename):\n",
    "        \"\"\"\n",
    "    Load image and bounding boxes info from XML file in the PASCAL VOC\n",
    "    format.\n",
    "    \"\"\"\n",
    "        tree = ET.parse(filename)\n",
    "        objs = tree.findall('object')\n",
    "        num_objs = len(objs)\n",
    "\n",
    "        boxes = np.zeros((num_objs, 4), dtype=np.float32)\n",
    "        gt_classes = np.zeros((num_objs), dtype=np.int32)\n",
    "        overlaps = np.zeros((num_objs, len(self.classes)), dtype=np.float32)\n",
    "        # \"Seg\" area for pascal is just the box area\n",
    "        seg_areas = np.zeros((num_objs), dtype=np.float32)\n",
    "\n",
    "        # Load object bounding boxes into a data frame.\n",
    "        for ix, obj in enumerate(objs):\n",
    "            bbox = obj.find('bndbox')\n",
    "            # Make pixel indexes 0-based\n",
    "            x1 = float(bbox.find('xmin').text) - 1\n",
    "            y1 = float(bbox.find('ymin').text) - 1\n",
    "            x2 = float(bbox.find('xmax').text) - 1\n",
    "            y2 = float(bbox.find('ymax').text) - 1\n",
    "            cls = self._class_to_ind[obj.find('name').text.lower().strip()]\n",
    "            boxes[ix, :] = [x1, y1, x2, y2]\n",
    "            gt_classes[ix] = cls\n",
    "            overlaps[ix, cls] = 1.0\n",
    "            seg_areas[ix] = (x2 - x1 + 1) * (y2 - y1 + 1)\n",
    "\n",
    "        overlaps = scipy.sparse.csr_matrix(overlaps)\n",
    "\n",
    "        return {\n",
    "            'boxes': boxes,\n",
    "            'gt_classes': gt_classes,\n",
    "            'gt_overlaps': overlaps,\n",
    "            'flipped': False,\n",
    "            'seg_areas': seg_areas\n",
    "        }\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    datalayer = DataLayer(\"./dataset/val\")\n",
    "    first = datalayer.forward()\n",
    "    print(first)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 建立一个简单的模型\n",
    "### 2.3.1 使用Faster R-CNN框架\n",
    "我们建立了一个基类Network, 在Network上定义了各个操作方法。然后我们使用VGG16作为Network的backbone,"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# --------------------------------------------------------\n",
    "# Tensorflow Faster R-CNN\n",
    "# Licensed under The MIT License [see LICENSE for details]\n",
    "# Written by Xinlei Chen\n",
    "# --------------------------------------------------------\n",
    "from __future__ import absolute_import\n",
    "from __future__ import division\n",
    "from __future__ import print_function\n",
    "\n",
    "import math\n",
    "import numpy as np\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "from torch.autograd import Variable\n",
    "import torchvision.models as models\n",
    "from lib.snippets import generate_anchors_pre\n",
    "from lib.proposal_layer import proposal_layer\n",
    "from lib.proposal_top_layer import proposal_top_layer\n",
    "from lib.anchor_target_layer import anchor_target_layer\n",
    "from lib.proposal_target_layer import proposal_target_layer\n",
    "from lib.visualization import draw_bounding_boxes\n",
    "\n",
    "from torchvision.ops import RoIAlign, RoIPool\n",
    "\n",
    "from config import cfg\n",
    "\n",
    "import tensorboardX as tb\n",
    "import cv2\n",
    "# from scipy.misc import imresize\n",
    "\n",
    "\n",
    "class Network(nn.Module):\n",
    "    def __init__(self):\n",
    "        nn.Module.__init__(self)\n",
    "        self._predictions = {}\n",
    "        self._losses = {}\n",
    "        self._anchor_targets = {}\n",
    "        self._proposal_targets = {}\n",
    "        self._layers = {}\n",
    "        self._gt_image = None\n",
    "        self._act_summaries = {}\n",
    "        self._score_summaries = {}\n",
    "        self._event_summaries = {}\n",
    "        self._image_gt_summaries = {}\n",
    "        self._variables_to_fix = {}\n",
    "        self._device = 'cuda'\n",
    "        # self._device = 'cpu'\n",
    "\n",
    "    def _add_gt_image(self):\n",
    "        # add back mean\n",
    "        image = self._image_gt_summaries['image'] + cfg.PIXEL_MEANS\n",
    "        # image = imresize(image[0], self._im_info[:2] / self._im_info[2])\n",
    "        image = cv2.resize(image[0], None, None, fx=self._im_info[1] / self._im_info[2], fy=self._im_info[0] / self._im_info[2])\n",
    "        # BGR to RGB (opencv uses BGR)\n",
    "        self._gt_image = image[np.newaxis, :, :, ::-1].copy(order='C')\n",
    "\n",
    "    def _add_gt_image_summary(self):\n",
    "        # use a customized visualization function to visualize the boxes\n",
    "        self._add_gt_image()\n",
    "        image = draw_bounding_boxes(\\\n",
    "                          self._gt_image, self._image_gt_summaries['gt_boxes'], self._image_gt_summaries['im_info'])\n",
    "\n",
    "        return tb.summary.image('GROUND_TRUTH',\n",
    "                                image[0].astype('float32') / 255.0, dataformats='HWC')\n",
    "\n",
    "    def _add_act_summary(self, key, tensor):\n",
    "        return tb.summary.histogram(\n",
    "            'ACT/' + key + '/activations',\n",
    "            tensor.data.cpu().numpy(),\n",
    "            bins='auto'),\n",
    "        tb.summary.scalar('ACT/' + key + '/zero_fraction',\n",
    "                          (tensor.data == 0).float().sum() / tensor.numel())\n",
    "\n",
    "    def _add_score_summary(self, key, tensor):\n",
    "        return tb.summary.histogram(\n",
    "            'SCORE/' + key + '/scores', tensor.data.cpu().numpy(), bins='auto')\n",
    "\n",
    "    def _add_train_summary(self, key, var):\n",
    "        return tb.summary.histogram(\n",
    "            'TRAIN/' + key, var.data.cpu().numpy(), bins='auto')\n",
    "\n",
    "    def _proposal_top_layer(self, rpn_cls_prob, rpn_bbox_pred):\n",
    "        rois, rpn_scores = proposal_top_layer(\\\n",
    "                                        rpn_cls_prob, rpn_bbox_pred, self._im_info,\n",
    "                                         self._feat_stride, self._anchors, self._num_anchors)\n",
    "        return rois, rpn_scores\n",
    "\n",
    "    def _proposal_layer(self, rpn_cls_prob, rpn_bbox_pred):\n",
    "        rois, rpn_scores = proposal_layer(\\\n",
    "                                        rpn_cls_prob, rpn_bbox_pred, self._im_info, self._mode,\n",
    "                                         self._feat_stride, self._anchors, self._num_anchors)\n",
    "\n",
    "        return rois, rpn_scores\n",
    "\n",
    "    def _roi_pool_layer(self, bottom, rois):\n",
    "        return RoIPool((cfg.POOLING_SIZE, cfg.POOLING_SIZE),\n",
    "                       1.0 / 16.0)(bottom, rois)\n",
    "\n",
    "    def _roi_align_layer(self, bottom, rois):\n",
    "        return RoIAlign((cfg.POOLING_SIZE, cfg.POOLING_SIZE), 1.0 / 16.0,\n",
    "                        0)(bottom, rois)\n",
    "\n",
    "    def _anchor_target_layer(self, rpn_cls_score):\n",
    "        rpn_labels, rpn_bbox_targets, rpn_bbox_inside_weights, rpn_bbox_outside_weights = \\\n",
    "          anchor_target_layer(\n",
    "          rpn_cls_score.data, self._gt_boxes.data.cpu().numpy(), self._im_info, self._feat_stride, self._anchors.data.cpu().numpy(), self._num_anchors)\n",
    "\n",
    "        rpn_labels = torch.from_numpy(rpn_labels).float().to(\n",
    "            self._device)  #.set_shape([1, 1, None, None])\n",
    "        rpn_bbox_targets = torch.from_numpy(rpn_bbox_targets).float().to(\n",
    "            self._device)  #.set_shape([1, None, None, self._num_anchors * 4])\n",
    "        rpn_bbox_inside_weights = torch.from_numpy(\n",
    "            rpn_bbox_inside_weights).float().to(\n",
    "                self.\n",
    "                _device)  #.set_shape([1, None, None, self._num_anchors * 4])\n",
    "        rpn_bbox_outside_weights = torch.from_numpy(\n",
    "            rpn_bbox_outside_weights).float().to(\n",
    "                self.\n",
    "                _device)  #.set_shape([1, None, None, self._num_anchors * 4])\n",
    "\n",
    "        rpn_labels = rpn_labels.long()\n",
    "        self._anchor_targets['rpn_labels'] = rpn_labels\n",
    "        self._anchor_targets['rpn_bbox_targets'] = rpn_bbox_targets\n",
    "        self._anchor_targets[\n",
    "            'rpn_bbox_inside_weights'] = rpn_bbox_inside_weights\n",
    "        self._anchor_targets[\n",
    "            'rpn_bbox_outside_weights'] = rpn_bbox_outside_weights\n",
    "\n",
    "        for k in self._anchor_targets.keys():\n",
    "            self._score_summaries[k] = self._anchor_targets[k]\n",
    "\n",
    "        return rpn_labels\n",
    "\n",
    "    def _proposal_target_layer(self, rois, roi_scores):\n",
    "        rois, roi_scores, labels, bbox_targets, bbox_inside_weights, bbox_outside_weights = \\\n",
    "          proposal_target_layer(\n",
    "          rois, roi_scores, self._gt_boxes, self._num_classes)\n",
    "\n",
    "        self._proposal_targets['rois'] = rois\n",
    "        self._proposal_targets['labels'] = labels.long()\n",
    "        self._proposal_targets['bbox_targets'] = bbox_targets\n",
    "        self._proposal_targets['bbox_inside_weights'] = bbox_inside_weights\n",
    "        self._proposal_targets['bbox_outside_weights'] = bbox_outside_weights\n",
    "\n",
    "        for k in self._proposal_targets.keys():\n",
    "            self._score_summaries[k] = self._proposal_targets[k]\n",
    "\n",
    "        return rois, roi_scores\n",
    "\n",
    "    def _anchor_component(self, height, width):\n",
    "        # just to get the shape right\n",
    "        #height = int(math.ceil(self._im_info.data[0, 0] / self._feat_stride[0]))\n",
    "        #width = int(math.ceil(self._im_info.data[0, 1] / self._feat_stride[0]))\n",
    "        anchors, anchor_length = generate_anchors_pre(\\\n",
    "                                              height, width,\n",
    "                                               self._feat_stride, self._anchor_scales, self._anchor_ratios)\n",
    "        self._anchors = torch.from_numpy(anchors).to(self._device)\n",
    "        self._anchor_length = anchor_length\n",
    "\n",
    "    def _smooth_l1_loss(self,\n",
    "                        bbox_pred,\n",
    "                        bbox_targets,\n",
    "                        bbox_inside_weights,\n",
    "                        bbox_outside_weights,\n",
    "                        sigma=1.0,\n",
    "                        dim=[1]):\n",
    "        sigma_2 = sigma**2\n",
    "        box_diff = bbox_pred - bbox_targets\n",
    "        in_box_diff = bbox_inside_weights * box_diff\n",
    "        abs_in_box_diff = torch.abs(in_box_diff)\n",
    "        smoothL1_sign = (abs_in_box_diff < 1. / sigma_2).detach().float()\n",
    "        in_loss_box = torch.pow(in_box_diff, 2) * (sigma_2 / 2.) * smoothL1_sign \\\n",
    "                      + (abs_in_box_diff - (0.5 / sigma_2)) * (1. - smoothL1_sign)\n",
    "        out_loss_box = bbox_outside_weights * in_loss_box\n",
    "        loss_box = out_loss_box\n",
    "        for i in sorted(dim, reverse=True):\n",
    "            loss_box = loss_box.sum(i)\n",
    "        loss_box = loss_box.mean()\n",
    "        return loss_box\n",
    "\n",
    "    def _add_losses(self, sigma_rpn=3.0):\n",
    "        # RPN, class loss\n",
    "        rpn_cls_score = self._predictions['rpn_cls_score_reshape'].view(-1, 2)\n",
    "        rpn_label = self._anchor_targets['rpn_labels'].view(-1)\n",
    "        rpn_select = (rpn_label.data != -1).nonzero().view(-1)\n",
    "        rpn_cls_score = rpn_cls_score.index_select(\n",
    "            0, rpn_select).contiguous().view(-1, 2)\n",
    "        rpn_label = rpn_label.index_select(0, rpn_select).contiguous().view(-1)\n",
    "        rpn_cross_entropy = F.cross_entropy(rpn_cls_score, rpn_label)\n",
    "\n",
    "        # RPN, bbox loss\n",
    "        rpn_bbox_pred = self._predictions['rpn_bbox_pred']\n",
    "        rpn_bbox_targets = self._anchor_targets['rpn_bbox_targets']\n",
    "        rpn_bbox_inside_weights = self._anchor_targets[\n",
    "            'rpn_bbox_inside_weights']\n",
    "        rpn_bbox_outside_weights = self._anchor_targets[\n",
    "            'rpn_bbox_outside_weights']\n",
    "        rpn_loss_box = self._smooth_l1_loss(\n",
    "            rpn_bbox_pred,\n",
    "            rpn_bbox_targets,\n",
    "            rpn_bbox_inside_weights,\n",
    "            rpn_bbox_outside_weights,\n",
    "            sigma=sigma_rpn,\n",
    "            dim=[1, 2, 3])\n",
    "\n",
    "        # RCNN, class loss\n",
    "        cls_score = self._predictions[\"cls_score\"]\n",
    "        label = self._proposal_targets[\"labels\"].view(-1)\n",
    "        cross_entropy = F.cross_entropy(\n",
    "            cls_score.view(-1, self._num_classes), label)\n",
    "\n",
    "        # RCNN, bbox loss\n",
    "        bbox_pred = self._predictions['bbox_pred']\n",
    "        bbox_targets = self._proposal_targets['bbox_targets']\n",
    "        bbox_inside_weights = self._proposal_targets['bbox_inside_weights']\n",
    "        bbox_outside_weights = self._proposal_targets['bbox_outside_weights']\n",
    "        loss_box = self._smooth_l1_loss(\n",
    "            bbox_pred, bbox_targets, bbox_inside_weights, bbox_outside_weights)\n",
    "\n",
    "        self._losses['cross_entropy'] = cross_entropy\n",
    "        self._losses['loss_box'] = loss_box\n",
    "        self._losses['rpn_cross_entropy'] = rpn_cross_entropy\n",
    "        self._losses['rpn_loss_box'] = rpn_loss_box\n",
    "\n",
    "        loss = cross_entropy + loss_box + rpn_cross_entropy + rpn_loss_box\n",
    "        self._losses['total_loss'] = loss\n",
    "\n",
    "        for k in self._losses.keys():\n",
    "            self._event_summaries[k] = self._losses[k]\n",
    "\n",
    "        return loss\n",
    "\n",
    "    def _region_proposal(self, net_conv):\n",
    "        rpn = F.relu(self.rpn_net(net_conv))\n",
    "        self._act_summaries['rpn'] = rpn\n",
    "\n",
    "        rpn_cls_score = self.rpn_cls_score_net(\n",
    "            rpn)  # batch * (num_anchors * 2) * h * w\n",
    "\n",
    "        # change it so that the score has 2 as its channel size\n",
    "        rpn_cls_score_reshape = rpn_cls_score.view(\n",
    "            1, 2, -1,\n",
    "            rpn_cls_score.size()[-1])  # batch * 2 * (num_anchors*h) * w\n",
    "        rpn_cls_prob_reshape = F.softmax(rpn_cls_score_reshape, dim=1)\n",
    "\n",
    "        # Move channel to the last dimenstion, to fit the input of python functions\n",
    "        rpn_cls_prob = rpn_cls_prob_reshape.view_as(rpn_cls_score).permute(\n",
    "            0, 2, 3, 1)  # batch * h * w * (num_anchors * 2)\n",
    "        rpn_cls_score = rpn_cls_score.permute(\n",
    "            0, 2, 3, 1)  # batch * h * w * (num_anchors * 2)\n",
    "        rpn_cls_score_reshape = rpn_cls_score_reshape.permute(\n",
    "            0, 2, 3, 1).contiguous()  # batch * (num_anchors*h) * w * 2\n",
    "        rpn_cls_pred = torch.max(rpn_cls_score_reshape.view(-1, 2), 1)[1]\n",
    "\n",
    "        rpn_bbox_pred = self.rpn_bbox_pred_net(rpn)\n",
    "        rpn_bbox_pred = rpn_bbox_pred.permute(\n",
    "            0, 2, 3, 1).contiguous()  # batch * h * w * (num_anchors*4)\n",
    "\n",
    "        if self._mode == 'TRAIN':\n",
    "            rois, roi_scores = self._proposal_layer(\n",
    "                rpn_cls_prob, rpn_bbox_pred)  # rois, roi_scores are varible\n",
    "            rpn_labels = self._anchor_target_layer(rpn_cls_score)\n",
    "            rois, _ = self._proposal_target_layer(rois, roi_scores)\n",
    "        else:\n",
    "            if cfg.TEST.MODE == 'nms':\n",
    "                rois, _ = self._proposal_layer(rpn_cls_prob, rpn_bbox_pred)\n",
    "            elif cfg.TEST.MODE == 'top':\n",
    "                rois, _ = self._proposal_top_layer(rpn_cls_prob, rpn_bbox_pred)\n",
    "            else:\n",
    "                raise NotImplementedError\n",
    "\n",
    "        self._predictions[\"rpn_cls_score\"] = rpn_cls_score\n",
    "        self._predictions[\"rpn_cls_score_reshape\"] = rpn_cls_score_reshape\n",
    "        self._predictions[\"rpn_cls_prob\"] = rpn_cls_prob\n",
    "        self._predictions[\"rpn_cls_pred\"] = rpn_cls_pred\n",
    "        self._predictions[\"rpn_bbox_pred\"] = rpn_bbox_pred\n",
    "        self._predictions[\"rois\"] = rois\n",
    "\n",
    "        return rois\n",
    "\n",
    "    def _region_classification(self, fc7):\n",
    "        cls_score = self.cls_score_net(fc7)\n",
    "        cls_pred = torch.max(cls_score, 1)[1]\n",
    "        cls_prob = F.softmax(cls_score, dim=1)\n",
    "        bbox_pred = self.bbox_pred_net(fc7)\n",
    "\n",
    "        self._predictions[\"cls_score\"] = cls_score\n",
    "        self._predictions[\"cls_pred\"] = cls_pred\n",
    "        self._predictions[\"cls_prob\"] = cls_prob\n",
    "        self._predictions[\"bbox_pred\"] = bbox_pred\n",
    "\n",
    "        return cls_prob, bbox_pred\n",
    "\n",
    "    def _image_to_head(self):\n",
    "        raise NotImplementedError\n",
    "\n",
    "    def _head_to_tail(self, pool5):\n",
    "        raise NotImplementedError\n",
    "\n",
    "    def create_architecture(self,\n",
    "                            num_classes,\n",
    "                            tag=None,\n",
    "                            anchor_scales=(8, 16, 32),\n",
    "                            anchor_ratios=(0.5, 1, 2)):\n",
    "        self._tag = tag\n",
    "\n",
    "        self._num_classes = num_classes\n",
    "        self._anchor_scales = anchor_scales\n",
    "        self._num_scales = len(anchor_scales)\n",
    "\n",
    "        self._anchor_ratios = anchor_ratios\n",
    "        self._num_ratios = len(anchor_ratios)\n",
    "\n",
    "        self._num_anchors = self._num_scales * self._num_ratios\n",
    "\n",
    "        assert tag != None\n",
    "\n",
    "        # Initialize layers\n",
    "        self._init_modules()\n",
    "\n",
    "    def _init_modules(self):\n",
    "        self._init_head_tail()\n",
    "\n",
    "        # rpn\n",
    "        self.rpn_net = nn.Conv2d(\n",
    "            self._net_conv_channels, cfg.RPN_CHANNELS, [3, 3], padding=1)\n",
    "\n",
    "        self.rpn_cls_score_net = nn.Conv2d(cfg.RPN_CHANNELS,\n",
    "                                           self._num_anchors * 2, [1, 1])\n",
    "\n",
    "        self.rpn_bbox_pred_net = nn.Conv2d(cfg.RPN_CHANNELS,\n",
    "                                           self._num_anchors * 4, [1, 1])\n",
    "\n",
    "        self.cls_score_net = nn.Linear(self._fc7_channels, self._num_classes)\n",
    "        self.bbox_pred_net = nn.Linear(self._fc7_channels,\n",
    "                                       self._num_classes * 4)\n",
    "\n",
    "        self.init_weights()\n",
    "\n",
    "    def _run_summary_op(self, val=False):\n",
    "        \"\"\"\n",
    "    Run the summary operator: feed the placeholders with corresponding newtork outputs(activations)\n",
    "    \"\"\"\n",
    "        summaries = []\n",
    "        # Add image gt\n",
    "        summaries.append(self._add_gt_image_summary())\n",
    "        # Add event_summaries\n",
    "        for key, var in self._event_summaries.items():\n",
    "            summaries.append(tb.summary.scalar(key, var.item()))\n",
    "        self._event_summaries = {}\n",
    "        if not val:\n",
    "            # Add score summaries\n",
    "            for key, var in self._score_summaries.items():\n",
    "                summaries.append(self._add_score_summary(key, var))\n",
    "            self._score_summaries = {}\n",
    "            # Add act summaries\n",
    "            for key, var in self._act_summaries.items():\n",
    "                summaries += self._add_act_summary(key, var)\n",
    "            self._act_summaries = {}\n",
    "            # Add train summaries\n",
    "            for k, var in dict(self.named_parameters()).items():\n",
    "                if var.requires_grad:\n",
    "                    summaries.append(self._add_train_summary(k, var))\n",
    "\n",
    "            self._image_gt_summaries = {}\n",
    "\n",
    "        return summaries\n",
    "\n",
    "    def _predict(self):\n",
    "        # This is just _build_network in tf-faster-rcnn\n",
    "        torch.backends.cudnn.benchmark = False\n",
    "        net_conv = self._image_to_head()\n",
    "\n",
    "        # build the anchors for the image\n",
    "        self._anchor_component(net_conv.size(2), net_conv.size(3))\n",
    "\n",
    "        rois = self._region_proposal(net_conv)\n",
    "        if cfg.POOLING_MODE == 'align':\n",
    "            pool5 = self._roi_align_layer(net_conv, rois)\n",
    "        else:\n",
    "            pool5 = self._roi_pool_layer(net_conv, rois)\n",
    "\n",
    "        if self._mode == 'TRAIN':\n",
    "            torch.backends.cudnn.benchmark = True  # benchmark because now the input size are fixed\n",
    "        fc7 = self._head_to_tail(pool5)\n",
    "\n",
    "        cls_prob, bbox_pred = self._region_classification(fc7)\n",
    "\n",
    "        for k in self._predictions.keys():\n",
    "            self._score_summaries[k] = self._predictions[k]\n",
    "\n",
    "        return rois, cls_prob, bbox_pred\n",
    "\n",
    "    def forward(self, image, im_info, gt_boxes=None, mode='TRAIN'):\n",
    "        self._image_gt_summaries['image'] = image\n",
    "        self._image_gt_summaries['gt_boxes'] = gt_boxes\n",
    "        self._image_gt_summaries['im_info'] = im_info\n",
    "\n",
    "        self._image = torch.from_numpy(image.transpose([0, 3, 1,\n",
    "                                                        2])).to(self._device)\n",
    "        self._im_info = im_info  # No need to change; actually it can be an list\n",
    "        self._gt_boxes = torch.from_numpy(gt_boxes).to(\n",
    "            self._device) if gt_boxes is not None else None\n",
    "\n",
    "        self._mode = mode\n",
    "\n",
    "        rois, cls_prob, bbox_pred = self._predict()\n",
    "\n",
    "        if mode == 'TEST':\n",
    "            stds = bbox_pred.data.new(cfg.TRAIN.BBOX_NORMALIZE_STDS).repeat(\n",
    "                self._num_classes).unsqueeze(0).expand_as(bbox_pred)\n",
    "            means = bbox_pred.data.new(cfg.TRAIN.BBOX_NORMALIZE_MEANS).repeat(\n",
    "                self._num_classes).unsqueeze(0).expand_as(bbox_pred)\n",
    "            self._predictions[\"bbox_pred\"] = bbox_pred.mul(stds).add(means)\n",
    "        else:\n",
    "            self._add_losses()  # compute losses\n",
    "\n",
    "    def init_weights(self):\n",
    "        def normal_init(m, mean, stddev, truncated=False):\n",
    "            \"\"\"\n",
    "      weight initalizer: truncated normal and random normal.\n",
    "      \"\"\"\n",
    "            # x is a parameter\n",
    "            if truncated:\n",
    "                m.weight.data.normal_().fmod_(2).mul_(stddev).add_(\n",
    "                    mean)  # not a perfect approximation\n",
    "            else:\n",
    "                m.weight.data.normal_(mean, stddev)\n",
    "            m.bias.data.zero_()\n",
    "\n",
    "        normal_init(self.rpn_net, 0, 0.01, cfg.TRAIN.TRUNCATED)\n",
    "        normal_init(self.rpn_cls_score_net, 0, 0.01, cfg.TRAIN.TRUNCATED)\n",
    "        normal_init(self.rpn_bbox_pred_net, 0, 0.01, cfg.TRAIN.TRUNCATED)\n",
    "        normal_init(self.cls_score_net, 0, 0.01, cfg.TRAIN.TRUNCATED)\n",
    "        normal_init(self.bbox_pred_net, 0, 0.001, cfg.TRAIN.TRUNCATED)\n",
    "\n",
    "    # Extract the head feature maps, for example for vgg16 it is conv5_3\n",
    "    # only useful during testing mode\n",
    "    def extract_head(self, image):\n",
    "        feat = self._layers[\"head\"](torch.from_numpy(\n",
    "            image.transpose([0, 3, 1, 2])).to(self._device))\n",
    "        return feat\n",
    "\n",
    "    # only useful during testing mode\n",
    "    def test_image(self, image, im_info):\n",
    "        self.eval()\n",
    "        with torch.no_grad():\n",
    "            self.forward(image, im_info, None, mode='TEST')\n",
    "        cls_score, cls_prob, bbox_pred, rois = self._predictions[\"cls_score\"].data.cpu().numpy(), \\\n",
    "                                                         self._predictions['cls_prob'].data.cpu().numpy(), \\\n",
    "                                                         self._predictions['bbox_pred'].data.cpu().numpy(), \\\n",
    "                                                         self._predictions['rois'].data.cpu().numpy()\n",
    "        return cls_score, cls_prob, bbox_pred, rois\n",
    "\n",
    "    def delete_intermediate_states(self):\n",
    "        # Delete intermediate result to save memory\n",
    "        for d in [\n",
    "                self._losses, self._predictions, self._anchor_targets,\n",
    "                self._proposal_targets\n",
    "        ]:\n",
    "            for k in list(d):\n",
    "                del d[k]\n",
    "\n",
    "    def get_summary(self, blobs):\n",
    "        self.eval()\n",
    "        self.forward(blobs['data'], blobs['im_info'], blobs['gt_boxes'])\n",
    "        self.train()\n",
    "        summary = self._run_summary_op(True)\n",
    "\n",
    "        return summary\n",
    "\n",
    "    def train_step(self, blobs, train_op):\n",
    "        self.forward(blobs['data'], blobs['im_info'], blobs['gt_boxes'])\n",
    "        rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, loss = self._losses[\"rpn_cross_entropy\"].item(), \\\n",
    "                                                                            self._losses['rpn_loss_box'].item(), \\\n",
    "                                                                            self._losses['cross_entropy'].item(), \\\n",
    "                                                                            self._losses['loss_box'].item(), \\\n",
    "                                                                            self._losses['total_loss'].item()\n",
    "        #utils.timer.timer.tic('backward')\n",
    "        train_op.zero_grad()\n",
    "        self._losses['total_loss'].backward()\n",
    "        #utils.timer.timer.toc('backward')\n",
    "        train_op.step()\n",
    "\n",
    "        self.delete_intermediate_states()\n",
    "\n",
    "        return rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, loss\n",
    "\n",
    "    def train_step_with_summary(self, blobs, train_op):\n",
    "        self.forward(blobs['data'], blobs['im_info'], blobs['gt_boxes'])\n",
    "        rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, loss = self._losses[\"rpn_cross_entropy\"].item(), \\\n",
    "                                                                            self._losses['rpn_loss_box'].item(), \\\n",
    "                                                                            self._losses['cross_entropy'].item(), \\\n",
    "                                                                            self._losses['loss_box'].item(), \\\n",
    "                                                                            self._losses['total_loss'].item()\n",
    "        train_op.zero_grad()\n",
    "        self._losses['total_loss'].backward()\n",
    "        train_op.step()\n",
    "        summary = self._run_summary_op()\n",
    "\n",
    "        self.delete_intermediate_states()\n",
    "\n",
    "        return rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, loss, summary\n",
    "\n",
    "    def train_step_no_return(self, blobs, train_op):\n",
    "        self.forward(blobs['data'], blobs['im_info'], blobs['gt_boxes'])\n",
    "        train_op.zero_grad()\n",
    "        self._losses['total_loss'].backward()\n",
    "        train_op.step()\n",
    "        self.delete_intermediate_states()\n",
    "\n",
    "    def load_state_dict(self, state_dict):\n",
    "        \"\"\"\n",
    "    Because we remove the definition of fc layer in resnet now, it will fail when loading\n",
    "    the model trained before.\n",
    "    To provide back compatibility, we overwrite the load_state_dict\n",
    "    \"\"\"\n",
    "        nn.Module.load_state_dict(\n",
    "            self, {k: v\n",
    "                   for k, v in state_dict.items() if k in self.state_dict()}\n",
    "            )\n",
    "\n",
    "class VGG16(Network):\n",
    "    def __init__(self):\n",
    "        Network.__init__(self)\n",
    "        self._feat_stride = [\n",
    "            16,\n",
    "        ]\n",
    "        self._feat_compress = [\n",
    "            1. / float(self._feat_stride[0]),\n",
    "        ]\n",
    "        self._net_conv_channels = 512\n",
    "        self._fc7_channels = 4096\n",
    "\n",
    "    def _init_head_tail(self):\n",
    "        self.vgg = models.vgg16()\n",
    "        # Remove fc8\n",
    "        self.vgg.classifier = nn.Sequential(\n",
    "            *list(self.vgg.classifier._modules.values())[:-1])\n",
    "\n",
    "        # Fix the layers before conv3:\n",
    "        for layer in range(10):\n",
    "            for p in self.vgg.features[layer].parameters():\n",
    "                p.requires_grad = False\n",
    "\n",
    "        # not using the last maxpool layer\n",
    "        self._layers['head'] = nn.Sequential(\n",
    "            *list(self.vgg.features._modules.values())[:-1])\n",
    "\n",
    "    def _image_to_head(self):\n",
    "        net_conv = self._layers['head'](self._image)\n",
    "        self._act_summaries['conv'] = net_conv\n",
    "\n",
    "        return net_conv\n",
    "\n",
    "    def _head_to_tail(self, pool5):\n",
    "        pool5_flat = pool5.view(pool5.size(0), -1)\n",
    "        fc7 = self.vgg.classifier(pool5_flat)\n",
    "\n",
    "        return fc7\n",
    "\n",
    "    def load_pretrained_cnn(self, state_dict):\n",
    "        self.vgg.load_state_dict({\n",
    "            k: v\n",
    "            for k, v in state_dict.items() if k in self.vgg.state_dict()\n",
    "        })\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3.2 建立一个简单的模型训练并保存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "model create successfully!\n",
      "model params load successfully!\n"
     ]
    }
   ],
   "source": [
    "from loadData import DataLayer\n",
    "from model import VGG16, Network\n",
    "import torch\n",
    "import tensorboardX as tb\n",
    "import os\n",
    "\n",
    "weight_output = \"./weight_output\"\n",
    "if not os.path.exists(weight_output):  # 如果路径不存在\n",
    "    os.makedirs(weight_output)\n",
    "\n",
    "# import pydevd_pycharm\n",
    "# pydevd_pycharm.settrace('10.214.160.245', port=8011, stdoutToServer=True, stderrToServer=True)\n",
    "\n",
    "def train():\n",
    "    # 加载训练数据\n",
    "    data_layer = DataLayer(\"./dataset/train\")\n",
    "    # image_len = len(data_layer.images)\n",
    "    data_layer_val = DataLayer(\"./dataset/val\")\n",
    "    # 构建模型\n",
    "    net = VGG16()\n",
    "    # Construct the computation graph\n",
    "    net.create_architecture(2, tag='default', anchor_scales=[8,16,32], anchor_ratios=[0.5,1,2])\n",
    "    # Define the loss\n",
    "    # Set learning rate and momentum\n",
    "    lr = 0.0001\n",
    "    params = []\n",
    "    for key, value in dict(net.named_parameters()).items():\n",
    "        if value.requires_grad:\n",
    "            if 'bias' in key:\n",
    "                params += [{\n",
    "                    'params': [value],\n",
    "                    'lr': lr * 2,\n",
    "                    'weight_decay': 0.0001\n",
    "                }]\n",
    "            else:\n",
    "                params += [{\n",
    "                    'params': [value],\n",
    "                    'lr': lr,\n",
    "                    'weight_decay': getattr(value, 'weight_decay', 0.0001)\n",
    "                }]\n",
    "    optimizer = torch.optim.SGD(params, momentum=0.9)\n",
    "    # Write the train and validation information to tensorboard\n",
    "    writer = tb.writer.FileWriter(\"./tensorboard/train\")\n",
    "    valwriter = tb.writer.FileWriter(\"./tensorboard/val\")\n",
    "\n",
    "\n",
    "    print(\"model create successfully!\")\n",
    "    # 加载模型\n",
    "    list_dir = os.listdir(weight_output)\n",
    "    if len(list_dir) == 0:\n",
    "        net.load_pretrained_cnn(torch.load(\"./imagenet_weights/vgg16.pth\"))\n",
    "    else:\n",
    "         net.load_state_dict(torch.load(os.path.join(weight_output, list_dir[-1]), map_location='cpu'))\n",
    "\n",
    "    print(\"model params load successfully!\")\n",
    "    net.train()\n",
    "    net.to(net._device)\n",
    "\n",
    "    # 开始训练\n",
    "    max_iter = 5001\n",
    "    for iter in range(max_iter):\n",
    "        # Compute the graph with summary\n",
    "        blobs = data_layer.forward()\n",
    "        if iter % 100 == 0:\n",
    "            rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, total_loss, summary = net.train_step_with_summary(blobs, optimizer)\n",
    "            for _sum in summary:\n",
    "                writer.add_summary(_sum, float(iter))\n",
    "            # Also check the summary on the validation set\n",
    "            blobs_val = data_layer_val.forward()\n",
    "            summary_val = net.get_summary(blobs_val)\n",
    "            for _sum in summary_val:\n",
    "                valwriter.add_summary(_sum, float(iter))\n",
    "        else:\n",
    "            blobs = data_layer.forward()\n",
    "            # Compute the graph without summary\n",
    "            rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, total_loss = net.train_step(blobs, optimizer)\n",
    "        if iter % 10 == 0:\n",
    "            # Display the last image training information\n",
    "            print('iter: %d / %d, total loss: %.6f\\n >>> rpn_loss_cls: %.6f\\n '\n",
    "                      '>>> rpn_loss_box: %.6f\\n >>> loss_cls: %.6f\\n >>> loss_box: %.6f\\n >>> lr: %f' % \\\n",
    "                      (iter, max_iter, total_loss, rpn_loss_cls, rpn_loss_box, loss_cls, loss_box, lr))\n",
    "\n",
    "        if iter % 1000 == 0:\n",
    "            torch.save(net.state_dict(), os.path.join(weight_output, \"params\"+'{0:0>9}'.format(iter)+\".pkl\"))\n",
    "\n",
    "    writer.close()\n",
    "    valwriter.close()\n",
    "\n",
    "if __name__ == '__main__':\n",
    "#     os.environ['CUDA_VISIBLE_DEVICES'] = '0'\n",
    "    train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3.3 分析模型训练过程以及模型概况\n",
    "整个训练过程分为:\n",
    "+ 使用DataLayer加载训练数据。\n",
    "+ 构建模型VGG16。\n",
    "+ 使用torch.load加载模型参数。\n",
    "+ 设置训练epoch,然后开始训练。\n",
    "+ 记下训练结果,使用torch.save保存模型参数。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3.4 加载模型并对模型进行评估\n",
    "目标检测的评估方法主要有两种,一种是ap(average precision),一种是CorLoc(Correct Localization)\n",
    "\n",
    "本模型中只使用了ap作为评估方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xml.etree.ElementTree as ET\n",
    "import os\n",
    "import numpy as np\n",
    "import glob\n",
    "\n",
    "# classes = (\n",
    "#             '__background__',  # always index 0\n",
    "#             'balloon')\n",
    "# class_to_ind = dict(\n",
    "#             list(zip(classes, list(range(len(classes))))))\n",
    "\n",
    "def parse_rec(filename):\n",
    "    \"\"\" Parse a PASCAL VOC xml file \"\"\"\n",
    "    tree = ET.parse(filename)\n",
    "    objects = []\n",
    "    for obj in tree.findall('object'):\n",
    "        obj_struct = {}\n",
    "        obj_struct['name'] = obj.find('name').text\n",
    "        # obj_struct['pose'] = obj.find('pose').text\n",
    "        # obj_struct['truncated'] = int(obj.find('truncated').text)\n",
    "        obj_struct['difficult'] = int(obj.find('difficult').text)\n",
    "        bbox = obj.find('bndbox')\n",
    "        obj_struct['bbox'] = [\n",
    "            float(bbox.find('xmin').text),\n",
    "            float(bbox.find('ymin').text),\n",
    "            float(bbox.find('xmax').text),\n",
    "            float(bbox.find('ymax').text)\n",
    "        ]\n",
    "        objects.append(obj_struct)\n",
    "\n",
    "    return objects\n",
    "\n",
    "\n",
    "def voc_ap(rec, prec, use_07_metric=False):\n",
    "    \"\"\" ap = voc_ap(rec, prec, [use_07_metric])\n",
    "  Compute VOC AP given precision and recall.\n",
    "  If use_07_metric is true, uses the\n",
    "  VOC 07 11 point method (default:False).\n",
    "  \"\"\"\n",
    "    if use_07_metric:\n",
    "        # 11 point metric\n",
    "        ap = 0.\n",
    "        for t in np.arange(0., 1.1, 0.1):\n",
    "            if np.sum(rec >= t) == 0:\n",
    "                p = 0\n",
    "            else:\n",
    "                p = np.max(prec[rec >= t])\n",
    "            ap = ap + p / 11.\n",
    "    else:\n",
    "        # correct AP calculation\n",
    "        # first append sentinel values at the end\n",
    "        mrec = np.concatenate(([0.], rec, [1.]))\n",
    "        mpre = np.concatenate(([0.], prec, [0.]))\n",
    "\n",
    "        # compute the precision envelope\n",
    "        for i in range(mpre.size - 1, 0, -1):\n",
    "            mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])\n",
    "\n",
    "        # to calculate area under PR curve, look for points\n",
    "        # where X axis (recall) changes value\n",
    "        i = np.where(mrec[1:] != mrec[:-1])[0]\n",
    "\n",
    "        # and sum (\\Delta recall) * prec\n",
    "        ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])\n",
    "    return ap\n",
    "\n",
    "\n",
    "def voc_eval(pred_values,\n",
    "             annopath,\n",
    "             classname,\n",
    "             ovthresh=0.5,\n",
    "             use_07_metric=False,\n",
    "             use_diff=False):\n",
    "    \"\"\"rec, prec, ap = voc_eval(pred_values,\n",
    "                              annopath,\n",
    "                              imagesetfile,\n",
    "                              classname,\n",
    "                              [ovthresh],\n",
    "                              [use_07_metric])\n",
    "\n",
    "  Top level function that does the PASCAL VOC evaluation.\n",
    "\n",
    "  pred_values:\n",
    "    是一个2维矩阵,[[图片地址,一个bbox对于cls的分数,bbox_xmin, bbox_ymin, bbox_xmax, bbox_ymax]]\n",
    "  annopath: Path to annotations\n",
    "      annopath.format(imagename) should be the xml annotations file.\n",
    "  classname: Category name (duh)\n",
    "  [ovthresh]: Overlap threshold (default = 0.5)\n",
    "  [use_07_metric]: Whether to use VOC07's 11 point AP computation\n",
    "      (default False)\n",
    "  \"\"\"\n",
    "    recs = {}\n",
    "    for xmlP in glob.glob(annopath + \"/*.*\"):\n",
    "        recs[xmlP] = parse_rec(xmlP)\n",
    "    class_recs = {}\n",
    "    # extract gt objects for this cls class\n",
    "    npos = 0\n",
    "    for xmlP in glob.glob(annopath + \"/*.*\"):\n",
    "        R = [obj for obj in recs[xmlP] if obj['name'] == classname]\n",
    "        bbox = np.array([x['bbox'] for x in R])\n",
    "        if use_diff:\n",
    "            difficult = np.array([False for x in R]).astype(np.bool)\n",
    "        else:\n",
    "            difficult = np.array([x['difficult'] for x in R]).astype(np.bool)\n",
    "        det = [False] * len(R)\n",
    "        npos = npos + sum(~difficult)\n",
    "        class_recs[xmlP] = {\n",
    "            'bbox': bbox,\n",
    "            'difficult': difficult,\n",
    "            'det': det\n",
    "        }\n",
    "\n",
    "    image_ids = [x[0] for x in pred_values]  # 图片下标或文件名(不包括.jpg),与imagename表示同样的意思\n",
    "    confidence = np.array([float(x[1]) for x in pred_values])  # 置信度\n",
    "    BB = np.array([[float(z) for z in x[2:]] for x in pred_values])  # bbox\n",
    "\n",
    "    nd = len(image_ids)\n",
    "    tp = np.zeros(nd)\n",
    "    fp = np.zeros(nd)\n",
    "\n",
    "    if BB.shape[0] > 0:\n",
    "        # sort by confidence\n",
    "        sorted_ind = np.argsort(-confidence)\n",
    "        sorted_scores = np.sort(-confidence)\n",
    "        BB = BB[sorted_ind, :]\n",
    "        image_ids = [image_ids[x] for x in sorted_ind]\n",
    "\n",
    "        # go down dets and mark TPs and FPs\n",
    "        for d in range(nd):\n",
    "            R = class_recs[image_ids[d]]\n",
    "            bb = BB[d, :].astype(float)\n",
    "            ovmax = -np.inf\n",
    "            BBGT = R['bbox'].astype(float)\n",
    "\n",
    "            if BBGT.size > 0:\n",
    "                # compute overlaps\n",
    "                # intersection\n",
    "                ixmin = np.maximum(BBGT[:, 0], bb[0])\n",
    "                iymin = np.maximum(BBGT[:, 1], bb[1])\n",
    "                ixmax = np.minimum(BBGT[:, 2], bb[2])\n",
    "                iymax = np.minimum(BBGT[:, 3], bb[3])\n",
    "                iw = np.maximum(ixmax - ixmin + 1., 0.)\n",
    "                ih = np.maximum(iymax - iymin + 1., 0.)\n",
    "                inters = iw * ih\n",
    "\n",
    "                # union\n",
    "                uni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) +\n",
    "                       (BBGT[:, 2] - BBGT[:, 0] + 1.) *\n",
    "                       (BBGT[:, 3] - BBGT[:, 1] + 1.) - inters)\n",
    "\n",
    "                overlaps = inters / uni\n",
    "                ovmax = np.max(overlaps)\n",
    "                jmax = np.argmax(overlaps)\n",
    "\n",
    "            if ovmax > ovthresh:\n",
    "                if not R['difficult'][jmax]:\n",
    "                    if not R['det'][jmax]:\n",
    "                        tp[d] = 1.\n",
    "                        R['det'][jmax] = 1\n",
    "                    else:\n",
    "                        fp[d] = 1.\n",
    "            else:\n",
    "                fp[d] = 1.\n",
    "\n",
    "    # compute precision recall\n",
    "    fp = np.cumsum(fp)  # 在该方法之前fp中取值只能是0/1, np.cumsum方法是将fp数组中的所有数据加起来,\n",
    "                        # 所加的总和在fp[-1]最后一位上(表示总共fp【错误肯定】的个数)。具体可以查看np.cumsum方法源码,在源码注释后面还有样例讲解\n",
    "    tp = np.cumsum(tp)  # 在该方法之前tp中取值只能是0/1, np.cumsum方法是将tp数组中的所有数据加起来,\n",
    "                        # 所加的总和在tp[-1]最后一位上(表示总共tp【正确肯定】的个数)。具体可以查看np.cumsum方法源码,在源码注释后面还有样例讲解\n",
    "    rec = tp / float(npos)\n",
    "    # avoid divide by zero in case the first detection matches a difficult\n",
    "    # ground truth\n",
    "    prec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)\n",
    "    ap = voc_ap(rec, prec, use_07_metric)\n",
    "\n",
    "    return rec, prec, ap"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from loadData import DataLayer\n",
    "from model import VGG16, Network\n",
    "import torch\n",
    "from lib.bbox_transform import bbox_transform_inv\n",
    "import os\n",
    "import numpy as np\n",
    "from torchvision.ops import nms\n",
    "from config import cfg\n",
    "import cv2\n",
    "from inference import _clip_boxes\n",
    "from voc_eval import voc_eval\n",
    "\n",
    "weight_output = \"./weight_output\"\n",
    "\n",
    "def ap_test():\n",
    "    pred_values = []\n",
    "    data_layer_test = DataLayer(os.path.join(\"dataset\", \"test\"))\n",
    "    net = VGG16()\n",
    "    # Construct the computation graph\n",
    "    net.create_architecture(2, tag='default', anchor_scales=[8, 16, 32], anchor_ratios=[0.5, 1, 2])\n",
    "    net.eval()\n",
    "    # if not torch.cuda.is_available():\n",
    "    net._device = 'cpu'\n",
    "    net.to(net._device)\n",
    "\n",
    "    # 加载模型\n",
    "    list_dir = os.listdir(weight_output)\n",
    "    if len(list_dir) == 0:\n",
    "        net.load_pretrained_cnn(torch.load(\"./imagenet_weights/vgg16.pth\"))\n",
    "    else:\n",
    "        # net.load_state_dict(torch.load(os.path.join(weight_output, list_dir[-1])))\n",
    "        net.load_state_dict(torch.load(os.path.join(weight_output, list_dir[-1]), map_location='cpu'))\n",
    "\n",
    "    print(\"load model params successfully. \")\n",
    "\n",
    "    for i in range(data_layer_test.length):\n",
    "        blobs = data_layer_test.forward()\n",
    "        im_blob = blobs['data']\n",
    "        im_scale = blobs['im_info'][2]\n",
    "        _, scores, bbox_pred, rois = net.test_image(blobs['data'], blobs['im_info'])\n",
    "        boxes = rois[:, 1:5] / im_scale\n",
    "        img = cv2.resize(\n",
    "            im_blob[0],\n",
    "            None,\n",
    "            None,\n",
    "            fx=1 / im_scale,\n",
    "            fy=1 / im_scale,\n",
    "            interpolation=cv2.INTER_LINEAR)\n",
    "\n",
    "        img += cfg.PIXEL_MEANS\n",
    "\n",
    "        scores = np.reshape(scores, [scores.shape[0], -1])\n",
    "        bbox_pred = np.reshape(bbox_pred, [bbox_pred.shape[0], -1])\n",
    "\n",
    "        # Apply bounding-box regression deltas\n",
    "        box_deltas = bbox_pred\n",
    "        pred_boxes = bbox_transform_inv(\n",
    "            torch.from_numpy(boxes), torch.from_numpy(box_deltas)).numpy()\n",
    "        pred_boxes = _clip_boxes(pred_boxes, img.shape)\n",
    "\n",
    "        # skip j = 0, because it's the background class\n",
    "        for j in range(1, 2):\n",
    "            inds = np.where(scores[:, j] > 0.5)[0]\n",
    "            cls_scores = scores[inds, j]\n",
    "            cls_boxes = pred_boxes[inds, j * 4:(j + 1) * 4]\n",
    "            cls_dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) \\\n",
    "                .astype(np.float32, copy=False)\n",
    "            # NMS 操作,剔除一部分box\n",
    "            keep = nms(\n",
    "                torch.from_numpy(cls_boxes), torch.from_numpy(cls_scores),\n",
    "                cfg.TEST.NMS).numpy() if cls_dets.size > 0 else []\n",
    "            cls_dets = cls_dets[keep, :]\n",
    "\n",
    "            height, width, channel = img.shape\n",
    "            for r in range(len(cls_dets)):\n",
    "                # 画预测的框\n",
    "                left = float(max(cls_dets[r][0] + 1, 0))\n",
    "                top = float(max(cls_dets[r][1] + 1, 0))\n",
    "                right = float(min(cls_dets[r][2] + 1, width))\n",
    "                bottom = float(min(cls_dets[r][3] + 1, height))\n",
    "\n",
    "                pred_values.append([data_layer_test.filenames[i], cls_dets[r][4], left, top, right, bottom])\n",
    "\n",
    "    return voc_eval(pred_values, os.path.join(\"dataset\", \"test\", \"Annotations\"), \"balloon\")\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    # os.environ['CUDA_VISIBLE_DEVICES'] = '0'\n",
    "    rec, prec, ap = ap_test()\n",
    "    print(rec)\n",
    "    print(prec)\n",
    "    print(ap)\n",
    "    score = 0\n",
    "    if ap <= 0:\n",
    "        score = 0\n",
    "    elif ap > 0 and ap <= 0.1:\n",
    "        score = 60\n",
    "    elif ap > 0.1 and ap <= 0.2:\n",
    "        score = 70\n",
    "    elif ap > 0.2 and ap <= 0.3:\n",
    "        score = 80\n",
    "    elif ap > 0.3 and ap <= 0.4:\n",
    "        score = 90\n",
    "    else:\n",
    "        score = 100\n",
    "    print(\"score: \", score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.3.5 加载模型并预测输入数据的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from loadData import DataLayer\n",
    "from model import VGG16, Network\n",
    "import torch\n",
    "from lib.bbox_transform import bbox_transform_inv\n",
    "import os\n",
    "import numpy as np\n",
    "from torchvision.ops import nms\n",
    "from config import cfg\n",
    "import cv2\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "image_output = \"./image_output\"\n",
    "if not os.path.exists(image_output):  # 如果路径不存在\n",
    "    os.makedirs(image_output)\n",
    "weight_output = \"./weight_output\"\n",
    "\n",
    "def _clip_boxes(boxes, im_shape):\n",
    "    \"\"\"Clip boxes to image boundaries.\"\"\"\n",
    "    # x1 >= 0\n",
    "    boxes[:, 0::4] = np.maximum(boxes[:, 0::4], 0)\n",
    "    # y1 >= 0\n",
    "    boxes[:, 1::4] = np.maximum(boxes[:, 1::4], 0)\n",
    "    # x2 < im_shape[1]\n",
    "    boxes[:, 2::4] = np.minimum(boxes[:, 2::4], im_shape[1] - 1)\n",
    "    # y2 < im_shape[0]\n",
    "    boxes[:, 3::4] = np.minimum(boxes[:, 3::4], im_shape[0] - 1)\n",
    "    return boxes\n",
    "\n",
    "def inference():\n",
    "    data_layer_test = DataLayer(\"./dataset/val\")\n",
    "\n",
    "    net = VGG16()\n",
    "    # Construct the computation graph\n",
    "    net.create_architecture(2, tag='default', anchor_scales=[8, 16, 32], anchor_ratios=[0.5, 1, 2])\n",
    "    net.eval()\n",
    "    # if not torch.cuda.is_available():\n",
    "    net._device = 'cpu'\n",
    "    net.to(net._device)\n",
    "\n",
    "    # 加载模型\n",
    "    list_dir = os.listdir(weight_output)\n",
    "    if len(list_dir) == 0:\n",
    "        net.load_pretrained_cnn(torch.load(\"./imagenet_weights/vgg16.pth\"))\n",
    "    else:\n",
    "        # net.load_state_dict(torch.load(os.path.join(weight_output, list_dir[-1])))\n",
    "        net.load_state_dict(torch.load(os.path.join(weight_output, list_dir[-1]), map_location='cpu'))\n",
    "\n",
    "    print(\"load model params successfully. \")\n",
    "\n",
    "    fig = plt.gcf()  # 获取当前图表,get current figure\n",
    "    fig.set_size_inches(10, 12)  # 1寸等于 2.54 cm\n",
    "\n",
    "    for i in range(data_layer_test.length):\n",
    "        blobs = data_layer_test.forward()\n",
    "        im_blob = blobs['data']\n",
    "        im_scale = blobs['im_info'][2]\n",
    "        _, scores, bbox_pred, rois = net.test_image(blobs['data'], blobs['im_info'])\n",
    "        boxes = rois[:, 1:5] / im_scale\n",
    "        img = cv2.resize(\n",
    "            im_blob[0],\n",
    "            None,\n",
    "            None,\n",
    "            fx=1/im_scale,\n",
    "            fy=1/im_scale,\n",
    "            interpolation=cv2.INTER_LINEAR)\n",
    "\n",
    "        img += cfg.PIXEL_MEANS\n",
    "\n",
    "        scores = np.reshape(scores, [scores.shape[0], -1])\n",
    "        bbox_pred = np.reshape(bbox_pred, [bbox_pred.shape[0], -1])\n",
    "\n",
    "        # Apply bounding-box regression deltas\n",
    "        box_deltas = bbox_pred\n",
    "        pred_boxes = bbox_transform_inv(\n",
    "                torch.from_numpy(boxes), torch.from_numpy(box_deltas)).numpy()\n",
    "        pred_boxes = _clip_boxes(pred_boxes, img.shape)\n",
    "\n",
    "        # skip j = 0, because it's the background class\n",
    "        for j in range(1, 2):\n",
    "            inds = np.where(scores[:, j] > 0.5)[0]\n",
    "            cls_scores = scores[inds, j]\n",
    "            cls_boxes = pred_boxes[inds, j * 4:(j + 1) * 4]\n",
    "            cls_dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) \\\n",
    "                .astype(np.float32, copy=False)\n",
    "            # NMS 操作,剔除一部分box\n",
    "            keep = nms(\n",
    "                torch.from_numpy(cls_boxes), torch.from_numpy(cls_scores),\n",
    "                cfg.TEST.NMS).numpy() if cls_dets.size > 0 else []\n",
    "            cls_dets = cls_dets[keep, :]\n",
    "\n",
    "            height, width, channel = img.shape\n",
    "            for r in range(len(cls_dets)):\n",
    "                # 画预测的框\n",
    "                left = int(max(cls_dets[r][0], 0))\n",
    "                top = int(max(cls_dets[r][1], 0))\n",
    "                right = int(min(cls_dets[r][2], width))\n",
    "                bottom = int(min(cls_dets[r][3], height))\n",
    "\n",
    "                cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 1)\n",
    "                text_size, baseline = cv2.getTextSize(str(cls_dets[r][4]), 1, 1, 1)\n",
    "                cv2.rectangle(img, (left, top - text_size[1] - (baseline * 2)), (left + text_size[0], top),\n",
    "                              (44, 44, 44), -1)\n",
    "                cv2.putText(img, str(cls_dets[r][4]), (left, top - baseline), 1,\n",
    "                            1, (255, 255, 255), 1)\n",
    "\n",
    "        ax = plt.subplot(1, 1, 1)  # 获取当前需要处理的子图\n",
    "        show_image = img.astype(np.int32, copy=False)\n",
    "        ax.imshow(show_image, cmap=\"binary\")\n",
    "        ax.set_xticks([])\n",
    "        ax.set_yticks([])\n",
    "        plt.show()\n",
    "\n",
    "        # 文件保存\n",
    "        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)\n",
    "        cv2.imwrite(os.path.join(image_output, '{0:0>6}'.format(i)+ \".jpg\"), img)\n",
    "\n",
    "if __name__ == '__main__':\n",
    "#     os.environ['CUDA_VISIBLE_DEVICES'] = '0'\n",
    "    inference()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"11\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}