From 854bba32bcd8993452bf255317f771f08f1eb494 Mon Sep 17 00:00:00 2001 From: "Jake W. Ireland" Date: Wed, 9 Sep 2020 08:47:31 +1200 Subject: [PATCH] Added a tentative scoring of faces using classifiers (a step towards #7; closes #22) --- Manifest.toml | 69 +++++++++++++++++++++++++ Project.toml | 2 + examples/scores.jl | 79 ++++++++++++----------------- figs/scores-1st-elif-nocount.pdf | Bin 0 -> 35387 bytes figs/scores.pdf | Bin 35547 -> 34639 bytes figs/scores.pdf.sb-ace87edf-N9ZSHk | Bin 0 -> 2837 bytes 6 files changed, 104 insertions(+), 46 deletions(-) create mode 100644 figs/scores-1st-elif-nocount.pdf create mode 100644 figs/scores.pdf.sb-ace87edf-N9ZSHk diff --git a/Manifest.toml b/Manifest.toml index 9f5f30c64..045693283 100644 --- a/Manifest.toml +++ b/Manifest.toml @@ -92,6 +92,11 @@ git-tree-sha1 = "f465c8fb261367b2b6b01f9f30357df6bd658460" uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" version = "0.10.2" +[[Combinatorics]] +git-tree-sha1 = "08c8b6831dc00bfea825826be0bc8336fc369860" +uuid = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" +version = "1.0.2" + [[CommonSubexpressions]] deps = ["MacroTools", "Test"] git-tree-sha1 = "7b8a93dba8af7e3b42fecabf646260105ac373f7" @@ -110,6 +115,12 @@ git-tree-sha1 = "7c4f882c41faa72118841185afc58a2eb00ef612" uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" version = "0.3.3+0" +[[Compose]] +deps = ["Base64", "Colors", "DataStructures", "Dates", "IterTools", "JSON", "LinearAlgebra", "Measures", "Printf", "Random", "Requires", "UUIDs"] +git-tree-sha1 = "034174e607d254b8ca0853a1a9029b265114bf6c" +uuid = "a81c6b42-2e10-5240-aca2-a61377ecd94b" +version = "0.8.2" + [[ComputationalResources]] git-tree-sha1 = "52cb3ec90e8a8bea0e62e275ba577ad0f74821f7" uuid = "ed09eef8-17a6-5b46-8889-db040fac31e3" @@ -127,6 +138,12 @@ git-tree-sha1 = "71333ea3f841bca6c1aa2863f11758eb9b37bfbc" uuid = "150eb455-5306-5404-9cee-2592286d6298" version = "0.5.1" +[[CoupledFields]] +deps = ["LinearAlgebra", "Statistics", "StatsBase"] +git-tree-sha1 = "6c9671364c68c1158ac2524ac881536195b7e7bc" +uuid = "7ad07ef1-bdf2-5661-9d2b-286fd4296dac" +version = "0.2.0" + [[CustomUnitRanges]] git-tree-sha1 = "0d42a23be3acfb3c58569b28ed3ab8bd67af5ced" uuid = "dc8bdbbb-1ca9-579f-8c36-e416f6a65cce" @@ -196,6 +213,12 @@ git-tree-sha1 = "9c41285c57c6e0d73a21ed4b65f6eec34805f937" uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" version = "0.23.8" +[[DocStringExtensions]] +deps = ["LibGit2", "Markdown", "Pkg", "Test"] +git-tree-sha1 = "50ddf44c53698f5e784bbebb3f4b21c5807401b1" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.3" + [[EllipsisNotation]] git-tree-sha1 = "65dad386e877850e6fce4fc77f60fe75a468ce9d" uuid = "da5c29d0-fa7d-589e-88eb-ea29b0a81949" @@ -282,6 +305,12 @@ git-tree-sha1 = "7ea6f715b7caa10d7ee16f1cfcd12f3ccc74116a" uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" version = "0.48.0" +[[Gadfly]] +deps = ["Base64", "CategoricalArrays", "Colors", "Compose", "Contour", "CoupledFields", "DataStructures", "Dates", "Distributions", "DocStringExtensions", "Hexagons", "IndirectArrays", "IterTools", "JSON", "Juno", "KernelDensity", "LinearAlgebra", "Loess", "Measures", "Printf", "REPL", "Random", "Requires", "Showoff", "Statistics"] +git-tree-sha1 = "3d6d5025e08ce535c90979303ec6ab103c8a09b9" +uuid = "c91e804a-d5a3-530f-b6f0-dfbca275c004" +version = "1.3.0" + [[GeometryTypes]] deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "StaticArrays"] git-tree-sha1 = "34bfa994967e893ab2f17b864eec221b3521ba4d" @@ -294,6 +323,18 @@ git-tree-sha1 = "45d684ead5b65c043ad46bd5be750d61c39d7ef8" uuid = "a2bd30eb-e257-5431-a919-1863eab51364" version = "1.0.2" +[[Hexagons]] +deps = ["Test"] +git-tree-sha1 = "de4a6f9e7c4710ced6838ca906f81905f7385fd6" +uuid = "a1b4810d-1bce-5fbd-ac56-80944d57a21f" +version = "0.2.0" + +[[HypothesisTests]] +deps = ["Combinatorics", "Distributions", "LinearAlgebra", "Random", "Rmath", "Roots", "Statistics", "StatsBase"] +git-tree-sha1 = "be162cf7f657ec92ca02010c82f6323c4dbd2d14" +uuid = "09f84164-cd44-5f33-b23f-e6b0d136a0d5" +version = "0.10.0" + [[IdentityRanges]] deps = ["OffsetArrays"] git-tree-sha1 = "be8fcd695c4da16a1d6d0cd213cb88090a150e3b" @@ -427,6 +468,12 @@ git-tree-sha1 = "b34d7cef7b337321e97d22242c3c2b91f476748e" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" version = "0.21.0" +[[Juno]] +deps = ["Base64", "Logging", "Media", "Profile"] +git-tree-sha1 = "90976c3ab792a98d240d42f9df07420ccfc60668" +uuid = "e5e0dc1b-0480-54bc-9374-aad01c23163d" +version = "0.8.3" + [[KernelDensity]] deps = ["Distributions", "FFTW", "Interpolations", "Optim", "StatsBase", "Test"] git-tree-sha1 = "c1048817fe5711f699abc8fabd47b1ac6ba4db04" @@ -462,6 +509,12 @@ version = "7.1.0" deps = ["Libdl"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +[[Loess]] +deps = ["Distances", "Statistics"] +git-tree-sha1 = "67b1bc5f42144fb83b065b8a8e117e56ec10e601" +uuid = "4345ca2d-374a-55d4-8d30-97f9976e7612" +version = "0.5.1" + [[Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" @@ -491,6 +544,12 @@ git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" version = "0.3.1" +[[Media]] +deps = ["MacroTools", "Test"] +git-tree-sha1 = "75a54abd10709c01f1b86b84ec225d26e840ed58" +uuid = "e89f7d12-3494-54d1-8411-f7d8b9ae1f27" +version = "0.5.0" + [[Missings]] deps = ["DataAPI"] git-tree-sha1 = "de0a5ce9e5289f27df672ffabef4d1e5861247d5" @@ -654,6 +713,10 @@ version = "0.2.3" deps = ["Unicode"] uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +[[Profile]] +deps = ["Printf"] +uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" + [[ProgressMeter]] deps = ["Distributed", "Printf"] git-tree-sha1 = "3e1784c27847bba115815d4d4e668b99873985e5" @@ -719,6 +782,12 @@ git-tree-sha1 = "d76185aa1f421306dec73c057aa384bad74188f0" uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" version = "0.2.2+1" +[[Roots]] +deps = ["Printf"] +git-tree-sha1 = "1211c7c1928c1ed29cdcef65979b7a791e3b9fbe" +uuid = "f2b01f46-fcfa-551c-844a-d8ac1e96c665" +version = "1.0.5" + [[Rotations]] deps = ["LinearAlgebra", "StaticArrays", "Statistics"] git-tree-sha1 = "d5f83867093db7319a9366d55f29280ecae9bcda" diff --git a/Project.toml b/Project.toml index 32f813230..feb3ea163 100644 --- a/Project.toml +++ b/Project.toml @@ -2,6 +2,8 @@ CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" +Gadfly = "c91e804a-d5a3-530f-b6f0-dfbca275c004" +HypothesisTests = "09f84164-cd44-5f33-b23f-e6b0d136a0d5" ImageDraw = "4381153b-2b60-58ae-a1ba-fd683676385f" ImageIO = "82e4d734-157c-48bb-816b-45c225c6df19" Images = "916415d5-f1e6-5110-898d-aaa5f9f070e0" diff --git a/examples/scores.jl b/examples/scores.jl index 6d6361bbc..f074c23b9 100755 --- a/examples/scores.jl +++ b/examples/scores.jl @@ -10,9 +10,10 @@ include(joinpath(dirname(dirname(@__FILE__)), "src", "FaceDetection.jl")) using .FaceDetection using Images: imresize -using StatsPlots#, Plots # StatsPlots required for box plots +using StatsPlots # StatsPlots required for box plots # plot boxplot @layout :origin savefig using CSV: write using DataFrames: DataFrame +using HypothesisTests: UnequalVarianceTTest function main(smartChooseFeats::Bool=false, alt::Bool=false) @@ -70,70 +71,56 @@ function main(smartChooseFeats::Bool=false, alt::Bool=false) nonFacesTesting = FaceDetection.loadImages(negTestingPath) nonFacesIITesting = map(i -> imresize(i, (19,19)), map(FaceDetection.toIntegralImage, nonFacesTesting)) println("...done. ", length(nonFacesTesting), " non-faces loaded.\n") - - FaceDetection.notifyUser("Testing selected classifiers...") - correctFaces = 0 - correctNonFaces = 0 - correctFaces = sum(FaceDetection.ensembleVoteAll(facesIITesting, classifiers)) - correctNonFaces = length(nonFacesTesting) - sum(FaceDetection.ensembleVoteAll(nonFacesIITesting, classifiers)) - correctFacesPercent = (float(correctFaces) / length(facesTesting)) * 100 - correctNonFacesPercent = (float(correctNonFaces) / length(nonFacesTesting)) * 100 - - println("...done.\n") notifyUser("Calculating test face scores and constructing dataset...") - dfFaces = Matrix{Union{Float64, Missing}}(undef, length(facesIITesting), 1) - dfNonFaces = Matrix{Union{Float64, Missing}}(undef, length(nonFacesIITesting), 1) - dfFaces[1:length(facesIITesting)] .= [sum([FaceDetection.getFaceness(c,face) for c in classifiers]) for face in facesIITesting] - dfNonFaces[1:length(nonFacesIITesting)] .= [sum([FaceDetection.getFaceness(c,nonFace) for c in classifiers]) for nonFace in nonFacesIITesting] + # get scores + # facesScores = Matrix{Float64}(undef, length(facesIITesting), 1) + # nonFacesScores = Matrix{Float64}(undef, length(nonFacesIITesting), 1) + facesScores = zeros(length(facesIITesting)) + nonFacesScores = zeros(length(nonFacesIITesting)) + facesScores[1:length(facesScores)] .= [sum([FaceDetection.getFaceness(c,face) for c in classifiers]) for face in facesIITesting] + nonFacesScores[1:length(nonFacesScores)] .= [sum([FaceDetection.getFaceness(c,nonFace) for c in classifiers]) for nonFace in nonFacesIITesting] - # displaymatrix(dfFaces) - # displaymatrix(dfNonFaces) + # filling in the dataset with missing to easily write to csv + dfFaces = facesScores + dfNonFaces = nonFacesScores + if length(facesScores) < length(nonFacesScores) + dfFaces = vcat(dfFaces, Matrix{Union{Float64, Missing}}(undef, length(nonFacesIITesting) - length(facesIITesting), 1)) + elseif length(facesScores) > length(nonFacesScores) + dfNonFaces = vcat(dfNonFaces, Matrix{Union{Float64, Missing}}(undef, length(facesIITesting) - length(nonFacesIITesting), 1)) + end + + # write score data + write(joinpath(homedir(), "Desktop", "facelikeness-data.csv"), DataFrame(hcat(dfFaces, dfNonFaces)), writeheader=false) println("...done.\n") + notifyUser("Computing differences in scores between faces and non-faces...") + + welch_t = UnequalVarianceTTest(facesScores, nonFacesScores) + + println("...done. $welch_t\n") + notifyUser("Constructing box plot with said dataset...") + gr() # set plot backend theme(:solarized) - plot = boxplot(["" ""],# titles? - dfFaces, dfNonFaces, + plot = StatsPlots.plot( + StatsPlots.boxplot(facesScores, xaxis=false) + StatsPlots.boxplot(nonFacesScores, xaxis=false), title = ["Scores of Faces" "Scores of Non-Faces"], label = ["faces" "non-faces"], fontfamily = font("Times"), layout = @layout([a b]), # fillcolor = [:blue, :orange], link = :y, - framestyle = [:origin :origin] + # framestyle = [:origin :origin] ) - - plot( - boxplot(dfFaces, - title = "Scores of Faces", - label = "faces", - fontfamily = font("Times"), - # fillcolor = [:blue, :orange], - link = :y, - framestyle = [:origin :origin] - ) - boxplot(dfNonFaces, - title = "Scores of Non-Faces", - label = non-faces", - fontfamily = font("Times"), - framestyle = [:origin :origin] - ) - ) - - if length(dfFaces) < length(dfNonFaces) # filling in the dataset - dfFaces = vcat(dfFaces, Matrix{Union{Float64, Missing}}(undef, length(nonFacesIITesting) - length(facesIITesting), 1)) - elseif length(dfFaces) > length(dfNonFaces) - dfNonFaces = vcat(dfNonFaces, Matrix{Union{Float64, Missing}}(undef, length(facesIITesting) - length(nonFacesIITesting), 1)) - end - - write(joinpath(homedir(), "Desktop", "facelikeness-data.csv"), DataFrame(hcat(dfFaces, dfNonFaces)), writeheader=false) - savefig(plot, joinpath(dirname(dirname(@__FILE__)), "figs", "scores.pdf")) + # save plot + StatsPlots.savefig(plot, joinpath(dirname(dirname(@__FILE__)), "figs", "scores.pdf")) println("...done. Plot created at ", joinpath(dirname(dirname(@__FILE__)), "figs", "scores.pdf"), "\n") diff --git a/figs/scores-1st-elif-nocount.pdf b/figs/scores-1st-elif-nocount.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7d38e28486b3c50f1821fd2c0fdee55e3465df01 GIT binary patch literal 35387 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 diff --git a/figs/scores.pdf.sb-ace87edf-N9ZSHk b/figs/scores.pdf.sb-ace87edf-N9ZSHk new file mode 100644 index 0000000000000000000000000000000000000000..d3820eb1da7186b33b1d958a39e745c75fa75843 GIT binary patch literal 2837 zcmZWrc_5Ve8*j6caU|{r>Yl&-e3up6B_zf4mE;Haq2?zrz8jwSWARx()$Bg){gHyyQ5P+HyXoO%gkxM`zf>c143vhry?Luk6 z0VHmW+=%}n;Kf@b{zb3_<<3YBCD8!bckOs=|Bv42vIT`hpjH8XRKNqp>*D!cq270e z)*y*UI|0BE5GXbvm{>QpuqdU+&Tv3;@NFxi{PwE;-a9oM!1r<0;SkGM0`A)CR=N1b`iY8R)~1 z1_%J^OZYD0Rq=3t1K}G0IFF8ZXHTGU7a{TZc%hq}Pax>a>&FXu85__qfM7}v2RvZh z;n6S{pbLX}@`NMNxHD4$G*2=fbo0yd;;kLG6f-~?Y-t8~K(WEx4gQjBL+VX&!n0?y zI&SQ>5WDo@t3>Fe{R9&e%Yq4r#tUHwFYo98M9S^HRQl<7*1k~i{lW9z#2gu+#66UE z4mY!Mvi7d8%{pYu(NIThBdo|!W9uew=Gl)Dl-!Xo5wV%j(jLosrcHEXePcr%T^1@g z4hDTG9R3h8J3v10y3{Dk^H+^5-=(A%(i~{@P|=ljdd^bEG`nH!IqY$pbDY3Ey79Vh z{X6Mo5PF_#fQw1XllA_Bc0F8n?tMnehpWamH(pgKMo_aMQe<9W{fBs?Q?Td8fsO+;| zc!(mdbvW^5iwyxcGa4y3Z0J*adp7XxI}+c`>RXfUD+Y!~GI!2V!%}sVUQV&q12pS9 zhkowu>sBF>QnZcVDDqpH6nB|e((_YnkH03m-jT4cahgs&u-|*?h}L<_v_sD%@(t|X z^J)If+>ZjQn-K$L2jQ&J!no4iNkP5zGtt=c2b%m8RbhE0iZ$ci=~+u0Ml9!zoQGq% zD+l923khov{KHL)zqhpFu-3LAQJm&bS)VvV`0Zsrwc?@a02EJD;5*L3nU;h%D7Q^Q|wcEcP_Mlo) z!SFZJ^L<54E;0?*qLHKGT_M%Z>v{QscuUr;pD13pyNR-*Sn(_3BnfRFRd`>4r(Y`x zEc=6`MvPzBo%mUBaA*A*Le|eF#mC`+YN8vYXA($^G(IVf+0ncBu#DrgqDDiP*SaUD)=@CH%tf z&OgUmMV$wUx$G!L6+KF=JTFDjeYN5o_1Z0Yql0dNkB?FyT5MY9-3JEsqE_6EAeZTsbF_n0hl zxj zP~)>}YOHPbu$aKb$6_hD@~6hM24|!ax4U*lP8@%rYbzCuB-B^0Co^)?oyhT}1<=UI z0_e1nlOd)e|C7yQNkNGM&LM>nE2+4npS?Q>$Z}c z-8*RQr%!bgwZaiHrRLw)UKC`gX>5O;Ug&iF%&DFwY~_`s$(9~Ta0eq+?ejaaX{~bjLlfe=ecb$0D{bO5-M>MfCTB*jA&m6H})uDGVvZwD( z(=%4W%Ga1)#U`DOXEC@aEq-+w&&k>tm5!KB_D74#h1|RDGIA#>Eq>S;rp-5u6}W0) zb==LVZ^W(hi`(j_&kKusr!CI5MzyZNII87#hnuM;*YS$(g6)rzc0<21T1++FmlD!z zCPLiMCdov$i;2Synun131V0yCvxkZ4k z)v~ty5&XP1=ke{4sL|P?#u=?2!WP|M3s$W4g{_=xd-VSLvdBoI1?SKE;>>G8-g@M5 zh0kYgca2>6FrTte+h{!h<`C1xhmAQy^sgOLoHC>?nnKYXnaoc?ctL5Ack|M#N>Z1e zg!sgjUl8(s$`p+lf1&(x#N0f#u_CK7w$p_} z3L>rfrDaTRl)%AypFF(q%1V4np$k*%?!|teUO^RfU3(OIG`auS>P$9F9ean(D1Us+ z=zi_Pa|;bS*cmWyP1dwivQ*V_T4!cf_(%wUioW4FJ-=!qOV4~@!ODwtAUB$lNo|&A z<6PvLuBE+oZJZB1HMt^MrcIZ;KG=eij+njh)`&U@US!%I(`y_|=U=>}g`NNX(|uyv z)cm&{R7bg<@2tz_-#wfH`a@uV{-(p>*&G0kLLpIrKk#=B&hAIFa5&en{X3_p z|DPNJ!8Jku!XZ%x|H+~Bxz6lgID|gew{GQV6hc5SNZGKkjscM%cVwsonM?zC&Xa2_ f@g#pT!1K8q-i1mdP-q*wA