Compare commits

...

8 커밋

7개의 변경된 파일322개의 추가작업 그리고 158개의 파일을 삭제
분할 보기
  1. BIN
      10185101162-云计算演示.pdf
  2. +20
    -5
      README.md
  3. +91
    -0
      style-transform-master/style-transform-master/backup.js
  4. +211
    -153
      style-transform-master/style-transform-master/server.js
  5. BIN
      style-transform-master/style-transform-master/uploads/176f63b4e76bfa3eae8817b2c9055cb303bcc63e691.jpg
  6. BIN
      style-transform-master/style-transform-master/uploads/ac66edfea279293b221dedd5ba5259d4
  7. BIN
      style-transform-master/style-transform-master/uploads/c83d4c92a165b43d0bd727657727d721

BIN
10185101162-云计算演示.pdf 파일 보기


+ 20
- 5
README.md 파일 보기

@ -2,16 +2,31 @@
基于预训练VGG-19的风格迁移的web应用。
## 单机运行
## 云端部署
通过git clone将项目保存到本地,安装nodejs,使用npm安装cheerio、express、cookie-parser、body-parser、cors、multer包,然后通过运行命令:
以CentOS系统为例,首先安装nodejs:
```
yum install -y nodejs
```
通过git clone将项目保存到本地,使用npm安装cheerio、express、cookie-parser、body-parser、cors、multer包,然后通过运行命令:
```
node server.js
```
将项目在本地运行,运行在https://localhost:1337/
将项目在云端运行,运行在http://${你的云主机IP}:1337/,如http://106.75.253.244:1337/
## 云端部署
接着使用一台没有弹性IP但有GPU的主机作为计算节点(可以租借服务器,但价格昂贵,推荐使用实验室或个人电脑,在有计算需求时弹性开启服务),通过git clone保存项目到本地,安装nodejs,使用npm安装child_process、request包,然后通过运行命令:
```
node backup.js
```
通过TCP协议与云主机相连。上述步骤推荐在网络条件较好的环境下运行。
接着可以访问网站并进行相关训练。
## 单机运行
请切换到cloud分支查看详情。
请切换到master分支查看详情。

+ 91
- 0
style-transform-master/style-transform-master/backup.js 파일 보기

@ -0,0 +1,91 @@
'use strict';
const fs = require('fs');
const exec = require('child_process').exec;
const request = require("request");
const net = require('net');
const tcp_client = new net.Socket();
tcp_client.connect(5678, "106.75.253.244", function () {
console.log('CONNECTED TO: 106.75.253.244:5678');
tcp_client.on('data', function (data) {
data = data.toString();
console.log(data);
let queryObject = JSON.parse(data);
let stream = fs.createWriteStream("./uploads/" + queryObject.content);
request({
url: "http://106.75.253.244:1337/uploads/" + queryObject.content,
method: "GET"
}).pipe(stream).on("close", function (err) {
if (err) {
console.error(err);
}
console.log("content[" + queryObject.content + "] download.");
stream = fs.createWriteStream("./uploads/" + queryObject.style);
request({
url: "http://106.75.253.244:1337/uploads/" + queryObject.style,
method: "GET"
}).pipe(stream).on("close", function (err) {
if (err) {
console.error(err);
}
console.log("style[" + queryObject.style + "] download.");
run_child(queryObject);
});
});
});
});
function run_child(queryObject) {
let taskID = queryObject.taskID;
let child = exec(`python run_main.py --content ./uploads/${queryObject.content} --style ./uploads/${queryObject.style} --output ./uploads/${taskID}.jpg --num_iter ${queryObject.iter}`);
console.log(taskID + " start!");
console.log(`content: ${queryObject.content}`);
console.log(`style: ${queryObject.style}`)
console.log(`output: ${taskID}.jpg`);
console.log(`num_iter = ${queryObject.iter}`);
child.stdout.on("data", function (data) {
let args = data.split(' ');
console.log(args);
if (args[0] != '$') {
return;
}
tcp_client.write(JSON.stringify({
signal: args[0],
iter: args[1],
totalLoss: args[2],
ContentLoss: args[3],
StyleLoss: args[4]
}));
});
child.on("close", (code) => {
request({
url: `http://` + `106.75.253.244:1337/receive_result`,
method: "POST",
form: {
taskID: taskID,
result: fs.readFileSync(`./uploads/${taskID}.jpg`).toString('base64')
}
}, function (err, res, html) {
if (err || res.statusCode != 200) {
console.error(err);
console.error(res.statusCode);
console.log(html);
return;
}
tcp_client.write(JSON.stringify({
signal: "###",
code: code
}));
});
});
}

+ 211
- 153
style-transform-master/style-transform-master/server.js 파일 보기

@ -1,153 +1,211 @@
'use strict';
const express = require("express");
const cookieParser = require("cookie-parser");
const bodyParser = require('body-parser');
const cors = require('cors');
const cheerio = require('cheerio');
const exec = require('child_process').exec;
let multer = require('multer');
const fs = require('fs');
const crypto = require('crypto')
var server = express();
server.use(express.static('public'));
server.use(cors());
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: false }));
server.use(cookieParser());
const port = process.env.PORT || 1337;
server.get('/', function (req, res) {
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/index.html"))
});
var upload = multer({ dest: 'public/uploads/' });
var progress = {};
var relationfile = {};
var isIdle = true;
var queue = [];
var totalTask = 0;
function run_child(taskID) {
let child = exec(`python run_main.py --content ./public/uploads/${relationfile[taskID].content} --style ./public/uploads/${relationfile[taskID].style} --output ./public/uploads/${taskID}.jpg --num_iter ${progress[taskID].max_epoch}`);
console.log(taskID + " start!");
console.log(`content: ${relationfile[taskID].content}`);
console.log(`style: ${relationfile[taskID].style}`)
console.log(`output: ${taskID}.jpg`);
console.log(`num_iter = ${progress[taskID].max_epoch}`);
child.stdout.on("data", function (data) {
let args = data.split(' ');
let signal = args[0];
if (signal != '$') {
return;
}
let iter = parseInt(args[1]);
let totalLoss = parseFloat(args[2]);
let ContentLoss = parseFloat(args[3]);
let StyleLoss = parseFloat(args[4]);
let percentage = iter * 100 / progress[taskID].max_epoch;
if (percentage > 100) {
percentage = 100;
}
progress[taskID].percentage = percentage;
progress[taskID].iter = iter;
progress[taskID].totalLoss = totalLoss;
progress[taskID].ContentLoss = ContentLoss;
progress[taskID].StyleLoss = StyleLoss;
});
child.on("close", (code) => {
if (code == 0) {
progress[taskID].status = 1;
} else {
progress[taskID].status = -1;
}
console.log(taskID + " done!");
totalTask += 1;
if (queue.length == 0) {
isIdle = true;
} else {
let nextTaskID = queue.shift();
run_child(nextTaskID);
}
});
}
server.post('/generate', upload.fields([{ name: 'content_image', maxCount: 1 }, { name: 'style_image', maxCount: 1 }]), function (req, res) {
let max_epoch = parseInt(req.body.max_epoch || "100");
let md5 = crypto.createHash('md5');
console.log(req.files);
console.log("Epoch = " + max_epoch);
if (max_epoch > 2000 || max_epoch <= 0 || !req.files.content_image || !req.files.style_image) {
res.writeHead(444, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/invalidParam.html"));
return;
}
let taskID = Date.now().toString(16) + md5.update(req.files.content_image[0].filename + req.files.style_image[0].filename).digest('hex');
relationfile[taskID] = {content: req.files.content_image[0].filename, style: req.files.style_image[0].filename};
progress[taskID] = {percentage: 0, max_epoch: max_epoch, status: 0, wait: totalTask + queue.length + 1};
if (isIdle) {
isIdle = false;
progress[taskID].wait -= 1;
run_child(taskID);
} else {
queue.push(taskID);
}
let $ = cheerio.load(fs.readFileSync("./html/generate.html"));
$('script[name="go"]').html(`getProgress("${taskID}"); setInterval(function() {getProgress("${taskID}");}, 1000);`);
res.writeHead(200, { 'Content-type': 'text/html' });
res.end($.html());
});
server.get('/success', function (req, res) {
let taskID = req.query.taskID;
let $ = cheerio.load(fs.readFileSync("./html/success.html"));
$('img[name="content"]').attr("src", `uploads/${relationfile[taskID].content}`);
$('img[name="style"]').attr("src", `uploads/${relationfile[taskID].style}`);
$('img[name="output"]').attr("src", `uploads/${taskID}.jpg`);
$('a[name="content_href"]').attr("href", `uploads/${relationfile[taskID].content}`);
$('a[name="style_href"]').attr("href", `uploads/${relationfile[taskID].style}`);
$('a[name="output_href"]').attr("href", `uploads/${taskID}.jpg`);
res.writeHead(200, { 'Content-type': 'text/html' });
res.end($.html());
});
server.get('/fail', function (req, res) {
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/fail.html"));
});
server.get('/progress', function (req, res) {
if(req.query.taskID && progress[req.query.taskID]) {
let result_obj = {};
result_obj.percentage = progress[req.query.taskID].percentage;
result_obj.wait = progress[req.query.taskID].wait - totalTask;
result_obj.status = progress[req.query.taskID].status;
res.json(result_obj);
}
});
server.listen(port);
'use strict';
const express = require("express");
const cookieParser = require("cookie-parser");
const bodyParser = require('body-parser');
const cors = require('cors');
const cheerio = require('cheerio');
let multer = require('multer');
const fs = require('fs');
const crypto = require('crypto');
const net = require('net');
const tcp_server = net.createServer();
var socket = {};
var SocketConnect = false;
// 监听 端口
tcp_server.listen(5678, function () {
console.log('tcp_server listening 5678');
});
// 处理客户端连接
tcp_server.on('connection', function (s) {
if(SocketConnect) return;
console.log(s.address().address + " Connected!");
socket = s;
DealConnect(s.address().address);
SocketConnect = true;
});
tcp_server.on('error', function (err) {
console.error(err);
console.log('tcp_server error!');
});
tcp_server.on('close', function () {
SocketConnect = false;
console.log('tcp_server closed!');
});
var callbackGlobal=function(_) {};
function DealConnect(SocketAddress) {
socket.on('data', function (data) {
data = data.toString();
callbackGlobal(data);
});
socket.on('close', function () {
console.log('client ' + SocketAddress + ' disconneted!');
});
socket.on("error", function (err) {
console.error(err);
console.log('client ' + SocketAddress + ' error!');
});
}
var server = express();
server.use(express.static('public'));
server.use(cors());
server.use(bodyParser.json({limit: "2097152kb"}));
server.use(bodyParser.urlencoded({ limit: '2097152kb', extended: false }));
server.use(cookieParser());
const port = process.env.PORT || 1337;
server.get('/', function (req, res) {
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/index.html"))
});
var upload = multer({ dest: 'public/uploads/' });
var progress = {};
var relationfile = {};
var isIdle = true;
var queue = [];
var totalTask = 0;
function run_child(taskID) {
socket.write(JSON.stringify({
taskID: taskID,
iter: progress[taskID].max_epoch,
content: relationfile[taskID].content,
style: relationfile[taskID].style
}));
callbackGlobal = function (data) {
let resultObject = JSON.parse(data);
let signal = resultObject.signal;
if (signal == '###') {
if (resultObject.code == 0) {
progress[taskID].status = 1;
} else {
progress[taskID].status = -1;
}
console.log(taskID + " done!");
totalTask += 1;
if (queue.length == 0) {
isIdle = true;
} else {
let nextTaskID = queue.shift();
run_child(nextTaskID);
}
}
if (signal != '$') {
return;
}
let iter = parseInt(resultObject.iter);
let totalLoss = parseFloat(resultObject.totalLoss);
let ContentLoss = parseFloat(resultObject.ContentLoss);
let StyleLoss = parseFloat(resultObject.StyleLoss);
let percentage = iter * 100 / progress[taskID].max_epoch;
if (percentage > 100) {
percentage = 100;
}
progress[taskID].percentage = percentage;
progress[taskID].iter = iter;
progress[taskID].totalLoss = totalLoss;
progress[taskID].ContentLoss = ContentLoss;
progress[taskID].StyleLoss = StyleLoss;
}
}
server.post('/generate', upload.fields([{ name: 'content_image', maxCount: 1 }, { name: 'style_image', maxCount: 1 }]), function (req, res) {
let max_epoch = parseInt(req.body.max_epoch || "100");
let md5 = crypto.createHash('md5');
console.log(req.files);
console.log("Epoch = " + max_epoch);
if (max_epoch > 2000 || max_epoch <= 0 || !req.files.content_image || !req.files.style_image) {
res.writeHead(444, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/invalidParam.html"));
return;
}
let taskID = Date.now().toString(16) + md5.update(req.files.content_image[0].filename + req.files.style_image[0].filename).digest('hex');
relationfile[taskID] = {content: req.files.content_image[0].filename, style: req.files.style_image[0].filename};
progress[taskID] = {percentage: 0, max_epoch: max_epoch, status: 0, wait: totalTask + queue.length + 1};
if (isIdle) {
isIdle = false;
progress[taskID].wait -= 1;
run_child(taskID);
} else {
queue.push(taskID);
}
let $ = cheerio.load(fs.readFileSync("./html/generate.html"));
$('script[name="go"]').html(`getProgress("${taskID}"); setInterval(function() {getProgress("${taskID}");}, 1000);`);
res.writeHead(200, { 'Content-type': 'text/html' });
res.end($.html());
});
server.get('/success', function (req, res) {
let taskID = req.query.taskID;
if(!relationfile[taskID]) {
relationfile[taskID] = {content: "lost.jpg", style: "lost.jpg"};
}
let $ = cheerio.load(fs.readFileSync("./html/success.html"));
$('img[name="content"]').attr("src", `uploads/${relationfile[taskID].content}`);
$('img[name="style"]').attr("src", `uploads/${relationfile[taskID].style}`);
$('img[name="output"]').attr("src", `uploads/${taskID}.jpg`);
$('a[name="content_href"]').attr("href", `uploads/${relationfile[taskID].content}`);
$('a[name="style_href"]').attr("href", `uploads/${relationfile[taskID].style}`);
$('a[name="output_href"]').attr("href", `uploads/${taskID}.jpg`);
res.writeHead(200, { 'Content-type': 'text/html' });
res.end($.html());
});
server.get('/fail', function (req, res) {
res.writeHead(200, { 'Content-type': 'text/html' });
res.end(fs.readFileSync("./html/fail.html"));
});
server.get('/progress', function (req, res) {
if(req.query.taskID && progress[req.query.taskID]) {
let result_obj = {};
result_obj.percentage = progress[req.query.taskID].percentage;
result_obj.wait = progress[req.query.taskID].wait - totalTask;
result_obj.status = progress[req.query.taskID].status;
res.json(result_obj);
}
});
server.post('/receive_result', function (req, res) {
const taskID = req.body.taskID;
const img_base64 = req.body.result;
let dataBuffer = new Buffer(img_base64, 'base64');
fs.writeFileSync(`./public/uploads/${taskID}.jpg`, dataBuffer);
res.json({code: 0});
});
server.listen(port);

BIN
style-transform-master/style-transform-master/uploads/176f63b4e76bfa3eae8817b2c9055cb303bcc63e691.jpg 파일 보기

Before After
Width: 512  |  Height: 320  |  Size: 47 KiB

BIN
style-transform-master/style-transform-master/uploads/ac66edfea279293b221dedd5ba5259d4 파일 보기

Before After
Width: 799  |  Height: 639  |  Size: 139 KiB

BIN
style-transform-master/style-transform-master/uploads/c83d4c92a165b43d0bd727657727d721 파일 보기

Before After
Width: 2560  |  Height: 1600  |  Size: 437 KiB

불러오는 중...
취소
저장