Skip to content

Instantly share code, notes, and snippets.

@albertomontesg
Last active November 14, 2023 16:20
Show Gist options
  • Save albertomontesg/d8b21a179c1e6cca0480ebdf292c34d2 to your computer and use it in GitHub Desktop.
Save albertomontesg/d8b21a179c1e6cca0480ebdf292c34d2 to your computer and use it in GitHub Desktop.
C3D Model for Keras

C3D Model for Keras

This is the C3D model used with a fork of Caffe to the Sports1M dataset migrated to Keras. Details about the network architecture can be found in the following arXiv paper:

Tran, Du, et al. "Learning Spatiotemporal Features With 3D Convolutional Networks." Proceedings of the IEEE International Conference on Computer Vision. 2015.

Content

Download: weights

Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Sports 1M C3D Network to Keras"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This notebook is trying to explain detailed the steps needed to port the network parameters trained on a Caffe's fork to Keras. The network was trained over the Sports1M Dataset, and the Caffe version was a fork which implements the 3D convolution. More info at the [paper](http://arxiv.org/abs/1412.0767).\n",
"\n",
"The first step is to obtain the parameters [file](https://www.dropbox.com/s/vr8ckp0pxgbldhs/conv3d_deepnetA_sport1m_iter_1900000?dl=0) related to the network. This file is stored as a caffemodel. To read this file it will be needed to generate the python output of the [proto definition](https://raw.githubusercontent.com/facebook/C3D/master/src/caffe/proto/caffe.proto) at the fork of caffe [C3D](https://github.com/facebook/C3D).\n",
"\n",
"To compile the proto file and then be able to read the caffemodel file with python require to recompile the protobuf library increasing the limit size. By definition, protobuf is thought to treat no large amount of data and it is limitated to read files smaller than 64MB. We can increase that limit following these steps:\n",
"1. Cloning the protobuf repository.\n",
"```sh\n",
"git clone https://github.com/google/protobuf\n",
"```\n",
"2. Change the following line of code.\n",
"\n",
"```diff\n",
"diff --git a/src/google/protobuf/io/coded_stream.h b/src/google/protobuf/io/coded_stream.h\n",
"index c81a33a..eeb8863 100644\n",
"--- a/src/google/protobuf/io/coded_stream.h\n",
"+++ b/src/google/protobuf/io/coded_stream.h\n",
"@@ -609,7 +609,7 @@ class LIBPROTOBUF_EXPORT CodedInputStream {\n",
" // Return the size of the buffer.\n",
" int BufferSize() const;\n",
" \n",
"- static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB\n",
"+ static const int kDefaultTotalBytesLimit = 256 << 20; // 256MB\n",
" \n",
" static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB\n",
"```\n",
"\n",
"3. Follow the instructions [here](https://github.com/google/protobuf/blob/master/src/README.md) to recompile the protoc compiler.\n",
"\n",
"4. Follow the instructions [here](https://github.com/google/protobuf/blob/master/python/README.md) to install the python protobuf with the reading file size increased.\n",
"\n",
"5. Compile the `caffe.proto` file for python.\n",
"```sh\n",
"protoc --python_out=. caffe.proto\n",
"```\n",
"\n",
"Once protobuf is build, it is also required to have all the depencies ok Keras and Theano (it is going to use as the backend of Keras because is the only one that supports 3D convolutions)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sports1M pre-trained model C3D"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Following the definition of the caffe proto of the C3D network used to train Sports1M and the paper, we define the same model in Keras."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using Theano backend.\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------------------------------------------------------\n",
"Initial input shape: (None, 3, 16, 112, 112)\n",
"--------------------------------------------------------------------------------\n",
"Layer (name) Output Shape Param # \n",
"--------------------------------------------------------------------------------\n",
"Convolution3D (conv1) (None, 64, 16, 112, 112) 5248 \n",
"MaxPooling3D (pool1) (None, 64, 16, 56, 56) 0 \n",
"Convolution3D (conv2) (None, 128, 16, 56, 56) 221312 \n",
"MaxPooling3D (pool2) (None, 128, 8, 28, 28) 0 \n",
"Convolution3D (conv3a) (None, 256, 8, 28, 28) 884992 \n",
"Convolution3D (conv3b) (None, 256, 8, 28, 28) 1769728 \n",
"MaxPooling3D (pool3) (None, 256, 4, 14, 14) 0 \n",
"Convolution3D (conv4a) (None, 512, 4, 14, 14) 3539456 \n",
"Convolution3D (conv4b) (None, 512, 4, 14, 14) 7078400 \n",
"MaxPooling3D (pool4) (None, 512, 2, 7, 7) 0 \n",
"Convolution3D (conv5a) (None, 512, 2, 7, 7) 7078400 \n",
"Convolution3D (conv5b) (None, 512, 2, 7, 7) 7078400 \n",
"ZeroPadding3D (zeropadding3d) (None, 512, 2, 9, 9) 0 \n",
"MaxPooling3D (pool5) (None, 512, 1, 4, 4) 0 \n",
"Flatten (flatten) (None, 8192) 0 \n",
"Dense (fc6) (None, 4096) 33558528 \n",
"Dropout (dropout) (None, 4096) 0 \n",
"Dense (fc7) (None, 4096) 16781312 \n",
"Dropout (dropout) (None, 4096) 0 \n",
"Dense (fc8) (None, 487) 1995239 \n",
"--------------------------------------------------------------------------------\n",
"Total params: 79991015\n",
"--------------------------------------------------------------------------------\n",
"None\n"
]
}
],
"source": [
"from keras.models import Sequential\n",
"from keras.layers.core import Dense, Dropout, Flatten\n",
"from keras.layers.convolutional import Convolution3D, MaxPooling3D, ZeroPadding3D\n",
"from keras.optimizers import SGD\n",
"\n",
"def get_model(summary=False):\n",
" \"\"\" Return the Keras model of the network\n",
" \"\"\"\n",
" model = Sequential()\n",
" # 1st layer group\n",
" model.add(Convolution3D(64, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv1',\n",
" subsample=(1, 1, 1), \n",
" input_shape=(3, 16, 112, 112)))\n",
" model.add(MaxPooling3D(pool_size=(1, 2, 2), strides=(1, 2, 2), \n",
" border_mode='valid', name='pool1'))\n",
" # 2nd layer group\n",
" model.add(Convolution3D(128, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv2',\n",
" subsample=(1, 1, 1)))\n",
" model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), \n",
" border_mode='valid', name='pool2'))\n",
" # 3rd layer group\n",
" model.add(Convolution3D(256, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv3a',\n",
" subsample=(1, 1, 1)))\n",
" model.add(Convolution3D(256, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv3b',\n",
" subsample=(1, 1, 1)))\n",
" model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), \n",
" border_mode='valid', name='pool3'))\n",
" # 4th layer group\n",
" model.add(Convolution3D(512, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv4a',\n",
" subsample=(1, 1, 1)))\n",
" model.add(Convolution3D(512, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv4b',\n",
" subsample=(1, 1, 1)))\n",
" model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), \n",
" border_mode='valid', name='pool4'))\n",
" # 5th layer group\n",
" model.add(Convolution3D(512, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv5a',\n",
" subsample=(1, 1, 1)))\n",
" model.add(Convolution3D(512, 3, 3, 3, activation='relu', \n",
" border_mode='same', name='conv5b',\n",
" subsample=(1, 1, 1)))\n",
" model.add(ZeroPadding3D(padding=(0, 1, 1)))\n",
" model.add(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2), \n",
" border_mode='valid', name='pool5'))\n",
" model.add(Flatten())\n",
" # FC layers group\n",
" model.add(Dense(4096, activation='relu', name='fc6'))\n",
" model.add(Dropout(.5))\n",
" model.add(Dense(4096, activation='relu', name='fc7'))\n",
" model.add(Dropout(.5))\n",
" model.add(Dense(487, activation='softmax', name='fc8'))\n",
" if summary:\n",
" print(model.summary())\n",
" return model\n",
"\n",
"model = get_model(summary=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Loading parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now lets load all the parametes. One thing to consider is that this operation waste a lot of computer memory (arround 3GB of RAM) due to ineficiencies of protobuf with large serialized objects.\n",
"\n",
"Due to differences between the order of saving the parametes in caffe, some transformations to the matrix should be made."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import caffe_pb2 as caffe\n",
"import numpy as np\n",
"\n",
"p = caffe.NetParameter()\n",
"p.ParseFromString(\n",
" open('model/conv3d_deepnetA_sport1m_iter_1900000', 'rb').read()\n",
")\n",
"\n",
"def rot90(W):\n",
" for i in range(W.shape[0]):\n",
" for j in range(W.shape[1]):\n",
" for k in range(W.shape[2]):\n",
" W[i, j, k] = np.rot90(W[i, j, k], 2)\n",
" return W\n",
"\n",
"params = []\n",
"conv_layers_indx = [1, 4, 7, 9, 12, 14, 17, 19]\n",
"fc_layers_indx = [22, 25, 28]\n",
"\n",
"for i in conv_layers_indx:\n",
" layer = p.layers[i]\n",
" weights_b = np.array(layer.blobs[1].data, dtype=np.float32)\n",
" weights_p = np.array(layer.blobs[0].data, dtype=np.float32).reshape(\n",
" layer.blobs[0].num, layer.blobs[0].channels, layer.blobs[0].length,\n",
" layer.blobs[0].height, layer.blobs[0].width\n",
" )\n",
" weights_p = rot90(weights_p)\n",
" params.append([weights_p, weights_b])\n",
"for i in fc_layers_indx:\n",
" layer = p.layers[i]\n",
" weights_b = np.array(layer.blobs[1].data, dtype=np.float32)\n",
" weights_p = np.array(layer.blobs[0].data, dtype=np.float32).reshape(\n",
" layer.blobs[0].num, layer.blobs[0].channels, layer.blobs[0].length,\n",
" layer.blobs[0].height, layer.blobs[0].width)[0,0,0,:,:].T\n",
" params.append([weights_p, weights_b])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now that all the params are loaded, lets put it to the model."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"model_layers_indx = [0, 2, 4, 5, 7, 8, 10, 11] + [15, 17, 19] #conv + fc\n",
"for i, j in zip(model_layers_indx, range(11)):\n",
" model.layers[i].set_weights(params[j])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the future, we save the model definition to json and also its weights for whatever use we would like to do with them.\n",
"\n",
"You can also download them from here: [model](https://gist.githubusercontent.com/albertomontesg/d8b21a179c1e6cca0480ebdf292c34d2/raw/1e2620258ce619e18d3219cf962a3f0a0ed17093/sports_1M.json) and [weights](https://drive.google.com/open?id=0BzmDUR5_3US0V1hjV3VvREJ3NGs)."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import h5py\n",
"\n",
"model.save_weights('sports1M_weights.h5', overwrite=True)\n",
"json_string = model.to_json()\n",
"with open('sports1M_model.json', 'w') as f:\n",
" f.write(json_string)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Testing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For now on, it is highly recommended to reestart the kernel and reload the weights from the saved file. Doing this will only require 300MB instead of 3GB of memory. Also compile the model with a sgd and optimizer. This will not affect on testing due it work for training, but is necessary to compile the model so theano tensor's operations could be done in forward direction."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using Theano backend.\n"
]
}
],
"source": [
"from keras.models import model_from_json\n",
"\n",
"model = model_from_json(open('sports1M_model.json', 'r').read())\n",
"model.load_weights('sports1M_weights.h5')\n",
"model.compile(loss='mean_squared_error', optimizer='sgd')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For testing we are going to load all the labels corresponding to the Sports1M dataset as can be found [here](https://raw.githubusercontent.com/gtoderici/sports-1m-dataset/master/labels.txt)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Total labels: 487\n"
]
}
],
"source": [
"with open('dataset/labels.txt', 'r') as f:\n",
" labels = [line.strip() for line in f.readlines()]\n",
"print('Total labels: {}'.format(len(labels)))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For testing we are also going to load a [video](https://www.youtube.com/watch?v=dM06AMFLsrc) from the Sports1M dataset and pass it through the model. For this is required to have [OpenCV3](https://github.com/Itseez/opencv) and [ffmpeg](https://www.ffmpeg.org/) to be able to load videos."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import cv2\n",
"import numpy as np\n",
"\n",
"cap = cv2.VideoCapture('dM06AMFLsrc.mp4')\n",
"\n",
"vid = []\n",
"while True:\n",
" ret, img = cap.read()\n",
" if not ret:\n",
" break\n",
" vid.append(cv2.resize(img, (171, 128)))\n",
"vid = np.array(vid, dtype=np.float32)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plot a frame of the video. As can be seen, the video correspond to the label: **basquetball**"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x122b014a8>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAU8AAAD/CAYAAABxcFQzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVuIbNmWnveviIzIyIy8577U7VTVcRc+3bYbG4MtGWHa\nIAmMDOonH2Rk060GP8lYtozpy7vB3WCE/OobbWFwy/ZD68EPojEtgcGgBrtRW63uI7lOnVO1d+2d\ne+c1MiMyMiKWH7K+mX+MnGvFyn2p3KcVA5LMjFhrrnkZ8x//GHPMuYqyLLWUpSxlKUu5m7TuuwJL\nWcpSlvKTKEvwXMpSlrKUV5AleC5lKUtZyivIEjyXspSlLOUVZAmeS1nKUpbyCrIEz6UsZSlLeQV5\na+BZFMW/XRTFPy6K4o+Lovjlt/WcpSxlKUu5DyneRp5nURQtSX8s6c9KeiLpH0j6S2VZ/uM3/rCl\nLGUpS7kHeVvM81+X9IOyLL8oy/JK0v8s6eff0rOWspSlLOVbl7cFnh9K+rH9/+U3ny1lKUtZyp8I\nWbmvBxdFsdwXupSlLOUnQsqyLOJnbws8v5L0sf3/0Tef3ZKiuFWnpbwBKcty2bdvUZb9++pStc5C\nf3rf5q79tvu9qr5vy23/B5I+K4rik6IoupL+kqS/85aetZSlLOVPgDRZvH6XDNZbYZ5lWU6LoviP\nJP1dXQP0f1eW5R++jWctZSlL+cmSoigaAWXVvdIN0PL7PkD1raQqNXrwNzHPd8mS/EmSpVv5dmXZ\nv68m3mcRe3Jue9X9s9lsroy3ORZlWX6rMc9GslS+tyfLvn27suzfZlIUhVZWVrS9va39/X212221\nWi0VRZF+ZrOZptPp3D3xbwdarj89PdXh4aEmk0kC029T7hU8l7KUpfzJlk6no83NTf2pP/Wn9Of/\n/J/X6uqqVldX1el01Ol0tLKyotFopMFgkO5xYEW+YX8qy1JXV1e6uLjQ7//+7+vv//2/r6OjI52f\nn3/rbVuC51KWspQ3LjDFtbU1ffjhh/rggw/04MEDjcdjSdLOzo42NzfV6XR0dHSki4sLSboFmrly\ne72ednZ2dHx8rO985zuaTqc6Pz/P3vc2w5JL8FzKUpby1qTf7+uzzz7T2tqaPv/8c33xxRcaDAb6\n2Z/9Wb333nvqdDr64osv9Ad/8AdqtVpqtVqJYUbBXd/b29PP/MzPaG1tTZ999pmOj4/15MmTbz2U\nsgTPpSxlKW9N2u22er2eZrOZXr58qV6vp93dXX388cfa3t7Wy5cvdX5+rsFgkFinA2cE0el0qm63\nq/Pzc11dXWllZUWt1u2My29jIXwJnktZylLemETQarVaWllZ0XQ61Wg00kcffaRPP/1UP/3TP61W\nq6XT01OVZZkWjOL9uf8nk4mGw6Emk8lCN/9tyhI8l7KUpbxVabVaWl9fV7vd1ne/+11973vf08OH\nD1WWpT755BMdHBzoBz/4gcbjsSaTiaTqlKb7WFWvkiV4LmUpS3lrAjPs9Xra3NzUBx98oA8//FC9\nXk+j0Ui9Xk/9fl9bW1saDAYaDoe3VtvLstRsNtNsNtPKyoo6nU5Kd7pPWYLnUpaylLcmLP70ej3t\n7+9re3tbvV5P4/FYh4eH+vLLLzUcDvXgwQNJ1zFNzwVFLi8vNZlMtLq6qn6/r9XV1XtnoUvwXMpS\n7lF+0vZzv4rQRk+OJ19zMBio1WrpvffeU6vV0tramnZ3d9XpdDQajVSWpVqtls7OzjQcDrWxsaHt\n7W31+31dXV3deo4vOL3t3UdL8FzKUpby1oVFnsvLy8Qu2+22ptOp1tbWtL+/r263q8vLS33ve9/T\n2tqanj9/rul0qk6noxcvXujs7Ezb29taXV1VWZZzifVIBM63KUvwXMpSlvLGJLedsixLjcdjnZ2d\n6eLiQpeXl+p0OtrY2NBHH32k2WymXq+nw8NDnZycaDqdajwe68svv9R4PFav19Pe3p4ePXqk4XCo\n8Xis6XS6dNuXspSmUscmftJd26YS23lfB/s0FWKe4/FYg8FAZ2dnOj8/1/b2tjY2NvThhx+mFfbx\neKyDg4Pkyv/Tf/pPdXFxofX1df3pP/2n9dFHH+nzzz/X6empJM3th+dZ36YswXMpS1nKW5XZbKbL\ny0tdXV3pyZMnWl9f10/91E+p2+3q5ORET5480ZMnT/SjH/1I4/FYo9FIRVFoPB7r9PRUx8fH+vGP\nf6zV1VV98cUXGg6H2tvbu3eDuQTPpbzz8q6xqyUDvrtMJhNNp9O0jXJzc1Pb29u6vLzUwcGB/uAP\n/kBnZ2eSpBcvXqgoCl1eXmo0Gmk0GunJkydqtVp68uSJJGlzc/OtxjeblLkEz6UsZSlvTYqiULvd\nlnQNoE+fPtXZ2ZnW1tb0ySefaGtrS+12W6enp7q8vFRZlvqjP/ojSdfpSe12W51ORwcHB7q4uNBg\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x139fb63c8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"\n",
"plt.imshow(vid[2000]/256)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now from the video extract a 16 frame clip and crop the center to get a 3x16x112x112 clip."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"X = vid[2000:2016, 8:120, 30:142, :].transpose((3, 0, 1, 2))\n",
"output = model.predict_on_batch(np.array([X]))"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x110e579e8>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nSUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x139fb5e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(output[0][0])"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Position of maximum probability: 367\n",
"Maximum probability: 0.45910\n",
"Corresponding label: basketball\n",
"\n",
"Top 5 probabilities and labels:\n",
"0.45910 basketball\n",
"0.39566 streetball\n",
"0.02090 greco-roman wrestling\n",
"0.01479 freestyle wrestling\n",
"0.01391 slamball\n"
]
}
],
"source": [
"print('Position of maximum probability: {}'.format(output[0].argmax()))\n",
"print('Maximum probability: {:.5f}'.format(max(output[0][0])))\n",
"print('Corresponding label: {}'.format(labels[output[0].argmax()]))\n",
"\n",
"# sort top five predictions from softmax output\n",
"top_inds = output[0][0].argsort()[::-1][:5] # reverse sort and take five largest items\n",
"print('\\nTop 5 probabilities and labels:')\n",
"_ =[print('{:.5f} {}'.format(output[0][0][i], labels[i])) for i in top_inds]"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"As can be seen on the previous results, the classification of the video has been done correctly, giving as output the **basketball** category."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
@raingo
Copy link

raingo commented Apr 24, 2016

Did you subtract mean?

@albertomontesg
Copy link
Author

albertomontesg commented Apr 25, 2016

@raingo I hadn't it converted at that moment, but if you are intereseted I have published all of this in this repository which includes weights, model and mean:
keras-model-zoo C3D model

@mzolfaghari
Copy link

Hi,
Is there any way to convert Keras model to Caffe model?

Best,

@albertomontesg
Copy link
Author

albertomontesg commented Jun 12, 2016

Hi @mzolfaghari,
Actually I don't know any tool to do that. If you want to give a try, there is a repo that ports from Caffe to Keras, so digging into the code, you may find the way to do it on the inverse way.

Best,

@chuckcho
Copy link

chuckcho commented Feb 15, 2017

I ported this into Keras+Tensorflow (not Theano-backend) for those who are interested: https://github.com/chuckcho/c3d-keras

@chuckcho
Copy link

^ The only difference in my implementation with Tensorflow is the mean subtraction, which led to even better results:

Top 5 probabilities and labels:
basketball: 0.71422
streetball: 0.10293
volleyball: 0.04900
greco-roman wrestling: 0.02638
freestyle wrestling: 0.02408

@yzexeter
Copy link

yzexeter commented Mar 5, 2017

@chuckcho Hi, Thank you for you sharing. I downloaded your code and tried to run it. It seems that the downloaded file caffe.proto cannot be compiled properly. The warning message "[libprotobuf WARNING google/protobuf/compiler/parser.cc:546] No syntax specified for the proto file: caffe.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)". I added ""syntax = "proto2";" to fix this. I wonder whether there is any difference between them?

@yuijim
Copy link

yuijim commented Mar 17, 2017

Hi Alberto,
Great job ! Thanks for sharing !
How do you know that ZeroPadding3D (zeropadding3d) (None, 512, 2, 9, 9) 0 layer is used ? I was not able to find it in the original Caffe model ... Could you please point the place where it is ?

@chuckcho
Copy link

@yzexeter sorry for the late reply. yes, the caffe.proto is in v2 format (and to be compiled as such), and it seems v3 has non-backward-compatible features. http://stackoverflow.com/questions/33204321/upgrading-protobuf-from-version-2-to-3-incompatible-with-protobuf-default-valu

@zhuolinumd
Copy link

Can you share your code about converting sport1m caffe model to its tensorflow version? I tried to use this code https://github.com/ethereon/caffe-tensorflow, which did not support the video data layer. Thanks. @chuckcho

@smarinka
Copy link

smarinka commented Jun 5, 2017

Hi Alberto,
Could you tell whether you convert the images to RGB as by default openCV cap reads them in GBR format.
Do you know on which of them conv3D was trained?
Thanks

@mmderakhshani
Copy link

Hi,
I have loaded your transfered model using bellow command:
model = model_from_json(open('./sports_1M.json', 'r').read())
and I have received this error:
ValueError: Improper config format.
Could you please tell are there any problems with .json file?

@dataintensiveapplication

Hi, I have your same problem @MOHAMMAD-PY, did you found a solution for that?

@Zumbalamambo
Copy link

is it possible to retrain the network again?

@albertomontesg
Copy link
Author

@smarinka Sorry for the delay, but the original model was trained in GBR format.

@TrungHieu-Le
Copy link

@albertomontesg: Thank you for your sharing! I am studying the Keras, I used the UCF101 dataset to run and get a result, now I want to use SVM to classify but I don't know how to prepare input file for C3D model in Keras. Could you please help me. Thank you so much!

@bochen1106
Copy link

Hi,

Could you specify the version of your python, your Keras, and Theano? I am running it here on June 14 2018. Now the latest version cannot be compatible with the old one, so when I read your model json file and h5 file, it shows error. It also shows error when I define the model structure by myself and load h5 file.

@Ai-is-light
Copy link

@ jian @jiang2764 Hi, have u fixed this problem? I have tried to convert caffe's model of 3D convolution by using https://github.com/ethereon/caffe-tensorflow , I also failed.
looking forward to any replies.

@lDark-Moonl
Copy link

lDark-Moonl commented Nov 17, 2018

@albertomontesg Hi, Thank you for your great job. I have a problem loading the weights in my model. I thought it might be because I use tensorflow backend for my keras, so I decided to convert the weights, but I still get the same error:

ValueError: You are trying to load a weight file containing 0 layers into a model with 11 layers.

Could you please help where is the problem?

@EMCL
Copy link

EMCL commented Dec 10, 2018

Hi,

Could you specify the version of your python, your Keras, and Theano? I am running it here on June 14 2018. Now the latest version cannot be compatible with the old one, so when I read your model json file and h5 file, it shows error. It also shows error when I define the model structure by myself and load h5 file.

hi, did you solve that?

@supun-kanda
Copy link

supun-kanda commented Jan 23, 2019

Hi,
The links on weights and model to keras model you gave have some issues. Or my versions should be missmatched. Here are my libraries and versions

  • caffe-gpu=1.0=py36h51fbcb3_4
  • cudatoolkit=9.2=0
  • cudnn=7.2.1=cuda9.2_0
  • cupti=9.2.148=0
  • ffmpeg=4.0=hcdf2ecd_0
  • freeglut=3.0.0=hf484d3e_5
  • gast=0.2.0=py36_0
  • gflags=2.2.2=he6710b0_0
  • jasper=2.0.14=h07fcdf6_1
  • keras-applications=1.0.6=py36_0
  • keras-base=2.2.4=py36_0
  • keras-gpu=2.2.4=0
  • keras-preprocessing=1.0.5=py36_0
  • libboost=1.67.0=h46d08c1_4
  • libglu=9.0.0=hf484d3e_1
  • libopencv=3.4.2=hb342d67_1
  • libopus=1.3=h7b6447c_0
  • libprotobuf=3.6.1=hd408876_0
  • lmdb=0.9.22=hf484d3e_1
  • markdown=3.0.1=py36_0
  • protobuf=3.6.1=py36he6710b0_0
  • py-boost=1.67.0=py36h04863e7_4
  • py-opencv=3.4.2=py36hb342d67_1
  • python-gflags=3.1.2=py36_0
  • python-leveldb=0.194=py36_1
  • tensorboard=1.12.0=py36hf484d3e_0
  • tensorflow=1.12.0=gpu_py36he74679b_0
  • tensorflow-base=1.12.0=gpu_py36had579c0_0
  • tensorflow-gpu=1.12.0=h0d30ee6_0
  • termcolor=1.1.0=py36_1
  • conda=4.5.12=py36_0
  • conda-build=3.17.6=py36_0
  • conda-env=2.6.0=1
  • jupyter=1.0.0=py36_7
  • jupyter_client=5.2.4=py36_0
  • jupyter_console=6.0.0=py36_0
  • jupyter_core=4.4.0=py36_0
  • jupyterlab=0.35.3=py36_0
  • jupyterlab_server=0.2.0=py36_0
  • numpy=1.15.4=py36h7e9f1db_0
  • numpy-base=1.15.4=py36hde5b4d6_0
  • pillow=5.3.0=py36h34e0f95_0
  • pip=18.1=py36_0
  • python=3.6.7=h0371630_0
  • scikit-image=0.14.1=py36he6710b0_0
  • scikit-learn=0.20.1=py36hd81dba3_0
  • scipy=1.1.0=py36h7c811a0_2
  • pip:
    • keras==2.2.4

When using json model here is the error
ValueError: Improper config format:

When using previously created model (by adding layers manually) to lead h5 file weights here is the error
ValueError: You are trying to load a weight file containing 0 layers into a model with 11 layers.

Looks like the weights files cant be decoded properly. Any Idea on what to do?

@aslucki
Copy link

aslucki commented Feb 5, 2019

@supun-kanda Based on this project: https://github.com/axon-research/c3d-keras
I created an updated version of the model (for keras 2.2.4): https://github.com/aslucki/C3D_Sport1M_keras
and weights.

@iriyagupta
Copy link

iriyagupta commented Sep 10, 2019

@albertomontesg
Hi, I am facing this error. Did anyone else face this issue?


AttributeError Traceback (most recent call last)
in
22 weights_b = np.array(layer.blobs[1].data, dtype=np.float32)
23 weights_p = np.array(layer.blobs[0].data, dtype=np.float32).reshape(
---> 24 layer.blobs[0].num, layer.blobs[0].channels, layer.blobs[0].length,
25 layer.blobs[0].height, layer.blobs[0].width
26 )

AttributeError: length

I am new to caffe and getting attributes from blob using hpp files is sort of not understandable to me here.
Thanks in advance.

@parasmaharjan
Copy link

@albertomontesg
Is there any training code for the sports-1m dataset?

@masouduut94
Copy link

how can we use the C3D features to model violence detection on videos?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment