source: internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/Explicit_detector/analyse_app.py @ 16516

Last change on this file since 16516 was 16516, checked in by dferreira, 4 years ago

Changes made to icon analysing and local or web images

File size: 5.3 KB
Line 
1# Diogo Daniel Soares Ferreira
2# diogodanielsoaresferreira@ua.pt
3# Aptoide, 2016
4
5# Main function to analyse the percentage of explicitness of an app
6
7from __future__ import division
8import json
9import sqlite3
10import os
11import time
12import i2v
13import pickle
14from Illustration2Vector.illustration2vec_master.analyse_image import analyse_explicit
15from Text_categorization.Text_categorization import text_cat
16
17# Returns the illustration2vector model
18
19def get_model():
20        illust2vec = []
21
22        p = os.path.abspath(os.path.join("../", os.pardir))
23
24        with open(p+"/config.json") as json_data:
25                config = json.load(json_data)
26
27        try:
28                illust2vec_f = open(config['directories']['ill2vec_ser'], "rb")
29                illust2vec = pickle.load(illust2vec_f)
30                illust2vec_f.close()
31        except IOError:
32                illust2vec = i2v.make_i2v_with_chainer(config['directories']['ill2vec_model']
33            , config['directories']['ill2vec_tag_list'])
34                save_model = open(config['directories']['ill2vec_ser'], "wb")
35                pickle.dump(illust2vec, save_model)
36                save_model.close()
37        return illust2vec
38
39def analyse_app(app_id, app_md5, illust2vec, icons, screenshots, description, category, age, size, title):
40
41        p = os.path.abspath(os.path.join("../", os.pardir))
42        tb_id = 0
43        with open(p+"/config.json") as json_data:
44                config = json.load(json_data)
45
46        # Connect to database
47        db = sqlite3.connect(config['directories']['final_database'])
48        c = db.cursor()
49
50        # If id exists, app has already been processed.
51        # If exists, just return the value.
52        # Otherwise, create a new record in the table
53        c.execute(''' SELECT ID FROM app WHERE app_id=? ''',(int(app_id),))
54        res = c.fetchone()
55
56        if res:
57                c.execute(''' SELECT is_mature FROM final_results WHERE for_id=? ''',(res[0],))
58                res2 = c.fetchone()
59                if res2:
60                        db.close()
61                        return res2[0]
62                else:
63                        tb_id = res[0]
64        else:
65                c.execute(''' INSERT INTO app (app_id, app_md5) VALUES (?,?) ''',(app_id,app_md5,))
66                db.commit()
67                c.execute(''' SELECT ID FROM app WHERE app_id=? ''',(app_id,))
68                tb_id = c.fetchone()[0]
69
70
71        # Tries to load the model for text categorization
72        try:
73                f = open(config['directories']['text_cat_model'], "rb")
74                classifier = pickle.load(f)
75                f.close()
76        except:
77                print "Serialized objects not found"
78                exit(0)
79
80        icon_l = []
81        screens = []
82        for icon in icons:
83                # Check if has already been analysed.
84                # If it has, just append the previous result.
85                # If not, save the new result
86                c.execute(''' SELECT image_exp, image_safe FROM image_results WHERE url=?''',(icon,))
87                res = c.fetchone()
88                if res:
89                        icon_l.append(('explicit',res[0]), ('safe',res[1]))
90                else:
91                        res = analyse_explicit(illust2vec, icon)
92                        exp = False
93                        if res[0][1]>res[1][1]:
94                                exp = True
95                        c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), icon, res[0][1], res[1][1], exp, -1,  "icon",))
96                        db.commit()
97                        icon_l.append(res)
98
99        for scr in screenshots:
100                # Check if has already been analysed.
101                # If it has, just append the previous result.
102                # If not, save the new result
103                c.execute(''' SELECT image_exp, image_safe FROM image_results WHERE url=?''',(scr,))
104                res = c.fetchone()
105                if res:
106                        screens.append(('explicit',res[0][0]), ('safe',res[0][1]))
107                else:
108                        res = analyse_explicit(illust2vec, scr)
109                        exp = False
110                        if res[0][1]>res[1][1]:
111                                exp = True
112                        c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), scr, res[0][1], res[1][1], exp, -1,  "screenshot",))
113                        db.commit()
114                        screens.append(res)
115
116
117        # Check if has already been analysed.
118        # If it has, just use the previous result.
119        # If not, save the new result
120        c.execute(''' SELECT text_exp FROM text_results WHERE for_id=? ''',(int(tb_id),))
121        res = c.fetchone()
122        if res:
123                description = res[0]
124        else:
125                exp = False
126                description = text_cat(description, size, category, age)
127                if description.prob('exp')>0.5:
128                        exp = True
129                c.execute(''' INSERT INTO text_results VALUES (?,?,?,?) ''',(int(tb_id), description.prob('exp'), exp, -1,))
130                db.commit()
131
132        def find_features(icon_list, scr_list, description_result):
133                features = {}
134                maximum = 0
135                flag = 0
136                safe = 0
137
138                # Find maximum percentage of explicitness and its safetiness percentage.
139
140                if len(icon_list)==0:
141                        maximum = 0.5
142                        safe = 0.5
143                else:
144                        for icon in icon_list:
145                                for data in icon:
146                                        if data[0]=='explicit' and data[1]>maximum:
147                                                maximum = data[1]
148                                                flag = 1
149                                        if data[0]=='safe' and flag==1:
150                                                safe = data[1]
151                                                flag = 0
152                maximum_s = 0
153                flag = 0
154                safe_s = 0
155
156                if len(scr_list)==0:
157                        maximum_s = 0.5
158                        safe_s = 0.5
159                else:
160                        for scr in scr_list:
161                                for data in scr:
162                                        if data[0]=='explicit' and data[1]>maximum_s:
163                                                maximum_s = data[1]
164                                                flag = 1
165                                        if data[0]=='safe' and flag==1:
166                                                safe_s = data[1]
167                                                flag = 0
168
169                features['ic_exp'] = maximum
170                features['ic_non'] = safe
171                features['sc_exp'] = maximum_s
172                features['sc_non'] = safe_s
173                features['desc_exp'] = description_result.prob('exp')
174                return features
175        features = find_features(icon_l, screens, description)
176
177        # Save and close the database
178        c.execute(''' SELECT exp_per FROM final_results WHERE for_id=? ''', (int(tb_id),))
179        res = c.fetchone()
180        if res:
181                db.close()
182                return res[0]
183        else:
184                exp = False
185                res = classifier.prob_classify(features)
186                if res.prob('exp')>0.5:
187                        exp = True
188                c.execute(''' INSERT INTO final_results VALUES (?,?,?,?,?) ''', (int(tb_id), time.time(), res.prob('exp'),exp,-1,))
189                db.commit()
190                db.close()
191                return res
192
Note: See TracBrowser for help on using the repository browser.