网络状态读取(一)

知乎上有个帖子发表了可以用安卓扣扣查询某人的出行及作息规律,仿照其思路实现了这个功能。

基本思路是:首先用软件将扣扣界面截图,然后将目的区域进行状态的识别。这里需要用到机器学习的思路,先制作一个状态识别的训练库,然后将每一次的截图信息用训练好的状态分类器进行单次分类,然后将时间和状态信息输出到文本文件。

1. 状态训练库制作

程序是用matlab编写的,首先手动截图(扣扣登陆下ctrl+alt+a)目的区域,得到大量状态图片库,为了让matlab能统一进行处理,需要在PS中将每个图片大小和格式改为一致,示例中为[30,30]像素的png图片:


图一 状态训练库

训练图片库命名为Trainingdatas,这里单张图片名称可以乱写无所谓,因为做成训练库需要建立子文件夹,把类别相同的图片放到一起,子文件夹的名称就是分类名,像这样:

图二 制作好的状态训练库

在这里,也将测试阶段的测试图做好一个库,所有待识别图片放到一个文件夹命名为Testsample即可。

2. 编写程序进行指定区域截图

分析的对象为了在电脑上实现,用了夜神安卓模拟器登陆手机扣扣作为数据来源。


图三 安卓模拟器状态数据来源

仿照网络上寻找到的matlab调用Java实现截图的方法编写了一个属于自己的截图函数TangJietu,该函数能在给定参数[w,h,x,y](宽,高,起点横坐标,起点纵坐标)下截取桌面指定区域的像素图片:

function I = TangJietu(w,h,x,y)

    %%调用java接口的截图函数,给定起点坐标和截图大小返回一个三维uint8数组图片数据

    % w和h为指定的截图宽度和高度!默认值为(1920,1080)

    % x和y为截图起点横、纵坐标!默认值为(1,1),一般可省略

    if nargin == 0

        x=1;y=1;w=1920;h=1080;       

    elseif nargin == 2

        x=1;y=1;

    elseif nargin == 4

    else

        print('Input error!!')

        return;

    end

    robot = java.awt.Robot();

    rectangle = java.awt.Rectangle();

    rectangle.x = x;  

    rectangle.y = y; 

    rectangle.width = w;

    rectangle.height = h; 

    w = image.getWidth(); 

    h = image.getHeight();

    raster = image.getData();

    I = zeros(w*h*3,1);

    I = raster.getPixels(0,0,w,h,I);

    I = uint8(I);

    I1 = I(1:3:length(I));

    I1 = reshape(I1,w,h);

    I2 = I(2:3:length(I));

    I2 = reshape(I2,w,h);

    I3 = I(3:3:length(I));

    I3 = reshape(I3,w,h);

    I = uint8(zeros(w,h,3));

    I(1:w,1:h,1) = I1;

    I(1:w,1:h,2) = I2;

    I(1:w,1:h,3) = I3;

    I = imrotate(I,-90,'nearest');

    I = flipdim(I,2);

这里我不重点学习截图函数是怎么写好,因为是照搬别人的程序稍加修改得到的,这里截图坐标和大小的选择除了参考PS,还可以参考一个叫Colorpix的小软件估计坐标值。

然后下一步是写一个用于训练和分类的函数,这里是照搬了matlab参考页Object Detection and Recognition主题下的Digit Classification Using HOG Features示例写的一个函数Fenlei,作用是将文件夹下的训练库进行分类训练,返回测试库中给定图片的分类状态:

function classlabel = Fenlei()

% 将训练文件夹的数据训练分类,求测试文件夹里面数据的分类情况

% 这个函数写出来的目的就是为了实现单次测试,每次测试一个图片,返回一个分类值

syntheticDir  = fullfile('G:\Program\Run\Status\Trainingdatas');

handwrittenDir = fullfile('G:\Program\Run\Status\Testsample');

trainingSet = imageDatastore(syntheticDir,  'IncludeSubfolders', true, 'LabelSource', 'foldernames');

testSet    = imageDatastore(handwrittenDir, 'IncludeSubfolders', true, 'LabelSource', 'foldernames');

img = readimage(trainingSet, 1);

[hog_2x2, vis2x2] = extractHOGFeatures(img,'CellSize',[2 2]);

cellSize = [2 2];

hogFeatureSize = length(hog_2x2);

numImages = numel(trainingSet.Files);

trainingFeatures = zeros(numImages, hogFeatureSize, 'single');

for i = 1:numImages

    img = readimage(trainingSet, i);

    img = rgb2gray(img);

    img = imbinarize(img);

    trainingFeatures(i, :) = extractHOGFeatures(img, 'CellSize', cellSize);

end

trainingLabels = trainingSet.Labels;

classifier = fitcecoc(trainingFeatures, trainingLabels);

[testFeatures, testLabels] = helperExtractHOGFeaturesFromImageSet(testSet, hogFeatureSize, cellSize);

predictedLabels = predict(classifier, testFeatures);

confMat = confusionmat(testLabels, predictedLabels);

classlabel=sprintf('%s',predictedLabels );

这里示例中采用的将图片的HOG特征进行处理方法十分值得学习。需要注意的是matlab新版本出现的classifical属性,类似于array,输出十分麻烦。这里采用了sprintf将分类结果以string的格式作为函数的输出。接下来就是主体运行脚本Whosnetwork的编写了,主要考虑了每隔一段时间运行一次分类,并将结果规整化输出为txt文本数据:

% 获取某人所处网络状态

clear

clc

close all

tic

i=1;

while (i<1000)

    Status=TangJietu(30,30,1800,800);

    imshow(Status);

    imwrite(Status,'G:\Program\Run\Status\Testsample\status.jpg'); 

    new_Status=Fenlei();

    now_time=datestr(now, 'yyyymmddHHMMSS');

    datas=[now_time,'    ',new_Status]

    fid=fopen('G:\Program\Run\Status\Testsample\My_Output.txt','a'); 

    fprintf(fid,'%s;',now_time); 

    fprintf(fid,'%s\r\n',new_Status);

    std=fclose(fid); 

    i=i+1;

    pause(300);

end

toc

这里将文本数据规整化输出的内容十分值得记录,很多场合都需要使用。实际可以将循环周期自己设置,采样间隔自己设置,在调试过程中采取了while 1永真的做法,并且pause(0)实现实时观察输出结果,这个网络状态结果从某方面来讲就代替了用户的行为特征。这样就可以从txt输出文件看到网络状态数据了!实验完成!!


图四 状态数据输出文本结果

在这里数据的来源选择了周期性截图,数据的分析采用图片的特征识别SVM分类方法,有机器学习的内在思路在里面,关键是做成了一件事情。在生活节奏无比快的今天,在短期正反馈侵蚀着的今天,如何获取关键信息,如何分析数据的内涵就变得十分重要了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,208评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,502评论 3 405
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,496评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,176评论 1 302
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,185评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,630评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,992评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,973评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,510评论 1 325
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,546评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,659评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,250评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,990评论 3 340
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,421评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,569评论 1 277
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,238评论 3 382
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,732评论 2 366

推荐阅读更多精彩内容