Menu
Woocommerce Menu

AI换脸朱茵变杨幂,谈谈进程和线程的区别

0 Comment


NotificationManagerService在服务端处理ITransientNotification客户端传过来的enqueueToast事件。

虽然遭到全网封禁,但人工智能深度换脸技术——deepfakes并没有淡出人们的视野。近日,这项技术还伸向了国内电视剧,这次“中招”的是女明星杨幂。

包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

  • 客户端的处理

人脸识别公司云从科技技术人员告诉澎湃新闻(www.thepaper.cn),人脸识别技术能否识别deepfakes制作的内容,要看制作的视频和技术应用在什么场景。“因为现在不管是人脸还是人体都是往3D化在走,这种通过屏幕呈现的东西已经可以被活体检测技术检测出来了,不管是目前应用比较广的红外双目,或是正在推的3D结构光与深度摄像头的技术。”

线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

  • 客户端

但是由于许多用户将deepfakes技术用于制作虚假视频,例如伪造政治家公开演讲,制作著名女星色情内容等,导致这项技术声名狼藉。

图片 1

从Toast的调用我们开始分析Toast.makeText(MainActivity.this , "Hello World" , Toast.LENGTH_SHORT);我们主要看makeText方法。

图片 2

当你刚入职场时,无论你是用C++还是Java甚至只是应聘运维岗位,相信你都会遇到这个问题。

public class NotificationManagerService extends SystemService { private final class WorkerHandler extends Handler{ @Override public void handleMessage(Message msg){ switch { case MESSAGE_TIMEOUT: //调用当前的Toast的hide handleTimeout((ToastRecord)msg.obj); break; case MESSAGE_SAVE_POLICY_FILE: handleSavePolicyFile(); break; case MESSAGE_SEND_RANKING_UPDATE: handleSendRankingUpdate(); break; case MESSAGE_LISTENER_HINTS_CHANGED: handleListenerHintsChanged; break; case MESSAGE_LISTENER_NOTIFICATION_FILTER_CHANGED: handleListenerInterruptionFilterChanged; break; } } } //让当前Toast展示一段时间后消失 private void scheduleTimeoutLocked(ToastRecord r){ //移除mHandler关于这个TaostRecord的所有Message mHandler.removeCallbacksAndMessages; Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r); long delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY; //发送一个delayed=duration的MESSAGE_TIMEOUT事件 mHandler.sendMessageDelayed; } //使Toast消失 private void handleTimeout(ToastRecord record){ if  Slog.d(TAG, "Timeout pkg=" + record.pkg + " callback=" + record.callback); synchronized (mToastQueue) { //找当前ToastRecord在mToastQueue队列中的索引 int index = indexOfToastLocked(record.pkg, record.callback); if (index >= 0) { cancelToastLocked; } } } //调用当前索引=index的ToastRecord.callback.hide void cancelToastLocked(int index) { ToastRecord record = mToastQueue.get; try { ////调用客户端Binder对应的TN.hide方法。 record.callback.hide(); } catch (RemoteException e) { Slog.w(TAG, "Object died trying to hide notification " + record.callback + " in package " + record.pkg); // don't worry about this, we're about to remove it from // the list anyway } //移除处理完的ToastRecord mToastQueue.remove; keepProcessAliveLocked(record.pid); if (mToastQueue.size { // Show the next one. If the callback fails, this will remove // it from the list, so don't assume that the list hasn't changed // after this point. //处理队列中的下一个ToastRecord showNextToastLocked(); } }}

为了帮助大家让学习变得轻松、高效,给大家免费分享一大批资料,让AI越来越普及。在这里给大家推荐一个人工智能Python学习交流群:705673780欢迎大家进群交流讨论,学习交流,共同进步。

1、为什么需要设计线程?

图片 3TOAST.png

除了Reddit上的讨论外,在2018年1月,还有人推出了Windows程序的FakeApp,这大大降低了deepfake的使用门槛,它允许用户很轻松地自制换脸视频,即使你没有任何人工智能方面的知识。

联系

private static class TN extends ITransientNotification.Stub { /** * schedule handleHide into the right thread */ @Override public void hide() { if (localLOGV) Log.v(TAG, "HIDE: " + this); mHandler.post; } final Runnable mHide = new Runnable() { @Override public void run() { handleHide(); // Don't do this in handleHide() because it is also invoked by handleShow() mNextView = null; } }; public void handleHide() { if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView); if (mView != null) { // note: checking parent() just to make sure the view has // been added... i have seen cases where we get here when // the view isn't yet added, so let's try not to crash. if (mView.getParent() != null) { if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this); //调用WindowManager的removeView移除mView mWM.removeView; } mView = null; } }}

图片 4

1.计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

public class NotificationManagerService extends SystemService { //是否是系统调用 private static boolean isCallerSystem() { return isUidSystem(Binder.getCallingUid; } private final IBinder mService = new INotificationManager.Stub() { @Override public void enqueueToast(String pkg, ITransientNotification callback, int duration){ if  { Slog.i(TAG, "enqueueToast pkg=" + pkg + " callback=" + callback + " duration=" + duration); } if (pkg == null || callback == null) { Slog.e(TAG, "Not doing toast. pkg=" + pkg + " callback=" + callback); return ; } //判断是否是系统调动或者是Android系统应用程序进行调用 final boolean isSystemToast = isCallerSystem() || ("android".equals; //Toast或者通知权限被禁用 if (ENABLE_BLOCKED_TOASTS && !noteNotificationOp(pkg, Binder.getCallingUid { if (!isSystemToast) { Slog.e(TAG, "Suppressing toast from package " + pkg + " by user request."); return; } } //mToastQueue加锁 synchronized (mToastQueue) { int callingPid = Binder.getCallingPid(); long callingId = Binder.clearCallingIdentity(); try { ToastRecord record; //寻找当前callback在mToastQueue中的索引,没找到则返回-1 int index = indexOfToastLocked(pkg, callback); // If it's already in the queue, we update it in place, we don't // move it to the end of the queue. //index>=0表示mToastQueue中有该callback的索引,record进行更新展示时间 if (index >= 0) { record = mToastQueue.get; record.update; } else { // Limit the number of toasts that any given package except the android // package can enqueue. Prevents DOS attacks and deals with leaks. //不是系统的Toast if (!isSystemToast) { int count = 0; final int N = mToastQueue.size(); for (int i=0; i<N; i++) { final ToastRecord r = mToastQueue.get; //判断当前的Toast是不是同一个包发出的 if (r.pkg.equals { count++; //当前包的需要展示的Toast缓存数量>=50 if (count >= MAX_PACKAGE_NOTIFICATIONS) { Slog.e(TAG, "Package has already posted " + count + " toasts. Not showing more. Package=" + pkg); return; } } } } //根据callback等信息构造ToastRecord对象 record = new ToastRecord(callingPid, pkg, callback, duration); //将新的ToastRecord对象加入到队列总 mToastQueue.add; //加入之后当前的索引是lenth-1 index = mToastQueue.size() - 1; //将当前包对应的线程切换为前台线程 keepProcessAliveLocked(callingPid); } // If it's at index 0, it's the current toast. It doesn't matter if it's // new or just been updated. Call back and tell it to show itself. // If the callback fails, this will remove it from the list, so don't // assume that it's valid after this. //如果之前队列中没有正在处理的消息,那么处理当前这个ToastRecord if (index == 0) { showNextToastLocked(); } } finally { Binder.restoreCallingIdentity(callingId); } } } }}

deepfakes搭建的系统可以通过谷歌图片搜索、网络图库、Youtube视频等途径获取的素材,利用这些素材通过TensorFlow等多个开源库,训练深度学习网络,经过反复训练后,系统就会自动替换脸部信息。学习样本越多,生成脸谱图的还原度就会越高。

说基础是因为每个学计算机的人都应该懂,进程线程是计算机的基础概念,是每个程序员时时刻刻都要接触的东西。

public class Dialog implements DialogInterface, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener,Window.OnWindowDismissedCallback{ /** * Start the dialog and display it on screen. The window is placed in the * application layer and opaque. Note that you should not override this * method to do initialization when the dialog is shown, instead implement * that in {@link #onStart}. */ public void show() { if  { if (mDecor != null) { if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) { mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR); } mDecor.setVisibility(View.VISIBLE); } return; } mCanceled = false; //判断是否调用onCreate方法 if (!mCreated) { dispatchOnCreate; } //调用onStart方法 onStart(); //获取DecorView对象实例 mDecor = mWindow.getDecorView(); if (mActionBar == null && mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) { final ApplicationInfo info = mContext.getApplicationInfo(); mWindow.setDefaultIcon(info.icon); mWindow.setDefaultLogo(info.logo); mActionBar = new WindowDecorActionBar; } //更新Window属性参数 WindowManager.LayoutParams l = mWindow.getAttributes(); if ((l.softInputMode & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) { WindowManager.LayoutParams nl = new WindowManager.LayoutParams(); nl.copyFrom; nl.softInputMode |= WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION; l = nl; } try { //Windowmanger添加Window、ViewRootImpl初始化并绑定Window mWindowManager.addView(mDecor, l); mShowing = true; //OnShowListener监听回调 sendShowMessage(); } finally { } }}

public class Toast { final Context mContext; final TN mTN;// int mDuration;//展示时间 View mNextView;//所展示的View /** * Construct an empty Toast object. You must call {@link #setView} before you * can call {@link #show}. * * @param context The context to use. Usually your {@link android.app.Application} * or {@link android.app.Activity} object. */ //Context可以为Application也可以为Activity, public Toast(Context context) { mContext = context; mTN = new TN(); mTN.mY = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.toast_y_offset); mTN.mGravity = context.getResources().getInteger( com.android.internal.R.integer.config_toastDefaultGravity); } //NotificationManagerService的客户端IBinder对 private static INotificationManager sService; private static class TN extends ITransientNotification.Stub { TN() { // XXX This should be changed to use a Dialog, with a Theme.Toast // defined that sets up the layout params appropriately. final WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.format = PixelFormat.TRANSLUCENT; params.windowAnimations = com.android.internal.R.style.Animation_Toast; //设置Window类型为Toast params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle; params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; } } }

图片 5

2.假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

之后,deepfakes便被全网封禁:Reddit讨论版被删除,GitHub开源代码也被清除。成人视频网站上也删掉了用deepfakes算法做的视频。FakeApp的官网目前也已无法使用。

执行与调度的基本单位:thread

图片 6

10.这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做”信号量”(Semaphore),用来保证多个线程不会互相冲突。

public class Dialog implements DialogInterface, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener,Window.OnWindowDismissedCallback{ //只有Activity的Context可以启动Dialog,因为Dialog展示的时候需要主题资源也就是ContextThemeWrapper。 Dialog(Context context, int theme, boolean createContextThemeWrapper) { if (createContextThemeWrapper) { if (theme == 0) { TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme, outValue, true); theme = outValue.resourceId; } mContext = new ContextThemeWrapper(context, theme); } else { mContext = context; } //因为每个上下文环境获取的系统服务都是相同的实例,这里获取的WindowManager是Activity的WindowManager。 mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); //创建Dialog的PhoneWindow对象。 Window w = PolicyManager.makeNewWindow; mWindow = w; w.setCallback; w.setOnWindowDismissedCallback; w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); mListenersHandler = new ListenersHandler; }}

实际上,这并非deepfakes第一次在网上引发争议。在这之前,曾有人用deepfakes将“神奇女侠”盖尔·加朵的脸被贴在了一个成人电影女主的脸上,当时新闻一出在网络上引起了轰动。

6.车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

想阅读作者的更多文章,可以查看我 个人博客 和公共号:

deepfakes制作的视频和图片,一般人如果用肉眼无法识别,那么利用人脸识别技术能否识破呢?

当然面试的时候你不可能说上这一堆,面试官估计要跟你急,时间宝贵,我们需要用最精简的语言说出两者的概念以及区别。

