source: internals/2016/aptoideimagesdetector/trunk/explicit_content_detector/API/Explicit_detector/analyse_app_tests.py @ 16448

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

File organization totally changed

File size: 9.0 KB
Line 
1# Diogo Daniel Soares Ferreira,
2# diogodanielsoaresferreira@ua.pt
3# Aptoide, 2016
4
5# Script to train to analyse the percentage of explicitness of an app
6
7from __future__ import division
8import i2v
9import pickle
10import os
11import sqlite3
12import collections
13import glob
14import pickle
15from Illustration2Vector.illustration2vec_master.analyse_image import analyse_explicit
16from Text_categorization.Text_categorization import text_cat
17import random
18import nltk
19from datetime import datetime, time
20from nltk.metrics import precision, recall, f_measure
21from sklearn.naive_bayes import MultinomialNB, BernoulliNB
22from sklearn.linear_model import LogisticRegression, SGDClassifier, Ridge, Lasso, ElasticNet, SGDRegressor
23from nltk.classify.scikitlearn import SklearnClassifier
24from sklearn.svm import SVC, LinearSVC, NuSVC
25from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier, ExtraTreesClassifier
26from sklearn import tree
27
28# Number of features to test the classifier. The number left is for training.
29number_testing = 1000
30
31def analyse_app_train(illust2vec, app_info):
32       
33        def find_features(icon_list, scr_list, description_result):
34                features = {}
35                maximum = 0
36                flag = 0
37                safe = 0
38
39                # Find maximum percentage of explicitness and its safetiness percentage.
40
41                if len(icon_list)==0:
42                        maximum = 0.5
43                        safe = 0.5
44                else:
45                        for icon in icon_list:
46                                for data in icon:
47                                        if data[0]=='explicit' and data[1]>maximum:
48                                                maximum = data[1]
49                                                flag = 1
50                                        if data[0]=='safe' and flag==1:
51                                                safe = data[1]
52                                                flag = 0
53                maximum_s = 0
54                flag = 0
55                safe_s = 0
56
57                if len(scr_list)==0:
58                        maximum_s = 0.5
59                        safe_s = 0.5
60                else:
61                        for scr in scr_list:
62                                for data in scr:
63                                        if data[0]=='explicit' and data[1]>maximum_s:
64                                                maximum_s = data[1]
65                                                flag = 1
66                                        if data[0]=='safe' and flag==1:
67                                                safe_s = data[1]
68                                                flag = 0
69
70                features['ic_exp'] = maximum
71                features['ic_non'] = safe
72                features['sc_exp'] = maximum_s
73                features['sc_non'] = safe_s
74                features['desc_exp'] = description_result.prob('exp')
75                return features
76
77        featuresets = []
78        try:
79                f = open("./featuresets.pickle", "rb")
80                featuresets = pickle.load(f)
81                f.close()
82                print "Open FeatureSets Pickle"
83        except IOError:
84                # It can take toooo much time (4000 apps database, +- 8 hours)
85                print "Did not Find FeatureSets Pickle"
86                num=0
87                # Building the featureset
88                for info in app_info:
89                        icons_l = []
90                        screens = []
91                        for icon in info[0]:
92                                try:
93                                        icons_l.append(analyse_explicit(illust2vec, icon))
94                                except:
95                                        print "Could not resize image"
96
97                        for scr in info[1]:
98                                try:
99                                        screens.append(analyse_explicit(illust2vec, scr))
100                                except:
101                                        print "Could not resize image"
102
103                        desc = text_cat(info[2], len(info[2]), info[3],info[4])
104                        num+=1
105                        if (num%100)==0:
106                                print num
107                        features = find_features(icons_l, screens, desc)
108                        featuresets.append((features, info[5]))
109
110                random.shuffle(featuresets)
111                save_model = open("./featuresets.pickle", "wb")
112                pickle.dump(featuresets, save_model)
113                save_model.close()
114       
115        training_set = featuresets[number_testing:]
116
117        testing_set = featuresets[:number_testing]
118
119        def results(classifier, testing_set, training_set):
120                now = datetime.now()
121                # Trains classifier
122                classifier = classifier.train(training_set)
123                refsets = collections.defaultdict(set)
124                testsets = collections.defaultdict(set)
125
126                tp=0
127                fp=0
128                tn=0
129                fn=0
130
131                # Gets positive/false positives/negatives
132                for i, (features, label) in enumerate(testing_set):
133                        refsets[label].add(i)
134                        observed = classifier.classify(features)
135                        testsets[observed].add(i)
136                        if label =='exp' and observed =='exp':
137                                tp += 1
138                        elif label=='non' and observed=='non':
139                                tn += 1
140                        elif label=='exp' and observed=='non':
141                                fn += 1
142                        else:
143                                fp += 1
144
145                print "Time training: " + str(datetime.now()-now)
146                print "True Positives: " + str(tp)
147                print "False Positives: " + str(fp)
148                print "True Negatives: " + str(tn)
149                print "False Negatives: " + str(fn)
150                print 'Explicit Precision: ', precision(refsets['exp'], testsets['exp'])
151                print 'Explicit recall: ', recall(refsets['exp'], testsets['exp'])
152                print 'Explicit F-Score: ', f_measure(refsets['exp'], testsets['exp'])
153                print 'Non-Explicit Precision: ', precision(refsets['non'], testsets['non'])
154                print 'Non-Explicit Recall: ', recall(refsets['non'], testsets['non'])
155                print 'Non-Explicit F-Score: ', f_measure(refsets['non'], testsets['non'])
156
157                print "Accuracy percent: ", (nltk.classify.accuracy(classifier, testing_set))*100
158                return classifier
159        # Tests with different classifiers
160        try:
161                print "\n****** SGD CLASSIFIER ************"
162                results(SklearnClassifier(SGDClassifier()), testing_set, training_set)
163        except:
164                pass
165       
166        try:
167                print "\n****** SGD Regressor ************"
168                results(SklearnClassifier(SGDRegressor()), testing_set, training_set)
169        except:
170                pass
171        try:
172                print "\n****** NAIVE BAYES ************"
173                results(nltk.NaiveBayesClassifier, testing_set, training_set)
174        except:
175                pass
176        try:
177                print "\n****** Random Forest ************"
178                results(SklearnClassifier(RandomForestClassifier()), testing_set, training_set)
179        except:
180                pass
181        try:
182                print "\n****** ADA BOOST ************"
183                results(SklearnClassifier(AdaBoostClassifier()), testing_set, training_set)
184        except:
185                pass
186        try:
187                print "\n****** MULTINOMIAL ************"
188                results(SklearnClassifier(MultinomialNB()), testing_set, training_set)
189        except:
190                pass
191        try:
192                print "\n****** DECISION TREE ************"
193                results(SklearnClassifier(tree.DecisionTreeClassifier()), testing_set, training_set)
194        except:
195                pass
196        try:
197                print "\n****** BERNOULLI ************"
198                results(SklearnClassifier(BernoulliNB()), testing_set, training_set)
199        except:
200                pass
201        try:
202                print "\n****** LOGISTIC REGRESSION ************"
203                saving_model = results(SklearnClassifier(LogisticRegression()), testing_set, training_set)
204        except:
205                pass
206        try:
207                print "\n****** SVC ************"
208                results(SklearnClassifier(SVC()), testing_set, training_set)
209        except:
210                pass
211        try:
212                print "\n****** LINEAR SVC ************"
213                results(SklearnClassifier(LinearSVC()), testing_set, training_set)
214        except:
215                pass
216        try:
217                print "\n****** NU SVC ************"
218                saving_model=results(SklearnClassifier(NuSVC(nu=0.1)), testing_set, training_set)
219        except:
220                pass
221        try:
222                print "\n****** Extra Trees ************"
223                results(SklearnClassifier(ExtraTreesClassifier()), testing_set, training_set)
224        except:
225                pass
226        try:
227                print "\n****** RIDGE ************"
228                results(SklearnClassifier(Ridge()), testing_set, training_set)
229        except:
230                pass
231        try:
232                print "\n****** LASSO ************"
233                results(SklearnClassifier(Lasso()), testing_set, training_set)
234        except:
235                pass
236        try:
237                print "\n****** ELASTIC NET **********"
238                results(SklearnClassifier(ElasticNet()), testing_set, training_set)
239        except:
240                pass
241
242
243if __name__=='__main__':
244
245        try:
246                # Tries to load the illustration2vec model
247                illust2vec_f = open("Illustration2Vector/illustration2vec_master/illust2vec.pickle", "rb")
248                illust2vec = pickle.load(illust2vec_f)
249                illust2vec_f.close()
250        except IOError:
251                illust2vec = i2v.make_i2v_with_chainer(
252            "Illustration2Vector/illustration2vec-master/illust2vec_tag_ver200.caffemodel", "Illustration2Vector/illustration2vec-master/tag_list.json")
253                save_model = open("Illustration2Vector/illustration2vec_master/illust2vec.pickle", "wb")
254                pickle.dump(illust2vec, save_model)
255                save_model.close()
256
257        icons = []
258        screenshots = []
259        description = ""
260        # Gets all the content from database
261        db = sqlite3.connect('./API to download database/app_info_big.db')
262        c = db.cursor()
263
264        explicit_content = []
265        non_explicit_content = []
266        exp_size = 0
267        non_size = 0
268
269
270        c.execute(''' SELECT title,id,description, category, age FROM app_data WHERE mature=1''')
271
272        for d in c.fetchall():
273                explicit_content.append(d)
274                exp_size += 1
275
276
277        c.execute(''' SELECT title,id,description, category, age FROM app_data WHERE mature=0''')
278
279        for d in c.fetchall():
280                non_explicit_content.append(d)
281                non_size += 1
282
283        db.close()
284
285
286        print "Non-Explicit Size: "+str(non_size)
287        print "Explicit Size: "+str(exp_size)
288
289
290        # Get images from an app id
291        def get_images_list(id_int):
292
293                icons = []
294                scr = []
295
296                os.chdir("./API to download database/Big_Database/images/screenshot")
297                types = [".jpg", ".png"]
298                for type_image in types:
299                        for image in glob.glob(str(id_int)+"*"+type_image):
300                            scr.append("./API to download database/Big_Database/images/screenshot/"+image)
301
302                os.chdir("../icon")
303                types = [".jpg", ".png"]
304                for type_image in types:
305                        for image in glob.glob(str(id_int)+"*"+type_image):
306                                icons.append("./API to download database/Big_Database/images/icon/"+image)
307                os.chdir("../../../..")
308
309                return icons, scr
310
311        app_info = []
312        print "Appending all images..."
313        now = datetime.now()
314        for d in explicit_content:
315                icons, screenshots = get_images_list(d[1])
316                description = d[2]
317                cat = d[3]
318                age = d[4]
319                app_info.append((icons, screenshots, description,cat,age,'exp'))
320
321        for d in non_explicit_content:
322                icons, screenshots = get_images_list(d[1])
323                description = d[2]
324                cat = d[3]
325                age = d[4]
326                app_info.append((icons, screenshots, description, cat, age,'non'))
327        print str(datetime.now()-now)
328        analyse_app_train(illust2vec, app_info)
329
Note: See TracBrowser for help on using the repository browser.