添加一行
innerAudioContext.obeyMuteSwitch = false;
innerAudioContext.obeyMuteSwitch = false;
添加一行
innerAudioContext.obeyMuteSwitch = false;
innerAudioContext.obeyMuteSwitch = false;
很久没更博客了。。。
因为去创业了!创业干的事没多少技术含量。
无非是小程序,app一类的。没啥值得写的。
教育相关!给教育机构导流吧。
有想聊聊的朋友欢迎加微信:endpang
8.0之后的android 需要创建 channel 否则 notification 不显示。
final String CHANNEL_ID = "channel_id_1"; final String CHANNEL_NAME = "channel_name_1"; NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { //只在Android O之上需要渠道 NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH); //如果这里用IMPORTANCE_NOENE就需要在系统的设置里面开启渠道, //通知才能正常弹出 mNotificationManager.createNotificationChannel(notificationChannel); } NotificationCompat.Builder builder= new NotificationCompat.Builder(this,CHANNEL_ID); builder.setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("通知标题") .setContentText("通知内容") .setAutoCancel(true); mNotificationManager.notify(notificationId, builder.build());
github https://github.com/yu4u/age-gender-estimation
先试用下训练好的权重文件
将 demo.py 的80行改动了一下,用以识别图片
if 1==1: #for img in yield_images(): img = cv2.imread("test.jpg")
113行 改动用以保存结果
cv2.imwrite("test1.jpg",img) #cv2.imshow("result", img) #key = cv2.waitKey(30) #while true: # if key == 27: # break
效果还可以,等有空训练下再改成一个service。原权重的训练集基本都是老外。
另一个Tensorflow的实现:Age Gender Estimate TF 一个tensorflow 识别年龄的demo
整合进了颜值server
代码比较乱,凑活先用着吧,
全部代码请移步 Github https://github.com/endpang/xindong/blob/master/facerank/server.py
权重文件超过了 github100m的限制。大家去源地址下载吧。
https://github.com/yu4u/age-gender-estimation/releases/download/v0.5/weights.18-4.06.hdf5
__author__ = 'pangzhiwei' import cv2 import dlib import numpy as np import math import itertools from sklearn.externals import joblib from sklearn import decomposition import bottle from bottle import request import urllib.request import json from wide_resnet import WideResNet def facialRatio(points): x1 = points[0] y1 = points[1] x2 = points[2] y2 = points[3] x3 = points[4] y3 = points[5] x4 = points[6] y4 = points[7] dist1 = math.sqrt((x1-x2)**2 + (y1-y2)**2) dist2 = math.sqrt((x3-x4)**2 + (y3-y4)**2) ratio = dist1/dist2 return ratio def generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates): size = allLandmarkCoordinates.shape if len(size) > 1: allFeatures = np.zeros((size[0], len(pointIndices1))) for x in range(0, size[0]): landmarkCoordinates = allLandmarkCoordinates[x, :] ratios = [] for i in range(0, len(pointIndices1)): x1 = landmarkCoordinates[2*(pointIndices1[i]-1)] y1 = landmarkCoordinates[2*pointIndices1[i] - 1] x2 = landmarkCoordinates[2*(pointIndices2[i]-1)] y2 = landmarkCoordinates[2*pointIndices2[i] - 1] x3 = landmarkCoordinates[2*(pointIndices3[i]-1)] y3 = landmarkCoordinates[2*pointIndices3[i] - 1] x4 = landmarkCoordinates[2*(pointIndices4[i]-1)] y4 = landmarkCoordinates[2*pointIndices4[i] - 1] points = [x1, y1, x2, y2, x3, y3, x4, y4] ratios.append(facialRatio(points)) allFeatures[x, :] = np.asarray(ratios) else: allFeatures = np.zeros((1, len(pointIndices1))) landmarkCoordinates = allLandmarkCoordinates ratios = [] for i in range(0, len(pointIndices1)): x1 = landmarkCoordinates[2*(pointIndices1[i]-1)] y1 = landmarkCoordinates[2*pointIndices1[i] - 1] x2 = landmarkCoordinates[2*(pointIndices2[i]-1)] y2 = landmarkCoordinates[2*pointIndices2[i] - 1] x3 = landmarkCoordinates[2*(pointIndices3[i]-1)] y3 = landmarkCoordinates[2*pointIndices3[i] - 1] x4 = landmarkCoordinates[2*(pointIndices4[i]-1)] y4 = landmarkCoordinates[2*pointIndices4[i] - 1] points = [x1, y1, x2, y2, x3, y3, x4, y4] ratios.append(facialRatio(points)) allFeatures[0, :] = np.asarray(ratios) return allFeatures def generateAllFeatures(allLandmarkCoordinates): a = [18, 22, 23, 27, 37, 40, 43, 46, 28, 32, 34, 36, 5, 9, 13, 49, 55, 52, 58] combinations = itertools.combinations(a, 4) i = 0 pointIndices1 = [] pointIndices2 = [] pointIndices3 = [] pointIndices4 = [] for combination in combinations: pointIndices1.append(combination[0]) pointIndices2.append(combination[1]) pointIndices3.append(combination[2]) pointIndices4.append(combination[3]) i = i+1 pointIndices1.append(combination[0]) pointIndices2.append(combination[2]) pointIndices3.append(combination[1]) pointIndices4.append(combination[3]) i = i+1 pointIndices1.append(combination[0]) pointIndices2.append(combination[3]) pointIndices3.append(combination[1]) pointIndices4.append(combination[2]) i = i+1 return generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates) def fetch_face_pic(face,predictor): rects = detector(face, 1) img_h, img_w, _ = np.shape(face) faces = np.empty((len(rects), img_size, img_size, 3)) detected = rects img = face lables = [] if len(detected) > 0: for i, d in enumerate(detected): x1, y1, x2, y2, w, h = d.left(), d.top(), d.right() + 1, d.bottom() + 1, d.width(), d.height() xw1 = max(int(x1 - 0.4 * w), 0) yw1 = max(int(y1 - 0.4 * h), 0) xw2 = min(int(x2 + 0.4 * w), img_w - 1) yw2 = min(int(y2 + 0.4 * h), img_h - 1) cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2) # cv2.rectangle(img, (xw1, yw1), (xw2, yw2), (255, 0, 0), 2) faces[i, :, :, :] = cv2.resize(img[yw1:yw2 + 1, xw1:xw2 + 1, :], (img_size, img_size)) # predict ages and genders of the detected faces results = model.predict(faces) predicted_genders = results[0] ages = np.arange(0, 101).reshape(101, 1) predicted_ages = results[1].dot(ages).flatten() # draw results for i, d in enumerate(detected): label = [predicted_ages[i], "F" if predicted_genders[i][0] > 0.5 else "M"] #print(label) lables.append(label) #draw_label(img, (d.left(), d.top()), label) arrs = [] face_arr = [] for faces in range(len(rects)): # 使用predictor进行人脸关键点识别 #print(rects[faces]) landmarks = np.matrix([[p.x, p.y] for p in predictor(face, rects[faces]).parts()]) #face_img = face.copy() # 使用enumerate函数遍历序列中的元素以及它们的下标 arr = [] for idx, point in enumerate(landmarks): arr = np.append(arr,point[0,0]) arr = np.append(arr,point[0,1]) #strs += str(point[0, 0]) + ',' + str(point[0, 1]) + ',' #pos = (point[0, 0], point[0, 1]) #print(point) #f.write(str(point[0, 0])) #f.write(',') #f.write(str(point[0, 1])) #f.write(',') #f.write('\n') if len(arrs) == 0: arrs = [arr] else: arrs = np.concatenate((arrs,[arr]),axis=0) f = rects[faces] [x1,x2,y1,y2]=[f.left(),f.right(),f.top(),f.bottom()] a = [[x1,x2,y1,y2]] if len(face_arr) == 0: face_arr = a else: face_arr = np.concatenate((face_arr,a) ,axis=0) return arrs,face_arr,lables def predict(my_features): predictions = [] for i in range(len(my_features)): feature = my_features[i, :] feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer).tolist()) print(i) ''' if len(my_features.shape) > 1: for i in range(len(my_features)): feature = my_features[i, :] feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer)) print('照片中的人颜值得分依次为(满分为5分):') k = 1 for pre in predictions: print('第%d个人:' % k, end='') print(str(pre)+'分') k += 1 else: feature = my_features feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer)) print('照片中的人颜值得分为(满分为5分):') k = 1 for pre in predictions: print(str(pre)+'分') k += 1 ''' return predictions PREDICTOR_PATH = './model/shape_predictor_68_face_landmarks.dat' detector = dlib.get_frontal_face_detector() # 使用官方提供的模型构建特征提取器 predictor = dlib.shape_predictor(PREDICTOR_PATH) pre_model = joblib.load('./model/face_rating.pkl') features = np.loadtxt('./data/features_ALL.txt', delimiter=',') pca = decomposition.PCA(n_components=20) pca.fit(features) weight_file = "./model/weights.18-4.06.hdf5" img_size = 64 model = WideResNet(img_size, depth=16, k=8)() model.load_weights(weight_file) @bottle.route('/find', method='GET') def do_find(): w = request.query.get("url") #print(w) resp = urllib.request.urlopen(w) image = np.asarray(bytearray(resp.read()),dtype="uint8") image = cv2.imdecode(image,cv2.IMREAD_COLOR) arrs,faces,lables = fetch_face_pic(image,predictor) print("arrs:",arrs) if len(arrs) < 1: return "" if len(arrs) == 1: my_features = generateAllFeatures(arrs[0]) else: my_features = generateAllFeatures(arrs) if len(my_features.shape) > 1: predictions = predict(my_features,) print(faces) print(predictions) # print(type(predictions)) print(type(faces)) a2 = np.array([1,2]) if type(faces) == type(a2): print("is") faces = faces.tolist() result =[ faces,predictions,image.shape,lables ] #print(image) print(faces) return json.dumps(result) bottle.run(host='0.0.0.0', port=8888)
效果
测试图片
缘由:好友开发了一个程序化交易虚拟货币的助手软件。卖的火热(想购买的朋友请加微信: endpang )。出于对土豪的敬意,抽时间做一个时序预测的东西。
财富自由之路开始。。。。
首先得获得实时的价格数据,
火币网的接口:https://github.com/huobiapi/API_Docs/wiki/REST_introduction
websocket 获得实时数据并将价格写入文本文件
from websocket import create_connection import gzip import time import json if __name__ == '__main__': while(1): try: ws = create_connection("wss://api.huobipro.com/ws") break except: print('connect ws error,retry...') time.sleep(5) # 订阅 KLine 数据 tradeStr="""{"sub": "market.ethusdt.kline.1min","id": "id10"}""" # 请求 KLine 数据 # tradeStr="""{"req": "market.ethusdt.kline.1min","id": "id10", "from": 1513391453, "to": 1513392453}""" #订阅 Market Depth 数据 # tradeStr="""{"sub": "market.ethusdt.depth.step5", "id": "id10"}""" #请求 Market Depth 数据 # tradeStr="""{"req": "market.ethusdt.depth.step5", "id": "id10"}""" #订阅 Trade Detail 数据 # tradeStr="""{"sub": "market.ethusdt.trade.detail", "id": "id10"}""" #请求 Trade Detail 数据 # tradeStr="""{"req": "market.ethusdt.trade.detail", "id": "id10"}""" #请求 Market Detail 数据 # tradeStr="""{"req": "market.ethusdt.detail", "id": "id12"}""" ws.send(tradeStr) old = {"vol": 0,"count":0,"close":0} i = 0 with open('test_csv.csv',"w") as csv: #csv.write("lines\n") while(1): compressData=ws.recv() result=gzip.decompress(compressData).decode('utf-8') if result[:7] == '{"ping"': ts=result[8:21] pong='{"pong":'+ts+'}' ws.send(pong) ws.send(tradeStr) elif result[:5] == '{"ch"': arr = json.loads(result) #print("arr",arr) if arr['tick']['count'] < old["count"]: i = i+1 csv.write(format(old['close'])+"\n") print('count',old) else: delta = arr['tick']['vol'] - old['vol'] print("delta:",delta) if delta > 0: deltap = arr['tick']['close'] - old["close"] print("deltap",deltap) old = arr['tick']
基于tensorflow lstm 的预测模型。
import lstm import time import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt def plot_results(predicted_data, true_data): fig = plt.figure(facecolor='white') ax = fig.add_subplot(111) ax.plot(true_data, label='True Data') plt.plot(predicted_data, label='Prediction') plt.legend() plt.show() def plot_results_multiple(predicted_data, true_data, prediction_len): fig = plt.figure(facecolor='white') ax = fig.add_subplot(111) ax.plot(true_data, label='True Data') #Pad the list of predictions to shift it in the graph to it's correct start for i, data in enumerate(predicted_data): padding = [None for p in range(i * prediction_len)] plt.plot(padding + data, label='Prediction') plt.legend() plt.show() #Main Run Thread if __name__=='__main__': global_start_time = time.time() epochs = 1 seq_len = 50 print('> Loading data... ') X_train, y_train, X_test, y_test = lstm.load_data('test_csv.csv', seq_len, True) print('> Data Loaded. Compiling...') model = lstm.build_model([1, 50, 100, 1]) model.fit( X_train, y_train, batch_size=512, nb_epoch=epochs, validation_split=0.05) predictions = lstm.predict_sequences_multiple(model, X_test, seq_len, 50) #predicted = lstm.predict_sequence_full(model, X_test, seq_len) #predicted = lstm.predict_point_by_point(model, X_test) print('Training duration (s) : ', time.time() - global_start_time) plot_results_multiple(predictions, y_test, 50)
市场有风险,交易需谨慎。不准莫怪我,预测准的,写出来也不会开放代码的。。。 : P
带年龄的版本 Keras 实现的性别年龄检测
本文不再更新,请移步上面链接的文章。
__author__ = 'pangzhiwei' import cv2 import dlib import numpy as np import math import itertools from sklearn.externals import joblib from sklearn import decomposition import bottle from bottle import request import urllib.request import json def facialRatio(points): x1 = points[0] y1 = points[1] x2 = points[2] y2 = points[3] x3 = points[4] y3 = points[5] x4 = points[6] y4 = points[7] dist1 = math.sqrt((x1-x2)**2 + (y1-y2)**2) dist2 = math.sqrt((x3-x4)**2 + (y3-y4)**2) ratio = dist1/dist2 return ratio def generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates): size = allLandmarkCoordinates.shape if len(size) > 1: allFeatures = np.zeros((size[0], len(pointIndices1))) for x in range(0, size[0]): landmarkCoordinates = allLandmarkCoordinates[x, :] ratios = [] for i in range(0, len(pointIndices1)): x1 = landmarkCoordinates[2*(pointIndices1[i]-1)] y1 = landmarkCoordinates[2*pointIndices1[i] - 1] x2 = landmarkCoordinates[2*(pointIndices2[i]-1)] y2 = landmarkCoordinates[2*pointIndices2[i] - 1] x3 = landmarkCoordinates[2*(pointIndices3[i]-1)] y3 = landmarkCoordinates[2*pointIndices3[i] - 1] x4 = landmarkCoordinates[2*(pointIndices4[i]-1)] y4 = landmarkCoordinates[2*pointIndices4[i] - 1] points = [x1, y1, x2, y2, x3, y3, x4, y4] ratios.append(facialRatio(points)) allFeatures[x, :] = np.asarray(ratios) else: allFeatures = np.zeros((1, len(pointIndices1))) landmarkCoordinates = allLandmarkCoordinates ratios = [] for i in range(0, len(pointIndices1)): x1 = landmarkCoordinates[2*(pointIndices1[i]-1)] y1 = landmarkCoordinates[2*pointIndices1[i] - 1] x2 = landmarkCoordinates[2*(pointIndices2[i]-1)] y2 = landmarkCoordinates[2*pointIndices2[i] - 1] x3 = landmarkCoordinates[2*(pointIndices3[i]-1)] y3 = landmarkCoordinates[2*pointIndices3[i] - 1] x4 = landmarkCoordinates[2*(pointIndices4[i]-1)] y4 = landmarkCoordinates[2*pointIndices4[i] - 1] points = [x1, y1, x2, y2, x3, y3, x4, y4] ratios.append(facialRatio(points)) allFeatures[0, :] = np.asarray(ratios) return allFeatures def generateAllFeatures(allLandmarkCoordinates): a = [18, 22, 23, 27, 37, 40, 43, 46, 28, 32, 34, 36, 5, 9, 13, 49, 55, 52, 58] combinations = itertools.combinations(a, 4) i = 0 pointIndices1 = [] pointIndices2 = [] pointIndices3 = [] pointIndices4 = [] for combination in combinations: pointIndices1.append(combination[0]) pointIndices2.append(combination[1]) pointIndices3.append(combination[2]) pointIndices4.append(combination[3]) i = i+1 pointIndices1.append(combination[0]) pointIndices2.append(combination[2]) pointIndices3.append(combination[1]) pointIndices4.append(combination[3]) i = i+1 pointIndices1.append(combination[0]) pointIndices2.append(combination[3]) pointIndices3.append(combination[1]) pointIndices4.append(combination[2]) i = i+1 return generateFeatures(pointIndices1, pointIndices2, pointIndices3, pointIndices4, allLandmarkCoordinates) def fetch_face_pic(face,predictor): rects = detector(face, 1) #str = "" #strs = "" arrs = [] face_arr = [] for faces in range(len(rects)): # 使用predictor进行人脸关键点识别 #print(rects[faces]) landmarks = np.matrix([[p.x, p.y] for p in predictor(face, rects[faces]).parts()]) #face_img = face.copy() # 使用enumerate函数遍历序列中的元素以及它们的下标 arr = [] for idx, point in enumerate(landmarks): arr = np.append(arr,point[0,0]) arr = np.append(arr,point[0,1]) #strs += str(point[0, 0]) + ',' + str(point[0, 1]) + ',' #pos = (point[0, 0], point[0, 1]) #print(point) #f.write(str(point[0, 0])) #f.write(',') #f.write(str(point[0, 1])) #f.write(',') #f.write('\n') if len(arrs) == 0: arrs = [arr] else: arrs = np.concatenate((arrs,[arr]),axis=0) f = rects[faces] [x1,x2,y1,y2]=[f.left(),f.right(),f.top(),f.bottom()] a = [[x1,x2,y1,y2]] if len(face_arr) == 0: face_arr = a else: face_arr = np.concatenate((face_arr,a) ,axis=0) return arrs,face_arr def predict(my_features): predictions = [] for i in range(len(my_features)): feature = my_features[i, :] feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer).tolist()) print(i) ''' if len(my_features.shape) > 1: for i in range(len(my_features)): feature = my_features[i, :] feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer)) print('照片中的人颜值得分依次为(满分为5分):') k = 1 for pre in predictions: print('第%d个人:' % k, end='') print(str(pre)+'分') k += 1 else: feature = my_features feature_transfer = pca.transform(feature.reshape(1, -1)) predictions.append(pre_model.predict(feature_transfer)) print('照片中的人颜值得分为(满分为5分):') k = 1 for pre in predictions: print(str(pre)+'分') k += 1 ''' return predictions PREDICTOR_PATH = './model/shape_predictor_68_face_landmarks.dat' detector = dlib.get_frontal_face_detector() # 使用官方提供的模型构建特征提取器 predictor = dlib.shape_predictor(PREDICTOR_PATH) pre_model = joblib.load('./model/face_rating.pkl') features = np.loadtxt('./data/features_ALL.txt', delimiter=',') pca = decomposition.PCA(n_components=20) pca.fit(features) @bottle.route('/find', method='GET') def do_find(): w = request.query.get("url") #print(w) resp = urllib.request.urlopen(w) image = np.asarray(bytearray(resp.read()),dtype="uint8") image = cv2.imdecode(image,cv2.IMREAD_COLOR) arrs,faces = fetch_face_pic(image,predictor) print(arrs) my_features = generateAllFeatures(arrs) if len(my_features.shape) > 1: predictions = predict(my_features,) print(faces) print(predictions) # print(type(predictions)) result =[ faces.tolist(),predictions ] #print(image) print(faces) return json.dumps(result) bottle.run(host='0.0.0.0', port=8888)
最新代码及model 文件见 https://github.com/endpang/xindong
import cv2 import numpy as np import os import bottle def fetch_face_pic(img,face_cascade): # 将图像灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 人脸检测 faces,rl,wl = face_cascade.detectMultiScale3(gray,scaleFactor=1.1, minNeighbors=3, minSize=(30, 30), flags = cv2.CASCADE_SCALE_IMAGE, outputRejectLevels = True ) #输出分数最高的 ol = 0 for i,(x,y,w,h) in enumerate(faces): if wl[i][0] > ol: crop = img[y:y+h, x:x+w] # 使用切片操作直接提取感兴趣的区域 print(wl[i][0],ol,x,y,w,h) ol = wl[i][0] return crop face_cascade = cv2.CascadeClassifier('/root/girl/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml') @bottle.route('/find/<w>', method='GET') def do_find(w): jaffe_pic = '/web/maps.cc/public/girl/img/' + w img = cv2.imread(jaffe_pic) crop = fetch_face_pic(img,face_cascade) if crop is not None: cv2.imwrite("/web/maps.cc/public/girl/thumb/"+w,crop) return w return "" bottle.run(host='0.0.0.0', port=8080)
联网权限
app/manifests/AndroidManiifest.xml 文件 <application 上 添加
<uses-permission android:name="android.permission.INTERNET"/>
build.gradle(Module:app) 文件 dependencies 内加一行
compile 'com.squareup.okhttp3:okhttp:3.10.0'
Activity 文件。
package com.example.zhiweipang.xindong; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.MenuItem; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import java.io.IOException; public class MainActivity extends AppCompatActivity { OkHttpClient client = new OkHttpClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); getRequest(); } }); } private void getRequest() { final Request request=new Request.Builder() .get() .tag(this) .url("http://www.baidu.com") .build(); new Thread(new Runnable() { @Override public void run() { Response response = null; try { response = client.newCall(request).execute(); if (response.isSuccessful()) { Log.i("WY","打印GET响应的数据:" + response.body().string()); } else { throw new IOException("Unexpected code " + response); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
GITHUB:https://github.com/endpang/xindong
Traceback (most recent call last): File "/usr/local/bin/pip3.5", line 7, in <module> from pip import main File "/usr/local/lib/python3.5/dist-packages/pip/__init__.py", line 26, in <module> from pip.utils import get_installed_distributions, get_prog File "/usr/local/lib/python3.5/dist-packages/pip/utils/__init__.py", line 27, in <module> from pip._vendor import pkg_resources File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3018, in <module> @_call_aside File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3004, in _call_aside f(*args, **kwargs) File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 3046, in _initialize_master_working_set dist.activate(replace=False) File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2578, in activate declare_namespace(pkg) File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2152, in declare_namespace _handle_ns(packageName, path_item) File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2092, in _handle_ns _rebuild_mod_path(path, packageName, module) File "/usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2121, in _rebuild_mod_path orig_path.sort(key=position_in_sys_path) AttributeError: '_NamespacePath' object has no attribute 'sort'
sudo vim /usr/local/lib/python3.5/dist-packages/pip/_vendor/pkg_resources/__init__.py
2121行
#orig_path.sort(key=position_in_sys_path) #module.__path__[:] = [_normalize_cached(p) for p in orig_path] orig_path_t = list(orig_path) orig_path_t.sort(key=position_in_sys_path) module.__path__[:] = [_normalize_cached(p) for p in orig_path_t]
https://github.com/deepfakes/faceswap
效果