  • 服务端

图片 7图片 8

扩展阅读

图片 9振兴书城

deepfakes是如何做到换脸的?

既然要谈区别,那么首先需要理解什么是进程和线程。

public class Dialog implements DialogInterface, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener,Window.OnWindowDismissedCallback{ /** * Set the screen content from a layout resource. The resource will be * inflated, adding all top-level views to the screen. * * @param layoutResID Resource ID to be inflated. */ public void setContentView(int layoutResID) { mWindow.setContentView(layoutResID); }}

但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以拥有有效资源还是很有必要的。

图片 10

public class Toast { /** * Make a standard toast that just contains a text view. * * @param context The context to use. Usually your {@link android.app.Application} * or {@link android.app.Activity} object. * @param text The text to show. Can be formatted text. * @param duration How long to display the message. Either {@link #LENGTH_SHORT} or * {@link #LENGTH_LONG} * */ public static Toast makeText(Context context, CharSequence text, @Duration int duration) { Toast result = new Toast; //获取布局解析器 LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //解析transient_notification.xml生成对应的View View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); //找到View中的id为message的TextView TextView tv = v.findViewById(com.android.internal.R.id.message); //对Textview进行文字赋值 tv.setText; //展示的Toast所用的View result.mNextView = v; //设置间隔时间 result.mDuration = duration; return result; }}

好莱坞影星纷纷“中招”

线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

通过分析ActivityDialogToast通过对ViewRootImpl的更细节的分析,所有添加在窗口上的View都有一个ViewRootImpl作为它的Parent,处理View的布局、事件处理等。

对于一项技术来说,本身并没有对错,关键看掌握这项技术的人如何应用。例如,好莱坞的一些数字特效公司就对这项技术非常感兴趣,这种将一位演员的面容“移植”到另外一个身体上的技术,对于他们来说,可以提高后期制作的效率,并且能节约成本。

7.可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图