source: internals/2016/aptoideimagesdetector/trunk/Source Code/analyse_app_training.py @ 16401

Last change on this file since 16401 was 16401, checked in by dferreira, 3 years ago

Analyse Images updated

File size: 7.2 KB
Line 
1# Diogo Ferreira, 2016
2# Aptoide
3# Script to train to analyse the percentage of explicitness of an app
4
5from __future__ import division
6import i2v
7import pickle
8import os
9import sqlite3
10import collections
11import glob
12import pickle
13from Illustration2Vector.illustration2vec_master.analyse_image import analyse_explicit
14from Text_categorization.Text_categorization import text_cat
15import random
16import nltk
17from datetime import datetime, time
18from nltk.metrics import precision, recall, f_measure
19from sklearn.naive_bayes import MultinomialNB, BernoulliNB
20from sklearn.linear_model import LogisticRegression, SGDClassifier
21from nltk.classify.scikitlearn import SklearnClassifier
22from sklearn.svm import SVC, LinearSVC, NuSVC
23from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
24from sklearn import tree
25
26
27number_testing = 500
28
29def analyse_app_train(illust2vec, app_info):
30       
31        def find_features(icon_list, scr_list, description_result):
32                features = {}
33                maximum = 0
34                flag = 0
35                safe = 0
36                if len(icon_list)==0:
37                        maximum = 0.5
38                        safe = 0.5
39                else:
40                        for icon in icon_list:
41                                for data in icon:
42                                        if data[0]=='explicit' and data[1]>maximum:
43                                                maximum = data[1]
44                                                flag = 1
45                                        if data[0]=='safe' and flag==1:
46                                                safe = data[1]
47                                                flag = 0
48                maximum_s = 0
49                flag = 0
50                safe_s = 0
51
52                if len(scr_list)==0:
53                        maximum_s = 0.5
54                        safe_s = 0.5
55                else:
56                        for scr in scr_list:
57                                for data in scr:
58                                        if data[0]=='explicit' and data[1]>maximum_s:
59                                                maximum_s = data[1]
60                                                flag = 1
61                                        if data[0]=='safe' and flag==1:
62                                                safe_s = data[1]
63                                                flag = 0
64
65                features['ic_exp'] = maximum
66                features['ic_non'] = safe
67                features['sc_exp'] = maximum_s
68                features['sc_non'] = safe_s
69                features['desc_exp'] = description_result.prob('exp')
70                return features
71
72        featuresets = []
73        for info in app_info:
74                icons_l = []
75                screens = []
76                for icon in info[0]:
77                        icons_l.append(analyse_explicit(illust2vec, icon))
78
79                for scr in info[1]:
80                        screens.append(analyse_explicit(illust2vec, scr))
81
82
83                desc = text_cat(info[2])
84
85                features = find_features(icons_l, screens, desc)
86                featuresets.append((features, info[3]))
87
88        random.shuffle(featuresets)
89       
90        training_set = featuresets[:number_testing]
91        testing_set = featuresets[number_testing:]
92
93        def results(classifier, testing_set, training_set):
94                now = datetime.now()
95                classifier = classifier.train(training_set)
96                refsets = collections.defaultdict(set)
97                testsets = collections.defaultdict(set)
98
99                tp=0
100                fp=0
101                tn=0
102                fn=0
103
104                for i, (features, label) in enumerate(testing_set):
105                        refsets[label].add(i)
106                        observed = classifier.classify(features)
107                        testsets[observed].add(i)
108                        if label =='exp' and observed =='exp':
109                                tp += 1
110                        elif label=='non' and observed=='non':
111                                tn += 1
112                        elif label=='exp' and observed=='non':
113                                fn += 1
114                        else:
115                                fp += 1
116
117                print "Time training: " + str(datetime.now()-now)
118                print "True Positives: " + str(tp)
119                print "False Positives: " + str(fp)
120                print "True Negatives: " + str(tn)
121                print "False Negatives: " + str(fn)
122                print 'Explicit Precision: ', precision(refsets['exp'], testsets['exp'])
123                print 'Explicit recall: ', recall(refsets['exp'], testsets['exp'])
124                print 'Explicit F-Score: ', f_measure(refsets['exp'], testsets['exp'])
125                print 'Non-Explicit Precision: ', precision(refsets['non'], testsets['non'])
126                print 'Non-Explicit Recall: ', recall(refsets['non'], testsets['non'])
127                print 'Non-Explicit F-Score: ', f_measure(refsets['non'], testsets['non'])
128
129                print "Accuracy percent: ", (nltk.classify.accuracy(classifier, testing_set))*100
130                return classifier
131
132        print "\n****** NAIVE BAYES ************"
133        results(nltk.NaiveBayesClassifier, testing_set, training_set)
134        print "\n****** Random Forest ************"
135        results(SklearnClassifier(RandomForestClassifier()), testing_set, training_set)
136        print "\n****** ADA BOOST ************"
137        results(SklearnClassifier(AdaBoostClassifier()), testing_set, training_set)
138        print "\n****** MULTINOMIAL ************"
139        results(SklearnClassifier(MultinomialNB()), testing_set, training_set)
140        print "\n****** DECISION TREE ************"
141        results(SklearnClassifier(tree.DecisionTreeClassifier()), testing_set, training_set)
142        print "\n****** BERNOULLI ************"
143        results(SklearnClassifier(BernoulliNB()), testing_set, training_set)
144        print "\n****** LOGISTIC REGRESSION ************"
145        saving_model = results(SklearnClassifier(LogisticRegression()), testing_set, training_set)
146        print "\n****** SGD CLASSIFIER ************"
147        results(SklearnClassifier(SGDClassifier()), testing_set, training_set)
148        print "\n****** SVC ************"
149        results(SklearnClassifier(SVC()), testing_set, training_set)
150        print "\n****** LINEAR SVC ************"
151        results(SklearnClassifier(LinearSVC()), testing_set, training_set)
152
153        save_model = open("./model_apps_info.pickle", "wb")
154        pickle.dump(saving_model, save_model)
155        save_model.close()
156
157
158if __name__=='__main__':
159
160        try:
161                illust2vec_f = open("Illustration2Vector/illustration2vec_master/illust2vec.pickle", "rb")
162                illust2vec = pickle.load(illust2vec_f)
163                illust2vec_f.close()
164        except IOError:
165                illust2vec = i2v.make_i2v_with_chainer(
166            "Illustration2Vector/illustration2vec-master/illust2vec_tag_ver200.caffemodel", "Illustration2Vector/illustration2vec-master/tag_list.json")
167                save_model = open("Illustration2Vector/illustration2vec_master/illust2vec.pickle", "wb")
168                pickle.dump(illust2vec, save_model)
169                save_model.close()
170
171        icons = []
172        screenshots = []
173        description = ""
174
175        db = sqlite3.connect('./API to download database/app_info_non_explicit.db')
176        c = db.cursor()
177
178        db2 = sqlite3.connect('./API to download database/app_info_explicit.db')
179        c2 = db2.cursor()
180
181        explicit_content = []
182        non_explicit_content = []
183        exp_size = 0
184        non_size = 0
185
186        c2.execute(''' SELECT id,description FROM app_data WHERE majority=1 ''')
187
188        for d in c2.fetchall():
189                explicit_content.append(d)
190                exp_size+=1
191
192        c.execute(''' SELECT id,description FROM app_data WHERE majority=1''')
193
194        for d in c.fetchall():
195                explicit_content.append(d)
196                exp_size += 1
197
198        c.execute(''' SELECT id,description FROM app_data WHERE majority=0''')
199
200        for d in c.fetchall():
201                non_explicit_content.append(d)
202                non_size += 1
203
204
205        c2.execute(''' SELECT id,description FROM app_data WHERE majority=0 ''')
206
207        for d in c2.fetchall():
208                non_explicit_content.append(d)
209                non_size += 1
210
211        db.close()
212        db2.close()
213
214        print "Non-Explicit Size: "+str(non_size)
215        print "Explicit Size: "+str(exp_size)
216
217        def get_images_list(id_int):
218
219                icons = []
220                scr = []
221
222                os.chdir("./API to download database/images/screenshots")
223                types = [".jpg", ".png"]
224                for type_image in types:
225                        for image in glob.glob(str(id_int)+"*"+type_image):
226                            scr.append("./API to download database/images/screenshots/"+image)
227
228                os.chdir("../icon")
229                types = [".jpg", ".png"]
230                for type_image in types:
231                        for image in glob.glob(str(id_int)+"*"+type_image):
232                                icons.append("./API to download database/images/icon/"+image)
233                os.chdir("../../..")
234
235                return icons, scr
236
237        app_info = []
238
239        for d in explicit_content:
240                icons, screenshots = get_images_list(d[0])
241                description = d[1]
242                app_info.append((icons, screenshots, description, 'exp'))
243
244        for d in non_explicit_content:
245                icons, screenshots = get_images_list(d[0])
246                description = d[1]
247                app_info.append((icons, screenshots, description, 'non'))
248
249        analyse_app_train(illust2vec, app_info)
250
Note: See TracBrowser for help on using the repository browser.