-
使用微软人脸API实现人脸识别(java的URL方式)
2017-02-16 14:04:05可支持的人脸功能有:年龄、性别、头部姿态、微笑检测、胡须检测以及27个面部重要特征点位置等。FaceAPI 提供两个主要功能: 人脸检测和识别 目录: 申请subscription key示例效果开发示例AForge.Net 申请...微软提供的人脸识别服务可检测图片中一个或者多个人脸,并为人脸标记出边框,同时还可获得基于机器学习技术做出的面部特征预测。可支持的人脸功能有:年龄、性别、头部姿态、微笑检测、胡须检测以及27个面部重要特征点位置等。FaceAPI 提供两个主要功能: 人脸检测和识别
目录:
- 申请subscription key
- 示例效果
- 开发示例
- AForge.Net
申请订阅号
- 申请试用subscription key, 地址 https://www.microsoft.com/cognitive-services/en-us/sign-up
- 收费信息如下:
示例效果
- winform示例版,调用微软提供的SDK,见下面介绍
- 微信集成版, 如下图,开发过程中使用 http 直接调用
开发过程
- 参见:https://www.azure.cn/cognitive-services/en-us/face-api/documentation/get-started-with-face-api/GettingStartedwithFaceAPIinCSharp
- 在VS工程的NuGet Package Manager 管理窗口,程序包源:nuget.org, 搜索 Microsoft.ProjectOxford.Face ,进行安装
- sdk调用示例代码: 图片转byte[]
using (Stream s = new MemoryStream(bytes)) { var requiredFaceAttributes = new FaceAttributeType[] { FaceAttributeType.Age, FaceAttributeType.Gender, FaceAttributeType.Smile, FaceAttributeType.FacialHair, FaceAttributeType.HeadPose, FaceAttributeType.Glasses }; var faces = await Utils.FaceClient.DetectAsync(s, returnFaceLandmarks: true, returnFaceAttributes: requiredFaceAttributes); }
-
也可直接使用http请求,参见:https://dev.projectoxford.ai/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395236
-
参数信息如下:
-
http post 示例代码:
string URL = "你图片的url"; var client = new HttpClient(); var queryString = HttpUtility.ParseQueryString(string.Empty); // Request headers client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "你申请的key"); // Request parameters queryString["returnFaceId"] = "true"; queryString["returnFaceLandmarks"] = "false"; queryString["returnFaceAttributes"] = "age,gender,smile"; var uri = "https://api.projectoxford.ai/face/v1.0/detect?" + queryString; HttpResponseMessage response; byte[] byteData = Encoding.UTF8.GetBytes("{\"url\":\"" + URL + "\"}"); using (var content = new ByteArrayContent(byteData)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var task = client.PostAsync(uri, content); response = task.Result; var task1 = response.Content.ReadAsStringAsync(); string JSON = task1.Result; }
-
人脸识别http参数如下:(注意:要识别出人脸的身份,你必须先定义person,参见 personGroup 、Person介绍 https://www.azure.cn/cognitive-services/en-us/face-api/documentation/face-api-how-to-topics/howtoidentifyfacesinimage)
- 示例代码
var client = new HttpClient(); var queryString = HttpUtility.ParseQueryString(string.Empty); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "XXX"); var uri = "https://api.projectoxford.ai/face/v1.0/identify "; HttpResponseMessage response; byte[] byteData = Encoding.UTF8.GetBytes("{\"faceIds\":[\"XXX\"],\"personGroupId\":\"XXX\",\"maxNumOfCandidatesReturned\":5}"); using (var content = new ByteArrayContent(byteData)) { content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); var task = client.PostAsync(uri, content); response = task.Result; var task1 = response.Content.ReadAsStringAsync(); string JSON = task1.Result; }
- 根据人脸信息识别出身份后,获取个人信息,参数如下:
- 示例代码
var client = new HttpClient(); var queryString = HttpUtility.ParseQueryString(string.Empty); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "你申请的key"); var uri = "https://api.projectoxford.ai/face/v1.0/persongroups/你上传的分组/persons/" + personID; var task = client.GetStringAsync(uri); var response = task.Result; return JsonConvert.DeserializeObject<Person>(task.Result);
-
AForge.Net
- AForge.Net是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等领域, 我主要使用这个类库中的vedio 来启动笔记本摄像头进行图片抓拍
- 类库下载地址: http://www.aforgenet.com/framework/downloads.html
- 添加控件: 在工具箱中添加AForge.Control,VideoSourcePlayer就是我们要用的控件
- 示例代码如下:声明变量
FilterInfoCollection videoDevices; VideoCaptureDevice videoSource; public int selectedDeviceIndex = 0;
- 启动摄像头示例代码
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); selectedDeviceIndex = 0; videoSource = new VideoCaptureDevice(videoDevices[selectedDeviceIndex].MonikerString);//连接摄像头。 videoSource.VideoResolution = videoSource.VideoCapabilities[selectedDeviceIndex]; videoSourcePlayer1.VideoSource = videoSource; // set NewFrame event handler videoSourcePlayer1.Start();
-
抓拍示代码
if (videoSource == null) return; Bitmap bitmap = videoSourcePlayer1.GetCurrentVideoFrame(); string fileName = string.Format("{0}.jpg", DateTime.Now.ToString("yyyyMMddHHmmssfff")); this.filePath = string.Format("c:\\temp\\{0}", fileName); bitmap.Save(this.filePath, ImageFormat.Jpeg); this.labelControl1.Text = string.Format("存储目录:{0}", this.filePath); bitmap.Dispose(); videoDevices.Clear();
-
窗体关闭事件
if (this.videoSource != null) { if (this.videoSource.IsRunning) { this.videoSource.Stop(); } }
-
示例效果
- http://www.cnblogs.com/tgzhu/p/6207425.html
-
Android 使用Face++ SDK进行人脸识别和年龄检测
2015-05-21 12:53:40Face++的官网:http://www.faceplusplus.com.cn/可以识别照片中的人脸位置,人物的年龄,性别,种族,是否微笑等信息。效果图: 首先创建应用,会分配给我们一个API Key和API Secret,然后下载“Java SDK(Android...Face++的官网:
http://www.faceplusplus.com.cn/
可以识别照片中的人脸位置,人物的年龄,性别,种族,是否微笑等信息。效果图:
首先创建应用,会分配给我们一个API Key和API Secret,然后下载“Java SDK(Android)”,导入Jar包和库文件,参考官方的Demo进行编写。
1.FaceDetectUtil帮助类:
package com.zms.carlauncher.util; import java.io.ByteArrayOutputStream; import org.json.JSONObject; import com.facepp.error.FaceppParseException; import com.facepp.http.HttpRequests; import com.facepp.http.PostParameters; import com.zms.carlauncher.Constant; import android.graphics.Bitmap; import android.graphics.Matrix; public class FaceDetectUtil { public interface FaceCallBack { void success(JSONObject result); void error(FaceppParseException exception); } public static void detect(final Bitmap bitmapDetect, final FaceCallBack faceCallBack) { new Thread(new Runnable() { @Override public void run() { try { // 请求 HttpRequests httpRequests = new HttpRequests( Constant.FACE_API_KEY, Constant.FACE_API_SECRET, true, true); // Log.v(TAG, "image size : " + img.getWidth() + " " + // img.getHeight()); ByteArrayOutputStream stream = new ByteArrayOutputStream(); float scale = Math.min(1, Math.min( 600f / bitmapDetect.getWidth(), 600f / bitmapDetect.getHeight())); Matrix matrix = new Matrix(); matrix.postScale(scale, scale); Bitmap imgSmall = Bitmap.createBitmap(bitmapDetect, 0, 0, bitmapDetect.getWidth(), bitmapDetect.getHeight(), matrix, false); // Log.v(TAG, "imgSmall size : " + imgSmall.getWidth() + " " // + imgSmall.getHeight()); imgSmall.compress(Bitmap.CompressFormat.JPEG, 100, stream); byte[] array = stream.toByteArray(); PostParameters params = new PostParameters(); params.setImg(array); JSONObject result = httpRequests.detectionDetect(params); if(faceCallBack!=null){ faceCallBack.success(result); } } catch (FaceppParseException e) { e.printStackTrace(); if(faceCallBack!=null){ faceCallBack.error(e); } } } }).start(); } }
2.FaceDetectActivity:
package com.zms.carlauncher.ui; import java.io.ByteArrayOutputStream; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.provider.MediaStore.Images.ImageColumns; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.facepp.error.FaceppParseException; import com.facepp.http.HttpRequests; import com.facepp.http.PostParameters; import com.zms.carlauncher.Constant; import com.zms.carlauncher.R; import com.zms.carlauncher.util.FaceDetectUtil; public class FaceDetectActivity extends Activity { final private static String TAG = "FaceDetect"; final private int PICTURE_CHOOSE = 1; private ImageView imagePhoto = null; private Bitmap bitmapPhoto = null; private Button buttonDetect = null; private TextView textState = null; private View frameWait; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_face_detect); Button btnGetImage = (Button) this.findViewById(R.id.btnGetImage); btnGetImage.setOnClickListener(new MyOnClickListener()); frameWait = findViewById(R.id.frameWait); textState = (TextView) this.findViewById(R.id.textState); buttonDetect = (Button) this.findViewById(R.id.buttonDetect); buttonDetect.setVisibility(View.INVISIBLE); buttonDetect.setOnClickListener(new MyOnClickListener()); imagePhoto = (ImageView) this.findViewById(R.id.imagePhoto); imagePhoto.setImageBitmap(bitmapPhoto); } class MyOnClickListener implements View.OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btnGetImage: // 读取图库图片 Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); photoPickerIntent.setType("image/*"); startActivityForResult(photoPickerIntent, PICTURE_CHOOSE); break; case R.id.buttonDetect: frameWait.setVisibility(View.VISIBLE); FaceDetectUtil.detect(bitmapPhoto, new FaceDetectUtil.FaceCallBack() { @Override public void success(JSONObject result) { Message msg = Message.obtain(); msg.what = MSG_SUCCESS; msg.obj = result; faceHandler.sendMessage(msg); } @Override public void error(FaceppParseException exception) { Message msg = Message.obtain(); msg.what = MSG_ERROR; msg.obj = exception.getErrorMessage(); faceHandler.sendMessage(msg); } }); break; default: break; } } } private static final int MSG_SUCCESS = 0x111; private static final int MSG_ERROR = 0x112; private Handler faceHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case MSG_SUCCESS: frameWait.setVisibility(View.GONE); JSONObject rst = (JSONObject) msg.obj; Log.e(TAG, rst.toString()); prepareBitmap(rst); imagePhoto.setImageBitmap(bitmapPhoto); break; case MSG_ERROR: frameWait.setVisibility(View.GONE); String errorMsg = (String) msg.obj; if (TextUtils.isEmpty(errorMsg)) { textState.setText("Error"); } else { textState.setText(errorMsg); } break; default: break; } super.handleMessage(msg); } }; private Bitmap getGendorBitmap(int age, boolean isMale) { // frameWait.setVisibility(View.VISIBLE); TextView textAge = (TextView) frameWait.findViewById(R.id.textAge); textAge.setVisibility(View.VISIBLE); textAge.setText("" + age); if (isMale) { textAge.setTextColor(0xff1E88E5); textAge.setCompoundDrawablesWithIntrinsicBounds(getResources() .getDrawable(R.drawable.face_detect_male), null, null, null); } else { textAge.setTextColor(0xffff00ff); textAge.setCompoundDrawablesWithIntrinsicBounds(getResources() .getDrawable(R.drawable.face_detect_female), null, null, null); } textAge.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(textAge.getDrawingCache()); textAge.destroyDrawingCache(); return bitmap; } protected void prepareBitmap(JSONObject rst) { // 画笔 Paint paint = new Paint(); paint.setColor(Color.WHITE); // paint.setStrokeWidth(Math.max(img.getWidth(), // img.getHeight()) / 100f); paint.setStrokeWidth(3); // 画布 Bitmap bitmap = Bitmap.createBitmap(bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), bitmapPhoto.getConfig()); Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(bitmapPhoto, new Matrix(), null); try { // find out all faces JSONArray faceArray = rst.getJSONArray("face"); final int faceCount = faceArray.length(); textState.setText("Finished, " + faceCount + " faces."); for (int i = 0; i < faceCount; ++i) { float x, y, w, h; // 获取人脸中心 JSONObject faceObject = faceArray.getJSONObject(i); JSONObject positionObject = faceObject .getJSONObject("position"); x = (float) positionObject.getJSONObject("center").getDouble( "x"); y = (float) faceObject.getJSONObject("position") .getJSONObject("center").getDouble("y"); // 获取人脸大小 w = (float) positionObject.getDouble("width"); h = (float) positionObject.getDouble("height"); // 绘制人脸方框 x = x / 100 * bitmapPhoto.getWidth(); y = y / 100 * bitmapPhoto.getHeight(); w = w / 100 * bitmapPhoto.getWidth(); h = h / 100 * bitmapPhoto.getHeight(); canvas.drawLine(x - w / 2, y - h / 2, x - w / 2, y + h / 2, paint); canvas.drawLine(x - w / 2, y - h / 2, x + w / 2, y - h / 2, paint); canvas.drawLine(x + w / 2, y - h / 2, x + w / 2, y + h / 2, paint); canvas.drawLine(x - w / 2, y + h / 2, x + w / 2, y + h / 2, paint); // 性别和年龄 int age = faceObject.getJSONObject("attribute") .getJSONObject("age").getInt("value"); int range = faceObject.getJSONObject("attribute") .getJSONObject("age").getInt("range"); String gendorStr = faceObject.getJSONObject("attribute") .getJSONObject("gender").getString("value"); // Male-Female Bitmap ageBitmap = getGendorBitmap(age + range, "Male".equals(gendorStr)); int ageWidth = ageBitmap.getWidth(); int ageHeight = ageBitmap.getHeight(); if (bitmap.getWidth() < imagePhoto.getWidth() && bitmap.getHeight() < imagePhoto.getHeight()) { float ratio = Math.max(bitmap.getWidth() * 1.0f / imagePhoto.getWidth(), bitmap.getHeight() * 1.0f / imagePhoto.getHeight()); ageBitmap = Bitmap.createScaledBitmap(ageBitmap, (int) (ageWidth * ratio), (int) (ageHeight * ratio), false); } canvas.drawBitmap(ageBitmap, x - ageBitmap.getWidth() / 2, y - h / 2 - ageBitmap.getHeight(), null); } // save new image bitmapPhoto = bitmap; } catch (JSONException e) { e.printStackTrace(); FaceDetectActivity.this.runOnUiThread(new Runnable() { public void run() { textState.setText("Error."); } }); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); // the image picker callback if (requestCode == PICTURE_CHOOSE) { if (intent != null) { // Log.d(TAG, "idButSelPic Photopicker: " + // intent.getDataString()); Cursor cursor = getContentResolver().query(intent.getData(), null, null, null, null); cursor.moveToFirst(); int idx = cursor.getColumnIndex(ImageColumns.DATA); String fileSrc = cursor.getString(idx); // Log.d(TAG, "Picture:" + fileSrc); // just read size Options options = new Options(); options.inJustDecodeBounds = true; bitmapPhoto = BitmapFactory.decodeFile(fileSrc, options); // scale size to read options.inSampleSize = Math.max(1, (int) Math.ceil(Math.max( (double) options.outWidth / 1024f, (double) options.outHeight / 1024f))); options.inJustDecodeBounds = false; bitmapPhoto = BitmapFactory.decodeFile(fileSrc, options); textState.setText("Clik Detect. ==>"); imagePhoto.setImageBitmap(bitmapPhoto); buttonDetect.setVisibility(View.VISIBLE); } else { Log.d(TAG, "idButSelPic Photopicker canceled"); } } } private class FaceppDetect { DetectCallback callback = null; public void setDetectCallback(DetectCallback detectCallback) { callback = detectCallback; } public void detect(final Bitmap image) { new Thread(new Runnable() { public void run() { // zj: old position } }).start(); } } interface DetectCallback { void detectResult(JSONObject rst); } }
-
那个割肾换iPhone的男生,现在怎么样了?
2020-10-21 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(keeppure...Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者丨纯洁的微笑
来源丨纯洁的微笑(keeppuresmile)
iphone12发布,纷纷都在调侃肾12。
但是,大家知道苹果手机为什么叫“肾机”吗?
1
Iphone==肾机?
9年前iPhone4s发布。
作为乔帮主生前最得意的一款产品,iPhone4s 在发布之初便受到了消费者的热烈追捧。
2011年,那真是苹果手机最高光的一年,人们为了购买苹果手机可以整夜在排队,甚至可以用一年的薪资来买一部手机。
那时的苹果手机也是真的能打,放眼望去完全没有一个可以看得上的对手,乔布斯重新定义了什么叫做智能手机。
当时的中国经济还不是那么好,对于年轻人来讲哪怕是攒了一年钱,也未必可以买的起一部苹果手机。
于是个别年轻人走向了极端,一个17岁叫做小王的年轻人,为了买最新款的 iphone 手机,毅然前往黑市卖掉了自己的一个肾。
(说实话,这张图片我看了都觉得疼)
这个事件被报道出来之后,从此人们开始对苹果手机叫做“肾机”。
2
他是怎么卖的呢?
那小王是如何将自己的肾卖掉的呢?
2011年,小王看到同龄的年轻人在用iphone,他自己也非常渴望获得一部iphone手机,但是他没有钱家里条件也并不好。
于是在网上寻找一些可以换钱的手段,有一天他在QQ群了解到一个卖肾的地下生意,只要卖掉一个肾可以获得一笔不错的收益。
黑中介对小王说,人有两个肾割掉一个不打紧,并且一周以后就恢复了。
内心经过复杂的挣扎,最终经不住iphone诱惑的小王,在一家医院的地下室完成了交易,事后他获得了2.2万元。
拿到这笔钱之后,小王如愿以偿的买了,当年苹果手机的最新款iPhone4s以及iPad2,剩下的钱也很快被挥霍一空。
但是对他来讲,噩梦才刚刚开始...
3
割肾之后
随后回到安徽老家。一回家妈妈就发现了破绽。“他带了电脑,还有苹果手机,哪有这么多钱呢?他说他把肾卖了。”
发现儿子的一个肾被摘除了,母亲刘女士当即带着小王搭上火车赶到郴州报了案...
法院开庭之后小王家人提出227万刑事附带民事赔偿。(当时黑中介的获得利润是22万左右,给了小王2.2万)
参与黑市买卖的5个主要人均被追究刑事责任,而且提供场地和参与手术人员被追诉,主刀医生和中介赔偿了小王147万元。
....
小王是在黑市割肾之后伤口感染,加上没有得到及时的调理,发展到最后,被医院诊断为肾脏功能缺损,鉴定构成三级伤残。
原来身高1米9,体重75公斤的他,现在才90斤。
早已卧床不起,生活不能自理,而不得不早就断了学业,每天在家父母照顾,什么也不能做的他只能在床上刷刷手机。
如今只能靠药物维持生活...
4
最后
如果时光可以倒流到9年前,这个男孩子一定不会再说出那句:
“一个肾脏对我来说足够了,为什么需要另一个?为什么不卖它?”
年少无知,让他付出了惨痛的代价,一个肾脏在他的眼中,换一部手机足以。
却不知道这个世界上每天还有多少人在等着一个肾脏来救自己的命啊!
...
故事讲完了,但这里面还有很多点值得我们深思。
2011年国内经济发展不是很好,但到了现在,我不相信还有哪个少年会为了一部手机卖肾!
更值得警惕的是:当时的治安环境有多差,通过黑市中介承包医院科室、再找某医院副主任、麻醉师等就可以直接做手术!
参与的这些人,仅仅是为了挣一笔几万甚至几千的外快!
这到今天都不可思议!!!
少年,请三思...
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
在看点这里
好文分享给更多人↓↓
-
曾是谷歌程序员,抛下百万年薪创业,4年成就7亿用户,今身价百亿!
2020-09-13 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(keeppure...Python实战社群
Java实战社群
长按识别下方二维码,按需求添加
扫码关注添加客服
进Python社群▲
扫码关注添加客服
进Java社群▲
作者丨纯洁的微笑
来源丨纯洁的微笑(keeppuresmile)
“给我十年,记录这世界的喜怒哀乐。”
这句话,如果是放在,互联网迅速发展的今天,倒也没有什么稀奇的。
但如果,放在十年前,甚至是,二十年前,那简直就是痴人说梦。
然而,就在十年前,那个互联网还停留在2G、3G的时代,宿华,一个痴迷于编程的年轻小伙子,就大胆地提出了这个想法。
1
缘分
和普通人没什么两样,宿华出生于湖南省张家界市的一个普通小镇。父亲早年是一名公务员,后来,辞职做起了生意。虽然不是大富大贵,但也足够供给一家人的日常生活。
和普通孩子一样,好好上学,努力学习,是他走出这个小镇,最好的出路。他也很争气,从小成绩就一直不错。
父亲为了奖励成绩一直很好的他,便购买了当时很火的小霸王学习机。
和普通父亲奖励自己的孩子没什么两样。但就是这个小小的学习机,影响了宿华的一生。
那个时候的学习机,虽然不像现在的高级,但却也是新鲜玩意儿。它不仅可以用来学习,还可以用来打游戏,甚至可以用来编写代码。
一般的孩子可能会沉迷于打游戏,但是宿华没有。在那个小小的年纪里,宿华被一串串神奇的代码所吸引。
12岁的他,在这个游戏机上,敲下了人生中的第一串代码。
后来的他,仿佛打开了新世界的大门,开始狂热地投身于这些代码的研究和学习之中。
虽然,有很长一段时间,他像有些孩子痴迷于游戏那样,痴迷于研究这些代码。但是他的成绩一直都还是名列前茅,所以父亲也就很少约束他。
这一段莫名的缘份也就从此开始了。
2
选择
有些路看起来很近,走起来却很远。人生一半是现实,一半是梦想。
从小便热衷于编程的他,经过自己的努力学习,终于,在18岁那年,考入了清华大学的软件学院,开始了对这个专业的攻克和研读。
家庭并不富裕,却一直都深爱着编程的他,一直都很努力。
爱因斯坦曾说过“对于一切来说,只有热爱才是最好的老师。”
在人才济济的清华,宿华这一读,就是十年的书,从本科一路到博士,宿华一直都保持着初心,热爱着这门学科。我想如果不是真的热爱,可能也做不到如此的坚持吧。
当时的他,钻研功课,泡图书馆,一门心思都在读书上。
当他回过神来,看看在背后默默支持着自己的父母,才发现,北京的房价已经高得离谱,本来就不太富裕的家庭,可能真的不能再供他继续读书了。
面对现实的打击,一心求学的宿华,不得不重新考虑自己人生的选择。
一边是自己热爱的学业,一边是一直支持自己的家人。
最终考虑到现实问题,宿华不得不选择退学,开始进入工作状态,获取工资。
其实,生活就是这样,追求内心真正热爱之事的道路,总是不会一帆风顺。
“人生不如意十之八九”决定成败的不是现实给你的打击,而是面对这样的现实,你会做出怎样的选择。
3
创业
凭借着自己清华大学的高学历,宿华顺利进入了谷歌,开始了相关工作,主要负责“搜索和系统架构”。
在谷歌,宿华接触到的不再是各种各样,刻在书本上的代码。
亲身的体验,和工作中的学习,让宿华感受到了高科技的魅力。
不得已的退学和在谷歌中获得的工作体验,让年轻的宿华,产生了一个想法:创业。
在谷歌,检索一条消息,只需要几秒钟就可以完成。而自己未退学时,在图书馆找书的经历,让他意识到了,时代需要进步,而科技就是那股推动力。
在谷歌工作两年后,宿华觉得自己已经攒够了经验,可以开始创业了。
那时的他,觉得时代的发展要融入高科技,所以便产生了做视频广告这样一个想法。但,对于该怎么做,需不需要有合作伙伴等,他都没有准确的目标和定位。
而且视频广告的想法,在2008年那个互联网还不怎么发达的时代,几乎没有人愿意冒风险,去投资一个看起来没有什么前景的新事物。
再加上,当时出现了环球金融危机,恰巧就是在2008年,这场持续已久的金融危机,失控了,导致了很多金融机构的倒闭。
这些都让宿华没有什么根基的创业项目,彻底失败了。
然而,一直都不怎么服输的宿华,并没有就此放弃。
在接下来的一年里,他和他的同学们,相继筹备了33个项目。
但由于准备不足,这些项目,也全都以失败告终了。
可能真的是由于没有等到“天时地利人和”的时机,经历了接连失败的宿华,选择继续积累经验,提升自我,进入百度,成为了凤巢系统架构师。
4
坚持
生活很辛苦,只要你不忘记最初为什么开始,就心甘情愿。不忘初心,就是力量。
我们,在追求梦想的道路上,注定会遭遇坎坷,但我们要做的,是坚持,是绝不服输的坚持,是永不放弃的坚持。
其实,凭借着超高的学历和在谷歌的工作经验,进入百度工作的宿华,年薪已经超过了100万元。这足以使他在社会上过上优质的生活。
但是,宿华没有甘于这样,他一直坚守着初心。他想要创业,想要用高科技为这个时代做些什么。
在百度,他待了两年。在这两年里,他确实一直在学习,在积累经验。在那里,他认识到了团队的重要性,并开始学习如何带领一支优秀的团队。
两年后,离开百度的他,毫不犹豫地选择了再次创业。
经历了两年前的多次失败,再次创业,宿华抛弃了原来的想法,开始进行搜索引擎方面的尝试。
在积累了足够经验之后的这次尝试,显然成熟了很多,也有了很大的进步和成功,几个月便做到了盈亏平衡。
在尝到甜头,团队干劲十足的时候,公司的技术被阿里巴巴收购,宿华的团队因此得到了一大笔资金。
但是,面对阿里巴巴的工作邀约,他还是犹豫了。他还没有做到令自己满意的程度,他想创造一个属于自己,属于这个时代的新事物。
所以,面对接下来的选择,他又陷入了沉思。
5
机遇
机遇只偏爱那些有准备头脑的人。
——巴斯德
在这个世界上,有些人,盲目地努力了一生,却没有结果;而有些人,看准了机遇,并努力争取,最终才成就了一番事业。
机遇,无处不在,但机遇,也不是谁都能得到的,它需要的是,付出常人不能付出的努力和坚持。
宿华用了自己人生的10年,甚至是20年去做了准备,所以,当机遇来的时候,他才能准确地抓住。
就在宿华思索该做怎样的决定时,经人介绍,他认识了程一笑。
本来只是抱着试试的心态的他,在和程一笑的交谈过程中,惊喜地发现,他们有着同样的目标,话也很投机,一见如故,竟开始了彻夜长聊。
在谈话过程中,宿华得知,程一笑和他的团队,运营着拥有90万用户的“GIF快手”APP,此软件主要有制作和分享GIF动图的功能。
虽然已经取得了一定的成就,但是程一笑不满于此。于是两个志同道合的人,便开始了视频社交软件的尝试。
两个人就这样一起组建了新公司,开始着手调整快手。从快手界面开始,一步步进行提升。
改良之后的快手,界面干净了许多,同时,增加了录制和拍摄视频的功能。
但结果却并不尽人意。改良之后的快手,老用户大量流失,新用户却几乎没有增加。这让宿华陷入了沉思,开始怀疑自己是不是做错了。
这时,团队中有人提出,找明星,拉流量的想法,但这立马就被宿华否决了。
他一直坚持,“真实”才是快手的初衷,也只有真实才能记录普通人的生活状态。
没错,就是“真实”这两个宿华脱口而出的字,让他突然惊醒,一定是哪里出了问题,肯定是算法提供的数据还不够准确。
从那之后,他们开始专攻算法推荐技术,完全抛开了人工推荐,用最准确的算法数据为用户推荐最准确的内容。
在团队的不懈努力和认真负责之下,不仅流失的老用户回来了,而且,快手日活跃用户在半年之内增长了20倍。
而此时,国内的大环境也得到了改善。互联网的发展进入了4G时代,wifi和智能手机得到了大面积普及。
这给快手的发展,带来了千载难逢的机遇。
6
挑战
由于互联网的快速发展,从2015年6月开始,在八个月内快手用户涨了将近2亿人,大概两年之后,也就是在2017年左右,快手注册用户已经超过了7亿。
随着快手这个APP的火爆,各路资本也都向宿华砸了过来。
然而,就在快手得到了迅速发展之后,新的挑战也就随之出现了。
随着快手短视频的普及与发展,很多人在这方面看到了营利的机会,也抓住了法律和政策在这个新兴事物方面的漏洞。
新的营利实体便由此产生。有些人为了博取眼球,不择手段,甚至开始触碰道德的底线。
“有人放鞭炮进自己的裤袋里,有人生吃猪肉海鲜,有人虐待猫狗取乐,甚至还有未成年少女出现在平台上,以早孕为噱头盈利,吸引大批未成年少女跟风模仿……”
这些奇葩、狗血的视频,在当时,引起了央视等媒体的批评与谴责。
这让刚开始火爆的快手走上了舆论的风口浪尖。
面临新的挑战,宿华及时承认了错误,没有从外界找原因,而是及时在网上发文,表示,承认快手漏洞的存在,并承诺会及时处理这些漏洞,还给大家一个干净的网络环境。
他是这样说的,也是这样做的。
一夜之间,一万多个快手账号被查封,而且宿华还招聘了5000多名视频编辑和审核人员,以确保每条视频的质量都过关。
同时,对于快手直播间等方面,进行了年龄限制。为了防止未成年人沉迷于网络,还专门增加了“家长控制模式”。
慢慢地,快手以一个新的状态,又重新进入了大众的视野,并成为越来越多人记录生活的方式。
然而,就在宿华处理内部事件,无暇顾及外界的时候。抖音,一个视频软件,成为了快手最强劲的对手。
和快手几乎拥有一样功能的抖音,刚上线,就给快手带来了很大的冲击。
抖音,刚一上线,就拿出了猛虎的气势,各种广告,代言,在很短的时间内,便扩大了知名度。同时,还不惜花重金,成为某些火爆综艺节目的赞助商。在短短的两三年时间里,抖音的注册用户就达到了和快手持平的状态。
和抖音不同的是,快手一直保持的都是低调,克制的状态。因为要记录每个人真实的生活状态,所以从上线开始,快手就很少接广告,找明星代言。所以,在发展上,不及抖音那么迅速。
“落后就要挨打”这句话也同样适合竞争激烈的当代社会。抖音的出现以及发展,很有可能会取代快手的位置。
所以在抖音慢慢强大的同时,宿华开始慌了。此时的他,调整了原来低调的路线,也开始花重金上综艺,投放广告。
虽然,为了竞争,为了生存,快手做出了一系列的改变。
但是,不变的是,记录普通人生活状态的初心。
目前的快手和抖音,都处在迅速发展的状态,5G时代已经来临,这很有可能是高科技发展的一个新的节点。
未来,是未知的,但相信,一直都能保持初心并不轻言放弃的宿华,绝不会停滞不前。
“给我十年,记录这世界的喜怒哀乐”这是宿华,年轻时候的一个梦想,为了这个梦想,无论多难,他都坚持了下来。
7
最后
哪有什么一夜成名,其实都是百炼成钢。
在快手火爆的时候,大家才真正认识了宿华这个人,看起来是快手成就了宿华,但其实,是宿华自己成就了自己。
火爆只是一瞬间,但为了这个瞬间,宿华坚持了近20年,而且,为了能让快手跟上时代的潮流,宿华可能还要再努力个20年。
每个时代都有每个时代的英雄。
在宿华的奋斗史中,不可或缺的一部分是初心。在没有做出快手之前,他的初心是:要创造属于这个时代的新事物。
在快手真真正正地被创造出来之后,他的初心是:记录这世界真实的喜怒哀乐。
我们生活在这世界上的每个人,都会有初心,但是能一直坚守着它,不改变的却很少。
这也就是为什么,大部分的人都是平凡人,而被仰望的人却很少。
所以说只要心中还有理想,道路便依然远大。不论何时,要坚守信念,绽放光华。
PS:图片源于网络,版权归原作者所有,侵删!
程序员专栏 扫码关注填加客服 长按识别下方二维码进群
近期精彩内容推荐:
在看点这里
好文分享给更多人↓↓
-
一大波程序员血赚到腰疼...
2020-07-25 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(keeppures... -
D 创始人及员工,被批捕!这和 B站有啥关系?
2020-07-27 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(keeppure... -
华为鸿蒙背后:中国首个自己的开源基金会来了!
2020-10-07 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑该来的,终究还是来... -
CentOS 8 成为绝版!到底发生了什么?
2021-01-31 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(ID:keeppu... -
不允许程序员透露薪资!!!凭啥?
2021-01-07 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(ID:keeppu... -
又一个程序员,被抓捕!(真实事件)
2020-12-20 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(ID:keeppu... -
这个有特殊癖好的老板,亮瞎了我的眼....
2020-11-15 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(ID:keeppu... -
删库跑路升级版,著名大厂员工离职为报复公司,直接删虚拟机!
2020-10-17 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨纯洁的微笑来源丨纯洁的微笑(ID:keeppu... -
再见,世界首富!再见,马云!
2021-01-23 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨小生&微笑来源丨纯洁的微笑(ID:ke... -
中国芯片之父张汝京: 一生传奇,电影都不敢这么拍!
2020-06-09 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者 | 云游小生来源 | 纯洁的微笑转载授权(ID... -
曾遭周鸿祎全网封杀的360猛将 :草根打工到36岁身家上亿的逆袭!
2020-04-28 10:24:00Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者 | 云游小生来源|纯洁的微笑转载授权(ID... -
JavaScript 实现的人脸检测方法
2017-06-06 10:19:00当我知道Javascript库可以识别微笑,眼睛和脸部结构时,我得到启发去写一个教程。有许多的库,这些库要不就是纯粹的基于Javascript的,要不就是基于java语言的。 今天,我们开始学习tracking.js,它是一个... -
使用JavaScript 实现的人脸检测
2020-12-01 13:00:39当我知道Javascript库可以识别微笑,眼睛和脸部结构时,我得到启发去写一个教程。有许多的库,这些库要不就是纯粹的基于Javascript的,要不就是基于java语言的。 今天,我们开始学习tracking.js,它是一个由Eduardo ... -
@那伊抹微笑 @瑶妹 @loveSnowBest @谈笑风生 @诺木人 @飞龙 第二期 (2018-06-01) @KrisYu 授权信息: https://github.com/apachecn/Interview/tree/master/docs/Algorithm/ProjectCornerstone/ApproveLetter.md ...
-
Android应用开发揭秘--详细书签版
2012-12-12 13:27:46本书内容全面,不仅详细讲解了android框架、android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件 开发、android游戏引擎设计、android... -
实现类似Office助手的小精灵
2004-07-16 00:00:00Pleased //邀请的动作,面带微笑(可用) Process //类似于表演的动作,可以看看。如转圈等等 Processing //跟上面的动作一样,不过是一直持续不停 (连续状态,必须要用解除命令) Read //拿本书出来看,...
-
Galera 高可用 MySQL 集群(PXC v5.7+Hapro)
-
Mycat 实现 MySQL的分库分表、读写分离、主从切换
-
RapidScada从入门到精通
-
redux-sequence-action:使用先前更新的商店一一分发您的操作-源码
-
Glasterfs 分布式网络文件系统
-
echarts.min.js
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
ubuntu安装floodlight时ant命令编译失败
-
2020-2021学年广州市外国语学校八年级第一学期开学考试英语试题
-
360 GPU Pro : Shadows
-
GoBang002.rar
-
零信任安全原理和实践.pdf
-
Shell脚本一键部署——Redis数据库
-
Log4j日志体系结构
-
百度贴吧:复杂Web前端项目的构建工具优化实践
-
信号流程图理论分析多环谐振滤波器特性
-
spark大数据分析与实战
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
Java学习笔记04#Java数组
-
半导体量子阱中可调节的电磁感应透明度和吸收率,光控相门