图像分类与 Cloudflare 工人

今天,我们正在尝试一个与图像分类有关的实用的AI特性,即专门用来通过图像URL回回图像的书面解释的AI模型. 这有什么用? 作为第一个应用程序,在不打开图像的情况下知道图像内部是什么;这为一系列其他应用程序打开了大门,比如通过扫描图像的文本复制列表来识别滥用或不恰当的行为. 对于自动对图像进行描述并保存在某种数据库中也是有益的. 我们需要什么?
(1) 账户 云雾花 (甚至免费)
(2) A类 您的员工 云浮账户 (甚至免费)
在Cloudflare的工人中已经有一个预设的脚本来生成图像的文本转录,但是预设的脚本完全不能安全地在生产环境中使用;在这篇文章中,我们将看看如何定制脚本,使之更安全,并在PHP环境中使用.

我们该怎么办? 主要目标是创建一个脚本,从POST方法发送的图像URL开始,通过名为"resnet-50"的人工智能模型返回图像描述. ResNet是一个由152个层组成的非常深的演化神经网络(CNN),在被称作"跳过接通"的技术的帮助下为残余网络(剩余网络)铺平了道路.

我们需要产生什么? 对于我们工人的要求,我们将使用一个PHP文件;而对于脚本插入到我们工人身上,我们将使用一个比默认文件更安全的自定义文件。

工人脚本

导出默认值 {
aync 获取( 请求, env) {
/ 请检查url=值 (帮助). 检查授权信头是否包含一个有效的符号
cnst 认证页眉 = request.headers.get ("认证");
无效 托肯(Token) = "Your_AUTHENTICATION_Token"; 托肯(Token) = "Your_AUTHENTION_Token"; 托肯(Token) ; 托肯(Token) ; 托肯(Token) ; 托肯 (Token) ; 托肯 (Token) ; 托肯 (Token) ; 托肯 (Token) ; 托肯 (Token) ; 托肯(Token (Token) ; 托肯(Token) ; 托肯(Token) ; 托肯(Token) ;

如果(! 头) \ \ \ \ ’Bearer ${ validToken}} (帮助) {
/ 请检查url=值 (帮助). 如果丢失或无效, 返回一个401 未经授权的错误
返回新反应( E)
JSON.stringify ({错误:"无效或缺少认证符") , ),
{状态: 401,标题:{"Content-Type":"应用程序/json"}}}
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 仅处理有效的 POST 请求
如果(请求) 方法! ==="POST" (中文(简体) ). {
/ 请检查url=值 (帮助). 如果该方法不是 POST, 请返回 405 方法不允许错误
返回新的响应(“无效请求方法”。 使用 POST 和所需的数据。" {
状况: 405人,
标题:{"Content-Type":"text/plain"},
* ;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

尝试{
/ 请检查url=值 (帮助). 验证请求的内容类型
内容 type = request.headers.get ("Content-Type") QQ"; 1.
如果 (! ContentType. 包括 ("应用程序/json")){
/ 如果内容类型不是 JSON, 请返回一个 400 个坏请求错误
返回新反应( E)
JSON.stringify({错误:"无效内容-Type. 预期应用/json.}),
{状态: 400,标题:{"Content-Type":"application/json"}}}
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 解析请求的正文
const body = 等待请求.text();
如果(!body){则
/ 请检查url=值 (帮助). 如果请求正文为空, 请返回400 Bad 请求出错
返回新反应( E)
JSON.stringify ({错误:"请求的正文是空的"), ,
{状态: 400,标题:{"Content-Type":"application/json"}}}
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

Const { 图像 Url = JSON.parse(身体);
如果 (! 图像Url) {
/ 请检查url=值 (帮助). 如果未在正文中提供图像 URL, 返回一个 400 Bad 请求错误
返回新反应( E)
JSON.stringify ({错误:"未提供图像 URL"), ,
{状态: 400,标题:{"Content-Type":"application/json"}}}
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 从提供的 URL 获取图像
const 图像响应=等待获取(图像Url);
cons blob = 正在等待图像Response.array Boffer ();

/ 请检查url=值 (帮助). 为AI模式准备投入
输入量= {
图像 : [. 新的 Uint8Array( blob)],
* ;

/ 请检查url=值 (帮助). 运行AI模型并获得响应
const响应=等待env.AI.run (""@cf/microsoft/resnet-50""输入").

/ 请检查url=值 (帮助). 返回AI模型的反应
返回新反应( E)
JSON.stringify ({ 回复}), ,
{标题:{"Content-Type":"应用程序/json"}}
(三)
捕捉(反射){
// 处理任何出乎意料的错误并返回500个内部服务器出错
返回新反应( E)
JSON.stringify ({ 错误: 错误. message}), ,
{状态:500,标题:{"Content-Type":"应用程序/json"}}}
(三)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn华文楷体\fs16\1cHE0E0E0}
* ;

定制此脚本时要考虑什么 ? 常数 无效 键 必须包含您在请求时通过的自定义符号, 插入一个密码, 然后记住它以在 PHP 文件内再下移 ; 如果符号不相等, 脚本将返回一个 401 个错误, 并保存更多的 CPU 工作( 此常数可以更改, 但 PHP 脚本上必须相同) ; 此外, 如果请求不是来自 POST 方法, 脚本将返回一个 405 个错误, 也用于保存 CPU 工作 ; 还有一个检查, 以验证收到的请求是 JSON 格式, 这是唯一可以接受的格式 ; 此时有一个检查以验证发送的 URL 是否存在 。 如果一切都是正确的,那么我们可以继续将图像文件发送给人工智能,人工智能将返回其JSON格式的描述,准备被我们将要建立的PHP脚本所捕获.

前一頁 脚本

调用此脚本 图像ai.php 并保存在受保护的目录中

< php 读取
您的 Cloudflare 工人 的 URL
乌云浮雷 Url = “https://yourl.works.dev/” ;
$authToken = "YOUR_AUTHENTICTION_Token"; // 认证符与工人匹配

如果 ($_Server ['re request_METHOD'] ){
$imageUrl = $_POST ['imageUrl']; 美元 = $_POST ['imageUrl'];

如果(空(美元图像Url)) {
/ 请检查url=值 (帮助). 检查是否提供了图像 URL; 如果没有, 返回错误
回声 json_encode (['error' +'' Image URL 丢失.] );
离开;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

// 检查 URL 是否通过检查其内容- Type 标题来指向实际图像
$headers = 得到($imageUrl, 1) ;
if (!isset ($headers ['Content-Type']) ($headers ['Content-Type'], “image/') (X) 假) {
/ 请检查url=值 (帮助). 如果 URL 不指向图像, 返回错误
回声 json_encode (['error'''' URL不包含有效的图像.']);
离开;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 为请求准备JSON有效载荷
$data = json_encode(['image Url' = $image Url]) ;

/ 请检查url=值 (帮助). 设置请求选项, 包括带有符号的授权页眉
$选项= [
[http] (中文(简体) ).
'头'"Content-Type:应用程序/json\r\n".
"授权:熊熊(Bearer $authToken\r\n)",
/ 请检查url=值 (帮助). 在授权页眉中包含符号
'方法'`POST',
内容( C) 数据,
[ . ]
; ; ;

/ 请检查url=值 (帮助). 把要求发给工人,然后得到答复
$context = stream_context_create($options) ; 2.
$应答=文件_get_contents($cloudflare) 乌尔,假的,$context;

如果(答复QQ FALSE){
/ 请检查url=值 (帮助). 如果工人无法联系, 返回一个错误
回声 json_encode( ['error'' ) 无法联系工人。 ]
离开;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 解码来自工人的 JSON 响应
$decoded Response = json_decode($应答,为真) ;
如果( $decoded Response QQ 无效) {
/ 请检查url=值 (帮助). 如果响应无效, 返回错误
回声 json_encode( ['error'' ) 答复无效;
离开;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

/ 请检查url=值 (帮助). 输出解码响应
回声 json_encode($decoded Response) ;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
吗 ? >

定制此脚本时要考虑什么 ? $authToken 变量包含我们在工人脚本中设置的认证符(以前);两个脚本中值必须相同. 变量 乌云浮雷 乌尔尔 包含保存工人脚本的整个 URL( 先前保存) , 通常从 https:// 开始, 最后是 工人 。 dev 也可以将自定义的子域连接起来(由您选择) 。 脚本可以从一个
在 html 中,并且必须用 id “imageUrl ” 从一个字段通过图像 URL , 显然也可以通过 POST 从另一个用 javascript 的脚本中调用它( 如你所愿); 此时的 PHP 脚本检查通过 POST 的 URL 是否在那里, 并检查它是否确实是一个图像; 检查一旦通过, 就会调用工人脚本, 检查服务是否可用和可达到, 并返回必须使用 JSON 格式的响应 。

HTML 窗体

 (英语).
html lang="en" (中文(简体) ).
< 头 >
图像分类
< style> (英语)
车体{
字体家族: arial, sans-serif; 字体家族:
边距: 20px;
页: 1 ○;
背景颜色: #f4f4f9;
颜色: # 333;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
窗体 {
最大宽: 400px;
边距: 0 自动;
垫装: 20px;
背景情况 : #fff; (中文(简体) ).
边框: 1px 固态 #ddd;
边界辐射:5px;
框-阴影: 0 2px 5px rgba(0、0、0、0.1);
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
输入[类型="文本"]{
宽度:100%;
粘贴: 10px;
边距: 10px 0;
边框: 1px 固态 #ccc;
边距: 3px;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
按钮{
宽度:100%;
粘贴: 10px;
背景颜色: # 007bff;
颜色:白色;
边框:无;
边距: 3px;
光标:指针;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
按钮: hover {
背景颜色: # 0056b3;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
.说明 {
边角: 20px;
字体大小: 16px;
文本对齐:中;
粘贴: 10px;
边界辐射:5px;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
.description.success { (简体中文).
背景颜色 : #d4edda;
颜色: # 155724;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
.说明.error {
背景颜色: #f8d7da;
颜色: # 721c24;
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


单体

图像分类

输入图像的 URL 进行分类:

分类图像 < br> (英语)
文档.getElementById('classificationForm'). addEventListener('提交',async函数(事件){ 事件。 预防 / 请检查url=值 (帮助). 防止提交表单并重新加载页面 曲线图像 Url = 文档.getElementById('imageUrl'). value; 页面存档备份,存于互联网档案馆. c. “ 描述容器” ; 尝试{ / 请检查url=值 (帮助). 通过 POST 将图像 URL 发送给 PHP 脚本 Const 响应 = 等待取回('imageai.php', { 方法 : “ POST ” , 标题 : { "Content-Type":"应用/x-www-form-urlencode", {\fn华文楷体\fs16\1cHE0E0E0} 正文 : “ imageUrl=” + encodeUR 组件( imageUrl) * ; 连结结果=等待答复。 如果(答复.ok){ / 请检查url=值 (帮助). 显示从 PHP 脚本收到的描述 c. 响应; className = “描述成功”; 否则 / 请检查url=值 (帮助). 显示错误消息 语录 : 发生了出乎意料的错误.'; className = “描述错误”; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 说明 Contaner.style.display = “块”; // 让容器可见 捕捉(反射){ / 请检查url=值 (帮助). 处理网络或服务器出错 描述容器.textContent = 错误:"+error.message; className = “描述错误”; 说明 Container.style.display = “块”; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? * ; (简体中文) (简体中文)

结论

此脚本可以通过 HTML 格式( 在此显示) 使用, 或者甚至通过 javascript 脚本, 来照顾 POST 请求的发送, 但是它也可以完全通过 PHP 使用, 也许可以确保结果直接保存到一个数据库中, 在稍后的时间( 当被请求时) 。 应用程序可以根据需要而具有不同的功能;记住,向工人提出较少的复杂要求总是更好的,因为尽管他们有很高的限额,即使有免费帐户,但他们仍然有限度。 在数据库中保存所收到信息是良好做法,同样的url(或同一图像)和通过数据库取回信息(caching)不会以太多的要求将工人堵住。 已执行的管制(收件和主机核查)正是为了不发出太多可以达到工人限度的要求。 此外,在Cloudflare中,您也可以设置应用防火墙(WAF),以确保向该工人提出的请求必须来自指定的主机(以免增加工人限制计数器). 记住,为了更好的性能,resnet-50模型预计图像大小为224×224像素,因此建议在发送图像之前将图像大小调整到该维度.